static void opt_list(void *obj, void *av_log_obj, char *unit) { AVOption *opt=NULL; while((opt= av_next_option(obj, opt))){ if(!(opt->flags & (AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM))) continue; /* Don't print CONST's on level one. * Don't print anything but CONST's on level two. * Only print items from the requested unit. */ if (!unit && opt->type==FF_OPT_TYPE_CONST) continue; else if (unit && opt->type!=FF_OPT_TYPE_CONST) continue; else if (unit && opt->type==FF_OPT_TYPE_CONST && strcmp(unit, opt->unit)) continue; else if (unit && opt->type == FF_OPT_TYPE_CONST) av_log(av_log_obj, AV_LOG_INFO, " %-15s ", opt->name); else av_log(av_log_obj, AV_LOG_INFO, "-%-17s ", opt->name); switch( opt->type ) { case FF_OPT_TYPE_FLAGS: av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<flags>" ); break; case FF_OPT_TYPE_INT: av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<int>" ); break; case FF_OPT_TYPE_INT64: av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<int64>" ); break; case FF_OPT_TYPE_DOUBLE: av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<double>" ); break; case FF_OPT_TYPE_FLOAT: av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<float>" ); break; case FF_OPT_TYPE_STRING: av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<string>" ); break; case FF_OPT_TYPE_RATIONAL: av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "<rational>" ); break; case FF_OPT_TYPE_CONST: default: av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "" ); break; } av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_ENCODING_PARAM) ? 'E' : '.'); av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_DECODING_PARAM) ? 'D' : '.'); av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_VIDEO_PARAM ) ? 'V' : '.'); av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_AUDIO_PARAM ) ? 'A' : '.'); av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_SUBTITLE_PARAM) ? 'S' : '.'); if(opt->help) av_log(av_log_obj, AV_LOG_INFO, " %s", opt->help); av_log(av_log_obj, AV_LOG_INFO, "\n"); if (opt->unit && opt->type != FF_OPT_TYPE_CONST) { opt_list(obj, av_log_obj, opt->unit); } } }
void loadOptions( OptionMap& outOptions, void* av_class, int req_flags ) { if( ! av_class ) return; std::multimap<std::string, std::string> optionUnitToParentName; std::vector<Option> childOptions; const AVOption* avOption = NULL; // iterate on options #if LIBAVCODEC_VERSION_INT < AV_VERSION_INT( 51, 12, 0 ) while( ( avOption = av_next_option( av_class, avOption ) ) ) #else while( ( avOption = av_opt_next( av_class, avOption ) ) ) #endif { if( ! avOption || ! avOption->name || ( avOption->flags & req_flags ) != req_flags ) { continue; } Option option( *const_cast<AVOption*>( avOption ), av_class ); if( option.getType() == eOptionBaseTypeChild ) { childOptions.push_back( option ); } else { outOptions.insert( std::make_pair( option.getName(), option ) ); optionUnitToParentName.insert( std::make_pair( option.getUnit(), option.getName() ) ); } } // iterate on child options for( std::vector<Option>::iterator itOption = childOptions.begin(); itOption != childOptions.end(); ++itOption ) { bool parentFound = false; for( std::multimap<std::string, std::string>::iterator itUnit = optionUnitToParentName.begin(); itUnit != optionUnitToParentName.end(); ++itUnit ) { if( itUnit->first == itOption->getUnit() ) { std::string nameParentOption = itUnit->second; Option& parentOption = outOptions.at( nameParentOption ); parentOption.appendChild( *itOption ); // child of a Choice if( parentOption.getType() == eOptionBaseTypeChoice ) { if( itOption->getDefaultInt() == parentOption.getDefaultInt() ) parentOption.setDefaultChildIndex( parentOption.getChilds().size() - 1 ); } parentFound = true; break; } } if( ! parentFound ) { LOG_WARN( "Can't find a choice option for " << itOption->getName() ) } } }