TuttleOFX
1
|
00001 #include "OpenImageIOReaderPlugin.hpp" 00002 #include "OpenImageIOReaderProcess.hpp" 00003 #include "OpenImageIOReaderDefinitions.hpp" 00004 00005 #include <imageio.h> 00006 00007 #include <boost/gil/gil_all.hpp> 00008 #include <boost/filesystem.hpp> 00009 #include <boost/scoped_ptr.hpp> 00010 00011 namespace tuttle { 00012 namespace plugin { 00013 namespace openImageIO { 00014 namespace reader { 00015 00016 namespace bfs = boost::filesystem; 00017 using namespace boost::gil; 00018 00019 OpenImageIOReaderPlugin::OpenImageIOReaderPlugin( OfxImageEffectHandle handle ) 00020 : ReaderPlugin( handle ) 00021 { 00022 } 00023 00024 OpenImageIOReaderProcessParams OpenImageIOReaderPlugin::getProcessParams( const OfxTime time ) 00025 { 00026 OpenImageIOReaderProcessParams params; 00027 00028 params._filepath = getAbsoluteFilenameAt( time ); 00029 return params; 00030 } 00031 00032 void OpenImageIOReaderPlugin::changedParam( const OFX::InstanceChangedArgs& args, const std::string& paramName ) 00033 { 00034 ReaderPlugin::changedParam( args, paramName ); 00035 } 00036 00037 bool OpenImageIOReaderPlugin::getRegionOfDefinition( const OFX::RegionOfDefinitionArguments& args, OfxRectD& rod ) 00038 { 00039 const std::string filename( getAbsoluteFilenameAt( args.time ) ); 00040 00041 if( !bfs::exists( filename ) ) 00042 { 00043 BOOST_THROW_EXCEPTION( exception::FileInSequenceNotExist() 00044 << exception::user( "OpenImageIO: Unable to open file" ) 00045 << exception::filename( filename ) ); 00046 } 00047 00048 boost::scoped_ptr<OpenImageIO::ImageInput> in( OpenImageIO::ImageInput::create( filename ) ); 00049 if( !in ) 00050 { 00051 BOOST_THROW_EXCEPTION( exception::File() 00052 << exception::user( "OpenImageIO: Unable to open file" ) 00053 << exception::filename( filename ) ); 00054 } 00055 OpenImageIO::ImageSpec spec; 00056 00057 if( ! in->open( filename, spec ) ) 00058 { 00059 BOOST_THROW_EXCEPTION( exception::Unknown() 00060 << exception::user( "OIIO Reader: " + in->geterror () ) 00061 << exception::filename( filename ) ); 00062 } 00063 00064 rod.x1 = 0; 00065 rod.x2 = spec.width * this->_clipDst->getPixelAspectRatio(); 00066 rod.y1 = 0; 00067 rod.y2 = spec.height; 00068 00069 in->close(); 00070 return true; 00071 } 00072 00073 void OpenImageIOReaderPlugin::getClipPreferences( OFX::ClipPreferencesSetter& clipPreferences ) 00074 { 00075 ReaderPlugin::getClipPreferences( clipPreferences ); 00076 00077 const std::string filename( getAbsoluteFirstFilename() ); 00078 00079 if( !bfs::exists( filename ) ) 00080 { 00081 BOOST_THROW_EXCEPTION( exception::FileInSequenceNotExist() 00082 << exception::user( "OpenImageIO: Unable to open file" ) 00083 << exception::filename( filename ) ); 00084 } 00085 00086 // if no filename 00087 if( filename.size() == 0 ) 00088 { 00089 clipPreferences.setClipBitDepth( *this->_clipDst, OFX::eBitDepthFloat ); 00090 clipPreferences.setClipComponents( *this->_clipDst, OFX::ePixelComponentRGBA ); 00091 clipPreferences.setPixelAspectRatio( *this->_clipDst, 1.0 ); 00092 return; 00093 } 00094 00095 OpenImageIO::ImageInput *in = OpenImageIO::ImageInput::create( filename ); 00096 00097 if( !in ) 00098 { 00099 BOOST_THROW_EXCEPTION( exception::Unknown() 00100 << exception::user( "OIIO Reader: " + in->geterror () ) 00101 << exception::filename( filename ) ); 00102 } 00103 00104 OpenImageIO::ImageSpec spec; 00105 if( ! in->open( filename, spec ) ) 00106 { 00107 BOOST_THROW_EXCEPTION( exception::Unknown() 00108 << exception::user( "OIIO Reader: " + in->geterror () ) 00109 << exception::filename( filename ) ); 00110 } 00111 00112 if( getExplicitBitDepthConversion() == eParamReaderBitDepthAuto ) 00113 { 00114 OFX::EBitDepth bd = OFX::eBitDepthNone; 00115 switch( spec.format.basetype ) 00116 { 00117 // case TypeDesc::UCHAR: 00118 case OpenImageIO::TypeDesc::UINT8: 00119 // case TypeDesc::CHAR: 00120 case OpenImageIO::TypeDesc::INT8: 00121 bd = OFX::eBitDepthUByte; 00122 break; 00123 case OpenImageIO::TypeDesc::HALF: 00124 // case TypeDesc::USHORT: 00125 case OpenImageIO::TypeDesc::UINT16: 00126 // case TypeDesc::SHORT: 00127 case OpenImageIO::TypeDesc::INT16: 00128 bd = OFX::eBitDepthUShort; 00129 break; 00130 // case TypeDesc::UINT: 00131 case OpenImageIO::TypeDesc::UINT32: 00132 // case TypeDesc::INT: 00133 case OpenImageIO::TypeDesc::INT32: 00134 // case TypeDesc::ULONGLONG: 00135 case OpenImageIO::TypeDesc::UINT64: 00136 // case TypeDesc::LONGLONG: 00137 case OpenImageIO::TypeDesc::INT64: 00138 case OpenImageIO::TypeDesc::FLOAT: 00139 case OpenImageIO::TypeDesc::DOUBLE: 00140 bd = OFX::eBitDepthFloat; 00141 break; 00142 case OpenImageIO::TypeDesc::STRING: 00143 case OpenImageIO::TypeDesc::PTR: 00144 case OpenImageIO::TypeDesc::LASTBASE: 00145 case OpenImageIO::TypeDesc::UNKNOWN: 00146 case OpenImageIO::TypeDesc::NONE: 00147 default: 00148 { 00149 in->close(); 00150 BOOST_THROW_EXCEPTION( exception::ImageFormat() 00151 << exception::user("bad input format") ); 00152 } 00153 } 00154 clipPreferences.setClipBitDepth( *this->_clipDst, bd ); 00155 } 00156 00157 if( getExplicitChannelConversion() == eParamReaderChannelAuto ) 00158 { 00159 switch( spec.nchannels ) 00160 { 00161 case 1 : 00162 clipPreferences.setClipComponents( *this->_clipDst, OFX::ePixelComponentAlpha ); 00163 break; 00164 case 3 : 00165 if( OFX::getImageEffectHostDescription()->supportsPixelComponent( OFX::ePixelComponentRGB ) ) 00166 { 00167 clipPreferences.setClipComponents( *this->_clipDst, OFX::ePixelComponentRGB ); 00168 } 00169 else 00170 { 00171 clipPreferences.setClipComponents( *this->_clipDst, OFX::ePixelComponentRGBA ); 00172 } 00173 break; 00174 case 4 : 00175 clipPreferences.setClipComponents( *this->_clipDst, OFX::ePixelComponentRGBA ); 00176 break; 00177 default: 00178 clipPreferences.setClipComponents( *this->_clipDst, OFX::ePixelComponentRGBA ); 00179 break; 00180 } 00181 } 00182 00183 clipPreferences.setPixelAspectRatio( *this->_clipDst, 1.0 ); 00184 in->close(); 00185 } 00186 00187 /** 00188 * @brief The overridden render function 00189 * @param[in] args Rendering parameters 00190 */ 00191 void OpenImageIOReaderPlugin::render( const OFX::RenderArguments& args ) 00192 { 00193 ReaderPlugin::render( args ); 00194 00195 doGilRender<OpenImageIOReaderProcess>( *this, args ); 00196 } 00197 00198 } 00199 } 00200 } 00201 }