@ -36,6 +36,7 @@
# include "libavutil/imgutils.h"
# include "libavutil/internal.h"
# include "libavutil/intmath.h"
# include "libavutil/opt.h"
# include "avcodec.h"
# include "bytestream.h"
@ -195,27 +196,33 @@ static int bsfs_init(AVCodecContext *avctx)
while ( bsfs_str & & * bsfs_str ) {
AVBSFContext * * tmp ;
const AVBitStreamFilter * filter ;
char * bsf ;
char * bsf , * bsf_options_str , * bsf_name ;
bsf = av_get_token ( & bsfs_str , " , " ) ;
if ( ! bsf ) {
ret = AVERROR ( ENOMEM ) ;
goto fail ;
}
bsf_name = av_strtok ( bsf , " = " , & bsf_options_str ) ;
if ( ! bsf_name ) {
av_freep ( & bsf ) ;
ret = AVERROR ( ENOMEM ) ;
goto fail ;
}
filter = av_bsf_get_by_name ( bsf ) ;
filter = av_bsf_get_by_name ( bsf_name ) ;
if ( ! filter ) {
av_log ( avctx , AV_LOG_ERROR , " A non-existing bitstream filter %s "
" requested by a decoder. This is a bug, please report it. \n " ,
bsf ) ;
ret = AVERROR_BUG ;
bsf_name ) ;
av_freep ( & bsf ) ;
ret = AVERROR_BUG ;
goto fail ;
}
av_freep ( & bsf ) ;
tmp = av_realloc_array ( s - > bsfs , s - > nb_bsfs + 1 , sizeof ( * s - > bsfs ) ) ;
if ( ! tmp ) {
av_freep ( & bsf ) ;
ret = AVERROR ( ENOMEM ) ;
goto fail ;
}
@ -223,8 +230,10 @@ static int bsfs_init(AVCodecContext *avctx)
s - > nb_bsfs + + ;
ret = av_bsf_alloc ( filter , & s - > bsfs [ s - > nb_bsfs - 1 ] ) ;
if ( ret < 0 )
if ( ret < 0 ) {
av_freep ( & bsf ) ;
goto fail ;
}
if ( s - > nb_bsfs = = 1 ) {
/* We do not currently have an API for passing the input timebase into decoders,
@ -238,12 +247,38 @@ static int bsfs_init(AVCodecContext *avctx)
ret = avcodec_parameters_copy ( s - > bsfs [ s - > nb_bsfs - 1 ] - > par_in ,
s - > bsfs [ s - > nb_bsfs - 2 ] - > par_out ) ;
}
if ( ret < 0 )
if ( ret < 0 ) {
av_freep ( & bsf ) ;
goto fail ;
}
if ( bsf_options_str & & filter - > priv_class ) {
const AVOption * opt = av_opt_next ( s - > bsfs [ s - > nb_bsfs - 1 ] - > priv_data , NULL ) ;
const char * shorthand [ 2 ] = { NULL } ;
if ( opt )
shorthand [ 0 ] = opt - > name ;
ret = av_opt_set_from_string ( s - > bsfs [ s - > nb_bsfs - 1 ] - > priv_data , bsf_options_str , shorthand , " = " , " : " ) ;
if ( ret < 0 ) {
if ( ret ! = AVERROR ( ENOMEM ) ) {
av_log ( avctx , AV_LOG_ERROR , " Invalid options for bitstream filter %s "
" requested by the decoder. This is a bug, please report it. \n " ,
bsf_name ) ;
ret = AVERROR_BUG ;
}
av_freep ( & bsf ) ;
goto fail ;
}
}
av_freep ( & bsf ) ;
ret = av_bsf_init ( s - > bsfs [ s - > nb_bsfs - 1 ] ) ;
if ( ret < 0 )
goto fail ;
if ( * bsfs_str )
bsfs_str + + ;
}
return 0 ;