#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;
}
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 {
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;
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;
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;