diff mbox series

[FFmpeg-devel,1/2] lavc/qsv: allow to add more parameter buffers to QSV frame

Message ID 20210323030007.590540-1-haihao.xiang@intel.com
State New
Headers show
Series [FFmpeg-devel,1/2] lavc/qsv: allow to add more parameter buffers to QSV frame | expand

Checks

Context Check Description
andriy/x86_make success Make finished
andriy/x86_make_fate success Make fate finished
andriy/PPC64_make success Make finished
andriy/PPC64_make_fate success Make fate finished

Commit Message

Xiang, Haihao March 23, 2021, 3 a.m. UTC
---
 libavcodec/qsv.c          | 27 +++++++++++++++++++++++++++
 libavcodec/qsv_internal.h |  8 +++++++-
 libavcodec/qsvdec.c       |  8 +++++---
 3 files changed, 39 insertions(+), 4 deletions(-)

Comments

Xiang, Haihao Dec. 29, 2021, 5:46 a.m. UTC | #1
On Tue, 2021-03-23 at 11:00 +0800, Haihao Xiang wrote:
> ---
>  libavcodec/qsv.c          | 27 +++++++++++++++++++++++++++
>  libavcodec/qsv_internal.h |  8 +++++++-
>  libavcodec/qsvdec.c       |  8 +++++---
>  3 files changed, 39 insertions(+), 4 deletions(-)
> 
> diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c
> index 6e3154e1a3..879e109092 100644
> --- a/libavcodec/qsv.c
> +++ b/libavcodec/qsv.c
> @@ -821,3 +821,30 @@ int ff_qsv_close_internal_session(QSVSession *qs)
>  #endif
>      return 0;
>  }
> +
> +void ff_qsv_frame_add_ext_param (AVCodecContext *avctx, QSVFrame *frame,
> +                                 mfxExtBuffer * param)
> +{
> +    int i;
> +
> +    for (i = 0; i < frame->num_ext_params; i++) {
> +        mfxExtBuffer *ext_buffer = frame->ext_param[i];
> +
> +        if (ext_buffer->BufferId == param->BufferId) {
> +            av_log(avctx, AV_LOG_WARNING, "A buffer with the same type has
> been "
> +                   "added\n");
> +            return;
> +        }
> +    }
> +
> +    if (frame->num_ext_params < QSV_MAX_FRAME_EXT_PARAMS) {
> +        frame->ext_param[frame->num_ext_params] = param;
> +        frame->num_ext_params++;
> +        frame->surface.Data.NumExtParam = frame->num_ext_params;
> +    } else {
> +        av_log(avctx, AV_LOG_WARNING, "Ignore this extra buffer because do
> not "
> +               "have enough space\n");
> +    }
> +
> +
> +}
> diff --git a/libavcodec/qsv_internal.h b/libavcodec/qsv_internal.h
> index 6b2fbbe252..1d94d429e8 100644
> --- a/libavcodec/qsv_internal.h
> +++ b/libavcodec/qsv_internal.h
> @@ -52,6 +52,8 @@
>  
>  #define QSV_MAX_ENC_PAYLOAD 2       // # of mfxEncodeCtrl payloads supported
>  
> +#define QSV_MAX_FRAME_EXT_PARAMS 4
> +
>  #define QSV_VERSION_ATLEAST(MAJOR, MINOR)   \
>      (MFX_VERSION_MAJOR > (MAJOR) ||         \
>       MFX_VERSION_MAJOR == (MAJOR) && MFX_VERSION_MINOR >= (MINOR))
> @@ -74,7 +76,8 @@ typedef struct QSVFrame {
>      mfxFrameSurface1 surface;
>      mfxEncodeCtrl enc_ctrl;
>      mfxExtDecodedFrameInfo dec_info;
> -    mfxExtBuffer *ext_param;
> +    mfxExtBuffer *ext_param[QSV_MAX_FRAME_EXT_PARAMS];
> +    int num_ext_params;
>  
>      int queued;
>      int used;
> @@ -142,4 +145,7 @@ int ff_qsv_init_session_frames(AVCodecContext *avctx,
> mfxSession *session,
>  
>  int ff_qsv_find_surface_idx(QSVFramesContext *ctx, QSVFrame *frame);
>  
> +void ff_qsv_frame_add_ext_param(AVCodecContext *avctx, QSVFrame *frame,
> +                                mfxExtBuffer *param);
> +
>  #endif /* AVCODEC_QSV_INTERNAL_H */
> diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c
> index 5f2e641373..55cf9f35c5 100644
> --- a/libavcodec/qsvdec.c
> +++ b/libavcodec/qsvdec.c
> @@ -366,11 +366,13 @@ 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->surface.Data.ExtParam    = frame->ext_param;
> +    frame->surface.Data.NumExtParam = 0;
> +    frame->num_ext_params           = 0;
>      frame->dec_info.Header.BufferId = MFX_EXTBUFF_DECODED_FRAME_INFO;
>      frame->dec_info.Header.BufferSz = sizeof(frame->dec_info);
> +    ff_qsv_frame_add_ext_param(avctx, frame, (mfxExtBuffer *)&frame-
> >dec_info);
>  
>      frame->used = 1;

Will apply if no objection, 

-Haihao

>
diff mbox series

Patch

diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c
index 6e3154e1a3..879e109092 100644
--- a/libavcodec/qsv.c
+++ b/libavcodec/qsv.c
@@ -821,3 +821,30 @@  int ff_qsv_close_internal_session(QSVSession *qs)
 #endif
     return 0;
 }
+
+void ff_qsv_frame_add_ext_param (AVCodecContext *avctx, QSVFrame *frame,
+                                 mfxExtBuffer * param)
+{
+    int i;
+
+    for (i = 0; i < frame->num_ext_params; i++) {
+        mfxExtBuffer *ext_buffer = frame->ext_param[i];
+
+        if (ext_buffer->BufferId == param->BufferId) {
+            av_log(avctx, AV_LOG_WARNING, "A buffer with the same type has been "
+                   "added\n");
+            return;
+        }
+    }
+
+    if (frame->num_ext_params < QSV_MAX_FRAME_EXT_PARAMS) {
+        frame->ext_param[frame->num_ext_params] = param;
+        frame->num_ext_params++;
+        frame->surface.Data.NumExtParam = frame->num_ext_params;
+    } else {
+        av_log(avctx, AV_LOG_WARNING, "Ignore this extra buffer because do not "
+               "have enough space\n");
+    }
+
+
+}
diff --git a/libavcodec/qsv_internal.h b/libavcodec/qsv_internal.h
index 6b2fbbe252..1d94d429e8 100644
--- a/libavcodec/qsv_internal.h
+++ b/libavcodec/qsv_internal.h
@@ -52,6 +52,8 @@ 
 
 #define QSV_MAX_ENC_PAYLOAD 2       // # of mfxEncodeCtrl payloads supported
 
+#define QSV_MAX_FRAME_EXT_PARAMS 4
+
 #define QSV_VERSION_ATLEAST(MAJOR, MINOR)   \
     (MFX_VERSION_MAJOR > (MAJOR) ||         \
      MFX_VERSION_MAJOR == (MAJOR) && MFX_VERSION_MINOR >= (MINOR))
@@ -74,7 +76,8 @@  typedef struct QSVFrame {
     mfxFrameSurface1 surface;
     mfxEncodeCtrl enc_ctrl;
     mfxExtDecodedFrameInfo dec_info;
-    mfxExtBuffer *ext_param;
+    mfxExtBuffer *ext_param[QSV_MAX_FRAME_EXT_PARAMS];
+    int num_ext_params;
 
     int queued;
     int used;
@@ -142,4 +145,7 @@  int ff_qsv_init_session_frames(AVCodecContext *avctx, mfxSession *session,
 
 int ff_qsv_find_surface_idx(QSVFramesContext *ctx, QSVFrame *frame);
 
+void ff_qsv_frame_add_ext_param(AVCodecContext *avctx, QSVFrame *frame,
+                                mfxExtBuffer *param);
+
 #endif /* AVCODEC_QSV_INTERNAL_H */
diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c
index 5f2e641373..55cf9f35c5 100644
--- a/libavcodec/qsvdec.c
+++ b/libavcodec/qsvdec.c
@@ -366,11 +366,13 @@  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->surface.Data.ExtParam    = frame->ext_param;
+    frame->surface.Data.NumExtParam = 0;
+    frame->num_ext_params           = 0;
     frame->dec_info.Header.BufferId = MFX_EXTBUFF_DECODED_FRAME_INFO;
     frame->dec_info.Header.BufferSz = sizeof(frame->dec_info);
+    ff_qsv_frame_add_ext_param(avctx, frame, (mfxExtBuffer *)&frame->dec_info);
 
     frame->used = 1;