From d179fca13f2e3001d017a46e6e66efd17928af38 Mon Sep 17 00:00:00 2001 From: He Junyan Date: Thu, 28 Mar 2024 21:35:07 +0800 Subject: [PATCH] va: h265enc: Change the set_property to make it atomic The inside encoder may be set in other threads, so we should make its accessing atomic. Part-of: --- .../gst-plugins-bad/sys/va/gstvah265enc.c | 32 +++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/subprojects/gst-plugins-bad/sys/va/gstvah265enc.c b/subprojects/gst-plugins-bad/sys/va/gstvah265enc.c index 182cccd8d3..08289e6e92 100644 --- a/subprojects/gst-plugins-bad/sys/va/gstvah265enc.c +++ b/subprojects/gst-plugins-bad/sys/va/gstvah265enc.c @@ -4763,7 +4763,13 @@ gst_va_h265_enc_set_property (GObject * object, guint prop_id, { GstVaH265Enc *const self = GST_VA_H265_ENC (object); GstVaBaseEnc *base = GST_VA_BASE_ENC (self); - gboolean already_effect = FALSE; + GstVaEncoder *encoder = NULL; + gboolean no_effect; + + gst_object_replace ((GstObject **) (&encoder), (GstObject *) base->encoder); + no_effect = (encoder && gst_va_encoder_is_open (encoder)); + if (encoder) + gst_object_unref (encoder); GST_OBJECT_LOCK (self); @@ -4794,18 +4800,18 @@ gst_va_h265_enc_set_property (GObject * object, guint prop_id, break; case PROP_QP_I: self->prop.qp_i = g_value_get_uint (value); + no_effect = FALSE; g_atomic_int_set (&GST_VA_BASE_ENC (self)->reconf, TRUE); - already_effect = TRUE; break; case PROP_QP_P: self->prop.qp_p = g_value_get_uint (value); + no_effect = FALSE; g_atomic_int_set (&GST_VA_BASE_ENC (self)->reconf, TRUE); - already_effect = TRUE; break; case PROP_QP_B: self->prop.qp_b = g_value_get_uint (value); + no_effect = FALSE; g_atomic_int_set (&GST_VA_BASE_ENC (self)->reconf, TRUE); - already_effect = TRUE; break; case PROP_TRELLIS: self->prop.use_trellis = g_value_get_boolean (value); @@ -4834,18 +4840,18 @@ gst_va_h265_enc_set_property (GObject * object, guint prop_id, } case PROP_BITRATE: self->prop.bitrate = g_value_get_uint (value); + no_effect = FALSE; g_atomic_int_set (&GST_VA_BASE_ENC (self)->reconf, TRUE); - already_effect = TRUE; break; case PROP_TARGET_PERCENTAGE: self->prop.target_percentage = g_value_get_uint (value); + no_effect = FALSE; g_atomic_int_set (&GST_VA_BASE_ENC (self)->reconf, TRUE); - already_effect = TRUE; break; case PROP_TARGET_USAGE: self->prop.target_usage = g_value_get_uint (value); + no_effect = FALSE; g_atomic_int_set (&GST_VA_BASE_ENC (self)->reconf, TRUE); - already_effect = TRUE; break; case PROP_NUM_TILE_COLS: self->prop.num_tile_cols = g_value_get_uint (value); @@ -4855,11 +4861,12 @@ gst_va_h265_enc_set_property (GObject * object, guint prop_id, break; case PROP_RATE_CONTROL: self->prop.rc_ctrl = g_value_get_enum (value); + no_effect = FALSE; g_atomic_int_set (&GST_VA_BASE_ENC (self)->reconf, TRUE); - already_effect = TRUE; break; case PROP_CPB_SIZE: self->prop.cpb_size = g_value_get_uint (value); + no_effect = FALSE; g_atomic_int_set (&GST_VA_BASE_ENC (self)->reconf, TRUE); break; default: @@ -4868,13 +4875,12 @@ gst_va_h265_enc_set_property (GObject * object, guint prop_id, GST_OBJECT_UNLOCK (self); + if (no_effect) { #ifndef GST_DISABLE_GST_DEBUG - if (!already_effect && - base->encoder && gst_va_encoder_is_open (base->encoder)) { - GST_WARNING_OBJECT (self, "Property `%s` change ignored while processing.", - pspec->name); - } + GST_WARNING_OBJECT (self, "Property `%s` change may not take effect " + "until the next encoder reconfig.", pspec->name); #endif + } } static void