# HG changeset patch # User aurel # Date 1210721533 0 # Node ID d3818f6d75308d9544d5101997c9050e383751b1 # Parent 7100924e2932538dd7b474f9f6fcd18ac071c8a7 matroskadec: add support for zlib compressed tracks diff -r 7100924e2932 -r d3818f6d7530 matroskadec.c --- a/matroskadec.c Tue May 13 17:43:18 2008 +0000 +++ b/matroskadec.c Tue May 13 23:32:13 2008 +0000 @@ -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 @@ 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 @@ } 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 } }