Mercurial > libavformat.hg
changeset 3293:d3818f6d7530 libavformat
matroskadec: add support for zlib compressed tracks
author | aurel |
---|---|
date | Tue, 13 May 2008 23:32:13 +0000 |
parents | 7100924e2932 |
children | 5bfc21e57180 |
files | matroskadec.c |
diffstat | 1 files changed, 30 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- 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 <zlib.h> +#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 } }