mirror of https://git.ffmpeg.org/ffmpeg.git
matroskadec: add support for zlib compressed tracks
Originally committed as revision 13151 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
40a655e306
commit
fbb878ce0f
|
@ -35,6 +35,9 @@
|
||||||
#include "libavcodec/mpeg4audio.h"
|
#include "libavcodec/mpeg4audio.h"
|
||||||
#include "libavutil/intfloat_readwrite.h"
|
#include "libavutil/intfloat_readwrite.h"
|
||||||
#include "libavutil/lzo.h"
|
#include "libavutil/lzo.h"
|
||||||
|
#ifdef CONFIG_ZLIB
|
||||||
|
#include <zlib.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef struct Track {
|
typedef struct Track {
|
||||||
MatroskaTrackType type;
|
MatroskaTrackType type;
|
||||||
|
@ -1500,6 +1503,9 @@ matroska_add_stream (MatroskaDemuxContext *matroska)
|
||||||
if ((res = ebml_read_uint(matroska, &id, &num)) < 0)
|
if ((res = ebml_read_uint(matroska, &id, &num)) < 0)
|
||||||
break;
|
break;
|
||||||
if (num != MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP &&
|
if (num != MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP &&
|
||||||
|
#ifdef CONFIG_ZLIB
|
||||||
|
num != MATROSKA_TRACK_ENCODING_COMP_ZLIB &&
|
||||||
|
#endif
|
||||||
num != MATROSKA_TRACK_ENCODING_COMP_LZO)
|
num != MATROSKA_TRACK_ENCODING_COMP_LZO)
|
||||||
av_log(matroska->ctx, AV_LOG_ERROR,
|
av_log(matroska->ctx, AV_LOG_ERROR,
|
||||||
"Unsupported compression algo");
|
"Unsupported compression algo");
|
||||||
|
@ -2720,6 +2726,30 @@ matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data, int size,
|
||||||
}
|
}
|
||||||
pkt_size -= olen;
|
pkt_size -= olen;
|
||||||
break;
|
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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue