# HG changeset patch # User mosu # Date 1068044690 0 # Node ID 6bacd63a80a76c880d126817067262e206e44922 # Parent 6736b7fd66a812c689ac526d7a1b1dd0efa4b10d Proper usage of zlib for decompression. diff -r 6736b7fd66a8 -r 6bacd63a80a7 libmpdemux/demux_mkv.cpp --- a/libmpdemux/demux_mkv.cpp Tue Nov 04 22:11:50 2003 +0000 +++ b/libmpdemux/demux_mkv.cpp Wed Nov 05 15:04:50 2003 +0000 @@ -238,10 +238,6 @@ // Generic content encoding support. vector *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 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::iterator ce; @@ -738,33 +734,49 @@ #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);