16acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*M///////////////////////////////////////////////////////////////////////////////////////
26acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
36acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
46acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
56acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  By downloading, copying, installing or using the software you agree to this license.
66acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  If you do not agree to this license, do not download, install,
76acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  copy or use the software.
86acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
96acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                        Intel License Agreement
116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                For Open Source Computer Vision Library
126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Copyright (C) 2000, Intel Corporation, all rights reserved.
146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Third party copyrights are property of their respective owners.
156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Redistribution and use in source and binary forms, with or without modification,
176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// are permitted provided that the following conditions are met:
186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * Redistribution's of source code must retain the above copyright notice,
206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     this list of conditions and the following disclaimer.
216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * Redistribution's in binary form must reproduce the above copyright notice,
236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     this list of conditions and the following disclaimer in the documentation
246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     and/or other materials provided with the distribution.
256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * The name of Intel Corporation may not be used to endorse or promote products
276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     derived from this software without specific prior written permission.
286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// This software is provided by the copyright holders and contributors "as is" and
306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// any express or implied warranties, including, but not limited to, the implied
316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// warranties of merchantability and fitness for a particular purpose are disclaimed.
326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// In no event shall the Intel Corporation or contributors be liable for any direct,
336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// indirect, incidental, special, exemplary, or consequential damages
346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// (including, but not limited to, procurement of substitute goods or services;
356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// loss of use, data, or profits; or business interruption) however caused
366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// and on any theory of liability, whether in contract, strict liability,
376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// or tort (including negligence or otherwise) arising in any way out of
386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// the use of this software, even if advised of the possibility of such damage.
396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//M*/
416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifndef _GRFMT_JPEG_H_
436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define _GRFMT_JPEG_H_
446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "grfmt_base.h"
466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "bitstrm.h"
476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifdef HAVE_JPEG
496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* IJG-based version */
516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass GrFmtJpegReader : public GrFmtReader
536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic:
556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    GrFmtJpegReader( const char* filename );
576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ~GrFmtJpegReader();
586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    bool  ReadData( uchar* data, int step, int color );
606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    bool  ReadHeader();
616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void  Close();
626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennprotected:
646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void* m_cinfo; // pointer to IJG JPEG codec structure
666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void* m_jerr; // pointer to error processing manager state
676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    FILE* m_f;
686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass GrFmtJpegWriter : public GrFmtWriter
726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic:
746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    GrFmtJpegWriter( const char* filename );
766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ~GrFmtJpegWriter();
776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    bool  WriteImage( const uchar* data, int step,
796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                      int width, int height, int depth, int channels );
806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* hand-crafted implementation */
856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass RJpegBitStream : public RMBitStream
876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic:
896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    RMByteStream  m_low_strm;
906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    RJpegBitStream();
926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ~RJpegBitStream();
936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual bool  Open( const char* filename );
956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void  Close();
966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void  Flush(); // flushes high-level bit stream
986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void  AlignOnByte();
996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int   FindMarker();
1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennprotected:
1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void  ReadBlock();
1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//////////////////// JPEG reader /////////////////////
1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass GrFmtJpegReader : public GrFmtReader
1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic:
1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    GrFmtJpegReader( const char* filename );
1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ~GrFmtJpegReader();
1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    bool  ReadData( uchar* data, int step, int color );
1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    bool  ReadHeader();
1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void  Close();
1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennprotected:
1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int   m_offset; // offset of first scan
1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int   m_version; // JFIF version
1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int   m_planes; // 3 (YCrCb) or 1 (Gray)
1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int   m_precision; // 8 or 12-bit per sample
1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int   m_type; // SOF type
1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int   m_MCUs; // MCUs in restart interval
1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int   m_ss, m_se, m_ah, m_al; // progressive JPEG parameters
1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    // information about each component
1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    struct cmp_info
1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        char h;  // horizontal sampling factor
1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        char v;  // vertical   sampling factor
1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        char tq; // quantization table index
1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        char td, ta; // DC & AC huffman tables
1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int  dc_pred; // DC predictor
1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cmp_info m_ci[3];
1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int     m_tq[4][64];
1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    bool    m_is_tq[4];
1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    short*  m_td[4];
1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    bool    m_is_td[4];
1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    short*  m_ta[4];
1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    bool    m_is_ta[4];
1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    RJpegBitStream  m_strm;
1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennprotected:
1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    bool  LoadQuantTables( int length );
1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    bool  LoadHuffmanTables( int length );
1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void  ProcessScan( int* idx, int ns, uchar* data, int step, int color );
1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void  ResetDecoder();
1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void  GetBlock( int* block, int c );
1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//////////////////// JPEG-specific output bitstream ///////////////////////
1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass WJpegBitStream : public WMBitStream
1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic:
1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    WMByteStream  m_low_strm;
1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    WJpegBitStream();
1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ~WJpegBitStream();
1716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void  Flush();
1736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual bool  Open( const char* filename );
1746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void  Close();
1756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennprotected:
1776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    virtual void  WriteBlock();
1786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
1796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//////////////////// JPEG reader /////////////////////
1826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass GrFmtJpegWriter : public GrFmtWriter
1846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic:
1866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    GrFmtJpegWriter( const char* filename );
1886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ~GrFmtJpegWriter();
1896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    bool  WriteImage( const uchar* data, int step,
1916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                      int width, int height, int depth, int channels );
1926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennprotected:
1946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    WJpegBitStream  m_strm;
1966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
1976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif /* HAVE_JPEG */
1996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// JPEG filter factory
2026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennclass GrFmtJpeg : public GrFmtFilterFactory
2036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennpublic:
2056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    GrFmtJpeg();
2076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ~GrFmtJpeg();
2086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    GrFmtReader* NewReader( const char* filename );
2106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    GrFmtWriter* NewWriter( const char* filename );
2116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
2126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif/*_GRFMT_JPEG_H_*/
215