295 lines
11 KiB
C
295 lines
11 KiB
C
/*********************************************************************
|
|
* Portions COPYRIGHT 2016 STMicroelectronics *
|
|
* Portions SEGGER Microcontroller GmbH & Co. KG *
|
|
* Solutions for real time microcontroller applications *
|
|
**********************************************************************
|
|
* *
|
|
* (c) 1996 - 2015 SEGGER Microcontroller GmbH & Co. KG *
|
|
* *
|
|
* Internet: www.segger.com Support: support@segger.com *
|
|
* *
|
|
**********************************************************************
|
|
|
|
** emWin V5.32 - Graphical user interface for embedded applications **
|
|
All Intellectual Property rights in the Software belongs to SEGGER.
|
|
emWin is protected by international copyright laws. Knowledge of the
|
|
source code may not be used to write a similar product. This file may
|
|
only be used in accordance with the following terms:
|
|
|
|
The software has been licensed to STMicroelectronics International
|
|
N.V. a Dutch company with a Swiss branch and its headquarters in Plan-
|
|
les-Ouates, Geneva, 39 Chemin du Champ des Filles, Switzerland for the
|
|
purposes of creating libraries for ARM Cortex-M-based 32-bit microcon_
|
|
troller products commercialized by Licensee only, sublicensed and dis_
|
|
tributed under the terms and conditions of the End User License Agree_
|
|
ment supplied by STMicroelectronics International N.V.
|
|
Full source code is available at: www.segger.com
|
|
|
|
We appreciate your understanding and fairness.
|
|
----------------------------------------------------------------------
|
|
File : GUI_JPEG_Private.h
|
|
Purpose : Private header
|
|
----------------------------------------------------------------------
|
|
|
|
Explanation of terms:
|
|
|
|
Component - Color channel, e.g., Red or Luminance.
|
|
Sample - Single component value (i.e., one number in the image data).
|
|
Coefficient - Frequency coefficient (a DCT transform output number).
|
|
Block - 8x8 group of samples or coefficients.
|
|
MCU - (Minimum Coded Unit) is an interleaved set of blocks of size
|
|
determined by the sampling factors, or a single block in a
|
|
noninterleaved scan.
|
|
|
|
---------------------------END-OF-HEADER------------------------------
|
|
*/
|
|
|
|
/**
|
|
******************************************************************************
|
|
* @attention
|
|
*
|
|
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
|
|
* You may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at:
|
|
*
|
|
* http://www.st.com/software_license_agreement_liberty_v2
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*
|
|
******************************************************************************
|
|
*/
|
|
|
|
#ifndef GUI_JPEG_PRIVATE_H
|
|
#define GUI_JPEG_PRIVATE_H
|
|
|
|
/*********************************************************************
|
|
*
|
|
* Defines
|
|
*
|
|
**********************************************************************
|
|
*/
|
|
#define JPEG_LOCK_H(h) (GUI_JPEG_DCONTEXT *)GUI_LOCK_H(h)
|
|
|
|
/*********************************************************************
|
|
*
|
|
* Scan types
|
|
*/
|
|
#define GRAYSCALE 0
|
|
#define YH1V1 1
|
|
#define YH2V1 2
|
|
#define YH1V2 3
|
|
#define YH2V2 4
|
|
|
|
/*********************************************************************
|
|
*
|
|
* Maximum number of...
|
|
*/
|
|
#define MAX_COMPONENTS 4
|
|
#define MAX_HUFFTABLES 8
|
|
#define MAX_QUANTTABLES 4
|
|
#define MAX_COMPSINSCAN 4
|
|
#define MAX_BLOCKSPERMCU 10
|
|
|
|
/*********************************************************************
|
|
*
|
|
* Marker definitions
|
|
*/
|
|
#define M_SOF0 0xc0 /* Start Of Frame */
|
|
#define M_SOF1 0xc1
|
|
#define M_SOF2 0xc2
|
|
#define M_SOF3 0xc3
|
|
|
|
#define M_SOF5 0xc5
|
|
#define M_SOF6 0xc6
|
|
#define M_SOF7 0xc7
|
|
|
|
#define M_JPG 0xc8
|
|
#define M_SOF9 0xc9
|
|
#define M_SOF10 0xca
|
|
#define M_SOF11 0xcb
|
|
|
|
#define M_SOF13 0xcd
|
|
#define M_SOF14 0xce
|
|
#define M_SOF15 0xcf
|
|
|
|
#define M_DHT 0xc4 /* Define Huffman Table */
|
|
|
|
#define M_DAC 0xcc /* Define Arithmetic Coding Table */
|
|
|
|
#define M_RST0 0xd0
|
|
#define M_RST1 0xd1
|
|
#define M_RST2 0xd2
|
|
#define M_RST3 0xd3
|
|
#define M_RST4 0xd4
|
|
#define M_RST5 0xd5
|
|
#define M_RST6 0xd6
|
|
#define M_RST7 0xd7
|
|
|
|
#define M_SOI 0xd8 /* Start Of Image */
|
|
#define M_EOI 0xd9
|
|
#define M_SOS 0xda /* Start Of Scan */
|
|
#define M_DQT 0xdb /* Define Quantisation Table */
|
|
#define M_DRI 0xdd /* Define Restart Interval */
|
|
|
|
#define M_APP0 0xe0 /* Application Usage */
|
|
#define M_APP14 0xee /* Adobe marker */
|
|
|
|
#define M_TEM 0x01
|
|
|
|
#define ADOBE_TRANSFORM_RGB 0
|
|
#define ADOBE_TRANSFORM_YCBCR 1
|
|
|
|
/*********************************************************************
|
|
*
|
|
* Types
|
|
*
|
|
**********************************************************************
|
|
*/
|
|
/* Default parameter structure for reading data from memory */
|
|
typedef struct {
|
|
const U8 * pFileData;
|
|
I32 FileSize;
|
|
} GUI_JPEG_PARAM;
|
|
|
|
/* Huffman table definition */
|
|
typedef struct {
|
|
unsigned aLookUp[256];
|
|
U8 aCodeSize[256];
|
|
unsigned aTree[512];
|
|
} HUFF_TABLE;
|
|
|
|
/* Coefficient buffer used for progressive JPEGs */
|
|
typedef struct {
|
|
int NumBlocksX;
|
|
int NumBlocksY;
|
|
unsigned BlockSize;
|
|
GUI_HMEM hData;
|
|
} COEFF_BUFFER;
|
|
|
|
typedef struct GUI_JPEG_DCONTEXT GUI_JPEG_DCONTEXT;
|
|
|
|
struct GUI_JPEG_DCONTEXT {
|
|
/* Function pointer for drawing one line of completely decoded pixels */
|
|
void (* pfWritePixels)(int x0, int y0, GUI_JPEG_DCONTEXT * pContext, GUI_COLOR (* pfGetColor)(const U8 ** ppData, unsigned SkipCnt), tLCDDEV_Color2Index * pfColor2Index);
|
|
/* Function pointer for reading one byte */
|
|
int (* pfGetU8)(GUI_JPEG_DCONTEXT * pContext, U8 * pByte);
|
|
|
|
GUI_GET_DATA_FUNC * pfGetData; /* 'GetData' Function pointer */
|
|
void * pParam; /* Pointer passed to 'GetData' function */
|
|
U32 Off; /* Data pointer */
|
|
/* Image size */
|
|
U16 xSize;
|
|
U16 ySize;
|
|
/* Input buffer */
|
|
const U8 * pBuffer;
|
|
unsigned NumBytesInBuffer;
|
|
U8 StartOfFile;
|
|
U8 aStuff[4]; /* Stuff back buffer */
|
|
U8 NumBytesStuffed; /* Number of stuffed bytes */
|
|
/* Bit buffer */
|
|
U32 BitBuffer;
|
|
int NumBitsLeft;
|
|
/* Huffman tables */
|
|
U8 aHuffNumTableAvail[MAX_HUFFTABLES];
|
|
U8 aaHuffNum[MAX_HUFFTABLES][17]; /* Pointer to number of Huffman codes per bit size */
|
|
U8 aaHuffVal[MAX_HUFFTABLES][256]; /* Pointer to Huffman codes */
|
|
HUFF_TABLE aHuffTable[MAX_HUFFTABLES];
|
|
HUFF_TABLE * apDC_Huff[MAX_BLOCKSPERMCU];
|
|
HUFF_TABLE * apAC_Huff[MAX_BLOCKSPERMCU];
|
|
/* Quantization tables */
|
|
U16 aaQuantTbl[MAX_QUANTTABLES][64];
|
|
U16 * apQuantTbl[MAX_QUANTTABLES];
|
|
/* Component information */
|
|
U8 NumCompsPerFrame; /* Number of components per frame */
|
|
U8 aCompHSamp[MAX_COMPONENTS]; /* Component's horizontal sampling factor */
|
|
U8 aCompVSamp[MAX_COMPONENTS]; /* Component's vertical sampling factor */
|
|
U8 aCompQuant[MAX_COMPONENTS]; /* Component's quantization table selector */
|
|
U8 aCompId [MAX_COMPONENTS]; /* Component's ID */
|
|
U8 NumCompsPerScan; /* Number of components per scan */
|
|
U8 aCompList[MAX_COMPSINSCAN]; /* Components in this scan */
|
|
U8 aCompDC_Tab[MAX_COMPONENTS]; /* Component's DC Huffman coding table selector */
|
|
U8 aCompAC_Tab[MAX_COMPONENTS]; /* Component's AC Huffman coding table selector */
|
|
unsigned * apComponent[MAX_BLOCKSPERMCU]; /* Points into the table aLastDC_Val[] */
|
|
unsigned aLastDC_Val[MAX_COMPONENTS]; /* Table of last DC values */
|
|
/* Data used for progressive scans */
|
|
U8 SpectralStart; /* Spectral selection start */
|
|
U8 SpectralEnd; /* Spectral selection end */
|
|
U8 SuccessiveLow; /* Successive approximation low */
|
|
U8 SuccessiveHigh; /* Successive approximation high */
|
|
COEFF_BUFFER aDC_Coeffs[MAX_COMPONENTS]; /* DC coefficient buffer for progressive scan */
|
|
COEFF_BUFFER aAC_Coeffs[MAX_COMPONENTS]; /* AC coefficient buffer for progressive scan */
|
|
int aBlockY_MCU[MAX_COMPONENTS]; /* */
|
|
GUI_HMEM hBmpLine;
|
|
/* Common */
|
|
U8 TransformationRequired;
|
|
U8 IsProgressive; /* Flag is set to 1 if JPEG is progressive */
|
|
U8 ScanType; /* Gray, Yh1v1, Yh1v2, Yh2v1, Yh2v2 */
|
|
int MaxMCUsPerRow; /* Maximum number of MCUs per row */
|
|
int MaxMCUsPerCol; /* Maximum number of MCUs per column */
|
|
int MaxBlocksPerMCU; /* Maximum number of blocks per MCU */
|
|
int MaxBlocksPerRow; /* Maximum number of blocks per row */
|
|
int MaxMCU_xSize; /* MCU's max. X size in pixels */
|
|
int MaxMCU_ySize; /* MCU's max. Y size in pixels */
|
|
int DestBytesPerPixel; /* 4 (RGB) or 1 (Y) */
|
|
int DestBytesPerScanline; /* Rounded up */
|
|
int RealDestBytesPerScanline; /* Actual bytes */
|
|
int EOB_Run; /* 'End Of Band' run */
|
|
int RestartInterval;
|
|
int RestartsLeft;
|
|
int NextRestartNum;
|
|
int MCUsPerRow;
|
|
int MCUsPerCol;
|
|
int NumBlocksPerMCU;
|
|
int aMCU_Org[MAX_BLOCKSPERMCU];
|
|
/* Block buffer */
|
|
GUI_HMEM hBlocks;
|
|
GUI_HMEM hBlockMaxZagSet;
|
|
/* Sample buffer */
|
|
GUI_HMEM hSampleBuf;
|
|
U8 * pSampleBuf;
|
|
/* Status */
|
|
int TotalLinesLeft; /* Total number of lines left in image */
|
|
int MCULinesLeft; /* Total number of lines left in current MCU */
|
|
/* Output buffer(s) */
|
|
GUI_HMEM hScanLine0; /* Buffer 0 */
|
|
GUI_HMEM hScanLine1; /* Buffer 1, only used for V2 sampling factors */
|
|
U8 BufferIndex;
|
|
/* Arrays used for converting YCbCr to RGB */
|
|
int aCRR[256];
|
|
int aCBB[256];
|
|
I32 aCRG[256];
|
|
I32 aCBG[256];
|
|
/* Banding */
|
|
U8 BandingRequired; /* Flag if banding is required */
|
|
unsigned NumBands; /* Number of required bands for drawing the complete frame */
|
|
int NumBlocksPerBand; /* Number of vertical blocks per band */
|
|
int FirstBlockOfBand;
|
|
int aFirstBlockOfBand[MAX_COMPONENTS];
|
|
int bpp;
|
|
};
|
|
|
|
/*********************************************************************
|
|
*
|
|
* Private interface
|
|
*
|
|
**********************************************************************
|
|
*/
|
|
int GUI_JPEG__AllocBandingCoeffBuffer (GUI_HMEM hContext);
|
|
int GUI_JPEG__DecodeLine (GUI_JPEG_DCONTEXT * pContext);
|
|
int GUI_JPEG__DecodeProgressiveBanding(GUI_JPEG_DCONTEXT * pContext);
|
|
void GUI_JPEG__Free (GUI_JPEG_DCONTEXT * pContext);
|
|
GUI_COLOR GUI_JPEG__GetColorGray (const U8 ** ppData, unsigned SkipCnt);
|
|
GUI_COLOR GUI_JPEG__GetColorRGB (const U8 ** ppData, unsigned SkipCnt);
|
|
int GUI_JPEG__GetData (void * p, const U8 ** ppData, unsigned NumBytesReq, U32 Off);
|
|
int GUI_JPEG__InitDraw (GUI_HMEM hContext);
|
|
int GUI_JPEG__ReadUntilSOF (GUI_HMEM hContext);
|
|
void GUI_JPEG__SetNextBand (GUI_JPEG_DCONTEXT * pContext);
|
|
int GUI_JPEG__SkipLine (GUI_JPEG_DCONTEXT * pContext);
|
|
int GUI_JPEG__GetInfoEx (GUI_HMEM hContext, GUI_JPEG_INFO * pInfo);
|
|
|
|
#endif
|