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....@intel.com>
Signed-off-by: Zhong Li <zhong...@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@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to