1 /*M/////////////////////////////////////////////////////////////////////////////////////// 2 // 3 // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. 4 // 5 // By downloading, copying, installing or using the software you agree to this license. 6 // If you do not agree to this license, do not download, install, 7 // copy or use the software. 8 // 9 // 10 // Intel License Agreement 11 // For Open Source Computer Vision Library 12 // 13 // Copyright (C) 2000, Intel Corporation, all rights reserved. 14 // Third party copyrights are property of their respective owners. 15 // 16 // Redistribution and use in source and binary forms, with or without modification, 17 // are permitted provided that the following conditions are met: 18 // 19 // * Redistribution's of source code must retain the above copyright notice, 20 // this list of conditions and the following disclaimer. 21 // 22 // * Redistribution's in binary form must reproduce the above copyright notice, 23 // this list of conditions and the following disclaimer in the documentation 24 // and/or other materials provided with the distribution. 25 // 26 // * The name of Intel Corporation may not be used to endorse or promote products 27 // derived from this software without specific prior written permission. 28 // 29 // This software is provided by the copyright holders and contributors "as is" and 30 // any express or implied warranties, including, but not limited to, the implied 31 // warranties of merchantability and fitness for a particular purpose are disclaimed. 32 // In no event shall the Intel Corporation or contributors be liable for any direct, 33 // indirect, incidental, special, exemplary, or consequential damages 34 // (including, but not limited to, procurement of substitute goods or services; 35 // loss of use, data, or profits; or business interruption) however caused 36 // and on any theory of liability, whether in contract, strict liability, 37 // or tort (including negligence or otherwise) arising in any way out of 38 // the use of this software, even if advised of the possibility of such damage. 39 // 40 //M*/ 41 42 #ifndef _GRFMT_JPEG_H_ 43 #define _GRFMT_JPEG_H_ 44 45 #include "grfmt_base.h" 46 #include "bitstrm.h" 47 48 #ifdef HAVE_JPEG 49 50 /* IJG-based version */ 51 52 class GrFmtJpegReader : public GrFmtReader 53 { 54 public: 55 56 GrFmtJpegReader( const char* filename ); 57 ~GrFmtJpegReader(); 58 59 bool ReadData( uchar* data, int step, int color ); 60 bool ReadHeader(); 61 void Close(); 62 63 protected: 64 65 void* m_cinfo; // pointer to IJG JPEG codec structure 66 void* m_jerr; // pointer to error processing manager state 67 FILE* m_f; 68 }; 69 70 71 class GrFmtJpegWriter : public GrFmtWriter 72 { 73 public: 74 75 GrFmtJpegWriter( const char* filename ); 76 ~GrFmtJpegWriter(); 77 78 bool WriteImage( const uchar* data, int step, 79 int width, int height, int depth, int channels ); 80 }; 81 82 #else 83 84 /* hand-crafted implementation */ 85 86 class RJpegBitStream : public RMBitStream 87 { 88 public: 89 RMByteStream m_low_strm; 90 91 RJpegBitStream(); 92 ~RJpegBitStream(); 93 94 virtual bool Open( const char* filename ); 95 virtual void Close(); 96 97 void Flush(); // flushes high-level bit stream 98 void AlignOnByte(); 99 int FindMarker(); 100 101 protected: 102 virtual void ReadBlock(); 103 }; 104 105 106 //////////////////// JPEG reader ///////////////////// 107 108 class GrFmtJpegReader : public GrFmtReader 109 { 110 public: 111 112 GrFmtJpegReader( const char* filename ); 113 ~GrFmtJpegReader(); 114 115 bool ReadData( uchar* data, int step, int color ); 116 bool ReadHeader(); 117 void Close(); 118 119 protected: 120 121 int m_offset; // offset of first scan 122 int m_version; // JFIF version 123 int m_planes; // 3 (YCrCb) or 1 (Gray) 124 int m_precision; // 8 or 12-bit per sample 125 int m_type; // SOF type 126 int m_MCUs; // MCUs in restart interval 127 int m_ss, m_se, m_ah, m_al; // progressive JPEG parameters 128 129 // information about each component 130 struct cmp_info 131 { 132 char h; // horizontal sampling factor 133 char v; // vertical sampling factor 134 char tq; // quantization table index 135 char td, ta; // DC & AC huffman tables 136 int dc_pred; // DC predictor 137 }; 138 139 cmp_info m_ci[3]; 140 141 int m_tq[4][64]; 142 bool m_is_tq[4]; 143 144 short* m_td[4]; 145 bool m_is_td[4]; 146 147 short* m_ta[4]; 148 bool m_is_ta[4]; 149 150 RJpegBitStream m_strm; 151 152 protected: 153 154 bool LoadQuantTables( int length ); 155 bool LoadHuffmanTables( int length ); 156 void ProcessScan( int* idx, int ns, uchar* data, int step, int color ); 157 void ResetDecoder(); 158 void GetBlock( int* block, int c ); 159 }; 160 161 162 //////////////////// JPEG-specific output bitstream /////////////////////// 163 164 class WJpegBitStream : public WMBitStream 165 { 166 public: 167 WMByteStream m_low_strm; 168 169 WJpegBitStream(); 170 ~WJpegBitStream(); 171 172 virtual void Flush(); 173 virtual bool Open( const char* filename ); 174 virtual void Close(); 175 176 protected: 177 virtual void WriteBlock(); 178 }; 179 180 181 //////////////////// JPEG reader ///////////////////// 182 183 class GrFmtJpegWriter : public GrFmtWriter 184 { 185 public: 186 187 GrFmtJpegWriter( const char* filename ); 188 ~GrFmtJpegWriter(); 189 190 bool WriteImage( const uchar* data, int step, 191 int width, int height, int depth, int channels ); 192 193 protected: 194 195 WJpegBitStream m_strm; 196 }; 197 198 #endif /* HAVE_JPEG */ 199 200 201 // JPEG filter factory 202 class GrFmtJpeg : public GrFmtFilterFactory 203 { 204 public: 205 206 GrFmtJpeg(); 207 ~GrFmtJpeg(); 208 209 GrFmtReader* NewReader( const char* filename ); 210 GrFmtWriter* NewWriter( const char* filename ); 211 }; 212 213 214 #endif/*_GRFMT_JPEG_H_*/ 215