From 72cb1943da2d28b8ec87d75d0821f6e480d2ef4d Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Thu, 29 Mar 2018 16:42:40 +0200 Subject: [PATCH] omxvideoenc: restore OMX default target-bitrate if requested by user 0xffffffff is the magic number in gst-omx meaning 'the default value defined in OMX'. This works fine with OMX parameters which are only set once when starting the component but not with configs which can be changed while PLAYING. Save the actual OMX default bitrate so we can restore it later if user sets back 0xffffffff on the property. Added GST_OMX_PROP_OMX_DEFAULT so we stop hardcoding magic numbers everywhere. https://bugzilla.gnome.org/show_bug.cgi?id=794998 --- omx/gstomx.h | 5 +++++ omx/gstomxvideoenc.c | 14 ++++++++++---- omx/gstomxvideoenc.h | 2 ++ 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/omx/gstomx.h b/omx/gstomx.h index a5330bd..e1ea76b 100644 --- a/omx/gstomx.h +++ b/omx/gstomx.h @@ -118,6 +118,11 @@ G_BEGIN_DECLS } G_STMT_END #endif +/* If set on an element property means "use the OMX default value". + * If set on a default_* variable means that the default values hasn't been + * retrieved from OMX yet. */ +#define GST_OMX_PROP_OMX_DEFAULT G_MAXUINT32 + /* OMX_StateInvalid does not exist in 1.2.0 spec. The initial state is now * StateLoaded. Problem is that gst-omx still needs an initial state different * than StateLoaded. Otherwise gst_omx_component_set_state(StateLoaded) will diff --git a/omx/gstomxvideoenc.c b/omx/gstomxvideoenc.c index 788ef83..b78ea5d 100644 --- a/omx/gstomxvideoenc.c +++ b/omx/gstomxvideoenc.c @@ -518,6 +518,8 @@ gst_omx_video_enc_init (GstOMXVideoEnc * self) self->default_roi_quality = GST_OMX_VIDEO_ENC_DEFAULT_ROI_QUALITY; #endif + self->default_target_bitrate = GST_OMX_PROP_OMX_DEFAULT; + g_mutex_init (&self->drain_lock); g_cond_init (&self->drain_cond); @@ -746,9 +748,6 @@ gst_omx_video_enc_set_bitrate (GstOMXVideoEnc * self) gboolean result = TRUE; GST_OBJECT_LOCK (self); - if (self->control_rate == 0xffffffff && self->target_bitrate == 0xffffffff) - /* Keep defaults, nothing to do */ - goto out; GST_OMX_INIT_STRUCT (&bitrate_param); bitrate_param.nPortIndex = self->enc_out_port->index; @@ -764,10 +763,16 @@ gst_omx_video_enc_set_bitrate (GstOMXVideoEnc * self) bitrate_param.nPortIndex = self->enc_out_port->index; } #endif + if (self->default_target_bitrate == GST_OMX_PROP_OMX_DEFAULT) + /* Save the actual OMX default so we can restore it if needed */ + self->default_target_bitrate = bitrate_param.nTargetBitrate; + if (self->control_rate != 0xffffffff) bitrate_param.eControlRate = self->control_rate; if (self->target_bitrate != 0xffffffff) bitrate_param.nTargetBitrate = self->target_bitrate; + else + bitrate_param.nTargetBitrate = self->default_target_bitrate; err = gst_omx_component_set_parameter (self->enc, @@ -790,7 +795,6 @@ gst_omx_video_enc_set_bitrate (GstOMXVideoEnc * self) gst_omx_error_to_string (err), err); } -out: GST_OBJECT_UNLOCK (self); return result; } @@ -1667,6 +1671,8 @@ gst_omx_video_enc_stop (GstVideoEncoder * encoder) g_cond_broadcast (&self->drain_cond); g_mutex_unlock (&self->drain_lock); + self->default_target_bitrate = GST_OMX_PROP_OMX_DEFAULT; + gst_omx_component_get_state (self->enc, 5 * GST_SECOND); return TRUE; diff --git a/omx/gstomxvideoenc.h b/omx/gstomxvideoenc.h index a732254..7cf2b4a 100644 --- a/omx/gstomxvideoenc.h +++ b/omx/gstomxvideoenc.h @@ -94,6 +94,8 @@ struct _GstOMXVideoEnc gint default_roi_quality; #endif + guint32 default_target_bitrate; + GstFlowReturn downstream_flow_ret; GstOMXBufferAllocation input_allocation; -- 2.7.4