@ -801,11 +801,15 @@ static int ebml_parse_elem(MatroskaDemuxContext *matroska,
uint32_t id = syntax - > id ;
uint64_t length ;
int res ;
void * newelem ;
data = ( char * ) data + syntax - > data_offset ;
if ( syntax - > list_elem_size ) {
EbmlList * list = data ;
list - > elem = av_realloc ( list - > elem , ( list - > nb_elem + 1 ) * syntax - > list_elem_size ) ;
newelem = av_realloc ( list - > elem , ( list - > nb_elem + 1 ) * syntax - > list_elem_size ) ;
if ( ! newelem )
return AVERROR ( ENOMEM ) ;
list - > elem = newelem ;
data = ( char * ) list - > elem + list - > nb_elem * syntax - > list_elem_size ;
memset ( data , 0 , syntax - > list_elem_size ) ;
list - > nb_elem + + ;
@ -935,6 +939,7 @@ static int matroska_decode_buffer(uint8_t** buf, int* buf_size,
uint8_t * data = * buf ;
int isize = * buf_size ;
uint8_t * pkt_data = NULL ;
uint8_t * newpktdata ;
int pkt_size = isize ;
int result = 0 ;
int olen ;
@ -964,7 +969,12 @@ static int matroska_decode_buffer(uint8_t** buf, int* buf_size,
zstream . avail_in = isize ;
do {
pkt_size * = 3 ;
pkt_data = av_realloc ( pkt_data , pkt_size ) ;
newpktdata = av_realloc ( pkt_data , pkt_size ) ;
if ( ! newpktdata ) {
inflateEnd ( & zstream ) ;
goto failed ;
}
pkt_data = newpktdata ;
zstream . avail_out = pkt_size - zstream . total_out ;
zstream . next_out = pkt_data + zstream . total_out ;
result = inflate ( & zstream , Z_NO_FLUSH ) ;
@ -985,7 +995,12 @@ static int matroska_decode_buffer(uint8_t** buf, int* buf_size,
bzstream . avail_in = isize ;
do {
pkt_size * = 3 ;
pkt_data = av_realloc ( pkt_data , pkt_size ) ;
newpktdata = av_realloc ( pkt_data , pkt_size ) ;
if ( ! newpktdata ) {
BZ2_bzDecompressEnd ( & bzstream ) ;
goto failed ;
}
pkt_data = newpktdata ;
bzstream . avail_out = pkt_size - bzstream . total_out_lo32 ;
bzstream . next_out = pkt_data + bzstream . total_out_lo32 ;
result = BZ2_bzDecompress ( & bzstream ) ;
@ -1040,13 +1055,17 @@ static void matroska_fix_ass_packet(MatroskaDemuxContext *matroska,
}
}
static void matroska_merge_packets ( AVPacket * out , AVPacket * in )
static int matroska_merge_packets ( AVPacket * out , AVPacket * in )
{
out - > data = av_realloc ( out - > data , out - > size + in - > size ) ;
void * newdata = av_realloc ( out - > data , out - > size + in - > size ) ;
if ( ! newdata )
return AVERROR ( ENOMEM ) ;
out - > data = newdata ;
memcpy ( out - > data + out - > size , in - > data , in - > size ) ;
out - > size + = in - > size ;
av_destruct_packet ( in ) ;
av_free ( in ) ;
return 0 ;
}
static void matroska_convert_tag ( AVFormatContext * s , EbmlList * list ,
@ -1604,11 +1623,13 @@ static int matroska_deliver_packet(MatroskaDemuxContext *matroska,
memcpy ( pkt , matroska - > packets [ 0 ] , sizeof ( AVPacket ) ) ;
av_free ( matroska - > packets [ 0 ] ) ;
if ( matroska - > num_packets > 1 ) {
void * newpackets ;
memmove ( & matroska - > packets [ 0 ] , & matroska - > packets [ 1 ] ,
( matroska - > num_packets - 1 ) * sizeof ( AVPacket * ) ) ;
matroska - > packets =
av_realloc ( matroska - > packets , ( matroska - > num_packets - 1 ) *
sizeof ( AVPacket * ) ) ;
newpackets = av_realloc ( matroska - > packets ,
( matroska - > num_packets - 1 ) * sizeof ( AVPacket * ) ) ;
if ( newpackets )
matroska - > packets = newpackets ;
} else {
av_freep ( & matroska - > packets ) ;
}