[FFmpeg-devel] [PATCH 2/2] avcodec: Add hardware metadata to hardware backed decoders
Philip Langdale
philipl at overt.org
Tue Nov 28 06:46:01 EET 2017
Now that we have a way to identify hardware backed decoders, let
us do so. I may have missed some.
Signed-off-by: Philip Langdale <philipl at overt.org>
---
libavcodec/crystalhd.c | 4 +++-
libavcodec/cuviddec.c | 4 +++-
libavcodec/mediacodecdec.c | 24 ++++++++++++++++++------
libavcodec/mmaldec.c | 3 ++-
libavcodec/qsvdec_h2645.c | 8 ++++++--
libavcodec/qsvdec_other.c | 12 +++++++++---
libavcodec/v4l2_m2m_dec.c | 2 ++
7 files changed, 43 insertions(+), 14 deletions(-)
diff --git a/libavcodec/crystalhd.c b/libavcodec/crystalhd.c
index 83bc8bf364..0e856f2919 100644
--- a/libavcodec/crystalhd.c
+++ b/libavcodec/crystalhd.c
@@ -786,8 +786,10 @@ static int crystalhd_receive_frame(AVCodecContext *avctx, AVFrame *frame)
.receive_frame = crystalhd_receive_frame, \
.flush = flush, \
.bsfs = bsf_name, \
- .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING, \
+ .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING | \
+ AV_CODEC_CAP_HARDWARE, \
.pix_fmts = (const enum AVPixelFormat[]){AV_PIX_FMT_YUYV422, AV_PIX_FMT_NONE}, \
+ .provider = "crystalhd", \
};
#if CONFIG_H264_CRYSTALHD_DECODER
diff --git a/libavcodec/cuviddec.c b/libavcodec/cuviddec.c
index 96d56f406a..21fbbe9970 100644
--- a/libavcodec/cuviddec.c
+++ b/libavcodec/cuviddec.c
@@ -1127,13 +1127,15 @@ static const AVCodecHWConfigInternal *cuvid_hw_configs[] = {
.decode = cuvid_decode_frame, \
.receive_frame = cuvid_output_frame, \
.flush = cuvid_flush, \
- .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING, \
+ .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING | \
+ AV_CODEC_CAP_HARDWARE, \
.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_CUDA, \
AV_PIX_FMT_NV12, \
AV_PIX_FMT_P010, \
AV_PIX_FMT_P016, \
AV_PIX_FMT_NONE }, \
.hw_configs = cuvid_hw_configs, \
+ .provider = "cuvid", \
};
#if CONFIG_HEVC_CUVID_DECODER
diff --git a/libavcodec/mediacodecdec.c b/libavcodec/mediacodecdec.c
index 6d392adb3a..dd630bf6e3 100644
--- a/libavcodec/mediacodecdec.c
+++ b/libavcodec/mediacodecdec.c
@@ -538,10 +538,12 @@ AVCodec ff_h264_mediacodec_decoder = {
.decode = mediacodec_decode_frame,
.flush = mediacodec_decode_flush,
.close = mediacodec_decode_close,
- .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING,
+ .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING |
+ AV_CODEC_CAP_HARDWARE,
.caps_internal = FF_CODEC_CAP_SETS_PKT_DTS,
.bsfs = "h264_mp4toannexb",
.hw_configs = mediacodec_hw_configs,
+ .provider = "mediacodec",
};
#endif
@@ -556,10 +558,12 @@ AVCodec ff_hevc_mediacodec_decoder = {
.decode = mediacodec_decode_frame,
.flush = mediacodec_decode_flush,
.close = mediacodec_decode_close,
- .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING,
+ .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING |
+ AV_CODEC_CAP_HARDWARE,
.caps_internal = FF_CODEC_CAP_SETS_PKT_DTS,
.bsfs = "hevc_mp4toannexb",
.hw_configs = mediacodec_hw_configs,
+ .provider = "mediacodec",
};
#endif
@@ -574,9 +578,11 @@ AVCodec ff_mpeg2_mediacodec_decoder = {
.decode = mediacodec_decode_frame,
.flush = mediacodec_decode_flush,
.close = mediacodec_decode_close,
- .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING,
+ .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING |
+ AV_CODEC_CAP_HARDWARE,
.caps_internal = FF_CODEC_CAP_SETS_PKT_DTS,
.hw_configs = mediacodec_hw_configs,
+ .provider = "mediacodec",
};
#endif
@@ -591,9 +597,11 @@ AVCodec ff_mpeg4_mediacodec_decoder = {
.decode = mediacodec_decode_frame,
.flush = mediacodec_decode_flush,
.close = mediacodec_decode_close,
- .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING,
+ .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING |
+ AV_CODEC_CAP_HARDWARE,
.caps_internal = FF_CODEC_CAP_SETS_PKT_DTS,
.hw_configs = mediacodec_hw_configs,
+ .provider = "mediacodec",
};
#endif
@@ -608,9 +616,11 @@ AVCodec ff_vp8_mediacodec_decoder = {
.decode = mediacodec_decode_frame,
.flush = mediacodec_decode_flush,
.close = mediacodec_decode_close,
- .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING,
+ .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING |
+ AV_CODEC_CAP_HARDWARE,
.caps_internal = FF_CODEC_CAP_SETS_PKT_DTS,
.hw_configs = mediacodec_hw_configs,
+ .provider = "mediacodec",
};
#endif
@@ -625,8 +635,10 @@ AVCodec ff_vp9_mediacodec_decoder = {
.decode = mediacodec_decode_frame,
.flush = mediacodec_decode_flush,
.close = mediacodec_decode_close,
- .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING,
+ .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING |
+ AV_CODEC_CAP_HARDWARE,
.caps_internal = FF_CODEC_CAP_SETS_PKT_DTS,
.hw_configs = mediacodec_hw_configs,
+ .provider = "mediacodec",
};
#endif
diff --git a/libavcodec/mmaldec.c b/libavcodec/mmaldec.c
index b3f0cca4b5..b047b4b24e 100644
--- a/libavcodec/mmaldec.c
+++ b/libavcodec/mmaldec.c
@@ -840,12 +840,13 @@ static const AVOption options[]={
.decode = ffmmal_decode, \
.flush = ffmmal_flush, \
.priv_class = &ffmmal_##NAME##_dec_class, \
- .capabilities = AV_CODEC_CAP_DELAY, \
+ .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE, \
.caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, \
.pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_MMAL, \
AV_PIX_FMT_YUV420P, \
AV_PIX_FMT_NONE}, \
.hw_configs = mmal_hw_configs, \
+ .provider = "mmal", \
};
FFMMAL_DEC(h264, AV_CODEC_ID_H264)
diff --git a/libavcodec/qsvdec_h2645.c b/libavcodec/qsvdec_h2645.c
index 6b4fc5e36e..29aabab0a7 100644
--- a/libavcodec/qsvdec_h2645.c
+++ b/libavcodec/qsvdec_h2645.c
@@ -211,7 +211,8 @@ AVCodec ff_hevc_qsv_decoder = {
.decode = qsv_decode_frame,
.flush = qsv_decode_flush,
.close = qsv_decode_close,
- .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING,
+ .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING |
+ AC_CODEC_CAP_HARDWARE | AV_CODEC_CAP_MAYBE_NOT_HARDWARE,
.priv_class = &hevc_class,
.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12,
AV_PIX_FMT_P010,
@@ -219,6 +220,7 @@ AVCodec ff_hevc_qsv_decoder = {
AV_PIX_FMT_NONE },
.hw_configs = ff_qsv_hw_configs,
.bsfs = "hevc_mp4toannexb",
+ .provider = "qsv",
};
#endif
@@ -245,7 +247,8 @@ AVCodec ff_h264_qsv_decoder = {
.decode = qsv_decode_frame,
.flush = qsv_decode_flush,
.close = qsv_decode_close,
- .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING,
+ .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING |
+ AC_CODEC_CAP_HARDWARE | AV_CODEC_CAP_MAYBE_NOT_HARDWARE,
.priv_class = &class,
.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12,
AV_PIX_FMT_P010,
@@ -253,5 +256,6 @@ AVCodec ff_h264_qsv_decoder = {
AV_PIX_FMT_NONE },
.hw_configs = ff_qsv_hw_configs,
.bsfs = "h264_mp4toannexb",
+ .provider = "qsv",
};
#endif
diff --git a/libavcodec/qsvdec_other.c b/libavcodec/qsvdec_other.c
index f7691f95bf..259f50df49 100644
--- a/libavcodec/qsvdec_other.c
+++ b/libavcodec/qsvdec_other.c
@@ -176,12 +176,14 @@ AVCodec ff_mpeg2_qsv_decoder = {
.decode = qsv_decode_frame,
.flush = qsv_decode_flush,
.close = qsv_decode_close,
- .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING,
+ .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING |
+ AC_CODEC_CAP_HARDWARE | AV_CODEC_CAP_MAYBE_NOT_HARDWARE,
.priv_class = &mpeg2_qsv_class,
.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12,
AV_PIX_FMT_QSV,
AV_PIX_FMT_NONE },
.hw_configs = ff_qsv_hw_configs,
+ .provider = "qsv",
};
#endif
@@ -203,12 +205,14 @@ AVCodec ff_vc1_qsv_decoder = {
.decode = qsv_decode_frame,
.flush = qsv_decode_flush,
.close = qsv_decode_close,
- .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING,
+ .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING |
+ AC_CODEC_CAP_HARDWARE | AV_CODEC_CAP_MAYBE_NOT_HARDWARE,
.priv_class = &vc1_qsv_class,
.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12,
AV_PIX_FMT_QSV,
AV_PIX_FMT_NONE },
.hw_configs = ff_qsv_hw_configs,
+ .provider = "qsv",
};
#endif
@@ -230,11 +234,13 @@ AVCodec ff_vp8_qsv_decoder = {
.decode = qsv_decode_frame,
.flush = qsv_decode_flush,
.close = qsv_decode_close,
- .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING,
+ .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING |
+ AC_CODEC_CAP_HARDWARE | AV_CODEC_CAP_MAYBE_NOT_HARDWARE,
.priv_class = &vp8_qsv_class,
.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12,
AV_PIX_FMT_QSV,
AV_PIX_FMT_NONE },
.hw_configs = ff_qsv_hw_configs,
+ .provider = "qsv",
};
#endif
diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c
index 958cdc522b..2d0ac30a61 100644
--- a/libavcodec/v4l2_m2m_dec.c
+++ b/libavcodec/v4l2_m2m_dec.c
@@ -214,7 +214,9 @@ AVCodec ff_ ## NAME ## _v4l2m2m_decoder = { \
.init = v4l2_decode_init,\
.receive_frame = v4l2_receive_frame,\
.close = ff_v4l2_m2m_codec_end,\
+ .capabilities = AV_CODEC_CAP_HARDWARE, \
.bsfs = bsf_name, \
+ .provider = "v4l2m2m", \
};
M2MDEC(h264, "H.264", AV_CODEC_ID_H264, "h264_mp4toannexb");
--
2.14.1
More information about the ffmpeg-devel
mailing list