TuttleOFX
1
|
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 }