videoaggregator: Lock access to members of GstAggregatorPad

Take the pad's object lock before accessing members of the
GstAggregatorPad structure.

https://bugzilla.gnome.org/show_bug.cgi?id=742684
This commit is contained in:
Olivier Crête 2015-01-14 14:45:06 -05:00 committed by Thibault Saunier
parent 4527811b1f
commit f5d63b031d

View file

@ -956,15 +956,17 @@ gst_videoaggregator_fill_queues (GstVideoAggregator * vagg,
GST_OBJECT_LOCK (vagg); GST_OBJECT_LOCK (vagg);
for (l = GST_ELEMENT (vagg)->sinkpads; l; l = l->next) { for (l = GST_ELEMENT (vagg)->sinkpads; l; l = l->next) {
GstVideoAggregatorPad *pad = l->data; GstVideoAggregatorPad *pad = l->data;
GstSegment *segment; GstSegment segment;
GstAggregatorPad *bpad; GstAggregatorPad *bpad;
GstBuffer *buf; GstBuffer *buf;
GstVideoInfo *vinfo; GstVideoInfo *vinfo;
gboolean is_eos; gboolean is_eos;
bpad = GST_AGGREGATOR_PAD (pad); bpad = GST_AGGREGATOR_PAD (pad);
segment = &bpad->segment; GST_OBJECT_LOCK (bpad);
segment = bpad->segment;
is_eos = bpad->eos; is_eos = bpad->eos;
GST_OBJECT_UNLOCK (bpad);
if (!is_eos) if (!is_eos)
eos = FALSE; eos = FALSE;
buf = gst_aggregator_pad_get_buffer (bpad); buf = gst_aggregator_pad_get_buffer (bpad);
@ -1010,12 +1012,12 @@ gst_videoaggregator_fill_queues (GstVideoAggregator * vagg,
end_time += start_time; /* convert from duration to position */ end_time += start_time; /* convert from duration to position */
/* Check if it's inside the segment */ /* Check if it's inside the segment */
if (start_time >= segment->stop || end_time < segment->start) { if (start_time >= segment.stop || end_time < segment.start) {
GST_DEBUG_OBJECT (pad, GST_DEBUG_OBJECT (pad,
"Buffer outside the segment : segment: [%" GST_TIME_FORMAT " -- %" "Buffer outside the segment : segment: [%" GST_TIME_FORMAT " -- %"
GST_TIME_FORMAT "]" " Buffer [%" GST_TIME_FORMAT " -- %" GST_TIME_FORMAT "]" " Buffer [%" GST_TIME_FORMAT " -- %"
GST_TIME_FORMAT "]", GST_TIME_ARGS (segment->stop), GST_TIME_FORMAT "]", GST_TIME_ARGS (segment.stop),
GST_TIME_ARGS (segment->start), GST_TIME_ARGS (start_time), GST_TIME_ARGS (segment.start), GST_TIME_ARGS (start_time),
GST_TIME_ARGS (end_time)); GST_TIME_ARGS (end_time));
gst_buffer_unref (buf); gst_buffer_unref (buf);
@ -1027,13 +1029,13 @@ gst_videoaggregator_fill_queues (GstVideoAggregator * vagg,
} }
/* Clip to segment and convert to running time */ /* Clip to segment and convert to running time */
start_time = MAX (start_time, segment->start); start_time = MAX (start_time, segment.start);
if (segment->stop != -1) if (segment.stop != -1)
end_time = MIN (end_time, segment->stop); end_time = MIN (end_time, segment.stop);
start_time = start_time =
gst_segment_to_running_time (segment, GST_FORMAT_TIME, start_time); gst_segment_to_running_time (&segment, GST_FORMAT_TIME, start_time);
end_time = end_time =
gst_segment_to_running_time (segment, GST_FORMAT_TIME, end_time); gst_segment_to_running_time (&segment, GST_FORMAT_TIME, end_time);
g_assert (start_time != -1 && end_time != -1); g_assert (start_time != -1 && end_time != -1);
/* Convert to the output segment rate */ /* Convert to the output segment rate */
@ -1128,13 +1130,13 @@ prepare_frames (GstVideoAggregator * vagg, GstVideoAggregatorPad * pad)
if (pad->buffer != NULL) { if (pad->buffer != NULL) {
GstClockTime timestamp; GstClockTime timestamp;
gint64 stream_time; gint64 stream_time;
GstSegment *seg;
seg = &bpad->segment;
timestamp = GST_BUFFER_TIMESTAMP (pad->buffer); timestamp = GST_BUFFER_TIMESTAMP (pad->buffer);
stream_time = gst_segment_to_stream_time (seg, GST_FORMAT_TIME, timestamp); GST_OBJECT_LOCK (bpad);
stream_time = gst_segment_to_stream_time (&bpad->segment, GST_FORMAT_TIME,
timestamp);
GST_OBJECT_UNLOCK (bpad);
/* sync object properties on stream time */ /* sync object properties on stream time */
if (GST_CLOCK_TIME_IS_VALID (stream_time)) if (GST_CLOCK_TIME_IS_VALID (stream_time))
@ -1566,6 +1568,8 @@ gst_videoaggregator_sink_clip (GstAggregator * agg,
return GST_FLOW_OK; return GST_FLOW_OK;
} }
GST_OBJECT_LOCK (bpad);
start_time = MAX (start_time, bpad->segment.start); start_time = MAX (start_time, bpad->segment.start);
start_time = start_time =
gst_segment_to_running_time (&bpad->segment, GST_FORMAT_TIME, start_time); gst_segment_to_running_time (&bpad->segment, GST_FORMAT_TIME, start_time);
@ -1584,10 +1588,14 @@ gst_videoaggregator_sink_clip (GstAggregator * agg,
if (bpad->buffer != NULL && end_time < pad->priv->end_time) { if (bpad->buffer != NULL && end_time < pad->priv->end_time) {
gst_buffer_unref (buf); gst_buffer_unref (buf);
*outbuf = NULL; *outbuf = NULL;
return GST_FLOW_OK; goto done;
} }
*outbuf = buf; *outbuf = buf;
done:
GST_OBJECT_UNLOCK (bpad);
return GST_FLOW_OK; return GST_FLOW_OK;
} }