]> rtime.felk.cvut.cz Git - frescor/ffmpeg.git/commitdiff
Write the duration of the file
authorconrad <conrad@9553f0bf-9b14-0410-a0b8-cfaf0461ba5b>
Wed, 5 Sep 2007 00:23:11 +0000 (00:23 +0000)
committerconrad <conrad@9553f0bf-9b14-0410-a0b8-cfaf0461ba5b>
Wed, 5 Sep 2007 00:23:11 +0000 (00:23 +0000)
git-svn-id: file:///var/local/repositories/ffmpeg/trunk@10312 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b

libavformat/matroskaenc.c

index a3be93511a257994794b2f52ab9a8d9fe1a66ad0..c284c47fa49ec51208a4ff7516fd3bb1e0d6c08c 100644 (file)
@@ -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;
 }