libs: encoder: set VA HRD param before RC param
authorU. Artie Eoff <ullysses.a.eoff@intel.com>
Thu, 19 Mar 2020 18:19:18 +0000 (11:19 -0700)
committerU. Artie Eoff <ullysses.a.eoff@intel.com>
Thu, 19 Mar 2020 19:09:03 +0000 (12:09 -0700)
This is a workaround for intel-media-driver bug
https://github.com/intel/media-driver/issues/865

The driver will force the RC method to CBR for HEVCe
when it parses the HRD param.  Thus, any RC method
param submitted "prior" to the HRD param will be lost.
Therefore, VBR, ICQ and QVBR for HEVCe can't be
effectively enabled if the RC method param "precedes"
the HRD param.

To work around this issue, set the HRD param before
the RC method param so the driver will parse the RC
method param "after" the HRD param.

Afaict, other codecs in the driver (and other drivers)
do not appear to be dependent on the order of HRD and
RC param submission.

gst-libs/gst/vaapi/gstvaapiencoder.c

index 1184fc8..bc2584b 100644 (file)
@@ -63,21 +63,21 @@ gst_vaapi_encoder_ensure_param_control_rate (GstVaapiEncoder * encoder,
   if (GST_VAAPI_ENCODER_RATE_CONTROL (encoder) == GST_VAAPI_RATECONTROL_CQP)
     return TRUE;
 
-  /* RateControl params */
-  misc = GST_VAAPI_ENC_MISC_PARAM_NEW (RateControl, encoder);
+  /* HRD params */
+  misc = GST_VAAPI_ENC_MISC_PARAM_NEW (HRD, encoder);
   if (!misc)
     return FALSE;
-  memcpy (misc->data, &GST_VAAPI_ENCODER_VA_RATE_CONTROL (encoder),
-      sizeof (VAEncMiscParameterRateControl));
+  memcpy (misc->data, &GST_VAAPI_ENCODER_VA_HRD (encoder),
+      sizeof (VAEncMiscParameterHRD));
   gst_vaapi_enc_picture_add_misc_param (picture, misc);
   gst_vaapi_codec_object_replace (&misc, NULL);
 
-  /* HRD params */
-  misc = GST_VAAPI_ENC_MISC_PARAM_NEW (HRD, encoder);
+  /* RateControl params */
+  misc = GST_VAAPI_ENC_MISC_PARAM_NEW (RateControl, encoder);
   if (!misc)
     return FALSE;
-  memcpy (misc->data, &GST_VAAPI_ENCODER_VA_HRD (encoder),
-      sizeof (VAEncMiscParameterHRD));
+  memcpy (misc->data, &GST_VAAPI_ENCODER_VA_RATE_CONTROL (encoder),
+      sizeof (VAEncMiscParameterRateControl));
   gst_vaapi_enc_picture_add_misc_param (picture, misc);
   gst_vaapi_codec_object_replace (&misc, NULL);