videoaggregator: remove the use of the queued buffer on sink pads

That data is now held by the aggregator class
This commit is contained in:
Matthew Waters 2014-10-06 18:10:38 +11:00
parent 2817472b9e
commit c23cd9c3be
2 changed files with 29 additions and 56 deletions

View file

@ -791,7 +791,6 @@ gst_videoaggregator_reset (GstVideoAggregator * vagg)
GstVideoAggregatorPad *p = l->data; GstVideoAggregatorPad *p = l->data;
gst_buffer_replace (&p->buffer, NULL); gst_buffer_replace (&p->buffer, NULL);
gst_buffer_replace (&p->queued, NULL);
p->start_time = -1; p->start_time = -1;
p->end_time = -1; p->end_time = -1;
@ -810,6 +809,9 @@ gst_videoaggregator_fill_queues (GstVideoAggregator * vagg,
gboolean eos = TRUE; gboolean eos = TRUE;
gboolean need_more_data = FALSE; gboolean need_more_data = FALSE;
/* get a set of buffers into pad->buffer that are within output_start_time
* and output_end_time taking into account finished and unresponsive pads */
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;
@ -838,8 +840,8 @@ gst_videoaggregator_fill_queues (GstVideoAggregator * vagg,
/* FIXME: Make all this work with negative rates */ /* FIXME: Make all this work with negative rates */
if ((pad->buffer && start_time < GST_BUFFER_TIMESTAMP (pad->buffer)) if ((start_time < GST_BUFFER_TIMESTAMP (buf))
|| (pad->queued && start_time < GST_BUFFER_TIMESTAMP (pad->queued))) { || (pad->buffer && start_time < GST_BUFFER_TIMESTAMP (pad->buffer))) {
GST_DEBUG_OBJECT (pad, "Buffer from the past, dropping"); GST_DEBUG_OBJECT (pad, "Buffer from the past, dropping");
gst_buffer_unref (buf); gst_buffer_unref (buf);
buf = gst_aggregator_pad_steal_buffer (bpad); buf = gst_aggregator_pad_steal_buffer (bpad);
@ -848,24 +850,15 @@ gst_videoaggregator_fill_queues (GstVideoAggregator * vagg,
continue; continue;
} }
if (pad->queued) { end_time = GST_BUFFER_DURATION (buf);
end_time = start_time - GST_BUFFER_TIMESTAMP (pad->queued);
start_time = GST_BUFFER_TIMESTAMP (pad->queued);
gst_buffer_unref (buf);
buf = gst_buffer_ref (pad->queued);
vinfo = &pad->queued_vinfo;
} else {
end_time = GST_BUFFER_DURATION (buf);
if (end_time == -1) { if (end_time == -1) {
pad->queued = buf; gst_buffer_unref (buf);
buf = gst_aggregator_pad_steal_buffer (bpad); buf = gst_aggregator_pad_steal_buffer (bpad);
gst_buffer_unref (buf); gst_buffer_replace (&pad->buffer, buf);
pad->queued_vinfo = pad->info; gst_buffer_unref (buf);
GST_DEBUG ("end time is -1 and nothing queued"); GST_DEBUG_OBJECT (pad, "buffer duration is -1");
need_more_data = TRUE; continue;
continue;
}
} }
g_assert (start_time != -1 && end_time != -1); g_assert (start_time != -1 && end_time != -1);
@ -880,14 +873,9 @@ gst_videoaggregator_fill_queues (GstVideoAggregator * vagg,
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));
if (buf == pad->queued) { gst_buffer_unref (buf);
gst_buffer_unref (buf); buf = gst_aggregator_pad_steal_buffer (bpad);
gst_buffer_replace (&pad->queued, NULL); gst_buffer_unref (buf);
} else {
gst_buffer_unref (buf);
buf = gst_aggregator_pad_steal_buffer (bpad);
gst_buffer_unref (buf);
}
need_more_data = TRUE; need_more_data = TRUE;
continue; continue;
@ -911,15 +899,9 @@ gst_videoaggregator_fill_queues (GstVideoAggregator * vagg,
if (pad->end_time != -1 && pad->end_time > end_time) { if (pad->end_time != -1 && pad->end_time > end_time) {
GST_DEBUG_OBJECT (pad, "Buffer from the past, dropping"); GST_DEBUG_OBJECT (pad, "Buffer from the past, dropping");
if (buf == pad->queued) { gst_buffer_unref (buf);
gst_buffer_unref (buf); buf = gst_aggregator_pad_steal_buffer (bpad);
gst_buffer_replace (&pad->queued, NULL); gst_buffer_unref (buf);
} else {
gst_buffer_unref (buf);
buf = gst_aggregator_pad_steal_buffer (bpad);
gst_buffer_unref (buf);
}
need_more_data = TRUE; need_more_data = TRUE;
continue; continue;
} }
@ -933,15 +915,10 @@ gst_videoaggregator_fill_queues (GstVideoAggregator * vagg,
pad->start_time = start_time; pad->start_time = start_time;
pad->end_time = end_time; pad->end_time = end_time;
if (buf == pad->queued) { gst_buffer_unref (buf);
buf = gst_aggregator_pad_steal_buffer (bpad);
if (buf)
gst_buffer_unref (buf); gst_buffer_unref (buf);
gst_buffer_replace (&pad->queued, NULL);
} else {
gst_buffer_unref (buf);
buf = gst_aggregator_pad_steal_buffer (bpad);
if (buf)
gst_buffer_unref (buf);
}
eos = FALSE; eos = FALSE;
} else if (start_time >= output_end_time) { } else if (start_time >= output_end_time) {
GST_DEBUG_OBJECT (pad, "Keeping buffer until %" GST_TIME_FORMAT, GST_DEBUG_OBJECT (pad, "Keeping buffer until %" GST_TIME_FORMAT,
@ -949,16 +926,14 @@ gst_videoaggregator_fill_queues (GstVideoAggregator * vagg,
gst_buffer_unref (buf); gst_buffer_unref (buf);
eos = FALSE; eos = FALSE;
} else { } else {
GST_DEBUG_OBJECT (pad, "Too old buffer -- dropping"); GST_DEBUG_OBJECT (pad,
if (buf == pad->queued) { "Too old buffer -- dropping start %" GST_TIME_FORMAT " out end %"
GST_TIME_FORMAT, GST_TIME_ARGS (start_time),
GST_TIME_ARGS (output_end_time));
gst_buffer_unref (buf);
buf = gst_aggregator_pad_steal_buffer (bpad);
if (buf)
gst_buffer_unref (buf); gst_buffer_unref (buf);
gst_buffer_replace (&pad->queued, NULL);
} else {
gst_buffer_unref (buf);
buf = gst_aggregator_pad_steal_buffer (bpad);
if (buf)
gst_buffer_unref (buf);
}
need_more_data = TRUE; need_more_data = TRUE;
continue; continue;

View file

@ -66,8 +66,6 @@ struct _GstVideoAggregatorPad
GstBuffer *converted_buffer; GstBuffer *converted_buffer;
GstBuffer *buffer; GstBuffer *buffer;
GstVideoInfo queued_vinfo;
GstBuffer *queued;
GstVideoInfo buffer_vinfo; GstVideoInfo buffer_vinfo;
GstClockTime start_time; GstClockTime start_time;