[FFmpeg-cvslog] r13177 - trunk/libavformat/matroskadec.c

aurel subversion
Fri May 16 01:12:41 CEST 2008


Author: aurel
Date: Fri May 16 01:12:41 2008
New Revision: 13177

Log:
matroskadec: add support for bzlib compressed tracks

Modified:
   trunk/libavformat/matroskadec.c

Modified: trunk/libavformat/matroskadec.c
==============================================================================
--- trunk/libavformat/matroskadec.c	(original)
+++ trunk/libavformat/matroskadec.c	Fri May 16 01:12:41 2008
@@ -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 (MatroskaDemuxContex
 #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(MatroskaDemuxContex
                         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
                     }
                 }
 




More information about the ffmpeg-cvslog mailing list