On 30/01/18 09:52, 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 <[email protected]> > Signed-off-by: Zhong Li <[email protected]> > --- > 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..ffe7e6c 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; > + 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) >
Does this do the right thing for H.265? (Can't test right now.) I'm asking that because I know that frame types are still a problem for H.265 encoding, because not all IRAPs are IDR - when CRA frames are generated they aren't marked as key. The FrameType field (as used here) is not sufficient in that case, but I never sorted out exactly what does contain the necessary information. - Mark _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
