@ -95,6 +95,8 @@ static int write_number(void *obj, const AVOption *o, void *dst, double num, int
switch ( o - > type ) {
case AV_OPT_TYPE_FLAGS :
case AV_OPT_TYPE_PIXEL_FMT :
case AV_OPT_TYPE_SAMPLE_FMT :
case AV_OPT_TYPE_INT : * ( int * ) dst = llrint ( num / den ) * intnum ; break ;
case AV_OPT_TYPE_INT64 : * ( int64_t * ) dst = llrint ( num / den ) * intnum ; break ;
case AV_OPT_TYPE_FLOAT : * ( float * ) dst = num * intnum / den ; break ;
@ -427,11 +429,14 @@ int av_opt_set_image_size(void *obj, const char *name, int w, int h, int search_
}
static int set_format ( void * obj , const char * name , int fmt , int search_flags ,
enum AVOptionType type , const char * desc , int max )
enum AVOptionType type , const char * desc , int nb_fmts )
{
void * target_obj ;
const AVOption * o = av_opt_find2 ( obj , name , NULL , 0 ,
search_flags , & target_obj ) ;
int min , max ;
const AVClass * class = * ( AVClass * * ) obj ;
if ( ! o | | ! target_obj )
return AVERROR_OPTION_NOT_FOUND ;
if ( o - > type ! = type ) {
@ -440,10 +445,20 @@ static int set_format(void *obj, const char *name, int fmt, int search_flags,
return AVERROR ( EINVAL ) ;
}
if ( fmt < - 1 | | fmt > max ) {
# if LIBAVUTIL_VERSION_MAJOR < 53
if ( class - > version & & class - > version < AV_VERSION_INT ( 52 , 11 , 100 ) ) {
min = - 1 ;
max = nb_fmts - 1 ;
} else
# endif
{
min = FFMIN ( o - > min , - 1 ) ;
max = FFMAX ( o - > max , nb_fmts - 1 ) ;
}
if ( fmt < min | | fmt > max ) {
av_log ( obj , AV_LOG_ERROR ,
" Value %d for parameter '%s' out of %s format range [-1 - %d] \n " ,
fmt , name , desc , max ) ;
" Value %d for parameter '%s' out of %s format range [%d - %d] \n " ,
fmt , name , desc , min , m ax ) ;
return AVERROR ( ERANGE ) ;
}
* ( int * ) ( ( ( uint8_t * ) target_obj ) + o - > offset ) = fmt ;
@ -452,12 +467,12 @@ static int set_format(void *obj, const char *name, int fmt, int search_flags,
int av_opt_set_pixel_fmt ( void * obj , const char * name , enum AVPixelFormat fmt , int search_flags )
{
return set_format ( obj , name , fmt , search_flags , AV_OPT_TYPE_PIXEL_FMT , " pixel " , AV_PIX_FMT_NB - 1 ) ;
return set_format ( obj , name , fmt , search_flags , AV_OPT_TYPE_PIXEL_FMT , " pixel " , AV_PIX_FMT_NB ) ;
}
int av_opt_set_sample_fmt ( void * obj , const char * name , enum AVSampleFormat fmt , int search_flags )
{
return set_format ( obj , name , fmt , search_flags , AV_OPT_TYPE_SAMPLE_FMT , " sample " , AV_SAMPLE_FMT_NB - 1 ) ;
return set_format ( obj , name , fmt , search_flags , AV_OPT_TYPE_SAMPLE_FMT , " sample " , AV_SAMPLE_FMT_NB ) ;
}
# if FF_API_OLD_AVOPTIONS
@ -1179,8 +1194,8 @@ static const AVOption test_options[]= {
{ " lame " , " set lame flag " , 0 , AV_OPT_TYPE_CONST , { . i64 = TEST_FLAG_LAME } , INT_MIN , INT_MAX , 0 , " flags " } ,
{ " mu " , " set mu flag " , 0 , AV_OPT_TYPE_CONST , { . i64 = TEST_FLAG_MU } , INT_MIN , INT_MAX , 0 , " flags " } ,
{ " size " , " set size " , OFFSET ( w ) , AV_OPT_TYPE_IMAGE_SIZE , { 0 } , 0 , 0 } ,
{ " pix_fmt " , " set pixfmt " , OFFSET ( pix_fmt ) , AV_OPT_TYPE_PIXEL_FMT , { . i64 = AV_PIX_FMT_NONE } } ,
{ " sample_fmt " , " set samplefmt " , OFFSET ( sample_fmt ) , AV_OPT_TYPE_SAMPLE_FMT , { . i64 = AV_SAMPLE_FMT_NONE } } ,
{ " pix_fmt " , " set pixfmt " , OFFSET ( pix_fmt ) , AV_OPT_TYPE_PIXEL_FMT , { . i64 = AV_PIX_FMT_NONE } , - 1 , AV_PIX_FMT_NB - 1 } ,
{ " sample_fmt " , " set samplefmt " , OFFSET ( sample_fmt ) , AV_OPT_TYPE_SAMPLE_FMT , { . i64 = AV_SAMPLE_FMT_NONE } , - 1 , AV_SAMPLE_FMT_NB - 1 } ,
{ NULL } ,
} ;