@ -756,7 +756,8 @@ static int mov_read_enda(MOVContext *c, AVIOContext *pb, MOVAtom atom)
}
/* FIXME modify qdm2/svq3/h264 decoders to take full atom as extradata */
static int mov_read_extradata ( MOVContext * c , AVIOContext * pb , MOVAtom atom )
static int mov_read_extradata ( MOVContext * c , AVIOContext * pb , MOVAtom atom ,
enum CodecID codec_id )
{
AVStream * st ;
uint64_t size ;
@ -765,6 +766,10 @@ static int mov_read_extradata(MOVContext *c, AVIOContext *pb, MOVAtom atom)
if ( c - > fc - > nb_streams < 1 ) // will happen with jp2 files
return 0 ;
st = c - > fc - > streams [ c - > fc - > nb_streams - 1 ] ;
if ( st - > codec - > codec_id ! = codec_id )
return 0 ; /* unexpected codec_id - don't mess with extradata */
size = ( uint64_t ) st - > codec - > extradata_size + atom . size + 8 + FF_INPUT_BUFFER_PADDING_SIZE ;
if ( size > INT_MAX | | ( uint64_t ) atom . size > INT_MAX )
return - 1 ;
@ -780,6 +785,27 @@ static int mov_read_extradata(MOVContext *c, AVIOContext *pb, MOVAtom atom)
return 0 ;
}
/* wrapper functions for reading ALAC/AVS/MJPEG/MJPEG2000 extradata atoms only for those codecs */
static int mov_read_alac ( MOVContext * c , AVIOContext * pb , MOVAtom atom )
{
return mov_read_extradata ( c , pb , atom , CODEC_ID_ALAC ) ;
}
static int mov_read_avss ( MOVContext * c , AVIOContext * pb , MOVAtom atom )
{
return mov_read_extradata ( c , pb , atom , CODEC_ID_AVS ) ;
}
static int mov_read_fiel ( MOVContext * c , AVIOContext * pb , MOVAtom atom )
{
return mov_read_extradata ( c , pb , atom , CODEC_ID_MJPEG ) ;
}
static int mov_read_jp2h ( MOVContext * c , AVIOContext * pb , MOVAtom atom )
{
return mov_read_extradata ( c , pb , atom , CODEC_ID_JPEG2000 ) ;
}
static int mov_read_wave ( MOVContext * c , AVIOContext * pb , MOVAtom atom )
{
AVStream * st ;
@ -2251,7 +2277,7 @@ static int mov_read_chan(MOVContext *c, AVIOContext *pb, MOVAtom atom)
}
static const MOVParseTableEntry mov_default_parse_table [ ] = {
{ MKTAG ( ' a ' , ' v ' , ' s ' , ' s ' ) , mov_read_extradata } ,
{ MKTAG ( ' a ' , ' v ' , ' s ' , ' s ' ) , mov_read_avss } ,
{ MKTAG ( ' c ' , ' h ' , ' p ' , ' l ' ) , mov_read_chpl } ,
{ MKTAG ( ' c ' , ' o ' , ' 6 ' , ' 4 ' ) , mov_read_stco } ,
{ MKTAG ( ' c ' , ' t ' , ' t ' , ' s ' ) , mov_read_ctts } , /* composition time to sample */
@ -2260,12 +2286,12 @@ static const MOVParseTableEntry mov_default_parse_table[] = {
{ MKTAG ( ' e ' , ' d ' , ' t ' , ' s ' ) , mov_read_default } ,
{ MKTAG ( ' e ' , ' l ' , ' s ' , ' t ' ) , mov_read_elst } ,
{ MKTAG ( ' e ' , ' n ' , ' d ' , ' a ' ) , mov_read_enda } ,
{ MKTAG ( ' f ' , ' i ' , ' e ' , ' l ' ) , mov_read_extradata } ,
{ MKTAG ( ' f ' , ' i ' , ' e ' , ' l ' ) , mov_read_fiel } ,
{ MKTAG ( ' f ' , ' t ' , ' y ' , ' p ' ) , mov_read_ftyp } ,
{ MKTAG ( ' g ' , ' l ' , ' b ' , ' l ' ) , mov_read_glbl } ,
{ MKTAG ( ' h ' , ' d ' , ' l ' , ' r ' ) , mov_read_hdlr } ,
{ MKTAG ( ' i ' , ' l ' , ' s ' , ' t ' ) , mov_read_ilst } ,
{ MKTAG ( ' j ' , ' p ' , ' 2 ' , ' h ' ) , mov_read_extradata } ,
{ MKTAG ( ' j ' , ' p ' , ' 2 ' , ' h ' ) , mov_read_jp2h } ,
{ MKTAG ( ' m ' , ' d ' , ' a ' , ' t ' ) , mov_read_mdat } ,
{ MKTAG ( ' m ' , ' d ' , ' h ' , ' d ' ) , mov_read_mdhd } ,
{ MKTAG ( ' m ' , ' d ' , ' i ' , ' a ' ) , mov_read_default } ,
@ -2276,7 +2302,7 @@ static const MOVParseTableEntry mov_default_parse_table[] = {
{ MKTAG ( ' m ' , ' v ' , ' e ' , ' x ' ) , mov_read_default } ,
{ MKTAG ( ' m ' , ' v ' , ' h ' , ' d ' ) , mov_read_mvhd } ,
{ MKTAG ( ' S ' , ' M ' , ' I ' , ' ' ) , mov_read_smi } , /* Sorenson extension ??? */
{ MKTAG ( ' a ' , ' l ' , ' a ' , ' c ' ) , mov_read_extradata } , /* alac specific atom */
{ MKTAG ( ' a ' , ' l ' , ' a ' , ' c ' ) , mov_read_alac } , /* alac specific atom */
{ MKTAG ( ' a ' , ' v ' , ' c ' , ' C ' ) , mov_read_glbl } ,
{ MKTAG ( ' p ' , ' a ' , ' s ' , ' p ' ) , mov_read_pasp } ,
{ MKTAG ( ' s ' , ' t ' , ' b ' , ' l ' ) , mov_read_default } ,