mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-24 17:20:36 +00:00
videomixer2: store video info with buffers to keep it in sync
Instead the queued buffer might have an old caps while the pad is already storing the information for a new caps. Mixing those while handling buffers will often lead to issues https://bugzilla.gnome.org/show_bug.cgi?id=725948
This commit is contained in:
parent
4f47442c7f
commit
373eceef7c
1 changed files with 11 additions and 1 deletions
|
@ -138,8 +138,11 @@ struct _GstVideoMixer2Collect
|
|||
GstVideoMixer2Pad *mixpad;
|
||||
|
||||
GstBuffer *queued; /* buffer for which we don't know the end time yet */
|
||||
GstVideoInfo queued_vinfo;
|
||||
|
||||
GstBuffer *buffer; /* buffer that should be blended now */
|
||||
GstVideoInfo buffer_vinfo;
|
||||
|
||||
GstClockTime start_time;
|
||||
GstClockTime end_time;
|
||||
};
|
||||
|
@ -860,6 +863,7 @@ gst_videomixer2_fill_queues (GstVideoMixer2 * mix,
|
|||
GstVideoMixer2Collect *mixcol = pad->mixcol;
|
||||
GstSegment *segment = &pad->mixcol->collect.segment;
|
||||
GstBuffer *buf;
|
||||
GstVideoInfo *vinfo;
|
||||
|
||||
buf = gst_collect_pads_peek (mix->collect, &mixcol->collect);
|
||||
if (buf) {
|
||||
|
@ -872,6 +876,8 @@ gst_videomixer2_fill_queues (GstVideoMixer2 * mix,
|
|||
return -2;
|
||||
}
|
||||
|
||||
vinfo = &pad->info;
|
||||
|
||||
/* FIXME: Make all this work with negative rates */
|
||||
|
||||
if ((mixcol->buffer && start_time < GST_BUFFER_TIMESTAMP (mixcol->buffer))
|
||||
|
@ -890,6 +896,7 @@ gst_videomixer2_fill_queues (GstVideoMixer2 * mix,
|
|||
start_time = GST_BUFFER_TIMESTAMP (mixcol->queued);
|
||||
gst_buffer_unref (buf);
|
||||
buf = gst_buffer_ref (mixcol->queued);
|
||||
vinfo = &mixcol->queued_vinfo;
|
||||
} else {
|
||||
end_time = GST_BUFFER_DURATION (buf);
|
||||
|
||||
|
@ -897,6 +904,7 @@ gst_videomixer2_fill_queues (GstVideoMixer2 * mix,
|
|||
mixcol->queued = buf;
|
||||
buf = gst_collect_pads_pop (mix->collect, &mixcol->collect);
|
||||
gst_buffer_unref (buf);
|
||||
mixcol->queued_vinfo = pad->info;
|
||||
need_more_data = TRUE;
|
||||
continue;
|
||||
}
|
||||
|
@ -958,6 +966,7 @@ gst_videomixer2_fill_queues (GstVideoMixer2 * mix,
|
|||
"Taking new buffer with start time %" GST_TIME_FORMAT,
|
||||
GST_TIME_ARGS (start_time));
|
||||
gst_buffer_replace (&mixcol->buffer, buf);
|
||||
mixcol->buffer_vinfo = *vinfo;
|
||||
mixcol->start_time = start_time;
|
||||
mixcol->end_time = end_time;
|
||||
|
||||
|
@ -1093,7 +1102,8 @@ gst_videomixer2_blend_buffers (GstVideoMixer2 * mix,
|
|||
if (GST_CLOCK_TIME_IS_VALID (stream_time))
|
||||
gst_object_sync_values (GST_OBJECT (pad), stream_time);
|
||||
|
||||
gst_video_frame_map (&frame, &pad->info, mixcol->buffer, GST_MAP_READ);
|
||||
gst_video_frame_map (&frame, &mixcol->buffer_vinfo, mixcol->buffer,
|
||||
GST_MAP_READ);
|
||||
|
||||
if (pad->convert) {
|
||||
gint converted_size;
|
||||
|
|
Loading…
Reference in a new issue