diff options
author | Aurelien Jacobs <aurel@gnuage.org> | 2008-05-15 23:12:41 +0000 |
---|---|---|
committer | Aurelien Jacobs <aurel@gnuage.org> | 2008-05-15 23:12:41 +0000 |
commit | 54dddf095c96ee556d1ce8a874170da568ee5189 (patch) | |
tree | cade89d69fdd37fd1554b211dd2aa62804cb12f2 /libavformat/matroskadec.c | |
parent | e8214e0e480520f6b40188e158f9e1c9d642ca25 (diff) | |
download | ffmpeg-streaming-54dddf095c96ee556d1ce8a874170da568ee5189.zip ffmpeg-streaming-54dddf095c96ee556d1ce8a874170da568ee5189.tar.gz |
matroskadec: add support for bzlib compressed tracks
Originally committed as revision 13177 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/matroskadec.c')
-rw-r--r-- | libavformat/matroskadec.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index e4c6704..9c65a5b 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -38,6 +38,9 @@ #ifdef CONFIG_ZLIB #include <zlib.h> #endif +#ifdef CONFIG_BZLIB +#include <bzlib.h> +#endif typedef struct Track { MatroskaTrackType type; @@ -1506,6 +1509,9 @@ matroska_add_stream (MatroskaDemuxContext *matroska) #ifdef CONFIG_ZLIB num != MATROSKA_TRACK_ENCODING_COMP_ZLIB && #endif +#ifdef CONFIG_BZLIB + num != MATROSKA_TRACK_ENCODING_COMP_BZLIB && +#endif num != MATROSKA_TRACK_ENCODING_COMP_LZO) av_log(matroska->ctx, AV_LOG_ERROR, "Unsupported compression algo\n"); @@ -2750,6 +2756,30 @@ matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data, int size, 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 } } |