From 4fdb5ab675452fd5dfc0cb39f283356dd00c8c4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= Date: Tue, 23 May 2017 08:43:26 +0200 Subject: [PATCH] videotestsrc: Protect videoinfo with object lock The videoinfo is set in the streaming thread, but can be read by any thread from the various queries, so protect it with the object lock. --- gst/videotestsrc/gstvideotestsrc.c | 22 +++++++++++++++++++++- gst/videotestsrc/gstvideotestsrc.h | 2 +- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/gst/videotestsrc/gstvideotestsrc.c b/gst/videotestsrc/gstvideotestsrc.c index af03efb2e2..cfa66197df 100644 --- a/gst/videotestsrc/gstvideotestsrc.c +++ b/gst/videotestsrc/gstvideotestsrc.c @@ -874,6 +874,8 @@ gst_video_test_src_setcaps (GstBaseSrc * bsrc, GstCaps * caps) structure = gst_caps_get_structure (caps, 0); + GST_OBJECT_LOCK (videotestsrc); + if (gst_structure_has_name (structure, "video/x-raw")) { /* we can use the parsing code */ if (!gst_video_info_from_caps (&info, caps)) @@ -946,16 +948,20 @@ gst_video_test_src_setcaps (GstBaseSrc * bsrc, GstCaps * caps) videotestsrc->running_time = 0; videotestsrc->n_frames = 0; + GST_OBJECT_UNLOCK (videotestsrc); + return TRUE; /* ERRORS */ parse_failed: { + GST_OBJECT_UNLOCK (videotestsrc); GST_DEBUG_OBJECT (bsrc, "failed to parse caps"); return FALSE; } unsupported_caps: { + GST_OBJECT_UNLOCK (videotestsrc); GST_DEBUG_OBJECT (bsrc, "unsupported caps: %" GST_PTR_FORMAT, caps); return FALSE; } @@ -975,27 +981,33 @@ gst_video_test_src_query (GstBaseSrc * bsrc, GstQuery * query) GstFormat src_fmt, dest_fmt; gint64 src_val, dest_val; + GST_OBJECT_LOCK (src); gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, &dest_val); res = gst_video_info_convert (&src->info, src_fmt, src_val, dest_fmt, &dest_val); gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val); + GST_OBJECT_UNLOCK (src); break; } case GST_QUERY_LATENCY: { + GST_OBJECT_LOCK (src); if (src->info.fps_n > 0) { GstClockTime latency; latency = gst_util_uint64_scale (GST_SECOND, src->info.fps_d, src->info.fps_n); + GST_OBJECT_UNLOCK (src); gst_query_set_latency (query, gst_base_src_is_live (GST_BASE_SRC_CAST (src)), latency, GST_CLOCK_TIME_NONE); GST_DEBUG_OBJECT (src, "Reporting latency of %" GST_TIME_FORMAT, GST_TIME_ARGS (latency)); res = TRUE; + } else { + GST_OBJECT_UNLOCK (src); } break; } @@ -1006,16 +1018,22 @@ gst_video_test_src_query (GstBaseSrc * bsrc, GstQuery * query) gst_query_parse_duration (query, &format, NULL); switch (format) { case GST_FORMAT_TIME:{ - gint64 dur = gst_util_uint64_scale_int_round (bsrc->num_buffers + gint64 dur; + + GST_OBJECT_LOCK (src); + dur = gst_util_uint64_scale_int_round (bsrc->num_buffers * GST_SECOND, src->info.fps_d, src->info.fps_n); res = TRUE; gst_query_set_duration (query, GST_FORMAT_TIME, dur); + GST_OBJECT_UNLOCK (src); goto done; } case GST_FORMAT_BYTES: + GST_OBJECT_LOCK (src); res = TRUE; gst_query_set_duration (query, GST_FORMAT_BYTES, bsrc->num_buffers * src->info.size); + GST_OBJECT_UNLOCK (src); goto done; default: break; @@ -1192,12 +1210,14 @@ gst_video_test_src_start (GstBaseSrc * basesrc) { GstVideoTestSrc *src = GST_VIDEO_TEST_SRC (basesrc); + GST_OBJECT_LOCK (src); src->running_time = 0; src->n_frames = 0; src->accum_frames = 0; src->accum_rtime = 0; gst_video_info_init (&src->info); + GST_OBJECT_UNLOCK (src); return TRUE; } diff --git a/gst/videotestsrc/gstvideotestsrc.h b/gst/videotestsrc/gstvideotestsrc.h index 147843b338..291c2eb04e 100644 --- a/gst/videotestsrc/gstvideotestsrc.h +++ b/gst/videotestsrc/gstvideotestsrc.h @@ -146,7 +146,7 @@ struct _GstVideoTestSrc { GstVideoTestSrcPattern pattern_type; /* video state */ - GstVideoInfo info; + GstVideoInfo info; /* protected by the object or stream lock */ GstVideoChromaResample *subsample; gboolean bayer; gint x_invert;