mirror of
https://github.com/xenia-project/FFmpeg.git
synced 2024-12-19 01:27:28 +00:00
Merge commit '52ed83fa1a7f5170447eff6fad0b6c57119596e9'
* commit '52ed83fa1a7f5170447eff6fad0b6c57119596e9': lavc/qsvdec: expose frame pic_type and key_frame Merged-by: James Almer <jamrial@gmail.com>
This commit is contained in:
commit
6f277e1f76
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
@ -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…
Reference in New Issue
Block a user