@ -1250,11 +1250,19 @@ int show_license(void *optctx, const char *opt, const char *arg)
return 0 ;
}
static int is_device ( const AVClass * avclass )
{
if ( ! avclass )
return 0 ;
return AV_IS_INPUT_DEVICE ( avclass - > category ) | | AV_IS_OUTPUT_DEVICE ( avclass - > category ) ;
}
static int show_formats_devices ( void * optctx , const char * opt , const char * arg , int device_only , int muxdemuxers )
{
const AVInputFormat * ifmt = NULL ;
const AVOutputFormat * ofmt = NULL ;
AVInputFormat * ifmt = NULL ;
AVOutputFormat * ofmt = NULL ;
const char * last_name ;
int is_dev ;
printf ( " %s \n "
" D. = Demuxing supported \n "
@ -1267,24 +1275,34 @@ static int show_formats_devices(void *optctx, const char *opt, const char *arg,
const char * name = NULL ;
const char * long_name = NULL ;
# define x(func, type, condition) do { \
void * i = 0 ; \
if ( condition ) { \
while ( ( type = func ( & i ) ) ) { \
if ( ( ! name | | strcmp ( type - > name , name ) < 0 ) & & \
strcmp ( type - > name , last_name ) > 0 ) { \
name = type - > name ; \
long_name = type - > long_name ; \
encode = 1 ; \
} \
} \
} } while ( 0 )
x ( av_muxer_iterate , ofmt , muxdemuxers ! = SHOW_DEMUXERS & & ! device_only ) ;
x ( av_outdev_iterate , ofmt , muxdemuxers ! = SHOW_DEMUXERS ) ;
x ( av_demuxer_iterate , ifmt , muxdemuxers ! = SHOW_MUXERS & & ! device_only ) ;
x ( av_indev_iterate , ifmt , muxdemuxers ! = SHOW_MUXERS ) ;
# undef x
if ( muxdemuxers ! = SHOW_DEMUXERS ) {
while ( ( ofmt = av_oformat_next ( ofmt ) ) ) {
is_dev = is_device ( ofmt - > priv_class ) ;
if ( ! is_dev & & device_only )
continue ;
if ( ( ! name | | strcmp ( ofmt - > name , name ) < 0 ) & &
strcmp ( ofmt - > name , last_name ) > 0 ) {
name = ofmt - > name ;
long_name = ofmt - > long_name ;
encode = 1 ;
}
}
}
if ( muxdemuxers ! = SHOW_MUXERS ) {
while ( ( ifmt = av_iformat_next ( ifmt ) ) ) {
is_dev = is_device ( ifmt - > priv_class ) ;
if ( ! is_dev & & device_only )
continue ;
if ( ( ! name | | strcmp ( ifmt - > name , name ) < 0 ) & &
strcmp ( ifmt - > name , last_name ) > 0 ) {
name = ifmt - > name ;
long_name = ifmt - > long_name ;
encode = 0 ;
}
if ( name & & strcmp ( ifmt - > name , name ) = = 0 )
decode = 1 ;
}
}
if ( ! name )
break ;
last_name = name ;
@ -1424,8 +1442,7 @@ static char get_media_type_char(enum AVMediaType type)
static const AVCodec * next_codec_for_id ( enum AVCodecID id , const AVCodec * prev ,
int encoder )
{
void * i = 0 ;
while ( ( prev = av_codec_iterate ( & i ) ) ) {
while ( ( prev = av_codec_next ( prev ) ) ) {
if ( prev - > id = = id & &
( encoder ? av_codec_is_encoder ( prev ) : av_codec_is_decoder ( prev ) ) )
return prev ;
@ -2099,7 +2116,7 @@ double get_rotation(AVStream *st)
}
# if CONFIG_AVDEVICE
static int print_device_sources ( const AVInputFormat * fmt , AVDictionary * opts )
static int print_device_sources ( AVInputFormat * fmt , AVDictionary * opts )
{
int ret , i ;
AVDeviceInfoList * device_list = NULL ;
@ -2114,7 +2131,7 @@ static int print_device_sources(const AVInputFormat *fmt, AVDictionary *opts)
goto fail ;
}
if ( ( ret = avdevice_list_input_sources ( ( AVInputFormat * ) fmt , NULL , opts , & device_list ) ) < 0 ) {
if ( ( ret = avdevice_list_input_sources ( fmt , NULL , opts , & device_list ) ) < 0 ) {
printf ( " Cannot list sources. \n " ) ;
goto fail ;
}
@ -2129,7 +2146,7 @@ static int print_device_sources(const AVInputFormat *fmt, AVDictionary *opts)
return ret ;
}
static int print_device_sinks ( const AVOutputFormat * fmt , AVDictionary * opts )
static int print_device_sinks ( AVOutputFormat * fmt , AVDictionary * opts )
{
int ret , i ;
AVDeviceInfoList * device_list = NULL ;
@ -2144,7 +2161,7 @@ static int print_device_sinks(const AVOutputFormat *fmt, AVDictionary *opts)
goto fail ;
}
if ( ( ret = avdevice_list_output_sinks ( ( AVOutputFormat * ) fmt , NULL , opts , & device_list ) ) < 0 ) {
if ( ( ret = avdevice_list_output_sinks ( fmt , NULL , opts , & device_list ) ) < 0 ) {
printf ( " Cannot list sinks. \n " ) ;
goto fail ;
}
@ -2183,8 +2200,7 @@ static int show_sinks_sources_parse_arg(const char *arg, char **dev, AVDictionar
int show_sources ( void * optctx , const char * opt , const char * arg )
{
const AVInputFormat * fmt = NULL ;
void * i = 0 ;
AVInputFormat * fmt = NULL ;
char * dev = NULL ;
AVDictionary * opts = NULL ;
int ret = 0 ;
@ -2195,14 +2211,24 @@ int show_sources(void *optctx, const char *opt, const char *arg)
if ( ( ret = show_sinks_sources_parse_arg ( arg , & dev , & opts ) ) < 0 )
goto fail ;
while ( ( fmt = av_indev_iterate ( & i ) ) ) {
if ( ! strcmp ( fmt - > name , " lavfi " ) )
continue ; //it's pointless to probe lavfi
if ( dev & & ! av_match_name ( dev , fmt - > name ) )
continue ;
print_device_sources ( fmt , opts ) ;
}
do {
fmt = av_input_audio_device_next ( fmt ) ;
if ( fmt ) {
if ( ! strcmp ( fmt - > name , " lavfi " ) )
continue ; //it's pointless to probe lavfi
if ( dev & & ! av_match_name ( dev , fmt - > name ) )
continue ;
print_device_sources ( fmt , opts ) ;
}
} while ( fmt ) ;
do {
fmt = av_input_video_device_next ( fmt ) ;
if ( fmt ) {
if ( dev & & ! av_match_name ( dev , fmt - > name ) )
continue ;
print_device_sources ( fmt , opts ) ;
}
} while ( fmt ) ;
fail :
av_dict_free ( & opts ) ;
av_free ( dev ) ;
@ -2212,8 +2238,7 @@ int show_sources(void *optctx, const char *opt, const char *arg)
int show_sinks ( void * optctx , const char * opt , const char * arg )
{
const AVOutputFormat * fmt = NULL ;
void * i = 0 ;
AVOutputFormat * fmt = NULL ;
char * dev = NULL ;
AVDictionary * opts = NULL ;
int ret = 0 ;
@ -2224,11 +2249,22 @@ int show_sinks(void *optctx, const char *opt, const char *arg)
if ( ( ret = show_sinks_sources_parse_arg ( arg , & dev , & opts ) ) < 0 )
goto fail ;
while ( ( fmt = av_outdev_iterate ( & i ) ) ) {
if ( dev & & ! av_match_name ( dev , fmt - > name ) )
continue ;
print_device_sinks ( fmt , opts ) ;
}
do {
fmt = av_output_audio_device_next ( fmt ) ;
if ( fmt ) {
if ( dev & & ! av_match_name ( dev , fmt - > name ) )
continue ;
print_device_sinks ( fmt , opts ) ;
}
} while ( fmt ) ;
do {
fmt = av_output_video_device_next ( fmt ) ;
if ( fmt ) {
if ( dev & & ! av_match_name ( dev , fmt - > name ) )
continue ;
print_device_sinks ( fmt , opts ) ;
}
} while ( fmt ) ;
fail :
av_dict_free ( & opts ) ;
av_free ( dev ) ;