videorate: clear discont on duplicated buffers
authorWim Taymans <wim.taymans@collabora.co.uk>
Tue, 28 Apr 2009 09:32:49 +0000 (11:32 +0200)
committerWim Taymans <wim.taymans@collabora.co.uk>
Tue, 28 Apr 2009 14:45:07 +0000 (16:45 +0200)
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.

gst/videorate/gstvideorate.c
gst/videorate/gstvideorate.h

index 8d22186..7de2bb9 100644 (file)
@@ -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;
   }
index ea6063b..fe7feb6 100644 (file)
@@ -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;