summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosef Zlomek <josef.zlomek@itonis.tv>2006-04-25 11:09:24 +0000
committerTim-Philipp Müller <tim@centricular.net>2006-04-25 11:09:24 +0000
commit2e1a9a0472b1ac3edb5873333266a0124a4b5986 (patch)
tree85f8f03a1caf8fdae3dc3d56cb3417224920f9b3
parenta299de4f78ab9ab5c25dc5d458f115a55b7b4011 (diff)
gst/matroska/matroska-mux.c: Fix timestamping of B-frames, use signed integers, do some rounding (#339678).
Original commit message from CVS: Patch by: Josef Zlomek <josef dot zlomek at itonis dot tv> * gst/matroska/matroska-mux.c: (gst_matroska_mux_create_buffer_header), (gst_matroska_mux_write_data): Fix timestamping of B-frames, use signed integers, do some rounding (#339678).
-rw-r--r--ChangeLog10
-rw-r--r--gst/matroska/matroska-mux.c16
2 files changed, 22 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 00bde575..6fbae5ac 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2006-04-25 Tim-Philipp Müller <tim at centricular dot net>
+
+ Patch by: Josef Zlomek <josef dot zlomek at itonis dot tv>
+
+ * gst/matroska/matroska-mux.c:
+ (gst_matroska_mux_create_buffer_header),
+ (gst_matroska_mux_write_data):
+ Fix timestamping of B-frames, use signed integers, do
+ some rounding (#339678).
+
2006-04-24 Edgard Lima <edgard.lima@indt.org.br>
* ext/annodex/gstcmmlparser.c: (gst_cmml_parser_generic_error):
diff --git a/gst/matroska/matroska-mux.c b/gst/matroska/matroska-mux.c
index b19793cd..4750172c 100644
--- a/gst/matroska/matroska-mux.c
+++ b/gst/matroska/matroska-mux.c
@@ -1298,7 +1298,7 @@ gst_matroska_mux_best_pad (GstMatroskaMux * mux, gboolean * popped)
*/
GstBuffer *
gst_matroska_mux_create_buffer_header (GstMatroskaTrackContext * track,
- guint16 relative_timestamp, int flags)
+ gint16 relative_timestamp, int flags)
{
GstBuffer *hdr;
@@ -1330,7 +1330,8 @@ gst_matroska_mux_write_data (GstMatroskaMux * mux, GstMatroskaPad * collect_pad)
GstBuffer *buf, *hdr;
guint64 cluster, blockgroup;
gboolean write_duration;
- guint16 relative_timestamp;
+ gint16 relative_timestamp;
+ gint64 relative_timestamp64;
guint64 block_duration;
/* write data */
@@ -1430,8 +1431,15 @@ gst_matroska_mux_write_data (GstMatroskaMux * mux, GstMatroskaPad * collect_pad)
/* write the block, for matroska v2 use SimpleBlock if possible
* one slice (*breath*).
* FIXME: lacing, etc. */
- relative_timestamp =
- (GST_BUFFER_TIMESTAMP (buf) - mux->cluster_time) / mux->time_scale;
+ relative_timestamp64 = GST_BUFFER_TIMESTAMP (buf) - mux->cluster_time;
+ if (relative_timestamp64 >= 0) {
+ /* round the timestamp */
+ relative_timestamp64 += mux->time_scale / 2;
+ } else {
+ /* round the timestamp */
+ relative_timestamp64 -= mux->time_scale / 2;
+ }
+ relative_timestamp = relative_timestamp64 / (gint64) mux->time_scale;
if (mux->matroska_version > 1 && !write_duration) {
int flags =
GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT) ? 0 : 0x80;