summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Conrad <[email protected]>2007-09-05 00:22:52 +0000
committerDavid Conrad <[email protected]>2007-09-05 00:22:52 +0000
commitb1adb69c5b55180c8daeed4a91c8769129985715 (patch)
tree2c47bc925c2540ab00646a6bbe63c7a900e92839
parentf622c4f45c89b34f05699d060ffebeddccb04da0 (diff)
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
-rw-r--r--libavformat/matroskaenc.c11
1 files changed, 11 insertions, 0 deletions
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;
}