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

aurel subversion
Wed May 14 01:32:14 CEST 2008


Author: aurel
Date: Wed May 14 01:32:13 2008
New Revision: 13151

Log:
matroskadec: add support for zlib compressed tracks

Modified:
   trunk/libavformat/matroskadec.c

Modified: trunk/libavformat/matroskadec.c
==============================================================================
--- trunk/libavformat/matroskadec.c	(original)
+++ trunk/libavformat/matroskadec.c	Wed May 14 01:32:13 2008
@@ -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 @@ matroska_add_stream (MatroskaDemuxContex
                                                     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 @@ matroska_parse_block(MatroskaDemuxContex
                         }
                         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
                     }
                 }
 




More information about the ffmpeg-cvslog mailing list