TuttleOFX
1
|
00001 #include "TurboJpegReaderAlgorithm.hpp" 00002 00003 #include <boost/gil/gil_all.hpp> 00004 00005 #include <turbojpeg.h> 00006 00007 namespace tuttle { 00008 namespace plugin { 00009 namespace turboJpeg { 00010 namespace reader { 00011 00012 using namespace boost::gil; 00013 00014 template<class View> 00015 TurboJpegReaderProcess<View>::TurboJpegReaderProcess( TurboJpegReaderPlugin &effect ) 00016 : ImageGilProcessor<View>( effect, eImageOrientationFromTopToBottom ) 00017 , _plugin( effect ) 00018 { 00019 this->setNoMultiThreading(); 00020 } 00021 00022 template<class View> 00023 void TurboJpegReaderProcess<View>::setup( const OFX::RenderArguments& args ) 00024 { 00025 ImageGilProcessor<View>::setup( args ); 00026 _params = _plugin.getProcessParams( args.time ); 00027 } 00028 00029 /** 00030 * @brief Function called by rendering thread each time a process must be done. 00031 * @param[in] procWindowRoW Processing window 00032 */ 00033 template<class View> 00034 void TurboJpegReaderProcess<View>::multiThreadProcessImages( const OfxRectI& procWindowRoW ) 00035 { 00036 BOOST_ASSERT( procWindowRoW == this->_dstPixelRod ); 00037 readImage( this->_dstView ); 00038 } 00039 00040 template<class View> 00041 void TurboJpegReaderProcess<View>::readImage( View& dst ) 00042 { 00043 FILE *file = NULL; 00044 unsigned char *jpegbuf = NULL; 00045 unsigned char *rgbbuf = NULL; 00046 unsigned long jpgbufsize = 0; 00047 00048 const tjhandle jpeghandle = tjInitDecompress(); 00049 int width = 0; 00050 int height = 0; 00051 int jpegsubsamp = -1; 00052 int yuvsize = 0; 00053 int bufsize = 0; 00054 int ret = 0; 00055 int ps = TJPF_RGB; 00056 int flags = 0; 00057 00058 00059 file = fopen( _params.filepath.c_str(), "rb"); 00060 fseek( file, 0, SEEK_END ); 00061 jpgbufsize = ftell( file ); 00062 jpegbuf = new unsigned char[ jpgbufsize ]; 00063 00064 fseek( file, 0, SEEK_SET ); 00065 fread( jpegbuf, jpgbufsize, 1, file ); 00066 00067 switch( _params.optimization ) 00068 { 00069 case eTurboJpegOptimizationNone: flags = 0; break; 00070 case eTurboJpegOptimizationSSE3: flags |= TJ_FORCESSE3; 00071 case eTurboJpegOptimizationSSE2: flags |= TJ_FORCESSE2; 00072 case eTurboJpegOptimizationSSE: flags |= TJ_FORCESSE; 00073 case eTurboJpegOptimizationMMX: flags |= TJ_FORCEMMX; 00074 } 00075 00076 if( _params.fastUpsampling ) 00077 { 00078 flags |= TJ_FASTUPSAMPLE; 00079 } 00080 00081 ret = tjDecompressHeader2( jpeghandle, jpegbuf, jpgbufsize, &width, &height, &jpegsubsamp ); 00082 if( ret != 0 ) 00083 { 00084 BOOST_THROW_EXCEPTION( exception::FileNotExist() 00085 << exception::user( tjGetErrorStr() ) 00086 << exception::filename( _params.filepath ) ); 00087 } 00088 00089 yuvsize = tjBufSizeYUV( width, height, jpegsubsamp ); 00090 bufsize = tjBufSize( width, height, jpegsubsamp ); 00091 00092 rgbbuf = new unsigned char[ bufsize ]; 00093 00094 ret = tjDecompress2( jpeghandle, jpegbuf, jpgbufsize, rgbbuf, width, 0, height, ps, flags ); 00095 if( ret != 0 ) 00096 { 00097 BOOST_THROW_EXCEPTION( exception::File() 00098 << exception::user( tjGetErrorStr() ) 00099 << exception::filename( _params.filepath ) ); 00100 } 00101 00102 rgb8_view_t bufferView = interleaved_view( width, height, 00103 ( typename rgb8_view_t::value_type* )( rgbbuf ), 00104 width * sizeof( typename rgb8_view_t::value_type ) ); 00105 00106 boost::gil::copy_and_convert_pixels( bufferView, dst ); 00107 00108 delete[] jpegbuf; jpegbuf = NULL; 00109 delete[] rgbbuf; rgbbuf = NULL; 00110 tjDestroy( jpeghandle ); 00111 fclose(file); file = NULL; 00112 } 00113 00114 } 00115 } 00116 } 00117 }