summaryrefslogtreecommitdiffstats
path: root/libmpdemux
diff options
context:
space:
mode:
authormosu <mosu@b3059339-0415-0410-9bf9-f77b7e298cf2>2003-11-05 15:04:50 +0000
committermosu <mosu@b3059339-0415-0410-9bf9-f77b7e298cf2>2003-11-05 15:04:50 +0000
commitfc386d59ca7a0a7bad2b3dc4bae653ec97c04bff (patch)
treea2378f500bca5b9fda3da853ad80adf6cbe89add /libmpdemux
parenta0cb7264d95f719edf08860759d601144bd8cd2f (diff)
downloadmpv-fc386d59ca7a0a7bad2b3dc4bae653ec97c04bff.tar.bz2
mpv-fc386d59ca7a0a7bad2b3dc4bae653ec97c04bff.tar.xz
Proper usage of zlib for decompression.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@11394 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux')
-rw-r--r--libmpdemux/demux_mkv.cpp54
1 files changed, 33 insertions, 21 deletions
diff --git a/libmpdemux/demux_mkv.cpp b/libmpdemux/demux_mkv.cpp
index 04d458f43a..82cf6a9658 100644
--- a/libmpdemux/demux_mkv.cpp
+++ b/libmpdemux/demux_mkv.cpp
@@ -238,10 +238,6 @@ typedef struct mkv_track {
// Generic content encoding support.
vector<mkv_content_encoding_t> *c_encodings;
-#ifdef HAVE_ZLIB
- z_stream zstream;
- bool zstream_initiated;
-#endif
} mkv_track_t;
typedef struct mkv_demuxer {
@@ -719,7 +715,7 @@ static bool mkv_parse_idx(mkv_track_t *t) {
static bool reverse_encodings(mkv_track_t *track, unsigned char *&data,
uint32_t &size, uint32_t type) {
- int new_size;
+ int new_size, n;
unsigned char *new_data, *old_data;
bool modified;
vector<mkv_content_encoding_t>::iterator ce;
@@ -738,33 +734,49 @@ static bool reverse_encodings(mkv_track_t *track, unsigned char *&data,
#ifdef HAVE_ZLIB
if (ce->comp_algo == 0) {
int result;
+ z_stream zstream;
old_data = new_data;
- new_data = (unsigned char *)safemalloc(new_size * 20);
-
- track->zstream.zalloc = (alloc_func)0;
- track->zstream.zfree = (free_func)0;
- track->zstream.opaque = (voidpf)0;
- inflateInit(&track->zstream);
- track->zstream.next_in = (Bytef *)old_data;
- track->zstream.next_out = (Bytef *)new_data;
- track->zstream.avail_in = new_size;
- track->zstream.avail_out = 20 * new_size;
- result = inflate(&track->zstream, Z_FULL_FLUSH);
+
+ zstream.zalloc = (alloc_func)0;
+ zstream.zfree = (free_func)0;
+ zstream.opaque = (voidpf)0;
+ result = inflateInit(&zstream);
if (result != Z_OK) {
- mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Zlib decompression failed. "
+ mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Zlib initialization failed. "
"Result: %d\n", result);
safefree(new_data);
data = old_data;
size = new_size;
- inflateEnd(&track->zstream);
return modified;
}
+ zstream.next_in = (Bytef *)old_data;
+ zstream.avail_in = new_size;
+
+ n = 0;
+ new_data = NULL;
+ do {
+ n++;
+ new_data = (unsigned char *)realloc(new_data, n * 4000);
+ zstream.next_out = (Bytef *)&new_data[(n - 1) * 4000];
+ zstream.avail_out = 4000;
+ result = inflate(&zstream, Z_NO_FLUSH);
+ if ((result != Z_OK) && (result != Z_STREAM_END)) {
+ mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Zlib decompression failed. "
+ "Result: %d \n", result);
+ safefree(new_data);
+ data = old_data;
+ size = new_size;
+ inflateEnd(&zstream);
+ return modified;
+ }
+ } while ((zstream.avail_out == 0) &&
+ (zstream.avail_in != 0) && (result != Z_STREAM_END));
mp_msg(MSGT_DEMUX, MSGL_DBG2, "[mkv] zlib decompression: from %d to "
- "%d\n", new_size, 20 * new_size - track->zstream.avail_out);
- new_size = 20 * new_size - track->zstream.avail_out;
- inflateEnd(&track->zstream);
+ "%d \n", new_size, zstream.total_out);
+ new_size = zstream.total_out;
+ inflateEnd(&zstream);
if (modified)
safefree(old_data);