]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/qsv.c
avcodec/aacdec: Add FF_CODEC_CAP_INIT_CLEANUP
[ffmpeg] / libavcodec / qsv.c
index bb0d79588c4d66e0fd149bd8be6fec4f9d076d8a..65ad070e1facaee3be3307be729630fade32cb86 100644 (file)
@@ -60,6 +60,11 @@ int ff_qsv_codec_id_to_mfx(enum AVCodecID codec_id)
 #endif
     case AV_CODEC_ID_MJPEG:
         return MFX_CODEC_JPEG;
+#if QSV_VERSION_ATLEAST(1, 19)
+    case AV_CODEC_ID_VP9:
+        return MFX_CODEC_VP9;
+#endif
+
     default:
         break;
     }
@@ -67,20 +72,69 @@ 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;
+
+    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;
+}
+
+int ff_qsv_level_to_mfx(enum AVCodecID codec_id, int level)
+{
+    if (level == FF_LEVEL_UNKNOWN)
+        return MFX_LEVEL_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;
+        return level / 3;
+    default:
+        return level;
     }
-    return MFX_PROFILE_UNKNOWN;
 }
 
 static const struct {
@@ -158,7 +212,7 @@ int ff_qsv_print_warning(void *log_ctx, mfxStatus err,
     return ret;
 }
 
-static enum AVPixelFormat qsv_map_fourcc(uint32_t fourcc)
+enum AVPixelFormat ff_qsv_map_fourcc(uint32_t fourcc)
 {
     switch (fourcc) {
     case MFX_FOURCC_NV12: return AV_PIX_FMT_NV12;
@@ -196,6 +250,24 @@ int ff_qsv_find_surface_idx(QSVFramesContext *ctx, QSVFrame *frame)
     return AVERROR_BUG;
 }
 
+enum AVFieldOrder ff_qsv_map_picstruct(int mfx_pic_struct)
+{
+    enum AVFieldOrder field = AV_FIELD_UNKNOWN;
+    switch (mfx_pic_struct & 0xF) {
+    case MFX_PICSTRUCT_PROGRESSIVE:
+        field = AV_FIELD_PROGRESSIVE;
+        break;
+    case MFX_PICSTRUCT_FIELD_TFF:
+        field = AV_FIELD_TT;
+        break;
+    case MFX_PICSTRUCT_FIELD_BFF:
+        field = AV_FIELD_BB;
+        break;
+    }
+
+    return field;
+}
+
 enum AVPictureType ff_qsv_map_pictype(int mfx_pic_type)
 {
     enum AVPictureType type;
@@ -451,7 +523,7 @@ static mfxStatus qsv_frame_alloc(mfxHDL pthis, mfxFrameAllocRequest *req,
         frames_hwctx = frames_ctx->hwctx;
 
         frames_ctx->format            = AV_PIX_FMT_QSV;
-        frames_ctx->sw_format         = qsv_map_fourcc(i->FourCC);
+        frames_ctx->sw_format         = ff_qsv_map_fourcc(i->FourCC);
         frames_ctx->width             = i->Width;
         frames_ctx->height            = i->Height;
         frames_ctx->initial_pool_size = req->NumFrameSuggested;