X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fqsv.c;h=bb0d79588c4d66e0fd149bd8be6fec4f9d076d8a;hb=0c71c6d66f9ae8265158181e5b1cbc5c63525fde;hp=5217adfa9d1574428937bb0a39adfad8e871c7d0;hpb=20608261f7818fc034f96034a089e755f095716e;p=ffmpeg diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c index 5217adfa9d1..bb0d79588c4 100644 --- a/libavcodec/qsv.c +++ b/libavcodec/qsv.c @@ -31,6 +31,7 @@ #include "libavutil/hwcontext.h" #include "libavutil/hwcontext_qsv.h" #include "libavutil/imgutils.h" +#include "libavutil/avassert.h" #include "avcodec.h" #include "qsv_internal.h" @@ -195,6 +196,35 @@ int ff_qsv_find_surface_idx(QSVFramesContext *ctx, QSVFrame *frame) return AVERROR_BUG; } +enum AVPictureType ff_qsv_map_pictype(int mfx_pic_type) +{ + enum AVPictureType type; + switch (mfx_pic_type & 0x7) { + case MFX_FRAMETYPE_I: + if (mfx_pic_type & MFX_FRAMETYPE_S) + type = AV_PICTURE_TYPE_SI; + else + type = AV_PICTURE_TYPE_I; + break; + case MFX_FRAMETYPE_B: + type = AV_PICTURE_TYPE_B; + break; + case MFX_FRAMETYPE_P: + if (mfx_pic_type & MFX_FRAMETYPE_S) + type = AV_PICTURE_TYPE_SP; + else + type = AV_PICTURE_TYPE_P; + break; + case MFX_FRAMETYPE_UNKNOWN: + type = AV_PICTURE_TYPE_NONE; + break; + default: + av_assert0(0); + } + + return type; +} + static int qsv_load_plugins(mfxSession session, const char *load_plugins, void *logctx) { @@ -593,10 +623,12 @@ int ff_qsv_init_session_device(AVCodecContext *avctx, mfxSession *psession, "Error setting a HW handle"); } - err = MFXJoinSession(parent_session, session); - if (err != MFX_ERR_NONE) - return ff_qsv_print_error(avctx, err, - "Error joining session"); + if (QSV_RUNTIME_VERSION_ATLEAST(ver, 1, 25)) { + err = MFXJoinSession(parent_session, session); + if (err != MFX_ERR_NONE) + return ff_qsv_print_error(avctx, err, + "Error joining session"); + } ret = qsv_load_plugins(session, load_plugins, avctx); if (ret < 0) {