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;