Commit 02f487fc authored by David Conrad's avatar David Conrad

Write the duration of the file

Originally committed as revision 10312 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent f57b85a5
...@@ -28,6 +28,8 @@ typedef struct MatroskaMuxContext { ...@@ -28,6 +28,8 @@ typedef struct MatroskaMuxContext {
offset_t segment; offset_t segment;
offset_t cluster; offset_t cluster;
uint64_t cluster_pts; uint64_t cluster_pts;
offset_t duration_offset;
uint64_t duration;
} MatroskaMuxContext; } MatroskaMuxContext;
static void put_ebml_id(ByteIOContext *pb, unsigned int id) static void put_ebml_id(ByteIOContext *pb, unsigned int id)
...@@ -155,7 +157,11 @@ static int mkv_write_header(AVFormatContext *s) ...@@ -155,7 +157,11 @@ static int mkv_write_header(AVFormatContext *s)
// XXX: both are required; something better for writing app? // XXX: both are required; something better for writing app?
put_ebml_string(pb, MATROSKA_ID_WRITINGAPP, LIBAVFORMAT_IDENT); 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); end_ebml_master(pb, segment_info);
tracks = start_ebml_master(pb, MATROSKA_ID_TRACKS); tracks = start_ebml_master(pb, MATROSKA_ID_TRACKS);
...@@ -290,6 +296,8 @@ static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt) ...@@ -290,6 +296,8 @@ static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt)
put_byte(pb, !!(pkt->flags & PKT_FLAG_KEY)); put_byte(pb, !!(pkt->flags & PKT_FLAG_KEY));
put_buffer(pb, pkt->data, pkt->size); put_buffer(pb, pkt->data, pkt->size);
end_ebml_master(pb, block); end_ebml_master(pb, block);
mkv->duration = pkt->pts + pkt->duration;
return 0; return 0;
} }
...@@ -297,7 +305,16 @@ static int mkv_write_trailer(AVFormatContext *s) ...@@ -297,7 +305,16 @@ static int mkv_write_trailer(AVFormatContext *s)
{ {
MatroskaMuxContext *mkv = s->priv_data; MatroskaMuxContext *mkv = s->priv_data;
ByteIOContext *pb = &s->pb; ByteIOContext *pb = &s->pb;
offset_t currentpos;
end_ebml_master(pb, mkv->cluster); 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); end_ebml_master(pb, mkv->segment);
return 0; return 0;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment