From 2d3816fabc2d0951d814fa312895799116e94693 Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Wed, 14 Feb 2018 17:20:02 +0100 Subject: [PATCH] omxvideoenc: protect target_bitrate with the object lock The 'target-bitrate' property can be changed while PLAYING (GST_PARAM_MUTABLE_PLAYING). Make it thread-safe to prevent concurrent accesses between the application and streaming thread. https://bugzilla.gnome.org/show_bug.cgi?id=793458 --- omx/gstomxvideoenc.c | 9 +++++++++ omx/gstomxvideoenc.h | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/omx/gstomxvideoenc.c b/omx/gstomxvideoenc.c index 3e295ff3e5..941f00ee97 100644 --- a/omx/gstomxvideoenc.c +++ b/omx/gstomxvideoenc.c @@ -757,6 +757,7 @@ gst_omx_video_enc_open (GstVideoEncoder * encoder) { OMX_ERRORTYPE err; + GST_OBJECT_LOCK (self); if (self->control_rate != 0xffffffff || self->target_bitrate != 0xffffffff) { OMX_VIDEO_PARAM_BITRATETYPE bitrate_param; @@ -793,6 +794,7 @@ gst_omx_video_enc_open (GstVideoEncoder * encoder) GST_ERROR_OBJECT (self, "Failed to set bitrate parameters: %s (0x%08x)", gst_omx_error_to_string (err), err); + GST_OBJECT_UNLOCK (self); return FALSE; } } else { @@ -800,6 +802,7 @@ gst_omx_video_enc_open (GstVideoEncoder * encoder) gst_omx_error_to_string (err), err); } } + GST_OBJECT_UNLOCK (self); if (self->quant_i_frames != 0xffffffff || self->quant_p_frames != 0xffffffff || @@ -919,6 +922,7 @@ gst_omx_video_enc_set_property (GObject * object, guint prop_id, self->control_rate = g_value_get_enum (value); break; case PROP_TARGET_BITRATE: + GST_OBJECT_LOCK (self); self->target_bitrate = g_value_get_uint (value); if (self->enc) { OMX_VIDEO_CONFIG_BITRATETYPE config; @@ -935,6 +939,7 @@ gst_omx_video_enc_set_property (GObject * object, guint prop_id, "Failed to set bitrate parameter: %s (0x%08x)", gst_omx_error_to_string (err), err); } + GST_OBJECT_UNLOCK (self); break; case PROP_QUANT_I_FRAMES: self->quant_i_frames = g_value_get_uint (value); @@ -1009,7 +1014,9 @@ gst_omx_video_enc_get_property (GObject * object, guint prop_id, GValue * value, g_value_set_enum (value, self->control_rate); break; case PROP_TARGET_BITRATE: + GST_OBJECT_LOCK (self); g_value_set_uint (value, self->target_bitrate); + GST_OBJECT_UNLOCK (self); break; case PROP_QUANT_I_FRAMES: g_value_set_uint (value, self->quant_i_frames); @@ -2130,6 +2137,7 @@ gst_omx_video_enc_set_format (GstVideoEncoder * encoder, NULL) != OMX_ErrorNone) return FALSE; + GST_OBJECT_LOCK (self); if (self->target_bitrate != 0xffffffff) { OMX_VIDEO_PARAM_BITRATETYPE config; OMX_ERRORTYPE err; @@ -2144,6 +2152,7 @@ gst_omx_video_enc_set_format (GstVideoEncoder * encoder, GST_ERROR_OBJECT (self, "Failed to set bitrate parameter: %s (0x%08x)", gst_omx_error_to_string (err), err); } + GST_OBJECT_UNLOCK (self); if (self->input_state) gst_video_codec_state_unref (self->input_state); diff --git a/omx/gstomxvideoenc.h b/omx/gstomxvideoenc.h index 5c5d3c4082..3a5f2cf159 100644 --- a/omx/gstomxvideoenc.h +++ b/omx/gstomxvideoenc.h @@ -71,7 +71,7 @@ struct _GstOMXVideoEnc /* properties */ guint32 control_rate; - guint32 target_bitrate; + guint32 target_bitrate; /* protected by object lock */ guint32 quant_i_frames; guint32 quant_p_frames; guint32 quant_b_frames;