From 02f487fc7758a428426cf142748d867c4f9b941b Mon Sep 17 00:00:00 2001 From: David Conrad Date: Wed, 5 Sep 2007 00:23:11 +0000 Subject: Write the duration of the file Originally committed as revision 10312 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/matroskaenc.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) (limited to 'libavformat/matroskaenc.c') diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index a3be93511a..c284c47fa4 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -28,6 +28,8 @@ typedef struct MatroskaMuxContext { offset_t segment; offset_t cluster; uint64_t cluster_pts; + offset_t duration_offset; + uint64_t duration; } MatroskaMuxContext; static void put_ebml_id(ByteIOContext *pb, unsigned int id) @@ -155,7 +157,11 @@ static int mkv_write_header(AVFormatContext *s) // XXX: both are required; something better for writing app? put_ebml_string(pb, MATROSKA_ID_WRITINGAPP, LIBAVFORMAT_IDENT); } - // XXX: segment UID and duration + // XXX: segment UID + // reserve space for the duration + mkv->duration = 0; + mkv->duration_offset = url_ftell(pb); + put_ebml_void(pb, 11); // assumes double-precision float to be written end_ebml_master(pb, segment_info); tracks = start_ebml_master(pb, MATROSKA_ID_TRACKS); @@ -290,6 +296,8 @@ static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt) put_byte(pb, !!(pkt->flags & PKT_FLAG_KEY)); put_buffer(pb, pkt->data, pkt->size); end_ebml_master(pb, block); + + mkv->duration = pkt->pts + pkt->duration; return 0; } @@ -297,7 +305,16 @@ static int mkv_write_trailer(AVFormatContext *s) { MatroskaMuxContext *mkv = s->priv_data; ByteIOContext *pb = &s->pb; + offset_t currentpos; + end_ebml_master(pb, mkv->cluster); + + // update the duration + currentpos = url_ftell(pb); + url_fseek(pb, mkv->duration_offset, SEEK_SET); + put_ebml_float(pb, MATROSKA_ID_DURATION, mkv->duration); + url_fseek(pb, currentpos, SEEK_SET); + end_ebml_master(pb, mkv->segment); return 0; } -- cgit v1.2.3