[libav-devel] [PATCH] lavc/qsvdec: expose frame pic_type and key_frame

Maxym Dmytrychenko maxim.d33 at gmail.com
Mon Jan 29 20:31:02 CET 2018


LGTM as well,
will take care of it this week.

On Mon, Jan 29, 2018 at 9:20 AM, Luca Barbato <lu_zero at 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 at intel.com>
>> Signed-off-by: Zhong Li <zhong.li at 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 at libav.org
> https://lists.libav.org/mailman/listinfo/libav-devel


More information about the libav-devel mailing list