From: Mark Nauwelaerts Date: Tue, 6 Sep 2011 13:05:37 +0000 (+0200) Subject: matroskamux: make default duration check less sensitive X-Git-Tag: 1.19.3~509^2~7136^2~382 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=aa0ae490d052eee96a56c845b599066aa00855e5;p=platform%2Fupstream%2Fgstreamer.git matroskamux: make default duration check less sensitive Frame duration might vary for 1 usecond, in this case matroskamux decides to create BLOCKGROUP instead of SIMPLEBLOCK. Convert duration to timecodescale which is (typically) less precise, and then also allow the difference of 1/-1 to arrange for less sensitive check. Based on patch by Alexey Fisher Fixes #653080. --- diff --git a/gst/matroska/matroska-mux.c b/gst/matroska/matroska-mux.c index 2a639d4afa..ed98df1162 100644 --- a/gst/matroska/matroska-mux.c +++ b/gst/matroska/matroska-mux.c @@ -2204,6 +2204,10 @@ gst_matroska_mux_start (GstMatroskaMux * mux) child = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_TRACKENTRY); gst_matroska_mux_track_header (mux, collect_pad->track); gst_ebml_write_master_finish (ebml, child); + /* some remaing pad/track setup */ + collect_pad->default_duration_scaled = + gst_util_uint64_scale (collect_pad->track->default_duration, + 1, mux->time_scale); } } gst_ebml_write_master_finish (ebml, master); @@ -2767,9 +2771,14 @@ gst_matroska_mux_write_data (GstMatroskaMux * mux, GstMatroskaPad * collect_pad) /* Check if the duration differs from the default duration. */ write_duration = FALSE; - block_duration = GST_BUFFER_DURATION (buf); + block_duration = 0; if (GST_BUFFER_DURATION_IS_VALID (buf)) { - if (block_duration != collect_pad->track->default_duration) { + block_duration = gst_util_uint64_scale (GST_BUFFER_DURATION (buf), + 1, mux->time_scale); + + /* small difference should be ok. */ + if (block_duration > collect_pad->default_duration_scaled + 1 || + block_duration < collect_pad->default_duration_scaled - 1) { write_duration = TRUE; } } @@ -2810,10 +2819,8 @@ gst_matroska_mux_write_data (GstMatroskaMux * mux, GstMatroskaPad * collect_pad) hdr = gst_matroska_mux_create_buffer_header (collect_pad->track, relative_timestamp, 0); - if (write_duration) { - gst_ebml_write_uint (ebml, GST_MATROSKA_ID_BLOCKDURATION, - gst_util_uint64_scale (block_duration, 1, mux->time_scale)); - } + if (write_duration) + gst_ebml_write_uint (ebml, GST_MATROSKA_ID_BLOCKDURATION, block_duration); gst_ebml_write_buffer_header (ebml, GST_MATROSKA_ID_BLOCK, GST_BUFFER_SIZE (buf) + GST_BUFFER_SIZE (hdr)); gst_ebml_write_buffer (ebml, hdr); diff --git a/gst/matroska/matroska-mux.h b/gst/matroska/matroska-mux.h index 12700724ab..e5074a7c08 100644 --- a/gst/matroska/matroska-mux.h +++ b/gst/matroska/matroska-mux.h @@ -64,6 +64,7 @@ typedef struct guint64 duration; GstClockTime start_ts; GstClockTime end_ts; /* last timestamp + (if available) duration */ + guint64 default_duration_scaled; } GstMatroskaPad;