summaryrefslogtreecommitdiff
path: root/libavformat
diff options
context:
space:
mode:
authorAurelien Jacobs <aurel@gnuage.org>2008-05-15 23:12:41 +0000
committerAurelien Jacobs <aurel@gnuage.org>2008-05-15 23:12:41 +0000
commit54dddf095c96ee556d1ce8a874170da568ee5189 (patch)
treecade89d69fdd37fd1554b211dd2aa62804cb12f2 /libavformat
parente8214e0e480520f6b40188e158f9e1c9d642ca25 (diff)
matroskadec: add support for bzlib compressed tracks
Originally committed as revision 13177 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/matroskadec.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index e4c6704a1f..9c65a5b9cc 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
}
}