gint codedbuf_size;
GstBufferPool *recon_pool;
- /* global parameters va buffers, such as sequence, hrd, etc */
- GArray *params;
};
GST_DEBUG_CATEGORY_STATIC (gst_va_encoder_debug);
g_return_val_if_fail (GST_IS_VA_ENCODER (self), FALSE);
-
- if (!gst_va_encoder_is_open (self))
+ GST_OBJECT_LOCK (self);
+ if (!_is_open_unlocked (self)) {
+ GST_OBJECT_UNLOCK (self);
return TRUE;
+ }
- gst_va_encoder_reset_global_params (self);
-
- GST_OBJECT_LOCK (self);
config = self->config;
context = self->context;
recon_pool = self->recon_pool;
self->recon_pool = NULL;
- g_clear_pointer (&self->params, g_array_unref);
-
gst_va_encoder_init (self);
GST_OBJECT_UNLOCK (self);
self->coded_width = coded_width;
self->coded_height = coded_height;
self->codedbuf_size = codedbuf_size;
- self->params = g_array_sized_new (FALSE, FALSE, sizeof (VABufferID), 8);
gst_object_replace ((GstObject **) & self->recon_pool,
(GstObject *) recon_pool);
return TRUE;
}
-gboolean
-gst_va_encoder_add_global_param (GstVaEncoder * self, VABufferType type,
- gpointer data, gsize size)
-{
- VABufferID buffer;
-
- g_return_val_if_fail (GST_IS_VA_ENCODER (self), FALSE);
- g_return_val_if_fail (self->context != VA_INVALID_ID, FALSE);
- g_return_val_if_fail (data && size > 0, FALSE);
-
- if (!gst_va_encoder_is_open (self)) {
- GST_ERROR_OBJECT (self, "encoder has not been opened yet");
- return FALSE;
- }
-
- buffer = _create_buffer (self, type, data, size);
- if (buffer == VA_INVALID_ID)
- return FALSE;
-
- GST_OBJECT_LOCK (self);
- self->params = g_array_append_val (self->params, buffer);
- GST_OBJECT_UNLOCK (self);
-
- return TRUE;
-}
-
-gboolean
-gst_va_encoder_reset_global_params (GstVaEncoder * self)
-{
- guint i;
- gboolean ret = TRUE;
- GArray *params;
-
- g_return_val_if_fail (GST_IS_VA_ENCODER (self), FALSE);
- g_return_val_if_fail (self->context != VA_INVALID_ID, FALSE);
-
- GST_OBJECT_LOCK (self);
-
- if (!_is_open_unlocked (self)) {
- GST_OBJECT_UNLOCK (self);
- GST_ERROR_OBJECT (self, "encoder has not been opened yet");
- return TRUE;
- }
-
- params = g_array_copy (self->params);
- self->params = g_array_set_size (self->params, 0);
-
- GST_OBJECT_UNLOCK (self);
-
- for (i = 0; i < params->len; i++) {
- VABufferID buffer;
-
- buffer = g_array_index (params, VABufferID, i);
- ret &= _destroy_buffer (self->display, buffer);
- }
-
- g_array_unref (params);
-
- return ret;
-}
-
GArray *
gst_va_encoder_get_surface_formats (GstVaEncoder * self)
{
VASurfaceID surface;
VAContextID context;
gboolean ret = FALSE;
- guint orig_len;
g_return_val_if_fail (pic, FALSE);
goto bail;
}
- GST_OBJECT_LOCK (self);
- orig_len = self->params->len;
- self->params = g_array_append_vals (self->params, pic->params->data,
- pic->params->len);
- GST_OBJECT_UNLOCK (self);
-
if (pic->params->len > 0) {
- status = vaRenderPicture (dpy, context, (VABufferID *) self->params->data,
- self->params->len);
+ status = vaRenderPicture (dpy, context, (VABufferID *) pic->params->data,
+ pic->params->len);
if (status != VA_STATUS_SUCCESS) {
GST_WARNING_OBJECT (self, "vaRenderPicture: %s", vaErrorStr (status));
goto fail_end_pic;
if (!ret)
GST_WARNING_OBJECT (self, "vaEndPicture: %s", vaErrorStr (status));
- self->params = g_array_set_size (self->params, orig_len);
-
bail:
_destroy_all_buffers (pic);
fail_end_pic:
{
- self->params = g_array_set_size (self->params, orig_len);
+ _destroy_all_buffers (pic);
status = vaEndPicture (dpy, context);
ret = FALSE;
goto bail;
}
static gboolean
-_add_rate_control_parameter (GstVaH264Enc * self)
+_add_rate_control_parameter (GstVaH264Enc * self, GstVaEncodePicture * picture)
{
uint32_t window_size;
struct VAEncMiscParameterRateControlWrap
};
/* *INDENT-ON* */
- if (!gst_va_encoder_add_global_param (self->encoder,
+ if (!gst_va_encoder_add_param (self->encoder, picture,
VAEncMiscParameterBufferType, &rate_control, sizeof (rate_control))) {
GST_ERROR_OBJECT (self, "Failed to create the race control parameter");
return FALSE;
}
static gboolean
-_add_hrd_parameter (GstVaH264Enc * self)
+_add_hrd_parameter (GstVaH264Enc * self, GstVaEncodePicture * picture)
{
/* *INDENT-OFF* */
struct
g_assert (self->rc.max_bitrate_bits > 0);
- if (!gst_va_encoder_add_global_param (self->encoder,
+ if (!gst_va_encoder_add_param (self->encoder, picture,
VAEncMiscParameterBufferType, &hrd, sizeof (hrd))) {
GST_ERROR_OBJECT (self, "Failed to create the HRD parameter");
return FALSE;
}
static gboolean
-_add_quality_level_parameter (GstVaH264Enc * self)
+_add_quality_level_parameter (GstVaH264Enc * self, GstVaEncodePicture * picture)
{
/* *INDENT-OFF* */
struct
if (self->rc.target_usage == 0)
return TRUE;
- if (!gst_va_encoder_add_global_param (self->encoder,
+ if (!gst_va_encoder_add_param (self->encoder, picture,
VAEncMiscParameterBufferType, &quality_level,
sizeof (quality_level))) {
GST_ERROR_OBJECT (self, "Failed to create the quality level parameter");
}
static gboolean
-_add_frame_rate_parameter (GstVaH264Enc * self)
+_add_frame_rate_parameter (GstVaH264Enc * self, GstVaEncodePicture * picture)
{
/* *INDENT-OFF* */
struct
};
/* *INDENT-ON* */
- if (!gst_va_encoder_add_global_param (self->encoder,
+ if (!gst_va_encoder_add_param (self->encoder, picture,
VAEncMiscParameterBufferType, &framerate, sizeof (framerate))) {
GST_ERROR_OBJECT (self, "Failed to create the frame rate parameter");
return FALSE;
}
static gboolean
-_add_trellis_parameter (GstVaH264Enc * self)
+_add_trellis_parameter (GstVaH264Enc * self, GstVaEncodePicture * picture)
{
/* *INDENT-OFF* */
struct
if (!self->use_trellis)
return TRUE;
- if (!gst_va_encoder_add_global_param (self->encoder,
+ if (!gst_va_encoder_add_param (self->encoder, picture,
VAEncMiscParameterBufferType, &trellis, sizeof (trellis))) {
GST_ERROR_OBJECT (self, "Failed to create the trellis parameter");
return FALSE;
if (frame->poc == 0) {
VAEncSequenceParameterBufferH264 sequence;
- gst_va_encoder_reset_global_params (self->encoder);
-
- if (!_add_rate_control_parameter (self))
+ if (!_add_rate_control_parameter (self, frame->picture))
return FALSE;
- if (!_add_quality_level_parameter (self))
+ if (!_add_quality_level_parameter (self, frame->picture))
return FALSE;
- if (!_add_frame_rate_parameter (self))
+ if (!_add_frame_rate_parameter (self, frame->picture))
return FALSE;
- if (!_add_hrd_parameter (self))
+ if (!_add_hrd_parameter (self, frame->picture))
return FALSE;
- if (!_add_trellis_parameter (self))
+ if (!_add_trellis_parameter (self, frame->picture))
return FALSE;
_fill_sequence_param (self, &sequence);