From 45f711044fe60efba33e0dbaba354860fd450eed Mon Sep 17 00:00:00 2001 From: Zaheer Abbas Merali Date: Wed, 9 Jun 2010 22:00:16 +0200 Subject: [PATCH] matroskamux: change 2 second limit per cluster 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 | 7 +++++-- gst/matroska/matroska-mux.h | 2 ++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/gst/matroska/matroska-mux.c b/gst/matroska/matroska-mux.c index 0ed36fcc05..265eb186db 100644 --- a/gst/matroska/matroska-mux.c +++ b/gst/matroska/matroska-mux.c @@ -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); diff --git a/gst/matroska/matroska-mux.h b/gst/matroska/matroska-mux.h index 249f0c2146..12700724ab 100644 --- a/gst/matroska/matroska-mux.h +++ b/gst/matroska/matroska-mux.h @@ -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;