matroskamux: change 2 second limit per cluster
authorZaheer Abbas Merali <zaheerabbas@merali.org>
Wed, 9 Jun 2010 20:00:16 +0000 (22:00 +0200)
committerZaheer Abbas Merali <zaheerabbas@merali.org>
Wed, 9 Jun 2010 23:32:15 +0000 (01:32 +0200)
Start cluster at every keyframe or when we would overflow the previous
cluster's relative timestamp field. This would avoid as much as possible
starting clusters at non-keyframes.

gst/matroska/matroska-mux.c
gst/matroska/matroska-mux.h

index 0ed36fc..265eb18 100644 (file)
@@ -546,6 +546,7 @@ gst_matroska_mux_reset (GstElement * element)
 
   /* reset timers */
   mux->time_scale = GST_MSECOND;
+  mux->max_cluster_duration = G_MAXINT16 * mux->time_scale;
   mux->duration = 0;
 
   /* reset cluster */
@@ -2566,8 +2567,10 @@ gst_matroska_mux_write_data (GstMatroskaMux * mux, GstMatroskaPad * collect_pad)
   }
 
   if (mux->cluster) {
-    /* start a new cluster every two seconds or at keyframe */
-    if (mux->cluster_time + GST_SECOND * 2 < GST_BUFFER_TIMESTAMP (buf)
+    /* start a new cluster at every keyframe or when we may be reaching the
+     * limit of the relative timestamp */
+    if (mux->cluster_time +
+        mux->max_cluster_duration < GST_BUFFER_TIMESTAMP (buf)
         || is_video_keyframe) {
       if (!mux->streamable)
         gst_ebml_write_master_finish (ebml, mux->cluster);
index 249f0c2..1270072 100644 (file)
@@ -102,6 +102,8 @@ typedef struct _GstMatroskaMux {
  
   /* timescale in the file */
   guint64        time_scale;
+  /* based on timescale, limit of nanoseconds you can have in a cluster */ 
+  guint64        max_cluster_duration;
 
   /* length, position (time, ns) */
   guint64        duration;