Removed the limitation to max. eight laced blocks.

git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@12066 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
mosu 2004-03-25 20:47:37 +00:00
parent 70d700b8cd
commit 52fdaaef8c
1 changed files with 21 additions and 9 deletions

View File

@ -2107,12 +2107,13 @@ demux_close_mkv (demuxer_t *demuxer)
static int static int
demux_mkv_read_block_lacing (uint8_t *buffer, uint64_t *size, demux_mkv_read_block_lacing (uint8_t *buffer, uint64_t *size,
uint8_t *laces, uint32_t *lace_size) uint8_t *laces, uint32_t **all_lace_sizes)
{ {
uint32_t total = 0; uint32_t total = 0, *lace_size;
uint8_t flags; uint8_t flags;
int i; int i;
*all_lace_sizes = NULL;
/* lacing flags */ /* lacing flags */
flags = *buffer++; flags = *buffer++;
(*size)--; (*size)--;
@ -2121,6 +2122,7 @@ demux_mkv_read_block_lacing (uint8_t *buffer, uint64_t *size,
{ {
case 0: /* no lacing */ case 0: /* no lacing */
*laces = 1; *laces = 1;
lace_size = (uint32_t *)calloc(*laces, sizeof(uint32_t));
lace_size[0] = *size; lace_size[0] = *size;
break; break;
@ -2129,8 +2131,8 @@ demux_mkv_read_block_lacing (uint8_t *buffer, uint64_t *size,
case 3: /* EBML lacing */ case 3: /* EBML lacing */
*laces = *buffer++; *laces = *buffer++;
(*size)--; (*size)--;
if (++*laces > 8) (*laces)++;
return 1; lace_size = (uint32_t *)calloc(*laces, sizeof(uint32_t));
switch ((flags & 0x06) >> 1) switch ((flags & 0x06) >> 1)
{ {
@ -2157,8 +2159,10 @@ demux_mkv_read_block_lacing (uint8_t *buffer, uint64_t *size,
{ {
int l; int l;
uint64_t num = ebml_read_vlen_uint (buffer, &l); uint64_t num = ebml_read_vlen_uint (buffer, &l);
if (num == EBML_UINT_INVALID) if (num == EBML_UINT_INVALID) {
free(lace_size);
return 1; return 1;
}
buffer += l; buffer += l;
*size -= l; *size -= l;
@ -2167,8 +2171,10 @@ demux_mkv_read_block_lacing (uint8_t *buffer, uint64_t *size,
{ {
int64_t snum; int64_t snum;
snum = ebml_read_vlen_int (buffer, &l); snum = ebml_read_vlen_int (buffer, &l);
if (snum == EBML_INT_INVALID) if (snum == EBML_INT_INVALID) {
free(lace_size);
return 1; return 1;
}
buffer += l; buffer += l;
*size -= l; *size -= l;
lace_size[i] = lace_size[i-1] + snum; lace_size[i] = lace_size[i-1] + snum;
@ -2180,6 +2186,7 @@ demux_mkv_read_block_lacing (uint8_t *buffer, uint64_t *size,
} }
break; break;
} }
*all_lace_sizes = lace_size;
return 0; return 0;
} }
@ -2471,7 +2478,7 @@ handle_block (demuxer_t *demuxer, uint8_t *block, uint64_t length,
demux_stream_t *ds = NULL; demux_stream_t *ds = NULL;
uint64_t old_length; uint64_t old_length;
int64_t tc; int64_t tc;
uint32_t lace_size[8]; uint32_t *lace_size;
uint8_t laces; uint8_t laces;
int i, num, tmp, use_this_block = 1; int i, num, tmp, use_this_block = 1;
float current_pts; float current_pts;
@ -2485,14 +2492,17 @@ handle_block (demuxer_t *demuxer, uint8_t *block, uint64_t length,
block += 2; block += 2;
length -= tmp + 2; length -= tmp + 2;
old_length = length; old_length = length;
demux_mkv_read_block_lacing (block, &length, &laces, lace_size); if (demux_mkv_read_block_lacing (block, &length, &laces, &lace_size))
return 0;
block += old_length - length; block += old_length - length;
tc = ((time*mkv_d->tc_scale+mkv_d->cluster_tc) /1000000.0 - mkv_d->first_tc); tc = ((time*mkv_d->tc_scale+mkv_d->cluster_tc) /1000000.0 - mkv_d->first_tc);
if (tc < 0) if (tc < 0)
tc = 0; tc = 0;
if (mkv_d->stop_timecode > 0 && tc > mkv_d->stop_timecode) if (mkv_d->stop_timecode > 0 && tc > mkv_d->stop_timecode) {
free(lace_size);
return -1; return -1;
}
current_pts = tc / 1000.0; current_pts = tc / 1000.0;
clear_subtitles(demuxer, tc, 0); clear_subtitles(demuxer, tc, 0);
@ -2588,9 +2598,11 @@ handle_block (demuxer_t *demuxer, uint8_t *block, uint64_t length,
else if (ds == demuxer->audio) else if (ds == demuxer->audio)
mkv_d->a_skip_to_keyframe = 0; mkv_d->a_skip_to_keyframe = 0;
free(lace_size);
return 1; return 1;
} }
free(lace_size);
return 0; return 0;
} }