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