diff options
author | Wim Taymans <wim.taymans@collabora.co.uk> | 2009-04-28 11:32:49 +0200 |
---|---|---|
committer | Wim Taymans <wim.taymans@collabora.co.uk> | 2009-04-28 16:45:07 +0200 |
commit | 915b3d139dee6d5ffcc36a635557ca24269b2eb8 (patch) | |
tree | cfc12a0d40d00825b0d9eb15133ebdacccaffba1 | |
parent | e25f281de803d971139ea2ff04f34caf3402c9cc (diff) |
videorate: clear discont on duplicated buffers
When videorate duplicates a buffer with a DISCONT flag, it copies the discont on
the first pushed buffer but fails to clear it for subsequent buffers. This
causes theoraenc!oggmux and possibly other elements to consider this a discont
stream.
Fix videorate to produce discont as the first buffer and after a flushing seek.
Fixes #580271.
-rw-r--r-- | gst/videorate/gstvideorate.c | 11 | ||||
-rw-r--r-- | gst/videorate/gstvideorate.h | 1 |
2 files changed, 12 insertions, 0 deletions
diff --git a/gst/videorate/gstvideorate.c b/gst/videorate/gstvideorate.c index 8d221860e..7de2bb9d4 100644 --- a/gst/videorate/gstvideorate.c +++ b/gst/videorate/gstvideorate.c @@ -149,6 +149,7 @@ gst_video_rate_base_init (gpointer g_class) gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&gst_video_rate_src_template)); } + static void gst_video_rate_class_init (GstVideoRateClass * klass) { @@ -357,6 +358,7 @@ gst_video_rate_reset (GstVideoRate * videorate) videorate->drop = 0; videorate->dup = 0; videorate->next_ts = GST_CLOCK_TIME_NONE; + videorate->discont = TRUE; gst_video_rate_swap_prev (videorate, NULL, 0); gst_segment_init (&videorate->segment, GST_FORMAT_TIME); @@ -409,6 +411,12 @@ gst_video_rate_flush_prev (GstVideoRate * videorate) GST_BUFFER_OFFSET (outbuf) = videorate->out; GST_BUFFER_OFFSET_END (outbuf) = videorate->out + 1; + if (videorate->discont) { + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); + videorate->discont = FALSE; + } else + GST_BUFFER_FLAG_UNSET (outbuf, GST_BUFFER_FLAG_DISCONT); + /* this is the timestamp we put on the buffer */ push_ts = videorate->next_ts; @@ -810,6 +818,9 @@ gst_video_rate_change_state (GstElement * element, GstStateChange transition) videorate = GST_VIDEO_RATE (element); switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + videorate->discont = TRUE; + break; default: break; } diff --git a/gst/videorate/gstvideorate.h b/gst/videorate/gstvideorate.h index ea6063b8e..fe7feb62a 100644 --- a/gst/videorate/gstvideorate.h +++ b/gst/videorate/gstvideorate.h @@ -56,6 +56,7 @@ struct _GstVideoRate GstBuffer *prevbuf; guint64 prev_ts; /* Previous buffer timestamp */ guint64 segment_out; /* in-segment counting */ + gboolean discont; /* segment handling */ GstSegment segment; |