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