[FFmpeg-cvslog] lavc/qsv: extactly map profile

Zhong Li git at videolan.org
Tue May 7 06:04:08 EEST 2019


ffmpeg | branch: master | Zhong Li <zhong.li at intel.com> | Sun Apr 28 20:27:48 2019 +0800| [5b318ce68df6cb4939b0be68e22853621e1e3aab] | committer: Zhong Li

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 at intel.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=5b318ce68df6cb4939b0be68e22853621e1e3aab
---

 libavcodec/qsv.c | 52 ++++++++++++++++++++++++++++++++++++++++++++--------
 1 file 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;
 }
 



More information about the ffmpeg-cvslog mailing list