# HG changeset patch # User conrad # Date 1188951772 0 # Node ID 0c047310f2052a2181b3c56f4c0349b7a0a58930 # Parent 68743e7fa627c6c90b266c7c80022d0ad45a98a8 Write one cluster and SimpleBlocks for the frames. Should now create playable mkv files for some video codecs (H.264 and VP3 checked) diff -r 68743e7fa627 -r 0c047310f205 matroskaenc.c --- a/matroskaenc.c Wed Sep 05 00:22:50 2007 +0000 +++ b/matroskaenc.c Wed Sep 05 00:22:52 2007 +0000 @@ -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 @@ } 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 @@ { MatroskaMuxContext *mkv = s->priv_data; ByteIOContext *pb = &s->pb; + end_ebml_master(pb, mkv->cluster); end_ebml_master(pb, mkv->segment); return 0; }