TuttleOFX  1
LibAVOptionsFactory.cpp
Go to the documentation of this file.
00001 #include "LibAVOptionsFactory.hpp"
00002 
00003 #include <boost/foreach.hpp>
00004 
00005 namespace tuttle {
00006 namespace plugin {
00007 namespace av {
00008 
00009 void addOptionsFromAVOption( OFX::ImageEffectDescriptor& desc, OFX::GroupParamDescriptor* group, void* av_class, int req_flags, int rej_flags )
00010 {
00011         std::vector<OFX::ChoiceParamDescriptor*> choices;
00012         std::vector<std::string> unit;
00013         std::vector<int> defaultEnumChoices;
00014         std::vector<int> defaultChoices;
00015         std::vector<OFX::GroupParamDescriptor*> groups;
00016         const AVOption *opt = NULL;
00017 
00018         while( (opt = av_opt_next( av_class, opt)  ) != NULL )
00019         {
00020                 if( !opt ||
00021                         !opt->name ||
00022                         (opt->flags & req_flags) != req_flags ||
00023                         (opt->flags & rej_flags) )
00024                 {
00025                         continue;
00026                 }
00027                 
00028                 if( opt->unit && opt->type == AV_OPT_TYPE_FLAGS )
00029                 {
00030                         std::string name = "g_";
00031                         name += opt->unit;
00032                         OFX::GroupParamDescriptor* param = desc.defineGroupParam( name );
00033                         if( opt->help )
00034                                 param->setHint( opt->help );
00035                         param->setParent( group );
00036                         //param->setAsTab( );
00037                         groups.push_back( param );
00038                         continue;
00039                 }
00040                 if( opt->unit && opt->type == AV_OPT_TYPE_INT )
00041                 {
00042                         OFX::ChoiceParamDescriptor* param = desc.defineChoiceParam( opt->name );
00043                         if( opt->help )
00044                                 param->setHint( opt->help );
00045                         param->setParent( group );
00046                         choices.push_back( param );
00047                         unit.push_back( opt->unit );
00048                         defaultEnumChoices.push_back( opt->default_val.dbl );
00049                         //TUTTLE_LOG_INFO( opt->unit << " = " << opt->default_val.dbl );
00050                         continue;
00051                 }
00052                 
00053                 switch( opt->type )
00054                 {
00055                         case AV_OPT_TYPE_FLAGS:
00056                         {
00057                                 OFX::BooleanParamDescriptor* param = desc.defineBooleanParam( opt->name );
00058                                 param->setDefault( opt->default_val.i64 );
00059                                 if( opt->help )
00060                                         param->setHint( opt->help );
00061                                 param->setParent( group );
00062                                 break;
00063                         }
00064                         case AV_OPT_TYPE_INT:
00065                         case AV_OPT_TYPE_INT64:
00066                         {
00067                                 OFX::IntParamDescriptor* param = desc.defineIntParam( opt->name );
00068                                 param->setDefault( opt->default_val.i64 );
00069                                 param->setRange( opt->min, opt->max );
00070                                 param->setDisplayRange( opt->min, opt->max );
00071                                 if( opt->help )
00072                                         param->setHint( opt->help );
00073                                 param->setParent( group );
00074                                 break;
00075                         }
00076                         case AV_OPT_TYPE_DOUBLE:
00077                         case AV_OPT_TYPE_FLOAT:
00078                         {
00079                                 OFX::DoubleParamDescriptor* param = desc.defineDoubleParam( opt->name );
00080                                 param->setDefault( opt->default_val.dbl );
00081                                 param->setRange( opt->min, opt->max );
00082                                 param->setDisplayRange( opt->min, opt->max );
00083                                 if( opt->help )
00084                                         param->setHint( opt->help );
00085                                 param->setParent( group );
00086                                 break;
00087                         }
00088                         case AV_OPT_TYPE_STRING:
00089                         {
00090                                 OFX::StringParamDescriptor* param = desc.defineStringParam( opt->name );
00091                                 if( opt->default_val.str )
00092                                         param->setDefault( opt->default_val.str );
00093                                 if( opt->help )
00094                                         param->setHint( opt->help );
00095                                 param->setParent( group );
00096                                 break;
00097                         }
00098                         case AV_OPT_TYPE_RATIONAL:
00099                         {
00100                                 OFX::Int2DParamDescriptor* param = desc.defineInt2DParam( opt->name );
00101                                 param->setDefault( opt->default_val.q.num, opt->default_val.q.den );
00102                                 if( opt->help )
00103                                         param->setHint( opt->help );
00104                                 param->setParent( group );
00105                                 break;
00106                         }
00107                         case AV_OPT_TYPE_BINARY:
00108                         {
00109                                 OFX::StringParamDescriptor* param = desc.defineStringParam( opt->name );
00110                                 if( opt->help )
00111                                         param->setHint( opt->help );
00112                                 param->setParent( group );
00113                                 break;
00114                         }
00115                         case AV_OPT_TYPE_CONST:
00116                         {
00117                                 break;
00118                         }
00119                         default:
00120                         {
00121                                 TUTTLE_LOG_WARNING( "AudioVideo: undefined type for " << opt->name );
00122                         }
00123                 }
00124         }
00125 
00126         defaultChoices.resize( defaultEnumChoices.size() );
00127         
00128         // adding enum values and flags in groups
00129         opt = NULL;
00130         while( (opt = av_opt_next( av_class, opt)  ) != NULL )
00131         {
00132                 if( !opt ||
00133                         !opt->name ||
00134                         ( opt->flags & req_flags ) != req_flags ||
00135                         ( opt->flags & rej_flags ) ||
00136                         ( opt->unit && opt->type == AV_OPT_TYPE_FLAGS ) ||
00137                         ( opt->unit && opt->type == AV_OPT_TYPE_INT ) )
00138                 {
00139                         continue;
00140                 }
00141                 
00142                 switch( opt->type )
00143                 {
00144                         case AV_OPT_TYPE_CONST:
00145                         {
00146                                 for( size_t i = 0; i < unit.size(); i++ )
00147                                 {
00148                                         if( opt->unit == unit.at( i ) )
00149                                         {
00150                                                 //TUTTLE_LOG_INFO( "add " << opt->name << " to " << choices.at(i)->getName() );
00151                                                 if( opt->help )
00152                                                         choices.at(i)->appendOption( opt->name, opt->help );
00153                                                 else
00154                                                         choices.at(i)->appendOption( opt->name );
00155                                                 if( opt->default_val.dbl == defaultEnumChoices.at(i) )
00156                                                 {
00157                                                         defaultChoices.at(i) = choices.at(i)->getNOptions() - 1;
00158                                                 }
00159                                                 
00160                                         }
00161                                 }
00162                                 
00163                                 BOOST_FOREACH( OFX::GroupParamDescriptor* g, groups )
00164                                 {
00165                                         std::string name = "g_";
00166                                         name += opt->unit;
00167                                         if( name == g->getName() )
00168                                         {
00169                                                 OFX::BooleanParamDescriptor* param = desc.defineBooleanParam( opt->name );
00170                                                 param->setDefault( opt->offset );
00171                                                 if( opt->help )
00172                                                         param->setHint( opt->help );
00173                                                 param->setParent( g );
00174                                                 break;
00175                                         }
00176                                 }
00177                                 break;
00178                         }
00179                         default:
00180                         {
00181                                 break;
00182                         }
00183                 }
00184         }
00185         
00186         // set default value for enums
00187         opt = NULL;
00188         while( (opt = av_opt_next( av_class, opt)  ) != NULL )
00189         {
00190                 if( !opt ||
00191                         !opt->name ||
00192                         ( opt->flags & req_flags ) != req_flags ||
00193                         ( opt->flags & rej_flags ) ||
00194                         ( opt->unit && opt->type == AV_OPT_TYPE_FLAGS ) )
00195                 {
00196                         continue;
00197                 }
00198                 
00199                 if( opt->unit && opt->type == AV_OPT_TYPE_INT )
00200                 {
00201                         for( size_t i = 0; i < defaultChoices.size(); i++ )
00202                         {
00203                                 choices.at(i)->setDefault( defaultChoices.at(i) );
00204                         }
00205                         
00206                 }
00207         }
00208 }
00209 
00210 void addOptionsFromAVOption( OFX::ImageEffectDescriptor& desc, OFX::GroupParamDescriptor* group, const std::vector<AVPrivOption>& options )
00211 {
00212         std::vector<OFX::ChoiceParamDescriptor*> choices;
00213         std::vector<std::string> unit;
00214         std::vector<int> defaultEnumChoices;
00215         std::vector<int> defaultChoices;
00216         std::vector<OFX::GroupParamDescriptor*> groups;
00217 
00218         BOOST_FOREACH( AVPrivOption opt, options )
00219         {
00220                 if( opt.o.unit && opt.o.type == AV_OPT_TYPE_FLAGS )
00221                 {
00222                         std::string name = "g_";
00223                         name += opt.class_name;
00224                         name += "_";
00225                         name += opt.o.unit;
00226                         //TUTTLE_LOG_INFO( "add " << name );
00227                         OFX::GroupParamDescriptor* param = desc.defineGroupParam( name );
00228                         param->setLabel( opt.o.name );
00229                         if( opt.o.help )
00230                                 param->setHint( opt.o.help );
00231                         param->setParent( group );
00232                         //param->setAsTab( );
00233                         groups.push_back( param );
00234                         continue;
00235                 }
00236                 if( opt.o.unit && opt.o.type == AV_OPT_TYPE_INT )
00237                 {
00238                         std::string name = opt.class_name;
00239                         name += "_";
00240                         name += opt.o.name;
00241                         //TUTTLE_LOG_INFO( "add " << name );
00242                         OFX::ChoiceParamDescriptor* param = desc.defineChoiceParam( name );
00243                         param->setLabel( opt.o.name );
00244                         if( opt.o.help )
00245                                 param->setHint( opt.o.help );
00246                         param->setParent( group );
00247                         choices.push_back( param );
00248                         std::string u = opt.class_name;
00249                         u += "_";
00250                         u += opt.o.unit;
00251                         unit.push_back( u );
00252                         defaultEnumChoices.push_back( opt.o.default_val.dbl );
00253                         //TUTTLE_LOG_INFO( opt.o.unit << " = " << opt.o.default_val.dbl );
00254                         continue;
00255                 }
00256                 
00257                 std::string name = opt.class_name;
00258                 name += "_";
00259                 name += opt.o.name;
00260                 //TUTTLE_LOG_INFO( "+add " << name );
00261                 switch( opt.o.type )
00262                 {
00263                         case AV_OPT_TYPE_FLAGS:
00264                         {
00265                                 OFX::BooleanParamDescriptor* param = desc.defineBooleanParam( name );
00266                                 param->setLabel( opt.o.name );
00267                                 param->setDefault( opt.o.default_val.i64 );
00268                                 if( opt.o.help )
00269                                         param->setHint( opt.o.help );
00270                                 param->setParent( group );
00271                                 break;
00272                         }
00273                         case AV_OPT_TYPE_INT:
00274                         case AV_OPT_TYPE_INT64:
00275                         {
00276                                 OFX::IntParamDescriptor* param = desc.defineIntParam( name );
00277                                 param->setLabel( opt.o.name );
00278                                 param->setDefault( opt.o.default_val.i64 );
00279                                 param->setRange( opt.o.min, opt.o.max );
00280                                 param->setDisplayRange( opt.o.min, opt.o.max );
00281                                 if( opt.o.help )
00282                                         param->setHint( opt.o.help );
00283                                 param->setParent( group );
00284                                 break;
00285                         }
00286                         case AV_OPT_TYPE_DOUBLE:
00287                         case AV_OPT_TYPE_FLOAT:
00288                         {
00289                                 OFX::DoubleParamDescriptor* param = desc.defineDoubleParam( name );
00290                                 param->setLabel( opt.o.name );
00291                                 param->setDefault( opt.o.default_val.dbl );
00292                                 param->setRange( opt.o.min, opt.o.max );
00293                                 param->setDisplayRange( opt.o.min, opt.o.max );
00294                                 if( opt.o.help )
00295                                         param->setHint( opt.o.help );
00296                                 param->setParent( group );
00297                                 break;
00298                         }
00299                         case AV_OPT_TYPE_STRING:
00300                         {
00301                                 OFX::StringParamDescriptor* param = desc.defineStringParam( name );
00302                                 param->setLabel( opt.o.name );
00303                                 if( opt.o.default_val.str )
00304                                         param->setDefault( opt.o.default_val.str );
00305                                 if( opt.o.help )
00306                                         param->setHint( opt.o.help );
00307                                 param->setParent( group );
00308                                 break;
00309                         }
00310                         case AV_OPT_TYPE_RATIONAL:
00311                         {
00312                                 OFX::Int2DParamDescriptor* param = desc.defineInt2DParam( name );
00313                                 param->setLabel( opt.o.name );
00314                                 param->setDefault( opt.o.default_val.q.num, opt.o.default_val.q.den );
00315                                 if( opt.o.help )
00316                                         param->setHint( opt.o.help );
00317                                 param->setParent( group );
00318                                 break;
00319                         }
00320                         case AV_OPT_TYPE_BINARY:
00321                         {
00322                                 OFX::StringParamDescriptor* param = desc.defineStringParam( name );
00323                                 param->setLabel( opt.o.name );
00324                                 if( opt.o.help )
00325                                         param->setHint( opt.o.help );
00326                                 param->setParent( group );
00327                                 break;
00328                         }
00329                         case AV_OPT_TYPE_CONST:
00330                         {
00331                                 break;
00332                         }
00333                         default:
00334                         {
00335                                 TUTTLE_LOG_WARNING( "AudioVideo: undefined type for " << opt.o.name );
00336                                 
00337                         }
00338                 }
00339         }
00340 
00341         defaultChoices.resize( defaultEnumChoices.size() );
00342         
00343         // adding enum values and flags in groups
00344         BOOST_FOREACH( AVPrivOption opt, options )
00345         {
00346                 switch( opt.o.type )
00347                 {
00348                         case AV_OPT_TYPE_CONST:
00349                         {
00350                                 for( size_t i = 0; i < unit.size(); i++ )
00351                                 {
00352                                         std::string u = opt.class_name;
00353                                         u += "_";
00354                                         u += opt.o.unit;
00355                                         if( u == unit.at( i ) )
00356                                         {
00357                                                 //TUTTLE_LOG_INFO( "add " << opt.o.name << " to " << choices.at(i)->getName() );
00358                                                 if( opt.o.help )
00359                                                         choices.at(i)->appendOption( opt.o.name, opt.o.help );
00360                                                 else
00361                                                         choices.at(i)->appendOption( opt.o.name );
00362                                                 if( opt.o.default_val.dbl == defaultEnumChoices.at(i) )
00363                                                 {
00364                                                         defaultChoices.at(i) = choices.at(i)->getNOptions() - 1;
00365                                                 }
00366                                                 
00367                                         }
00368                                 }
00369                                 BOOST_FOREACH( OFX::GroupParamDescriptor* g, groups )
00370                                 {
00371                                         std::string name = "g_";
00372                                         name += opt.class_name;
00373                                         name += "_";
00374                                         name += opt.o.unit;
00375                                         if( name == g->getName() )
00376                                         {
00377                                                 std::string name = "flags_";
00378                                                 name += opt.class_name;
00379                                                 name += "_";
00380                                                 name += opt.o.name;
00381                                                 OFX::BooleanParamDescriptor* param = desc.defineBooleanParam( name );
00382                                                 param->setLabel( opt.o.name );
00383                                                 param->setDefault( opt.o.offset );
00384                                                 if( opt.o.help )
00385                                                         param->setHint( opt.o.help );
00386                                                 param->setParent( g );
00387                                                 break;
00388                                         }
00389                                 }
00390                                 break;
00391                         }
00392                         default:
00393                         {
00394                                 break;
00395                         }
00396                 }
00397         }
00398         
00399         // set default value for enums
00400         BOOST_FOREACH( AVPrivOption opt, options )
00401         {
00402                 if( opt.o.unit && opt.o.type == AV_OPT_TYPE_INT )
00403                 {
00404                         for( size_t i = 0; i < defaultChoices.size(); i++ )
00405                         {
00406                                 choices.at(i)->setDefault( defaultChoices.at(i) );
00407                         }
00408                         
00409                 }
00410         }
00411 }
00412 
00413 }
00414 }
00415 }