From fbb878ce0fa60cb84dfd821f4aa9687398c2c70a Mon Sep 17 00:00:00 2001 From: Aurelien Jacobs Date: Tue, 13 May 2008 23:32:13 +0000 Subject: [PATCH] matroskadec: add support for zlib compressed tracks Originally committed as revision 13151 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/matroskadec.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index e71ea3a95..40dcc9c79 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -35,6 +35,9 @@ #include "libavcodec/mpeg4audio.h" #include "libavutil/intfloat_readwrite.h" #include "libavutil/lzo.h" +#ifdef CONFIG_ZLIB +#include +#endif typedef struct Track { MatroskaTrackType type; @@ -1500,6 +1503,9 @@ matroska_add_stream (MatroskaDemuxContext *matroska) if ((res = ebml_read_uint(matroska, &id, &num)) < 0) break; if (num != MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP && +#ifdef CONFIG_ZLIB + num != MATROSKA_TRACK_ENCODING_COMP_ZLIB && +#endif num != MATROSKA_TRACK_ENCODING_COMP_LZO) av_log(matroska->ctx, AV_LOG_ERROR, "Unsupported compression algo"); @@ -2720,6 +2726,30 @@ matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data, int size, } 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 } } -- 2.11.0