diff options
author | David Conrad <lessen42@gmail.com> | 2007-09-05 00:23:11 +0000 |
---|---|---|
committer | David Conrad <lessen42@gmail.com> | 2007-09-05 00:23:11 +0000 |
commit | 02f487fc7758a428426cf142748d867c4f9b941b (patch) | |
tree | 2f626cecab5e3604e089da8105af82057665cf61 | |
parent | f57b85a5699dca9ccebe851c60141bb3d9dda200 (diff) | |
download | ffmpeg-02f487fc7758a428426cf142748d867c4f9b941b.tar.gz |
Write the duration of the file
Originally committed as revision 10312 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavformat/matroskaenc.c | 19 |
1 files changed, 18 insertions, 1 deletions
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; } |