TuttleOFX  1
OpenImageIOReaderPlugin.cpp
Go to the documentation of this file.
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 }