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