changeset 3293:d3818f6d7530 libavformat

matroskadec: add support for zlib compressed tracks
author aurel
date Tue, 13 May 2008 23:32:13 +0000
parents 7100924e2932
children 5bfc21e57180
files matroskadec.c
diffstat 1 files changed, 30 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/matroskadec.c	Tue May 13 17:43:18 2008 +0000
+++ b/matroskadec.c	Tue May 13 23:32:13 2008 +0000
@@ -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 @@
                                                     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 @@
                         }
                         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
                     }
                 }