libs: encoder: h264,vp8,mpeg2: refactor control rate
authorVíctor Manuel Jáquez Leal <vjaquez@igalia.com>
Fri, 2 Jun 2017 15:21:25 +0000 (17:21 +0200)
committerVíctor Manuel Jáquez Leal <vjaquez@igalia.com>
Wed, 7 Jun 2017 09:24:38 +0000 (11:24 +0200)
Instead of filling the control rate param in ensure_misc_params(),
this patch refactor it out, as a first step to merge the same code
for all the encoders.

https://bugzilla.gnome.org/show_bug.cgi?id=783449

gst-libs/gst/vaapi/gstvaapiencoder_h264.c
gst-libs/gst/vaapi/gstvaapiencoder_mpeg2.c
gst-libs/gst/vaapi/gstvaapiencoder_vp8.c

index fbe5d45ba47488dcad89262b1518f87fadb387da..0f046bb6d7d9ae53963a058c4215a8bd8be9e314 100644 (file)
@@ -2153,13 +2153,44 @@ error_create_packed_seq_hdr:
   }
 }
 
+static gboolean
+ensure_control_rate_params (GstVaapiEncoderH264 * encoder,
+    GstVaapiEncPicture * picture)
+{
+  GstVaapiEncMiscParam *misc;
+
+  if (GST_VAAPI_ENCODER_RATE_CONTROL (encoder) == GST_VAAPI_RATECONTROL_CQP)
+    return TRUE;
+
+  /* RateControl params */
+  misc = GST_VAAPI_ENC_MISC_PARAM_NEW (RateControl, encoder);
+  if (!misc)
+    return FALSE;
+
+  {
+    VAEncMiscParameterRateControl rate_control = {
+      .bits_per_second = encoder->bitrate_bits,
+      .target_percentage = 70,
+      .window_size = encoder->cpb_length,
+      .initial_qp = encoder->init_qp,
+      .min_qp = encoder->min_qp,
+    };
+
+    memcpy (misc->data, &rate_control, sizeof (rate_control));
+  }
+
+  gst_vaapi_enc_picture_add_misc_param (picture, misc);
+  gst_vaapi_codec_object_replace (&misc, NULL);
+
+  return TRUE;
+}
+
 /* Generates additional control parameters */
 static gboolean
 ensure_misc_params (GstVaapiEncoderH264 * encoder, GstVaapiEncPicture * picture)
 {
   GstVaapiEncoder *const base_encoder = GST_VAAPI_ENCODER_CAST (encoder);
-  GstVaapiEncMiscParam *misc = NULL;
-  VAEncMiscParameterRateControl *rate_control;
+  GstVaapiEncMiscParam *misc;
   guint num_roi;
 
   /* HRD params */
@@ -2170,23 +2201,11 @@ ensure_misc_params (GstVaapiEncoderH264 * encoder, GstVaapiEncPicture * picture)
   gst_vaapi_enc_picture_add_misc_param (picture, misc);
   gst_vaapi_codec_object_replace (&misc, NULL);
 
-  /* RateControl params */
+  if (!ensure_control_rate_params (encoder, picture))
+    return FALSE;
+
   if (GST_VAAPI_ENCODER_RATE_CONTROL (encoder) == GST_VAAPI_RATECONTROL_CBR ||
       GST_VAAPI_ENCODER_RATE_CONTROL (encoder) == GST_VAAPI_RATECONTROL_VBR) {
-    misc = GST_VAAPI_ENC_MISC_PARAM_NEW (RateControl, encoder);
-    if (!misc)
-      return FALSE;
-    rate_control = misc->data;
-    memset (rate_control, 0, sizeof (VAEncMiscParameterRateControl));
-    rate_control->bits_per_second = encoder->bitrate_bits;
-    rate_control->target_percentage = 70;
-    rate_control->window_size = encoder->cpb_length;
-    rate_control->initial_qp = encoder->init_qp;
-    rate_control->min_qp = encoder->min_qp;
-    rate_control->basic_unit_size = 0;
-    gst_vaapi_enc_picture_add_misc_param (picture, misc);
-    gst_vaapi_codec_object_replace (&misc, NULL);
-
     if (!encoder->view_idx) {
       if ((GST_VAAPI_ENC_PICTURE_IS_IDR (picture)) &&
           (GST_VAAPI_ENCODER_PACKED_HEADERS (encoder) &
index 02700920f4d5e538b596002b3751e7a68d5131c3..dd878d88201646b15f0d7534214ef926dedef244 100644 (file)
@@ -451,6 +451,38 @@ ensure_picture (GstVaapiEncoderMpeg2 * encoder, GstVaapiEncPicture * picture,
   return TRUE;
 }
 
+static gboolean
+ensure_control_rate_params (GstVaapiEncoderMpeg2 * encoder,
+    GstVaapiEncPicture * picture)
+{
+  GstVaapiEncoder *const base_encoder = GST_VAAPI_ENCODER_CAST (encoder);
+  GstVaapiEncMiscParam *misc;
+
+  if (GST_VAAPI_ENCODER_RATE_CONTROL (encoder) == GST_VAAPI_RATECONTROL_CQP)
+    return TRUE;
+
+  /* RateControl params */
+  misc = GST_VAAPI_ENC_MISC_PARAM_NEW (RateControl, encoder);
+  if (!misc)
+    return FALSE;
+
+  {
+    VAEncMiscParameterRateControl rate_control = {
+      .bits_per_second = base_encoder->bitrate * 1000,
+      .target_percentage = 70,
+      .window_size = 500,
+      .initial_qp = encoder->cqp,
+    };
+
+    memcpy (misc->data, &rate_control, sizeof (rate_control));
+  }
+
+  gst_vaapi_enc_picture_add_misc_param (picture, misc);
+  gst_vaapi_codec_object_replace (&misc, NULL);
+
+  return TRUE;
+}
+
 static gboolean
 set_misc_parameters (GstVaapiEncoderMpeg2 * encoder,
     GstVaapiEncPicture * picture)
@@ -458,7 +490,6 @@ set_misc_parameters (GstVaapiEncoderMpeg2 * encoder,
   GstVaapiEncoder *const base_encoder = GST_VAAPI_ENCODER_CAST (encoder);
   GstVaapiEncMiscParam *misc = NULL;
   VAEncMiscParameterHRD *hrd;
-  VAEncMiscParameterRateControl *rate_control;
 
   /* add hrd */
   misc = GST_VAAPI_ENC_MISC_PARAM_NEW (HRD, encoder);
@@ -475,26 +506,8 @@ set_misc_parameters (GstVaapiEncoderMpeg2 * encoder,
   }
   gst_vaapi_codec_object_replace (&misc, NULL);
 
-  /* add ratecontrol */
-  if (GST_VAAPI_ENCODER_RATE_CONTROL (encoder) == GST_VAAPI_RATECONTROL_CBR) {
-    misc = GST_VAAPI_ENC_MISC_PARAM_NEW (RateControl, encoder);
-    if (!misc)
-      return FALSE;
-    gst_vaapi_enc_picture_add_misc_param (picture, misc);
-    rate_control = misc->data;
-    memset (rate_control, 0, sizeof (VAEncMiscParameterRateControl));
-    if (base_encoder->bitrate)
-      rate_control->bits_per_second = base_encoder->bitrate * 1000;
-    else
-      rate_control->bits_per_second = 0;
-    rate_control->target_percentage = 70;
-    rate_control->window_size = 500;
-    rate_control->initial_qp = encoder->cqp;
-    rate_control->min_qp = 0;
-    rate_control->basic_unit_size = 0;
-    gst_vaapi_codec_object_replace (&misc, NULL);
-  }
-
+  if (!ensure_control_rate_params (encoder, picture))
+    return FALSE;
   if (!gst_vaapi_encoder_ensure_param_quality_level (base_encoder, picture))
     return FALSE;
   return TRUE;
index 58ee55527b4924ab1bf1e0557b20e20e3457c59b..4a94af03e29d854fe867d7dff6e8380057446505 100644 (file)
@@ -257,6 +257,41 @@ error:
   }
 }
 
+static gboolean
+ensure_control_rate_params (GstVaapiEncoderVP8 * encoder,
+    GstVaapiEncPicture * picture)
+{
+  GstVaapiEncoder *const base_encoder = GST_VAAPI_ENCODER_CAST (encoder);
+  GstVaapiEncMiscParam *misc;
+
+  if (GST_VAAPI_ENCODER_RATE_CONTROL (encoder) == GST_VAAPI_RATECONTROL_CQP)
+    return TRUE;
+
+  /* RateControl params */
+  misc = GST_VAAPI_ENC_MISC_PARAM_NEW (RateControl, encoder);
+  if (!misc)
+    return FALSE;
+
+  {
+    VAEncMiscParameterRateControl rate_control = {
+      .bits_per_second = base_encoder->bitrate * 1000,
+      .target_percentage = 70,
+      /* CPB (Coded picture buffer) length in milliseconds, which
+       * could be provided as a property */
+      .window_size = 500,
+      .initial_qp = encoder->yac_qi,
+      .min_qp = 1,
+    };
+
+    memcpy (misc->data, &rate_control, sizeof (rate_control));
+  }
+
+  gst_vaapi_enc_picture_add_misc_param (picture, misc);
+  gst_vaapi_codec_object_replace (&misc, NULL);
+
+  return TRUE;
+}
+
 static gboolean
 ensure_misc_params (GstVaapiEncoderVP8 * encoder, GstVaapiEncPicture * picture)
 {
@@ -266,6 +301,9 @@ ensure_misc_params (GstVaapiEncoderVP8 * encoder, GstVaapiEncPicture * picture)
   if (!gst_vaapi_encoder_ensure_param_quality_level (base_encoder, picture))
     return FALSE;
 
+  if (!ensure_control_rate_params (encoder, picture))
+    return FALSE;
+
   if (GST_VAAPI_ENCODER_RATE_CONTROL (encoder) != GST_VAAPI_RATECONTROL_CBR)
     return TRUE;
 
@@ -297,25 +335,6 @@ ensure_misc_params (GstVaapiEncoderVP8 * encoder, GstVaapiEncPicture * picture)
   gst_vaapi_enc_picture_add_misc_param (picture, misc);
   gst_vaapi_codec_object_replace (&misc, NULL);
 
-  /* RateControl params */
-  misc = GST_VAAPI_ENC_MISC_PARAM_NEW (RateControl, encoder);
-  if (!misc)
-    return FALSE;
-  {
-    VAEncMiscParameterRateControl *rate_control;
-    rate_control = misc->data;
-    rate_control->bits_per_second = base_encoder->bitrate * 1000;
-    rate_control->target_percentage = 70;
-    /* CPB (Coded picture buffer) length in milliseconds, which could
-     * be provided as a property */
-    rate_control->window_size = 500;
-    rate_control->initial_qp = encoder->yac_qi;
-    rate_control->min_qp = 1;
-  }
-
-  gst_vaapi_enc_picture_add_misc_param (picture, misc);
-  gst_vaapi_codec_object_replace (&misc, NULL);
-
   return TRUE;
 }