libs: encoder: use VA quality level structure

Instead of using a proxy to story the buffer quality level, the
encoder now uses the native VA structure, which is copied to the
dynamically allocated VAEncMiscParameterBuffer.

This approach is computationally less expensive.
This commit is contained in:
Víctor Manuel Jáquez Leal 2017-06-05 18:19:05 +02:00
parent 0e31137dec
commit 37b81a7b69
2 changed files with 14 additions and 13 deletions

View file

@ -190,7 +190,6 @@ gst_vaapi_encoder_ensure_param_quality_level (GstVaapiEncoder * encoder,
{ {
#if VA_CHECK_VERSION(0,36,0) #if VA_CHECK_VERSION(0,36,0)
GstVaapiEncMiscParam *misc; GstVaapiEncMiscParam *misc;
VAEncMiscParameterBufferQualityLevel *quality_level;
/* quality level param is not supported */ /* quality level param is not supported */
if (GST_VAAPI_ENCODER_QUALITY_LEVEL (encoder) == 0) if (GST_VAAPI_ENCODER_QUALITY_LEVEL (encoder) == 0)
@ -199,9 +198,8 @@ gst_vaapi_encoder_ensure_param_quality_level (GstVaapiEncoder * encoder,
misc = GST_VAAPI_ENC_QUALITY_LEVEL_MISC_PARAM_NEW (encoder); misc = GST_VAAPI_ENC_QUALITY_LEVEL_MISC_PARAM_NEW (encoder);
if (!misc) if (!misc)
return FALSE; return FALSE;
quality_level = misc->data; memcpy (misc->data, &encoder->va_quality_level,
memset (quality_level, 0, sizeof (VAEncMiscParameterBufferQualityLevel)); sizeof (encoder->va_quality_level));
quality_level->quality_level = encoder->quality_level;
gst_vaapi_enc_picture_add_misc_param (picture, misc); gst_vaapi_enc_picture_add_misc_param (picture, misc);
gst_vaapi_codec_object_replace (&misc, NULL); gst_vaapi_codec_object_replace (&misc, NULL);
#endif #endif
@ -767,13 +765,14 @@ gst_vaapi_encoder_reconfigure_internal (GstVaapiEncoder * encoder)
#if VA_CHECK_VERSION(0,36,0) #if VA_CHECK_VERSION(0,36,0)
if (get_config_attribute (encoder, VAConfigAttribEncQualityRange, if (get_config_attribute (encoder, VAConfigAttribEncQualityRange,
&quality_level_max) && quality_level_max > 0) { &quality_level_max) && quality_level_max > 0) {
encoder->quality_level = GST_VAAPI_ENCODER_QUALITY_LEVEL (encoder) =
gst_util_uint64_scale_int_ceil (encoder->quality_level, gst_util_uint64_scale_int_ceil (GST_VAAPI_ENCODER_QUALITY_LEVEL
quality_level_max, 8); (encoder), quality_level_max, 8);
} else { } else {
encoder->quality_level = 0; GST_VAAPI_ENCODER_QUALITY_LEVEL (encoder) = 0;
} }
GST_INFO ("Quality level is fixed to %d", encoder->quality_level); GST_INFO ("Quality level is fixed to %d",
GST_VAAPI_ENCODER_QUALITY_LEVEL (encoder));
#endif #endif
codedbuf_size = encoder->codedbuf_pool ? codedbuf_size = encoder->codedbuf_pool ?
@ -1137,11 +1136,11 @@ gst_vaapi_encoder_set_quality_level (GstVaapiEncoder * encoder,
{ {
g_return_val_if_fail (encoder != NULL, 0); g_return_val_if_fail (encoder != NULL, 0);
if (encoder->quality_level != quality_level if (GST_VAAPI_ENCODER_QUALITY_LEVEL (encoder) != quality_level
&& encoder->num_codedbuf_queued > 0) && encoder->num_codedbuf_queued > 0)
goto error_operation_failed; goto error_operation_failed;
encoder->quality_level = quality_level; GST_VAAPI_ENCODER_QUALITY_LEVEL (encoder) = quality_level;
return GST_VAAPI_ENCODER_STATUS_SUCCESS; return GST_VAAPI_ENCODER_STATUS_SUCCESS;
/* ERRORS */ /* ERRORS */

View file

@ -173,7 +173,7 @@ G_BEGIN_DECLS
*/ */
#undef GST_VAAPI_ENCODER_QUALITY_LEVEL #undef GST_VAAPI_ENCODER_QUALITY_LEVEL
#define GST_VAAPI_ENCODER_QUALITY_LEVEL(encoder) \ #define GST_VAAPI_ENCODER_QUALITY_LEVEL(encoder) \
(GST_VAAPI_ENCODER_CAST (encoder)->quality_level) (GST_VAAPI_ENCODER_CAST (encoder)->va_quality_level.quality_level)
/* Generate a mask for the supplied tuning option (internal) */ /* Generate a mask for the supplied tuning option (internal) */
#define GST_VAAPI_ENCODER_TUNE_MASK(TUNE) \ #define GST_VAAPI_ENCODER_TUNE_MASK(TUNE) \
@ -227,7 +227,9 @@ struct _GstVaapiEncoder
guint32 rate_control_mask; guint32 rate_control_mask;
guint bitrate; /* kbps */ guint bitrate; /* kbps */
guint keyframe_period; guint keyframe_period;
guint quality_level;
/* parameters */
VAEncMiscParameterBufferQualityLevel va_quality_level;
GMutex mutex; GMutex mutex;
GCond surface_free; GCond surface_free;