lavc/qsv: extactly map profile
authorZhong Li <zhong.li@intel.com>
Sun, 28 Apr 2019 12:27:48 +0000 (20:27 +0800)
committerZhong Li <zhong.li@intel.com>
Tue, 7 May 2019 03:00:19 +0000 (11:00 +0800)
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>
libavcodec/qsv.c

index 4d3fbaf..986d4f6 100644 (file)
@@ -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;
 }