diff options
author | Zhong Li <zhong.li@intel.com> | 2019-04-28 20:27:48 +0800 |
---|---|---|
committer | Zhong Li <zhong.li@intel.com> | 2019-05-07 11:00:19 +0800 |
commit | 5b318ce68df6cb4939b0be68e22853621e1e3aab (patch) | |
tree | f100b67d8d050eb500eded1859407e144ae4cd5b /libavcodec/qsv.c | |
parent | 94ab39ec78c536703f77821fc039fee649105aab (diff) | |
download | ffmpeg-5b318ce68df6cb4939b0be68e22853621e1e3aab.tar.gz |
lavc/qsv: extactly map profile
Currently profile mapping is hard-coded, and not flexible to do extactly
map (E.g: libmfx treats H264 constrained baseline to be baseline profile).
vaapi profile mapping funtion provides a better soultion than current
qsv mapping.
Signed-off-by: Zhong Li <zhong.li@intel.com>
Diffstat (limited to 'libavcodec/qsv.c')
-rw-r--r-- | libavcodec/qsv.c | 52 |
1 files changed, 44 insertions, 8 deletions
diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c index 4d3fbafe04..986d4f6022 100644 --- a/libavcodec/qsv.c +++ b/libavcodec/qsv.c @@ -67,19 +67,55 @@ int ff_qsv_codec_id_to_mfx(enum AVCodecID codec_id) return AVERROR(ENOSYS); } + +static const struct { + enum AVCodecID codec_id; + int codec_profile; + int mfx_profile; +} qsv_profile_map[] = { +#define MAP(c, p, v) { AV_CODEC_ID_ ## c, FF_PROFILE_ ## p, MFX_PROFILE_ ## v } + MAP(MPEG2VIDEO, MPEG2_SIMPLE, MPEG2_SIMPLE ), + MAP(MPEG2VIDEO, MPEG2_MAIN, MPEG2_MAIN ), + MAP(MPEG2VIDEO, MPEG2_HIGH, MPEG2_HIGH ), + + MAP(H264, H264_BASELINE, AVC_BASELINE ), + MAP(H264, H264_CONSTRAINED_BASELINE, AVC_BASELINE), +#if QSV_VERSION_ATLEAST(1, 3) + MAP(H264, H264_EXTENDED, AVC_EXTENDED ), +#endif + MAP(H264, H264_MAIN, AVC_MAIN ), + MAP(H264, H264_HIGH, AVC_HIGH ), + MAP(H264, H264_HIGH_422, AVC_HIGH_422 ), + +#if QSV_VERSION_ATLEAST(1, 8) + MAP(HEVC, HEVC_MAIN, HEVC_MAIN ), + MAP(HEVC, HEVC_MAIN_10, HEVC_MAIN10 ), + MAP(HEVC, HEVC_MAIN_STILL_PICTURE, HEVC_MAINSP ), +#endif +#if QSV_VERSION_ATLEAST(1, 16) + MAP(HEVC, HEVC_REXT, HEVC_REXT ), +#endif + + MAP(VC1, VC1_SIMPLE, VC1_SIMPLE ), + MAP(VC1, VC1_MAIN, VC1_MAIN ), + MAP(VC1, VC1_COMPLEX, VC1_ADVANCED ), + MAP(VC1, VC1_ADVANCED, VC1_ADVANCED ), +#undef MAP +}; + int ff_qsv_profile_to_mfx(enum AVCodecID codec_id, int profile) { + int i; if (profile == FF_PROFILE_UNKNOWN) return MFX_PROFILE_UNKNOWN; - switch (codec_id) { - case AV_CODEC_ID_H264: - case AV_CODEC_ID_HEVC: - return profile; - case AV_CODEC_ID_VC1: - return 4 * profile + 1; - case AV_CODEC_ID_MPEG2VIDEO: - return 0x10 * profile; + + for (i = 0; i < FF_ARRAY_ELEMS(qsv_profile_map); i++) { + if (qsv_profile_map[i].codec_id != codec_id) + continue; + if (qsv_profile_map[i].codec_profile == profile) + return qsv_profile_map[i].mfx_profile; } + return MFX_PROFILE_UNKNOWN; } |