From b1adb69c5b55180c8daeed4a91c8769129985715 Mon Sep 17 00:00:00 2001 From: David Conrad Date: Wed, 5 Sep 2007 00:22:52 +0000 Subject: [PATCH] Write one cluster and SimpleBlocks for the frames. Should now create playable mkv files for some video codecs (H.264 and VP3 checked) Originally committed as revision 10302 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/matroskaenc.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index d702e1f5a8..91da9079f4 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -25,6 +25,7 @@ typedef struct MatroskaMuxContext { offset_t segment; + offset_t cluster; } MatroskaMuxContext; static void put_ebml_id(ByteIOContext *pb, unsigned int id) @@ -215,13 +216,22 @@ static int mkv_write_header(AVFormatContext *s) } end_ebml_master(pb, tracks); + mkv->cluster = start_ebml_master(pb, MATROSKA_ID_CLUSTER); + put_ebml_uint(pb, MATROSKA_ID_CLUSTERTIMECODE, 0); + return 0; } static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt) { ByteIOContext *pb = &s->pb; + + block = start_ebml_master(pb, MATROSKA_ID_SIMPLEBLOCK); + put_byte(pb, 0x80 | pkt->stream_index); // this assumes stream_index is less than 127 + put_be16(pb, pkt->pts); + put_byte(pb, !!(pkt->flags & PKT_FLAG_KEY)); put_buffer(pb, pkt->data, pkt->size); + end_ebml_master(pb, block); return 0; } @@ -229,6 +239,7 @@ static int mkv_write_trailer(AVFormatContext *s) { MatroskaMuxContext *mkv = s->priv_data; ByteIOContext *pb = &s->pb; + end_ebml_master(pb, mkv->cluster); end_ebml_master(pb, mkv->segment); return 0; }