Mercurial > mplayer.hg
comparison libmpdemux/demux_mkv.c @ 22081:fde1ddcc04c7
Make mkv demuxer use ffmpeg LZO as well.
author | reimar |
---|---|
date | Wed, 31 Jan 2007 23:28:34 +0000 |
parents | 9562199ac075 |
children | 3d415b28e5e4 |
comparison
equal
deleted
inserted
replaced
22080:fc27312ae599 | 22081:fde1ddcc04c7 |
---|---|
34 | 34 |
35 #ifdef HAVE_ZLIB | 35 #ifdef HAVE_ZLIB |
36 #include <zlib.h> | 36 #include <zlib.h> |
37 #endif | 37 #endif |
38 | 38 |
39 #ifdef USE_LIBLZO | 39 #ifdef USE_LIBAVUTIL_SO |
40 #include <lzo1x.h> | 40 #include <ffmpeg/lzo.h> |
41 #else | 41 #else |
42 #include "libmpcodecs/native/minilzo.h" | 42 #include "libavutil/lzo.h" |
43 #endif | 43 #endif |
44 | 44 |
45 #if !defined(MIN) | 45 #if !defined(MIN) |
46 #define MIN(a, b) ((a)<(b)?(a):(b)) | 46 #define MIN(a, b) ((a)<(b)?(a):(b)) |
47 #endif | 47 #endif |
628 if (track->encodings[i].comp_algo == 2) | 628 if (track->encodings[i].comp_algo == 2) |
629 { | 629 { |
630 /* lzo encoded track */ | 630 /* lzo encoded track */ |
631 int dstlen = *size * 3; | 631 int dstlen = *size * 3; |
632 | 632 |
633 if (lzo_init () != LZO_E_OK) | |
634 { | |
635 mp_msg (MSGT_DEMUX, MSGL_WARN, | |
636 MSGTR_MPDEMUX_MKV_LzoInitializationFailed); | |
637 return modified; | |
638 } | |
639 | |
640 *dest = NULL; | 633 *dest = NULL; |
641 while (1) | 634 while (1) |
642 { | 635 { |
643 *dest = realloc (*dest, dstlen); | 636 int srclen = *size; |
644 result = lzo1x_decompress_safe (src, *size, *dest, &dstlen, | 637 if (dstlen > SIZE_MAX - LZO_OUTPUT_PADDING) goto lzo_fail; |
645 NULL); | 638 *dest = realloc (*dest, dstlen + LZO_OUTPUT_PADDING); |
646 if (result == LZO_E_OK) | 639 result = lzo1x_decode (*dest, &dstlen, src, &srclen); |
640 if (result == 0) | |
647 break; | 641 break; |
648 if (result != LZO_E_OUTPUT_OVERRUN) | 642 if (!(result & LZO_OUTPUT_FULL)) |
649 { | 643 { |
644 lzo_fail: | |
650 mp_msg (MSGT_DEMUX, MSGL_WARN, | 645 mp_msg (MSGT_DEMUX, MSGL_WARN, |
651 MSGTR_MPDEMUX_MKV_LzoDecompressionFailed); | 646 MSGTR_MPDEMUX_MKV_LzoDecompressionFailed); |
652 free(*dest); | 647 free(*dest); |
653 *dest = NULL; | 648 *dest = NULL; |
654 return modified; | 649 return modified; |
1155 int x; | 1150 int x; |
1156 uint64_t num = ebml_read_length (s, &x); | 1151 uint64_t num = ebml_read_length (s, &x); |
1157 // audit: cheap guard against overflows later.. | 1152 // audit: cheap guard against overflows later.. |
1158 if (num > SIZE_MAX - 1000) return 0; | 1153 if (num > SIZE_MAX - 1000) return 0; |
1159 l = x + num; | 1154 l = x + num; |
1160 track->private_data = malloc (num); | 1155 track->private_data = malloc (num + LZO_INPUT_PADDING); |
1161 if (stream_read(s, track->private_data, num) != (int) num) | 1156 if (stream_read(s, track->private_data, num) != (int) num) |
1162 goto err_out; | 1157 goto err_out; |
1163 track->private_size = num; | 1158 track->private_size = num; |
1164 mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + CodecPrivate, length " | 1159 mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] | + CodecPrivate, length " |
1165 "%u\n", track->private_size); | 1160 "%u\n", track->private_size); |
3407 } | 3402 } |
3408 | 3403 |
3409 case MATROSKA_ID_BLOCK: | 3404 case MATROSKA_ID_BLOCK: |
3410 block_length = ebml_read_length (s, &tmp); | 3405 block_length = ebml_read_length (s, &tmp); |
3411 free(block); | 3406 free(block); |
3412 block = malloc (block_length); | 3407 if (block_length > SIZE_MAX - LZO_INPUT_PADDING) return 0; |
3408 block = malloc (block_length + LZO_INPUT_PADDING); | |
3413 demuxer->filepos = stream_tell (s); | 3409 demuxer->filepos = stream_tell (s); |
3414 if (stream_read (s,block,block_length) != (int) block_length) | 3410 if (stream_read (s,block,block_length) != (int) block_length) |
3415 { | 3411 { |
3416 free(block); | 3412 free(block); |
3417 return 0; | 3413 return 0; |