Browse Source

Merge commit '52ed83fa1a7f5170447eff6fad0b6c57119596e9'

* commit '52ed83fa1a7f5170447eff6fad0b6c57119596e9':
  lavc/qsvdec: expose frame pic_type and key_frame

Merged-by: James Almer <jamrial@gmail.com>
tags/n4.0
James Almer 7 years ago
parent
commit
6f277e1f76
3 changed files with 36 additions and 0 deletions
  1. +24
    -0
      libavcodec/qsv.c
  2. +3
    -0
      libavcodec/qsv_internal.h
  3. +9
    -0
      libavcodec/qsvdec.c

+ 24
- 0
libavcodec/qsv.c View File

@@ -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)
{


+ 3
- 0
libavcodec/qsv_internal.h View File

@@ -51,6 +51,8 @@ typedef struct QSVFrame {
AVFrame *frame;
mfxFrameSurface1 surface;
mfxEncodeCtrl enc_ctrl;
mfxExtDecodedFrameInfo dec_info;
mfxExtBuffer *ext_param;

int queued;
int used;
@@ -86,6 +88,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);


+ 9
- 0
libavcodec/qsvdec.c View File

@@ -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,10 @@ 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);
//Key frame is IDR frame is only suitable for H264. For HEVC, IRAPs are key frames.
if (avctx->codec_id == AV_CODEC_ID_H264)
frame->key_frame = !!(out_frame->dec_info.FrameType & MFX_FRAMETYPE_IDR);

/* update the surface properties */
if (avctx->pix_fmt == AV_PIX_FMT_QSV)


Loading…
Cancel
Save