matroskadec: add support for bzlib compressed tracks
authorAurelien Jacobs <aurel@gnuage.org>
Thu, 15 May 2008 23:12:41 +0000 (23:12 +0000)
committerAurelien Jacobs <aurel@gnuage.org>
Thu, 15 May 2008 23:12:41 +0000 (23:12 +0000)
Originally committed as revision 13177 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/matroskadec.c

index e4c6704..9c65a5b 100644 (file)
@@ -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
                     }
                 }