From: John Stebbins Date: Mon, 11 May 2009 15:59:36 +0000 (-0700) Subject: fix BlockGroup size X-Git-Tag: 0.6.4~1^2~1 X-Git-Url: https://repo.or.cz/w/libmkv.git/commitdiff_plain/8c7935703262836777632d1e90b03b804a8d8194 fix BlockGroup size when BlockDuration is written, its size needs to be accounted for in the block group size --- diff --git a/include/libmkv.h b/include/libmkv.h index dee7372..34e045b 100644 --- a/include/libmkv.h +++ b/include/libmkv.h @@ -218,6 +218,7 @@ mk_Writer *mk_createWriter(const char *filename, int64_t timescale, mk_Track *mk_createTrack(mk_Writer *w, mk_TrackConfig *tc); int mk_writeHeader(mk_Writer *w, const char *writingApp); int mk_startFrame(mk_Writer *w, mk_Track *track); +int mk_flushFrame(mk_Writer *w, mk_Track *track); int mk_addFrameData(mk_Writer * w, mk_Track *track, const void *data, unsigned size); int mk_setFrameFlags(mk_Writer * w, mk_Track *track, int64_t timestamp, diff --git a/src/ebml.c b/src/ebml.c index 8443fc3..a2cb3a0 100644 --- a/src/ebml.c +++ b/src/ebml.c @@ -385,3 +385,16 @@ unsigned mk_ebmlSIntSize(int64_t si) return 8 - i; } + +unsigned mk_ebmlUIntSize(uint64_t ui) +{ + unsigned char c_ui[8] = { ui >> 56, ui >> 48, ui >> 40, ui >> 32, + ui >> 24, ui >> 16, ui >> 8, ui }; + unsigned i = 0; + + while (i < 7 && c_ui[i] == 0) + ++i; + + return 8 - i; +} + diff --git a/src/ebml.h b/src/ebml.h index 3270184..cdcf4d0 100644 --- a/src/ebml.h +++ b/src/ebml.h @@ -78,6 +78,7 @@ int mk_writeFloat(mk_Context *c, unsigned id, float f); int mk_writeVoid(mk_Context *c, uint64_t length); unsigned mk_ebmlSizeSize(uint64_t s); unsigned mk_ebmlSIntSize(int64_t si); +unsigned mk_ebmlUIntSize(uint64_t ui); int mk_writeEbmlHeader(mk_Writer *w, const char *doctype, uint64_t doctype_version, uint64_t doctype_readversion); diff --git a/src/matroska.c b/src/matroska.c index 797421e..94adf63 100644 --- a/src/matroska.c +++ b/src/matroska.c @@ -263,6 +263,10 @@ int mk_flushFrame(mk_Writer *w, mk_Track *track) ref = track->prev_frame_tc_scaled - w->cluster.tc_scaled - delta; bgsize += 1 + 1 + mk_ebmlSIntSize(ref); } + if (track->frame.duration > 0) /* BlockDuration */ + { + bgsize += 1 + 1 + mk_ebmlUIntSize(track->frame.duration); + } CHECK(mk_writeID(w->cluster.context, MATROSKA_ID_BLOCKGROUP)); /* BlockGroup */ CHECK(mk_writeSize(w->cluster.context, bgsize));