matroskadec: move buffer decoding code to a separate function

original patch by Evgeniy Stepanov  eugeni.stepanov _at_ gmail.com

Originally committed as revision 13891 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Evgeniy Stepanov 2008-06-22 15:49:44 +00:00 committed by Aurelien Jacobs
parent 51e1cc16d3
commit 935ec5a1d5
1 changed files with 81 additions and 69 deletions

View File

@ -972,6 +972,82 @@ matroska_parse_info (MatroskaDemuxContext *matroska)
return res;
}
static int
matroska_decode_buffer(uint8_t** buf, int* buf_size, MatroskaTrack *track)
{
uint8_t* data = *buf;
int isize = *buf_size;
uint8_t* pkt_data = NULL;
int pkt_size = isize;
int result = 0;
int olen;
switch (track->encoding_algo) {
case MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP:
return track->encoding_settings_len;
case MATROSKA_TRACK_ENCODING_COMP_LZO:
do {
olen = pkt_size *= 3;
pkt_data = av_realloc(pkt_data,
pkt_size+LZO_OUTPUT_PADDING);
result = lzo1x_decode(pkt_data, &olen, data, &isize);
} while (result==LZO_OUTPUT_FULL && pkt_size<10000000);
if (result)
goto failed;
pkt_size -= olen;
break;
#ifdef CONFIG_ZLIB
case MATROSKA_TRACK_ENCODING_COMP_ZLIB: {
z_stream zstream = {0};
if (inflateInit(&zstream) != Z_OK)
return -1;
zstream.next_in = data;
zstream.avail_in = isize;
do {
pkt_size *= 3;
pkt_data = av_realloc(pkt_data, pkt_size);
zstream.avail_out = pkt_size - zstream.total_out;
zstream.next_out = pkt_data + zstream.total_out;
result = inflate(&zstream, Z_NO_FLUSH);
} while (result==Z_OK && pkt_size<10000000);
pkt_size = zstream.total_out;
inflateEnd(&zstream);
if (result != Z_STREAM_END)
goto failed;
break;
}
#endif
#ifdef CONFIG_BZLIB
case MATROSKA_TRACK_ENCODING_COMP_BZLIB: {
bz_stream bzstream = {0};
if (BZ2_bzDecompressInit(&bzstream, 0, 0) != BZ_OK)
return -1;
bzstream.next_in = data;
bzstream.avail_in = isize;
do {
pkt_size *= 3;
pkt_data = av_realloc(pkt_data, pkt_size);
bzstream.avail_out = pkt_size - bzstream.total_out_lo32;
bzstream.next_out = pkt_data + bzstream.total_out_lo32;
result = BZ2_bzDecompress(&bzstream);
} while (result==BZ_OK && pkt_size<10000000);
pkt_size = bzstream.total_out_lo32;
BZ2_bzDecompressEnd(&bzstream);
if (result != BZ_STREAM_END)
goto failed;
break;
}
#endif
}
*buf = pkt_data;
*buf_size = pkt_size;
return 0;
failed:
av_free(pkt_data);
return -1;
}
static int
matroska_add_stream (MatroskaDemuxContext *matroska)
{
@ -2801,78 +2877,14 @@ matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data, int size,
matroska_queue_packet(matroska, pkt);
}
} else {
int result, offset = 0, ilen, olen, pkt_size = lace_size[n];
int offset = 0, pkt_size = lace_size[n];
uint8_t *pkt_data = data;
if (matroska->tracks[track]->encoding_scope & 1) {
switch (matroska->tracks[track]->encoding_algo) {
case MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP:
offset = matroska->tracks[track]->encoding_settings_len;
break;
case MATROSKA_TRACK_ENCODING_COMP_LZO:
pkt_data = NULL;
do {
ilen = lace_size[n];
olen = pkt_size *= 3;
pkt_data = av_realloc(pkt_data,
pkt_size+LZO_OUTPUT_PADDING);
result = lzo1x_decode(pkt_data, &olen, data, &ilen);
} while (result==LZO_OUTPUT_FULL && pkt_size<10000000);
if (result) {
av_free(pkt_data);
continue;
}
pkt_size -= olen;
break;
#ifdef CONFIG_ZLIB
case MATROSKA_TRACK_ENCODING_COMP_ZLIB: {
z_stream zstream = {0};
pkt_data = NULL;
if (inflateInit(&zstream) != Z_OK)
continue;
zstream.next_in = data;
zstream.avail_in = lace_size[n];
do {
pkt_size *= 3;
pkt_data = av_realloc(pkt_data, pkt_size);
zstream.avail_out = pkt_size - zstream.total_out;
zstream.next_out = pkt_data + zstream.total_out;
result = inflate(&zstream, Z_NO_FLUSH);
} while (result==Z_OK && pkt_size<10000000);
pkt_size = zstream.total_out;
inflateEnd(&zstream);
if (result != Z_STREAM_END) {
av_free(pkt_data);
continue;
}
break;
}
#endif
#ifdef CONFIG_BZLIB
case MATROSKA_TRACK_ENCODING_COMP_BZLIB: {
bz_stream bzstream = {0};
pkt_data = NULL;
if (BZ2_bzDecompressInit(&bzstream, 0, 0) != BZ_OK)
continue;
bzstream.next_in = data;
bzstream.avail_in = lace_size[n];
do {
pkt_size *= 3;
pkt_data = av_realloc(pkt_data, pkt_size);
bzstream.avail_out = pkt_size - bzstream.total_out_lo32;
bzstream.next_out = pkt_data + bzstream.total_out_lo32;
result = BZ2_bzDecompress(&bzstream);
} while (result==BZ_OK && pkt_size<10000000);
pkt_size = bzstream.total_out_lo32;
BZ2_bzDecompressEnd(&bzstream);
if (result != BZ_STREAM_END) {
av_free(pkt_data);
continue;
}
break;
}
#endif
}
offset = matroska_decode_buffer(&pkt_data, &pkt_size,
matroska->tracks[track]);
if (offset < 0)
continue;
}
pkt = av_mallocz(sizeof(AVPacket));