[FFmpeg-devel,1/3] lavc/vaapi_encode: Change the encode common code to support mutil-refs.

Submitted by Jun Zhao on Nov. 8, 2017, 8:20 a.m.

Details

Message ID 9a0a1319-8e13-5244-fc00-53d563b9b9e8@gmail.com
State New
Headers show

Commit Message

Jun Zhao Nov. 8, 2017, 8:20 a.m.
This is a early version for RFC, and will refactoring if have some comments.
Test with i965 mainline master branch, test command like this:

  ffmpeg -hwaccel vaapi -hwaccel_device /dev/dri/renderD128
-hwaccel_output_format vaapi -i input.mp4 -c:v h264_vaapi -refs 4
output_refs4.mp4

  ffmpeg -hwaccel vaapi -hwaccel_device /dev/dri/renderD128
-hwaccel_output_format vaapi -i input.mp4 -c:v hevc_vaapi -refs 4
output_refs4.mp4
From 703e4425942eb51cfddda578bd21d1662cc50be7 Mon Sep 17 00:00:00 2001
From: Jun Zhao <jun.zhao@intel.com>
Date: Tue, 7 Nov 2017 14:30:57 +0800
Subject: [PATCH 1/3] lavc/vaapi_encode: Change the encode common code to
 support mutil-refs.

Move vaapi_encode_alloc/free/step/output to vaapi_encode.h and change
the max reference frames number.

Signed-off-by: Jun Zhao <jun.zhao@intel.com>
Signed-off-by: Wang, Yi A <yi.a.wang@intel.com>
---
 libavcodec/vaapi_encode.c | 21 ++++++++++++++-------
 libavcodec/vaapi_encode.h | 19 ++++++++++++++++++-
 2 files changed, 32 insertions(+), 8 deletions(-)

Patch hide | download patch | download mbox

diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c
index 590f4be4ed..74bb02dc29 100644
--- a/libavcodec/vaapi_encode.c
+++ b/libavcodec/vaapi_encode.c
@@ -108,6 +108,7 @@  static int vaapi_encode_wait(AVCodecContext *avctx,
 {
     VAAPIEncodeContext *ctx = avctx->priv_data;
     VAStatus vas;
+    int i;
 
     av_assert0(pic->encode_issued);
 
@@ -131,6 +132,9 @@  static int vaapi_encode_wait(AVCodecContext *avctx,
     av_frame_free(&pic->input_image);
 
     pic->encode_complete = 1;
+    for (i = 0; i < pic->nb_refs; i++) {
+        pic->refs[i]->ref_count --;
+    }
     return 0;
 }
 
@@ -448,8 +452,8 @@  fail_at_end:
     return err;
 }
 
-static int vaapi_encode_output(AVCodecContext *avctx,
-                               VAAPIEncodePicture *pic, AVPacket *pkt)
+int vaapi_encode_output(AVCodecContext *avctx,
+		        VAAPIEncodePicture *pic, AVPacket *pkt)
 {
     VAAPIEncodeContext *ctx = avctx->priv_data;
     VACodedBufferSegment *buf_list, *buf;
@@ -526,7 +530,7 @@  static int vaapi_encode_discard(AVCodecContext *avctx,
     return 0;
 }
 
-static VAAPIEncodePicture *vaapi_encode_alloc(void)
+VAAPIEncodePicture *vaapi_encode_alloc(void)
 {
     VAAPIEncodePicture *pic;
 
@@ -541,8 +545,8 @@  static VAAPIEncodePicture *vaapi_encode_alloc(void)
     return pic;
 }
 
-static int vaapi_encode_free(AVCodecContext *avctx,
-                             VAAPIEncodePicture *pic)
+int vaapi_encode_free(AVCodecContext *avctx,
+                      VAAPIEncodePicture *pic)
 {
     int i;
 
@@ -573,8 +577,8 @@  static int vaapi_encode_free(AVCodecContext *avctx,
     return 0;
 }
 
-static int vaapi_encode_step(AVCodecContext *avctx,
-                             VAAPIEncodePicture *target)
+int vaapi_encode_step(AVCodecContext *avctx,
+                      VAAPIEncodePicture *target)
 {
     VAAPIEncodeContext *ctx = avctx->priv_data;
     VAAPIEncodePicture *pic;
@@ -1097,6 +1101,8 @@  static av_cold int vaapi_encode_config_attributes(AVCodecContext *avctx)
                 err = AVERROR(EINVAL);
                 goto fail;
             }
+	    ctx->max_ref_l0 = ref_l0;
+	    ctx->max_ref_l1 = ref_l1;
         }
         break;
         case VAConfigAttribEncPackedHeaders:
@@ -1340,6 +1346,7 @@  static av_cold int vaapi_encode_create_recon_frames(AVCodecContext *avctx)
     // At most three IDR/I/P frames and two runs of B frames can be in
     // flight at any one time.
     ctx->recon_frames->initial_pool_size = 3 + 2 * avctx->max_b_frames;
+    ctx->recon_frames->initial_pool_size += ctx->max_ref_l0 + ctx->max_ref_l1;
 
     err = av_hwframe_ctx_init(ctx->recon_frames_ref);
     if (err < 0) {
diff --git a/libavcodec/vaapi_encode.h b/libavcodec/vaapi_encode.h
index bcb9d57371..53950cc0a1 100644
--- a/libavcodec/vaapi_encode.h
+++ b/libavcodec/vaapi_encode.h
@@ -34,7 +34,7 @@  struct VAAPIEncodePicture;
 enum {
     MAX_CONFIG_ATTRIBUTES  = 4,
     MAX_GLOBAL_PARAMS      = 4,
-    MAX_PICTURE_REFERENCES = 2,
+    MAX_PICTURE_REFERENCES = 12,
     MAX_REORDER_DELAY      = 16,
     MAX_PARAM_BUFFER_SIZE  = 1024,
 };
@@ -79,9 +79,12 @@  typedef struct VAAPIEncodePicture {
     void           *priv_data;
     void           *codec_picture_params;
 
+    int          ref_count;
+
     int          nb_refs;
     struct VAAPIEncodePicture *refs[MAX_PICTURE_REFERENCES];
 
+
     int          nb_slices;
     VAAPIEncodeSlice *slices;
 } VAAPIEncodePicture;
@@ -206,6 +209,10 @@  typedef struct VAAPIEncodeContext {
     int p_counter;
     int end_of_stream;
 
+    // max reference frame number
+    int max_ref_l0;
+    int max_ref_l1;
+
     // Codec-local options are allocated to follow this structure in
     // memory (in the AVCodec definition, set priv_data_size to
     // sizeof(VAAPIEncodeContext) + sizeof(VAAPIEncodeFooOptions)).
@@ -279,5 +286,15 @@  int ff_vaapi_encode2(AVCodecContext *avctx, AVPacket *pkt,
 
 int ff_vaapi_encode_init(AVCodecContext *avctx);
 int ff_vaapi_encode_close(AVCodecContext *avctx);
+VAAPIEncodePicture *vaapi_encode_alloc(void);
+int vaapi_encode_free(AVCodecContext *avctx,
+                      VAAPIEncodePicture *pic);
+
+int vaapi_encode_step(AVCodecContext *avctx,
+                      VAAPIEncodePicture *target);
+int vaapi_encode_output(AVCodecContext *avctx,
+                        VAAPIEncodePicture *pic, AVPacket *pkt);
+
+
 
 #endif /* AVCODEC_VAAPI_ENCODE_H */