fix BlockGroup size
authorJohn Stebbins <john@stebbins.name>
Mon, 11 May 2009 15:59:36 +0000 (11 08:59 -0700)
committerJohn Stebbins <john@stebbins.name>
Mon, 11 May 2009 15:59:36 +0000 (11 08:59 -0700)
when BlockDuration is written, its size needs to be accounted for
in the block group size

include/libmkv.h
src/ebml.c
src/ebml.h
src/matroska.c

index dee7372..34e045b 100644 (file)
@@ -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,
index 8443fc3..a2cb3a0 100644 (file)
@@ -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;
+}
+
index 3270184..cdcf4d0 100644 (file)
@@ -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);
index 797421e..94adf63 100644 (file)
@@ -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));