|
|
|
@@ -88,6 +88,7 @@ typedef const struct EbmlSyntax { |
|
|
|
int list_elem_size; |
|
|
|
int data_offset; |
|
|
|
union { |
|
|
|
int64_t i; |
|
|
|
uint64_t u; |
|
|
|
double f; |
|
|
|
const char *s; |
|
|
|
@@ -675,7 +676,7 @@ static const EbmlSyntax matroska_blockgroup[] = { |
|
|
|
{ MATROSKA_ID_SIMPLEBLOCK, EBML_BIN, 0, offsetof(MatroskaBlock, bin) }, |
|
|
|
{ MATROSKA_ID_BLOCKDURATION, EBML_UINT, 0, offsetof(MatroskaBlock, duration) }, |
|
|
|
{ MATROSKA_ID_DISCARDPADDING, EBML_SINT, 0, offsetof(MatroskaBlock, discard_padding) }, |
|
|
|
{ MATROSKA_ID_BLOCKREFERENCE, EBML_SINT, 0, offsetof(MatroskaBlock, reference) }, |
|
|
|
{ MATROSKA_ID_BLOCKREFERENCE, EBML_SINT, 0, offsetof(MatroskaBlock, reference), { .i = INT64_MIN } }, |
|
|
|
{ MATROSKA_ID_CODECSTATE, EBML_NONE }, |
|
|
|
{ 1, EBML_UINT, 0, offsetof(MatroskaBlock, non_simple), { .u = 1 } }, |
|
|
|
{ 0 } |
|
|
|
@@ -1048,6 +1049,9 @@ static int ebml_parse_nest(MatroskaDemuxContext *matroska, EbmlSyntax *syntax, |
|
|
|
|
|
|
|
for (i = 0; syntax[i].id; i++) |
|
|
|
switch (syntax[i].type) { |
|
|
|
case EBML_SINT: |
|
|
|
*(int64_t *) ((char *) data + syntax[i].data_offset) = syntax[i].def.i; |
|
|
|
break; |
|
|
|
case EBML_UINT: |
|
|
|
*(uint64_t *) ((char *) data + syntax[i].data_offset) = syntax[i].def.u; |
|
|
|
break; |
|
|
|
@@ -3267,7 +3271,7 @@ static int matroska_parse_cluster_incremental(MatroskaDemuxContext *matroska) |
|
|
|
matroska->current_cluster_num_blocks = blocks_list->nb_elem; |
|
|
|
i = blocks_list->nb_elem - 1; |
|
|
|
if (blocks[i].bin.size > 0 && blocks[i].bin.data) { |
|
|
|
int is_keyframe = blocks[i].non_simple ? !blocks[i].reference : -1; |
|
|
|
int is_keyframe = blocks[i].non_simple ? blocks[i].reference == INT64_MIN : -1; |
|
|
|
uint8_t* additional = blocks[i].additional.size > 0 ? |
|
|
|
blocks[i].additional.data : NULL; |
|
|
|
if (!blocks[i].non_simple) |
|
|
|
@@ -3305,7 +3309,7 @@ static int matroska_parse_cluster(MatroskaDemuxContext *matroska) |
|
|
|
blocks = blocks_list->elem; |
|
|
|
for (i = 0; i < blocks_list->nb_elem; i++) |
|
|
|
if (blocks[i].bin.size > 0 && blocks[i].bin.data) { |
|
|
|
int is_keyframe = blocks[i].non_simple ? !blocks[i].reference : -1; |
|
|
|
int is_keyframe = blocks[i].non_simple ? blocks[i].reference == INT64_MIN : -1; |
|
|
|
res = matroska_parse_block(matroska, blocks[i].bin.data, |
|
|
|
blocks[i].bin.size, blocks[i].bin.pos, |
|
|
|
cluster.timecode, blocks[i].duration, |
|
|
|
|