aside of intend points at  frame->surface..., should be ok

On Thu, Mar 22, 2018 at 3:41 PM, Zhong Li <zhong...@intel.com> wrote:

> Currently pict_type are unset.
> Add an extra param to fetch the picture type from qsv decoder
>
> v2: fix the compile error since AV_PICTURE_TYPE_NONE is not existed in
> libav.
> v3: remove the key_frame setting because the judgement “key frame is equal
> to IDR frame” only suitable for H264.
> For HEVC, all IRAP frames are key frames, and other codecs have no IDR
> frame.
>
> Signed-off-by: ChaoX A Liu <chaox.a....@intel.com>
> Signed-off-by: Zhong Li <zhong...@intel.com>
> ---
>  libavcodec/qsv.c          | 24 ++++++++++++++++++++++++
>  libavcodec/qsv_internal.h |  3 +++
>  libavcodec/qsvdec.c       |  6 ++++++
>  3 files changed, 33 insertions(+)
>
> diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c
> index 96dca14..c7ba642 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 8148beb..c0ed4bd 100644
> --- a/libavcodec/qsvdec.c
> +++ b/libavcodec/qsvdec.c
> @@ -235,6 +235,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;
>
> @@ -421,6 +426,7 @@ 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);
>
>          /* update the surface properties */
>          if (avctx->pix_fmt == AV_PIX_FMT_QSV)
> --
> 1.8.3.1
>
> _______________________________________________
> libav-devel mailing list
> libav-devel@libav.org
> https://lists.libav.org/mailman/listinfo/libav-devel
_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to