Message ID | 1517211074-31516-1-git-send-email-zhong.li@intel.com |
---|---|
State | New |
Headers | show |
Series |
|
Related | show |
LGTM as well, will take care of it this week. On Mon, Jan 29, 2018 at 9:20 AM, Luca Barbato <lu_zero@gentoo.org> wrote: > On 29/01/2018 08:31, Zhong Li wrote: > >> Currently key_frame and pict_type are unset. >> Add an extra param to fetch the picture type from qsv decoder >> >> Signed-off-by: ChaoX A Liu <chaox.a.liu@intel.com> >> Signed-off-by: Zhong Li <zhong.li@intel.com> >> --- >> libavcodec/qsv.c | 24 ++++++++++++++++++++++++ >> libavcodec/qsv_internal.h | 3 +++ >> libavcodec/qsvdec.c | 7 +++++++ >> 3 files changed, 34 insertions(+) >> >> diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c >> index e78633d..9639bf7 100644 >> --- a/libavcodec/qsv.c >> +++ b/libavcodec/qsv.c >> @@ -195,6 +195,30 @@ 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 = AV_PICTURE_TYPE_NONE; >> + 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; >> + } >> + >> + return type; >> +} >> + >> static int qsv_load_plugins(mfxSession session, const char >> *load_plugins, >> void *logctx) >> { >> diff --git a/libavcodec/qsv_internal.h b/libavcodec/qsv_internal.h >> index 975c8de..07ddc59 100644 >> --- a/libavcodec/qsv_internal.h >> +++ b/libavcodec/qsv_internal.h >> @@ -48,6 +48,8 @@ typedef struct QSVMid { >> typedef struct QSVFrame { >> AVFrame *frame; >> mfxFrameSurface1 surface; >> + mfxExtDecodedFrameInfo dec_info; >> + mfxExtBuffer *ext_param; >> int queued; >> int used; >> @@ -83,6 +85,7 @@ int ff_qsv_codec_id_to_mfx(enum AVCodecID codec_id); >> int ff_qsv_profile_to_mfx(enum AVCodecID codec_id, int profile); >> int ff_qsv_map_pixfmt(enum AVPixelFormat format, uint32_t *fourcc); >> +enum AVPictureType ff_qsv_map_pictype(int mfx_pic_type); >> int ff_qsv_init_internal_session(AVCodecContext *avctx, mfxSession >> *session, >> const char *load_plugins); >> diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c >> index f31172d..9ee4177 100644 >> --- a/libavcodec/qsvdec.c >> +++ b/libavcodec/qsvdec.c >> @@ -232,6 +232,11 @@ static int alloc_frame(AVCodecContext *avctx, >> QSVContext *q, QSVFrame *frame) >> frame->surface.Data.MemId = &q->frames_ctx.mids[ret]; >> } >> + frame->surface.Data.ExtParam = &frame->ext_param; >> + frame->surface.Data.NumExtParam = 1; >> + frame->ext_param = (mfxExtBuffer*)&frame->dec_info; >> + frame->dec_info.Header.BufferId = MFX_EXTBUFF_DECODED_FRAME_INFO; >> + frame->dec_info.Header.BufferSz = sizeof(frame->dec_info); >> frame->used = 1; >> @@ -416,6 +421,8 @@ FF_ENABLE_DEPRECATION_WARNINGS >> outsurf->Info.PicStruct & MFX_PICSTRUCT_FIELD_TFF; >> frame->interlaced_frame = >> !(outsurf->Info.PicStruct & MFX_PICSTRUCT_PROGRESSIVE); >> + frame->pict_type = ff_qsv_map_pictype(out_frame-> >> dec_info.FrameType); >> + frame->key_frame = !!(out_frame->dec_info.FrameType & >> MFX_FRAMETYPE_IDR); >> /* update the surface properties */ >> if (avctx->pix_fmt == AV_PIX_FMT_QSV) >> >> > Seems fine to me. > _______________________________________________ > libav-devel mailing list > libav-devel@libav.org > https://lists.libav.org/mailman/listinfo/libav-devel
diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c index e78633d..9639bf7 100644 --- a/libavcodec/qsv.c +++ b/libavcodec/qsv.c @@ -195,6 +195,30 @@ 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 = AV_PICTURE_TYPE_NONE; + 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; + } + + return type; +} + static int qsv_load_plugins(mfxSession session, const char *load_plugins, void *logctx) { diff --git a/libavcodec/qsv_internal.h b/libavcodec/qsv_internal.h index 975c8de..07ddc59 100644 --- a/libavcodec/qsv_internal.h +++ b/libavcodec/qsv_internal.h @@ -48,6 +48,8 @@ typedef struct QSVMid { typedef struct QSVFrame { AVFrame *frame; mfxFrameSurface1 surface; + mfxExtDecodedFrameInfo dec_info; + mfxExtBuffer *ext_param; int queued; int used; @@ -83,6 +85,7 @@ int ff_qsv_codec_id_to_mfx(enum AVCodecID codec_id); int ff_qsv_profile_to_mfx(enum AVCodecID codec_id, int profile); int ff_qsv_map_pixfmt(enum AVPixelFormat format, uint32_t *fourcc); +enum AVPictureType ff_qsv_map_pictype(int mfx_pic_type); int ff_qsv_init_internal_session(AVCodecContext *avctx, mfxSession *session, const char *load_plugins); diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c index f31172d..9ee4177 100644 --- a/libavcodec/qsvdec.c +++ b/libavcodec/qsvdec.c @@ -232,6 +232,11 @@ static int alloc_frame(AVCodecContext *avctx, QSVContext *q, QSVFrame *frame) frame->surface.Data.MemId = &q->frames_ctx.mids[ret]; } + frame->surface.Data.ExtParam = &frame->ext_param; + frame->surface.Data.NumExtParam = 1; + frame->ext_param = (mfxExtBuffer*)&frame->dec_info; + frame->dec_info.Header.BufferId = MFX_EXTBUFF_DECODED_FRAME_INFO; + frame->dec_info.Header.BufferSz = sizeof(frame->dec_info); frame->used = 1; @@ -416,6 +421,8 @@ FF_ENABLE_DEPRECATION_WARNINGS outsurf->Info.PicStruct & MFX_PICSTRUCT_FIELD_TFF; frame->interlaced_frame = !(outsurf->Info.PicStruct & MFX_PICSTRUCT_PROGRESSIVE); + frame->pict_type = ff_qsv_map_pictype(out_frame->dec_info.FrameType); + frame->key_frame = !!(out_frame->dec_info.FrameType & MFX_FRAMETYPE_IDR); /* update the surface properties */ if (avctx->pix_fmt == AV_PIX_FMT_QSV)