Mercurial > libavformat.hg
changeset 2433:0c047310f205 libavformat
Write one cluster and SimpleBlocks for the frames. Should now create playable mkv files for some video codecs (H.264 and VP3 checked)
author | conrad |
---|---|
date | Wed, 05 Sep 2007 00:22:52 +0000 |
parents | 68743e7fa627 |
children | 273c76713989 |
files | matroskaenc.c |
diffstat | 1 files changed, 11 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- 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; }