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;
 }