extract ebml_read_binary() out of matroska_parse_block()

This allows to read all the blockgroup parameters before
parsing the block itself.

Originally committed as revision 8331 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Aurelien Jacobs 2007-03-11 22:54:15 +00:00
parent 12f3278dc5
commit 4d41f3eea0
1 changed files with 24 additions and 13 deletions

View File

@ -2375,24 +2375,18 @@ rv_offset(uint8_t *data, int slice, int slices)
}
static int
matroska_parse_block(MatroskaDemuxContext *matroska, uint64_t cluster_time,
matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data, int size,
int64_t pos, uint64_t cluster_time,
int is_keyframe, int *ptrack, AVPacket **ppkt)
{
int res;
uint32_t id;
int res = 0;
int track;
AVPacket *pkt;
uint8_t *data, *origdata;
int size;
uint8_t *origdata = data;
int16_t block_time;
uint32_t *lace_size = NULL;
int n, flags, laces = 0;
uint64_t num;
int64_t pos= url_ftell(&matroska->ctx->pb);
if ((res = ebml_read_binary(matroska, &id, &data, &size)) < 0)
return res;
origdata = data;
/* first byte(s): tracknum */
if ((n = matroska_ebmlnum_uint(data, size, &num)) < 0) {
@ -2567,6 +2561,9 @@ matroska_parse_blockgroup (MatroskaDemuxContext *matroska,
int is_keyframe = PKT_FLAG_KEY, last_num_packets = matroska->num_packets;
uint64_t duration = AV_NOPTS_VALUE;
int track = -1;
uint8_t *data;
int size = 0;
int64_t pos = 0;
av_log(matroska->ctx, AV_LOG_DEBUG, "parsing blockgroup...\n");
@ -2584,8 +2581,8 @@ matroska_parse_blockgroup (MatroskaDemuxContext *matroska,
* of the harder things, so this code is a bit complicated.
* See http://www.matroska.org/ for documentation. */
case MATROSKA_ID_BLOCK: {
res = matroska_parse_block(matroska, cluster_time,
is_keyframe, &track, &pkt);
pos = url_ftell(&matroska->ctx->pb);
res = ebml_read_binary(matroska, &id, &data, &size);
break;
}
@ -2620,6 +2617,13 @@ matroska_parse_blockgroup (MatroskaDemuxContext *matroska,
}
}
if (res)
return res;
if (size > 0)
res = matroska_parse_block(matroska, data, size, pos, cluster_time,
is_keyframe, &track, &pkt);
if (pkt)
{
if (duration != AV_NOPTS_VALUE)
@ -2637,6 +2641,9 @@ matroska_parse_cluster (MatroskaDemuxContext *matroska)
int res = 0;
uint32_t id;
uint64_t cluster_time = 0;
uint8_t *data;
int64_t pos;
int size;
av_log(matroska->ctx, AV_LOG_DEBUG,
"parsing cluster at %"PRId64"\n", url_ftell(&matroska->ctx->pb));
@ -2668,7 +2675,11 @@ matroska_parse_cluster (MatroskaDemuxContext *matroska)
break;
case MATROSKA_ID_SIMPLEBLOCK:
matroska_parse_block(matroska, cluster_time, -1, NULL, NULL);
pos = url_ftell(&matroska->ctx->pb);
res = ebml_read_binary(matroska, &id, &data, &size);
if (res == 0)
res = matroska_parse_block(matroska, data, size, pos,
cluster_time, -1, NULL, NULL);
break;
default: