RT1050 GUI demo using emWin library

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers GUI_JPEG_Private.h Source File

GUI_JPEG_Private.h

00001 /*********************************************************************
00002 *                SEGGER Microcontroller GmbH & Co. KG                *
00003 *        Solutions for real time microcontroller applications        *
00004 **********************************************************************
00005 *                                                                    *
00006 *        (c) 1996 - 2016  SEGGER Microcontroller GmbH & Co. KG       *
00007 *                                                                    *
00008 *        Internet: www.segger.com    Support:  support@segger.com    *
00009 *                                                                    *
00010 **********************************************************************
00011 
00012 ** emWin V5.38 - Graphical user interface for embedded applications **
00013 All  Intellectual Property rights  in the Software belongs to  SEGGER.
00014 emWin is protected by  international copyright laws.  Knowledge of the
00015 source code may not be used to write a similar product.  This file may
00016 only be used in accordance with the following terms:
00017 
00018 The software has been licensed to  NXP Semiconductors USA, Inc.  whose
00019 registered  office  is  situated  at 411 E. Plumeria Drive, San  Jose,
00020 CA 95134, USA  solely for  the  purposes  of  creating  libraries  for
00021 NXPs M0, M3/M4 and  ARM7/9 processor-based  devices,  sublicensed  and
00022 distributed under the terms and conditions of the NXP End User License
00023 Agreement.
00024 Full source code is available at: www.segger.com
00025 
00026 We appreciate your understanding and fairness.
00027 ----------------------------------------------------------------------
00028 Licensing information
00029 
00030 Licensor:                 SEGGER Microcontroller Systems LLC
00031 Licensed to:              NXP Semiconductors, 1109 McKay Dr, M/S 76, San Jose, CA 95131, USA
00032 Licensed SEGGER software: emWin
00033 License number:           GUI-00186
00034 License model:            emWin License Agreement, dated August 20th 2011
00035 Licensed product:         -
00036 Licensed platform:        NXP's ARM 7/9, Cortex-M0,M3,M4
00037 Licensed number of seats: -
00038 ----------------------------------------------------------------------
00039 File        : GUI_JPEG_Private.h
00040 Purpose     : Private header
00041 ----------------------------------------------------------------------
00042 
00043 Explanation of terms:
00044   
00045   Component   - Color channel, e.g., Red or Luminance.
00046   Sample      - Single component value (i.e., one number in the image data).
00047   Coefficient - Frequency coefficient (a DCT transform output number).
00048   Block       - 8x8 group of samples or coefficients.
00049   MCU         - (Minimum Coded Unit) is an interleaved set of blocks of size
00050                 determined by the sampling factors, or a single block in a
00051                 noninterleaved scan.
00052 
00053 ---------------------------END-OF-HEADER------------------------------
00054 */
00055 
00056 #ifndef GUI_JPEG_PRIVATE_H
00057 #define GUI_JPEG_PRIVATE_H
00058 
00059 /*********************************************************************
00060 *
00061 *       Defines
00062 *
00063 **********************************************************************
00064 */
00065 #define JPEG_LOCK_H(h) (GUI_JPEG_DCONTEXT *)GUI_LOCK_H(h)
00066 
00067 /*********************************************************************
00068 *
00069 *       Scan types
00070 */
00071 #define GRAYSCALE 0
00072 #define YH1V1     1
00073 #define YH2V1     2
00074 #define YH1V2     3
00075 #define YH2V2     4
00076 
00077 /*********************************************************************
00078 *
00079 *       Maximum number of...
00080 */
00081 #define MAX_COMPONENTS  4
00082 #define MAX_HUFFTABLES  8
00083 #define MAX_QUANTTABLES 4
00084 #define MAX_COMPSINSCAN 4
00085 #define MAX_BLOCKSPERMCU 10
00086 
00087 /*********************************************************************
00088 *
00089 *       Marker definitions
00090 */
00091 #define M_SOF0  0xc0 // Start Of Frame
00092 #define M_SOF1  0xc1
00093 #define M_SOF2  0xc2
00094 #define M_SOF3  0xc3
00095 
00096 #define M_SOF5  0xc5
00097 #define M_SOF6  0xc6
00098 #define M_SOF7  0xc7
00099 
00100 #define M_JPG   0xc8
00101 #define M_SOF9  0xc9
00102 #define M_SOF10 0xca
00103 #define M_SOF11 0xcb
00104 
00105 #define M_SOF13 0xcd
00106 #define M_SOF14 0xce
00107 #define M_SOF15 0xcf
00108 
00109 #define M_DHT   0xc4 // Define Huffman Table
00110 
00111 #define M_DAC   0xcc // Define Arithmetic Coding Table
00112 
00113 #define M_RST0  0xd0
00114 #define M_RST1  0xd1
00115 #define M_RST2  0xd2
00116 #define M_RST3  0xd3
00117 #define M_RST4  0xd4
00118 #define M_RST5  0xd5
00119 #define M_RST6  0xd6
00120 #define M_RST7  0xd7
00121 
00122 #define M_SOI   0xd8 // Start Of Image
00123 #define M_EOI   0xd9
00124 #define M_SOS   0xda // Start Of Scan
00125 #define M_DQT   0xdb // Define Quantisation Table
00126 #define M_DRI   0xdd // Define Restart Interval
00127 
00128 #define M_APP0  0xe0 // Application Usage
00129 #define M_APP14 0xee // Adobe marker
00130 
00131 #define M_TEM   0x01
00132 
00133 #define ADOBE_TRANSFORM_RGB   0
00134 #define ADOBE_TRANSFORM_YCBCR 1
00135 
00136 /*********************************************************************
00137 *
00138 *       Types
00139 *
00140 **********************************************************************
00141 */
00142 //
00143 // Default parameter structure for reading data from memory
00144 //
00145 typedef struct {
00146   const U8 * pFileData;
00147   I32   FileSize;
00148 } GUI_JPEG_PARAM;
00149 
00150 //
00151 // Huffman table definition
00152 //
00153 typedef struct {
00154   unsigned aLookUp[256];
00155   U8       aCodeSize[256];
00156   unsigned aTree[512];
00157 } HUFF_TABLE;
00158 
00159 //
00160 // Coefficient buffer used for progressive JPEGs
00161 //
00162 typedef struct {
00163   int NumBlocksX;
00164   int NumBlocksY;
00165   unsigned BlockSize;
00166   GUI_HMEM hData;
00167 } COEFF_BUFFER;
00168 
00169 typedef struct GUI_JPEG_DCONTEXT GUI_JPEG_DCONTEXT;
00170 
00171 struct GUI_JPEG_DCONTEXT {
00172   //
00173   // Function pointer for reading one byte
00174   //
00175   int (* pfGetU8)(GUI_JPEG_DCONTEXT * pContext, U8 * pByte);
00176 
00177   GUI_GET_DATA_FUNC * pfGetData; // 'GetData' Function pointer
00178   void * pParam;                 // Pointer passed to 'GetData' function
00179   U32 Off;                       // Data pointer
00180   //
00181   // Image size
00182   //
00183   U16 xSize;
00184   U16 ySize;
00185   //
00186   // Input buffer
00187   //
00188   const U8 * pBuffer;
00189   unsigned   NumBytesInBuffer;
00190   U8         StartOfFile;
00191   U8         aStuff[4];        // Stuff back buffer
00192   U8         NumBytesStuffed;  // Number of stuffed bytes
00193   //
00194   // Bit buffer
00195   //
00196   U32 BitBuffer;
00197   int NumBitsLeft;
00198   //
00199   // Huffman tables
00200   //
00201   U8 aHuffNumTableAvail[MAX_HUFFTABLES];
00202   U8 aaHuffNum[MAX_HUFFTABLES][17];   // Pointer to number of Huffman codes per bit size
00203   U8 aaHuffVal[MAX_HUFFTABLES][256];  // Pointer to Huffman codes
00204   HUFF_TABLE aHuffTable[MAX_HUFFTABLES];
00205   HUFF_TABLE * apDC_Huff[MAX_BLOCKSPERMCU];
00206   HUFF_TABLE * apAC_Huff[MAX_BLOCKSPERMCU];
00207   //
00208   // Quantization tables
00209   //
00210   U16 aaQuantTbl[MAX_QUANTTABLES][64];
00211   U16 * apQuantTbl[MAX_QUANTTABLES];
00212   //
00213   // Component information
00214   //
00215   U8 NumCompsPerFrame;                      // Number of components per frame
00216   U8 aCompHSamp[MAX_COMPONENTS];            // Component's horizontal sampling factor
00217   U8 aCompVSamp[MAX_COMPONENTS];            // Component's vertical sampling factor
00218   U8 aCompQuant[MAX_COMPONENTS];            // Component's quantization table selector
00219   U8 aCompId   [MAX_COMPONENTS];            // Component's ID
00220   U8 NumCompsPerScan;                       // Number of components per scan
00221   U8 aCompList[MAX_COMPSINSCAN];            // Components in this scan
00222   U8 aCompDC_Tab[MAX_COMPONENTS];           // Component's DC Huffman coding table selector
00223   U8 aCompAC_Tab[MAX_COMPONENTS];           // Component's AC Huffman coding table selector
00224   unsigned * apComponent[MAX_BLOCKSPERMCU]; // Points into the table aLastDC_Val[]
00225   unsigned   aLastDC_Val[MAX_COMPONENTS];   // Table of last DC values
00226   //
00227   // Data used for progressive scans
00228   //
00229   U8 SpectralStart;                        // Spectral selection start
00230   U8 SpectralEnd;                          // Spectral selection end
00231   U8 SuccessiveLow;                        // Successive approximation low
00232   U8 SuccessiveHigh;                       // Successive approximation high
00233   COEFF_BUFFER aDC_Coeffs[MAX_COMPONENTS]; // DC coefficient buffer for progressive scan
00234   COEFF_BUFFER aAC_Coeffs[MAX_COMPONENTS]; // AC coefficient buffer for progressive scan
00235   int aBlockY_MCU[MAX_COMPONENTS];         // 
00236   //
00237   // Common
00238   //
00239   U8 TransformationRequired;
00240   U8 IsProgressive;             // Flag is set to 1 if JPEG is progressive
00241   U8 ScanType;                  // Gray, Yh1v1, Yh1v2, Yh2v1, Yh2v2
00242   int MaxMCUsPerRow;            // Maximum number of MCUs per row
00243   int MaxMCUsPerCol;            // Maximum number of MCUs per column
00244   int MaxBlocksPerMCU;          // Maximum number of blocks per MCU
00245   int MaxBlocksPerRow;          // Maximum number of blocks per row
00246   int MaxMCU_xSize;             // MCU's max. X size in pixels
00247   int MaxMCU_ySize;             // MCU's max. Y size in pixels
00248   int DestBytesPerPixel;        // 4 (RGB) or 1 (Y)
00249   int DestBytesPerScanline;     // Rounded up
00250   int RealDestBytesPerScanline; // Actual bytes
00251   int EOB_Run;                  // 'End Of Band' run
00252   int RestartInterval;
00253   int RestartsLeft;
00254   int NextRestartNum;
00255   int MCUsPerRow;
00256   int MCUsPerCol;
00257   int NumBlocksPerMCU;
00258   int aMCU_Org[MAX_BLOCKSPERMCU];
00259   //
00260   // Block buffer
00261   //
00262   GUI_HMEM hBlocks;
00263   GUI_HMEM hBlockMaxZagSet;
00264   //
00265   // Sample buffer
00266   //
00267   GUI_HMEM hSampleBuf;
00268   U8     * pSampleBuf;
00269   //
00270   // Status
00271   //
00272   int TotalLinesLeft; // Total number of lines left in image
00273   int MCULinesLeft;   // Total number of lines left in current MCU
00274   //
00275   // Output buffer(s)
00276   //
00277   GUI_HMEM hScanLine0; // Buffer 0
00278   GUI_HMEM hScanLine1; // Buffer 1, only used for V2 sampling factors
00279   U8 BufferIndex;
00280   //
00281   // Arrays used for converting YCbCr to RGB
00282   //
00283   int aCRR[256];
00284   int aCBB[256];
00285   I32 aCRG[256];
00286   I32 aCBG[256];
00287   //
00288   // Banding
00289   //
00290   U8 BandingRequired;   // Flag if banding is required
00291   unsigned NumBands;    // Number of required bands for drawing the complete frame
00292   int NumBlocksPerBand; // Number of vertical blocks per band
00293   int FirstBlockOfBand;
00294   int aFirstBlockOfBand[MAX_COMPONENTS];
00295 };
00296 
00297 /*********************************************************************
00298 *
00299 *       Private interface
00300 *
00301 **********************************************************************
00302 */
00303 int       GUI_JPEG__AllocBandingCoeffBuffer (GUI_HMEM hContext);
00304 int       GUI_JPEG__DecodeLine              (GUI_JPEG_DCONTEXT * pContext);
00305 int       GUI_JPEG__DecodeProgressiveBanding(GUI_JPEG_DCONTEXT * pContext);
00306 void      GUI_JPEG__Free                    (GUI_JPEG_DCONTEXT * pContext);
00307 GUI_COLOR GUI_JPEG__GetColorGray            (const U8 ** ppData, unsigned SkipCnt);
00308 GUI_COLOR GUI_JPEG__GetColorRGB             (const U8 ** ppData, unsigned SkipCnt);
00309 int       GUI_JPEG__GetData                 (void * p, const U8 ** ppData, unsigned NumBytesReq, U32 Off);
00310 int       GUI_JPEG__InitDraw                (GUI_HMEM hContext);
00311 int       GUI_JPEG__ReadUntilSOF            (GUI_HMEM hContext);
00312 void      GUI_JPEG__SetNextBand             (GUI_JPEG_DCONTEXT * pContext);
00313 int       GUI_JPEG__SkipLine                (GUI_JPEG_DCONTEXT * pContext);
00314 int       GUI_JPEG__GetInfoEx               (GUI_HMEM hContext, GUI_JPEG_INFO * pInfo);
00315 
00316 #endif
00317 
00318 /*************************** End of file ****************************/