Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (c) 2011 Intel Corporation. All Rights Reserved.
      3  * Copyright (c) Imagination Technologies Limited, UK
      4  *
      5  * Permission is hereby granted, free of charge, to any person obtaining a
      6  * copy of this software and associated documentation files (the
      7  * "Software"), to deal in the Software without restriction, including
      8  * without limitation the rights to use, copy, modify, merge, publish,
      9  * distribute, sub license, and/or sell copies of the Software, and to
     10  * permit persons to whom the Software is furnished to do so, subject to
     11  * the following conditions:
     12  *
     13  * The above copyright notice and this permission notice (including the
     14  * next paragraph) shall be included in all copies or substantial portions
     15  * of the Software.
     16  *
     17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     18  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
     20  * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
     21  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
     22  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
     23  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     24  *
     25  * Authors:
     26  *    Elaine Wang <elaine.wang (at) intel.com>
     27  *
     28  */
     29 
     30 /*#include <string.h>*/
     31 #include <stdio.h>
     32 
     33 #include <pnw_hostcode.h>
     34 #include <pnw_hostjpeg.h>
     35 #include "psb_drv_debug.h"
     36 
     37 #define TRACK_FREE(ptr)                 free(ptr)
     38 #define TRACK_MALLOC(ptr)               malloc(ptr)
     39 #define TRACK_DEVICE_MEMORY_INIT
     40 #define TRACK_DEVICE_MEMORY_SHOW
     41 #define TIMER_INIT
     42 #define TIMER_START(...)
     43 #define TIMER_END(...)
     44 #define TIMER_CLOSE
     45 #define TIMER_CAPTURE(...)
     46 
     47 
     48 //#include <stdio.h>
     49 //#include <memory.h>
     50 //#include <stdlib.h>
     51 //#include <stdlib.h>
     52 //#include "malloc.h"
     53 //#include "mtxmain.h"
     54 
     55 //#include "mtxccb.h"
     56 //#include "topaz_tests.h"
     57 //#include "mvea_regs.h"
     58 //#include "mtx_regs.h"
     59 //#include "defs.h"
     60 //#include "mtxencode.h"
     61 //#include "topaz_vlc_regs.h"
     62 //#include "mtxheader.h"
     63 //#include "apiinternal.h"
     64 
     65 //#ifdef FIXME
     66 //extern void JPEGInitialiseHardware();
     67 //#endif
     68 
     69 #define JPEG_INCLUDE_NONAPI 1
     70 
     71 
     72 
     73 /////////////////////////////////////////////////////////////////////////////////////
     74 // BMP Reading Header Stuff
     75 /////////////////////////////////////////////////////////////////////////////////////
     76 
     77 
     78 const IMG_UINT8 gQuantLuma[QUANT_TABLE_SIZE_BYTES] = {
     79     16, 11, 10, 16, 24, 40, 51, 61,
     80     12, 12, 14, 19, 26, 58, 60, 55,
     81     14, 13, 16, 24, 40, 57, 69, 56,
     82     14, 17, 22, 29, 51, 87, 80, 62,
     83     18, 22, 37, 56, 68, 109, 103, 77,
     84     24, 35, 55, 64, 81, 104, 113, 92,
     85     49, 64, 78, 87, 103, 121, 120, 101,
     86     72, 92, 95, 98, 112, 100, 103, 99
     87 };
     88 
     89 /*const IMG_UINT8 DEBUG_gQuantLumaForCoverage[QUANT_TABLE_SIZE_BYTES] =
     90 {
     91     16, 17, 21, 22, 30, 31, 22, 45,
     92     18, 20, 23, 29, 32, 29, 44, 46,
     93     19, 24, 28, 33, 36, 43, 47, 58,
     94     25, 27, 34, 29, 42, 48, 57, 59,
     95     26, 34, 37, 41, 49, 56 , 60 , 67,
     96     36, 35, 40, 50, 55, 61 , 66 , 68,
     97     37, 39, 51, 54, 62 , 65 , 69 , 72 ,
     98     38, 52, 53, 63, 64 , 70 , 71 , 73
     99 };*/
    100 
    101 int DEBUG_giUsegQuantLumaForCoverageTable = 0;
    102 
    103 /*****************************************************************************/
    104 /*  \brief   gQuantChroma                                                    */
    105 /*                                                                           */
    106 /*  Contains the data that needs to be sent in the marker segment of an      */
    107 /*  interchange format JPEG stream or an abbreviated format table            */
    108 /*  specification data stream.                                               */
    109 /*  Quantizer table for the chrominance component                            */
    110 /*****************************************************************************/
    111 const IMG_UINT8 gQuantChroma[QUANT_TABLE_SIZE_BYTES] = {
    112     17, 18, 24, 47, 99, 99, 99, 99,
    113     18, 21, 26, 66, 99, 99, 99, 99,
    114     24, 26, 56, 99, 99, 99, 99, 99,
    115     47, 66, 99, 99, 99, 99, 99, 99,
    116     99, 99, 99, 99, 99, 99, 99, 99,
    117     99, 99, 99, 99, 99, 99, 99, 99,
    118     99, 99, 99, 99, 99, 99, 99, 99,
    119     99, 99, 99, 99, 99, 99, 99, 99
    120 };
    121 
    122 /*****************************************************************************/
    123 /*  \brief   gZigZag                                                         */
    124 /*                                                                           */
    125 /*  Zigzag scan pattern                                                      */
    126 /*****************************************************************************/
    127 const IMG_UINT8 gZigZag[] = {
    128     0,  1,  8, 16,  9,  2,  3, 10,
    129     17, 24, 32, 25, 18, 11,  4,  5,
    130     12, 19, 26, 33, 40, 48, 41, 34,
    131     27, 20, 13,  6,  7, 14, 21, 28,
    132     35, 42, 49, 56, 57, 50, 43, 36,
    133     29, 22, 15, 23, 30, 37, 44, 51,
    134     58, 59, 52, 45, 38, 31, 39, 46,
    135     53, 60, 61, 54, 47, 55, 62, 63
    136 };
    137 
    138 /*****************************************************************************/
    139 /*  \brief   gMarkerDataLumaDc                                               */
    140 /*                                                                           */
    141 /*  Contains the data that needs to be sent in the marker segment of an      */
    142 /*  interchange format JPEG stream or an abbreviated format table            */
    143 /*  specification data stream.                                               */
    144 /*  Specifies the huffman table used for encoding the luminance DC           */
    145 /*  coefficient differences. The table represents Table K.3 of               */
    146 /*  IS0/IEC 10918-1:1994(E)                                                  */
    147 /*****************************************************************************/
    148 const IMG_UINT8 gMarkerDataLumaDc[] = {
    149     //TcTh  Li
    150     0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00,
    151     0x00, 0x00, 0x00, 0x00, 0x00,
    152     // Vi
    153     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B
    154 };
    155 
    156 /*****************************************************************************/
    157 /*  \brief   gMarkerDataLumaAc                                               */
    158 /*                                                                           */
    159 /*  Contains the data that needs to be sent in the marker segment of an      */
    160 /*  interchange format JPEG stream or an abbreviated format table            */
    161 /*  specification data stream.                                               */
    162 /*  Specifies the huffman table used for encoding the luminance AC           */
    163 /*  coefficients. The table represents Table K.5 of IS0/IEC 10918-1:1994(E)  */
    164 /*****************************************************************************/
    165 const IMG_UINT8 gMarkerDataLumaAc[] = {
    166     // TcTh  Li
    167     0x10, 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03, 0x05, 0x05, 0x04,
    168     0x04, 0x00, 0x00, 0x01, 0x7D,
    169     // Vi
    170     0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06,
    171     0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xA1, 0x08,
    172     0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0, 0x24, 0x33, 0x62, 0x72,
    173     0x82, 0x09, 0x0A, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x25, 0x26, 0x27, 0x28,
    174     0x29, 0x2A, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, 0x45,
    175     0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
    176     0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75,
    177     0x76, 0x77, 0x78, 0x79, 0x7A, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
    178     0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3,
    179     0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6,
    180     0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9,
    181     0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE1, 0xE2,
    182     0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF1, 0xF2, 0xF3, 0xF4,
    183     0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA
    184 };
    185 
    186 /*****************************************************************************/
    187 /*  \brief   gMarkerDataChromaDc                                             */
    188 /*                                                                           */
    189 /*  Contains the data that needs to be sent in the marker segment of an      */
    190 /*  interchange format JPEG stream or an abbreviated format table            */
    191 /*  specification data stream.                                               */
    192 /*  Specifies the huffman table used for encoding the chrominance DC         */
    193 /*  coefficient differences. The table represents Table K.4 of               */
    194 /*  IS0/IEC 10918-1:1994(E)                                                  */
    195 /*****************************************************************************/
    196 const IMG_UINT8 gMarkerDataChromaDc[] = {
    197     // TcTh Li
    198     0x01, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
    199     0x00, 0x00, 0x00, 0x00, 0x00,
    200 
    201     // Vi
    202     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B
    203 };
    204 
    205 /*****************************************************************************/
    206 /*  \brief   gMarkerDataChromaAc                                             */
    207 /*                                                                           */
    208 /*  Contains the data that needs to be sent in the marker segment of an      */
    209 /*  interchange format JPEG stream or an abbreviated format table            */
    210 /*  specification data stream.                                               */
    211 /*  Specifies the huffman table used for encoding the chrominance AC         */
    212 /*  coefficients. The table represents Table K.6 of IS0/IEC 10918-1:1994(E)  */
    213 /*****************************************************************************/
    214 const IMG_UINT8 gMarkerDataChromaAc[] = {
    215     // TcTh
    216     0x11, 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05, 0x04,
    217     0x04, 0x00, 0x01, 0x02, 0x77,
    218 
    219     // Vi
    220     0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41,
    221     0x51, 0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
    222     0xA1, 0xB1, 0xC1, 0x09, 0x23, 0x33, 0x52, 0xF0, 0x15, 0x62, 0x72, 0xD1,
    223     0x0A, 0x16, 0x24, 0x34, 0xE1, 0x25, 0xF1, 0x17, 0x18, 0x19, 0x1A, 0x26,
    224     0x27, 0x28, 0x29, 0x2A, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44,
    225     0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
    226     0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x73, 0x74,
    227     0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
    228     0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A,
    229     0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4,
    230     0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
    231     0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA,
    232     0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF2, 0xF3, 0xF4,
    233     0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA
    234 };
    235 
    236 /*****************************************************************************/
    237 /*  \brief   gLumaDCCode                                                     */
    238 /*                                                                           */
    239 /*  Contains the code words to encode the luminance DC coefficient           */
    240 /*  differences. The code words are mentioned in table K.3 of                */
    241 /*  ISO/IEC 10918-1:1994(E)                                                  */
    242 /*****************************************************************************/
    243 const IMG_UINT16 gLumaDCCode[] = {
    244     0x0000, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006,
    245     0x000E, 0x001E, 0x003E, 0x007E, 0x00FE, 0x01FE
    246 };
    247 
    248 /*****************************************************************************/
    249 /*  \brief   gLumaDCSize                                                     */
    250 /*                                                                           */
    251 /*  Contains the code length of the code words that are used to encode the   */
    252 /*  luminance DC coefficient differences. The code lengths are mentioned in  */
    253 /*  table K.3 of ISO/IEC 10918-1:1994(E)                                     */
    254 /*****************************************************************************/
    255 const IMG_UINT8 gLumaDCSize[] = {
    256     0x0002, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
    257     0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009
    258 };
    259 
    260 /*****************************************************************************/
    261 /*  \brief   gChromaDCCode                                                   */
    262 /*                                                                           */
    263 /*  Contains the code words to encode the chrominance DC coefficient         */
    264 /*  differences. The code words are mentioned in table K.4 of                */
    265 /*  ISO/IEC 10918-1:1994(E)                                                  */
    266 /*****************************************************************************/
    267 const IMG_UINT16 gChromaDCCode[] = {
    268     0x0000, 0x0001, 0x0002, 0x0006, 0x000E, 0x001E,
    269     0x003E, 0x007E, 0x00FE, 0x01FE, 0x03FE, 0x07FE
    270 };
    271 
    272 /*****************************************************************************/
    273 /*  \brief   gChromaDCSize                                                   */
    274 /*                                                                           */
    275 /*  Contains the code length of the code words that are used to encode the   */
    276 /*  chrominance DC coefficient differences. The code lengths are mentioned in*/
    277 /*  table K.4 of ISO/IEC 10918-1:1994(E)                                     */
    278 /*****************************************************************************/
    279 const IMG_UINT8 gChromaDCSize[] = {
    280     0x0002, 0x0002, 0x0002, 0x0003, 0x0004, 0x0005,
    281     0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B
    282 };
    283 
    284 
    285 /*****************************************************************************/
    286 /*  \brief   gLumaACCode                                                     */
    287 /*                                                                           */
    288 /*  Contains the code words to encode the luminance AC coefficients. The     */
    289 /*  code words are arrange in the increasing order of run followed by size as*/
    290 /*  in table K.5 of ISO/IEC 10918-1:1994(E)                                  */
    291 /*****************************************************************************/
    292 const IMG_UINT16 gLumaACCode[] = {
    293     0x000A, 0x0000, 0x0001, 0x0004, 0x000B, 0x001A, 0x0078, 0x00F8, 0x03F6,
    294     0xFF82, 0xFF83, /* codes for run 0 */
    295     0x000C, 0x001B, 0x0079, 0x01F6, 0x07F6, 0xFF84, 0xFF85, 0xFF86,
    296     0xFF87, 0xFF88, /* codes for run 1 */
    297     0x001C, 0x00F9, 0x03F7, 0x0FF4, 0xFF89, 0xFF8A, 0xFF8b, 0xFF8C,
    298     0xFF8D, 0xFF8E, /* codes for run 2 */
    299     0x003A, 0x01F7, 0x0FF5, 0xFF8F, 0xFF90, 0xFF91, 0xFF92, 0xFF93,
    300     0xFF94, 0xFF95, /* codes for run 3 */
    301     0x003B, 0x03F8, 0xFF96, 0xFF97, 0xFF98, 0xFF99, 0xFF9A, 0xFF9B,
    302     0xFF9C, 0xFF9D, /* codes for run 4 */
    303     0x007A, 0x07F7, 0xFF9E, 0xFF9F, 0xFFA0, 0xFFA1, 0xFFA2, 0xFFA3,
    304     0xFFA4, 0xFFA5, /* codes for run 5 */
    305     0x007B, 0x0FF6, 0xFFA6, 0xFFA7, 0xFFA8, 0xFFA9, 0xFFAA, 0xFFAB,
    306     0xFFAC, 0xFFAD, /* codes for run 6 */
    307     0x00FA, 0x0FF7, 0xFFAE, 0xFFAF, 0xFFB0, 0xFFB1, 0xFFB2, 0xFFB3,
    308     0xFFB4, 0xFFB5, /* codes for run 7 */
    309     0x01F8, 0x7FC0, 0xFFB6, 0xFFB7, 0xFFB8, 0xFFB9, 0xFFBA, 0xFFBB,
    310     0xFFBC, 0xFFBD, /* codes for run 8 */
    311     0x01F9, 0xFFBE, 0xFFBF, 0xFFC0, 0xFFC1, 0xFFC2, 0xFFC3, 0xFFC4,
    312     0xFFC5, 0xFFC6, /* codes for run 9 */
    313     0x01FA, 0xFFC7, 0xFFC8, 0xFFC9, 0xFFCA, 0xFFCB, 0xFFCC, 0xFFCD,
    314     0xFFCE, 0xFFCF, /* codes for run A */
    315     0x03F9, 0xFFD0, 0xFFD1, 0xFFD2, 0xFFD3, 0xFFD4, 0xFFD5, 0xFFD6,
    316     0xFFD7, 0xFFD8, /* codes for run B */
    317     0x03FA, 0xFFD9, 0xFFDA, 0xFFDB, 0xFFDC, 0xFFDD, 0xFFDE, 0xFFDF,
    318     0xFFE0, 0xFFE1, /* codes for run C */
    319     0x07F8, 0xFFE2, 0xFFE3, 0xFFE4, 0xFFE5, 0xFFE6, 0xFFE7, 0xFFE8,
    320     0xFFE9, 0xFFEA, /* codes for run D */
    321     0xFFEB, 0xFFEC, 0xFFED, 0xFFEE, 0xFFEF, 0xFFF0, 0xFFF1, 0xFFF2,
    322     0xFFF3, 0xFFF4, /* codes for run E */
    323     0xFFF5, 0xFFF6, 0xFFF7, 0xFFF8, 0xFFF9, 0xFFFA, 0xFFFB, 0xFFFC, 0xFFFD,
    324     0xFFFE, 0x07F9  /* codes for run F */
    325 };
    326 
    327 /*****************************************************************************/
    328 /*  \brief   gLumaACSize                                                     */
    329 /*                                                                           */
    330 /*  Contains the code length of the code words that are used to encode the   */
    331 /*  luminance AC coefficients. The code lengths as in table K.5 of           */
    332 /*  ISO/IEC 10918-1:1994(E), are arranged in the increasing order of run     */
    333 /*  followed by size                                                         */
    334 /*****************************************************************************/
    335 const IMG_UINT8 gLumaACSize[] = {
    336     0x04, 0x02, 0x02, 0x03, 0x04, 0x05, 0x07, 0x08, 0x0A, 0x10, 0x10,/* run 0 */
    337     0x04, 0x05, 0x07, 0x09, 0x0B, 0x10, 0x10, 0x10, 0x10, 0x10,/* run 1 */
    338     0x05, 0x08, 0x0A, 0x0C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,/* run 2 */
    339     0x06, 0x09, 0x0C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,/* run 3 */
    340     0x06, 0x0A, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,/* run 4 */
    341     0x07, 0x0B, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,/* run 5 */
    342     0x07, 0x0C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,/* run 6 */
    343     0x08, 0x0C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,/* run 7 */
    344     0x09, 0x0F, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,/* run 8 */
    345     0x09, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,/* run 9 */
    346     0x09, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,/* run A */
    347     0x0A, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,/* run B */
    348     0x0A, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,/* run C */
    349     0x0B, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,/* run D */
    350     0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,/* run E */
    351     0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0B /* run F */
    352 };
    353 
    354 /*****************************************************************************/
    355 /*  \brief   gChromaACCode                                                   */
    356 /*                                                                           */
    357 /*  Contains the code words to encode the chromiannce AC coefficients. The   */
    358 /*  code words are arrange in the increasing order of run followed by size   */
    359 /*  as in table K.6 of ISO/IEC 10918-1:1994(E)                               */
    360 /*****************************************************************************/
    361 const IMG_UINT16 gChromaACCode[] = {
    362     0x0000, 0x0001, 0x0004, 0x000A, 0x0018, 0x0019, 0x0038, 0x0078, 0x01F4,
    363     0x03F6, 0x0FF4, /* codes for run 0 */
    364     0x000B, 0x0039, 0x00F6, 0x01F5, 0x07F6, 0x0FF5, 0xFF88, 0xFF89,
    365     0xFF8A, 0xFF8B, /* codes for run 1 */
    366     0x001A, 0x00F7, 0x03F7, 0x0FF6, 0x7FC2, 0xFF8C, 0xFF8D, 0xFF8E,
    367     0xFF8F, 0xFF90, /* codes for run 2 */
    368     0x001B, 0x00F8, 0x03F8, 0x0FF7, 0xFF91, 0xFF92, 0xFF93, 0xFF94,
    369     0xFF95, 0xFF96, /* codes for run 3 */
    370     0x003A, 0x01F6, 0xFF97, 0xFF98, 0xFF99, 0xFF9A, 0xFF9B, 0xFF9C,
    371     0xFF9D, 0xFF9E, /* codes for run 4 */
    372     0x003B, 0x03F9, 0xFF9F, 0xFFA0, 0xFFA1, 0xFFA2, 0xFFA3, 0xFFA4,
    373     0xFFA5, 0xFFA6, /* codes for run 5 */
    374     0x0079, 0x07F7, 0xFFA7, 0xFFA8, 0xFFA9, 0xFFAA, 0xFFAB, 0xFFAC,
    375     0xFFAD, 0xFFAE, /* codes for run 6 */
    376     0x007A, 0x07F8, 0xFFAF, 0xFFB0, 0xFFB1, 0xFFB2, 0xFFB3, 0xFFB4,
    377     0xFFB5, 0xFFB6, /* codes for run 7 */
    378     0x00F9, 0xFFB7, 0xFFB8, 0xFFB9, 0xFFBA, 0xFFBB, 0xFFBC, 0xFFBD,
    379     0xFFBE, 0xFFBF, /* codes for run 8 */
    380     0x01F7, 0xFFC0, 0xFFC1, 0xFFC2, 0xFFC3, 0xFFC4, 0xFFC5, 0xFFC6,
    381     0xFFC7, 0xFFC8, /* codes for run 9 */
    382     0x01F8, 0xFFC9, 0xFFCA, 0xFFCB, 0xFFCC, 0xFFCD, 0xFFCE, 0xFFCF,
    383     0xFFD0, 0xFFD1, /* codes for run A */
    384     0x01F9, 0xFFD2, 0xFFD3, 0xFFD4, 0xFFD5, 0xFFD6, 0xFFD7, 0xFFD8,
    385     0xFFD9, 0xFFDA, /* codes for run B */
    386     0x01FA, 0xFFDB, 0xFFDC, 0xFFDD, 0xFFDE, 0xFFDF, 0xFFE0, 0xFFE1,
    387     0xFFE2, 0xFFE3, /* codes for run C */
    388     0x07F9, 0xFFE4, 0xFFE5, 0xFFE6, 0xFFE7, 0xFFE8, 0xFFE9, 0xFFEA,
    389     0xFFEb, 0xFFEC, /* codes for run D */
    390     0x3FE0, 0xFFED, 0xFFEE, 0xFFEF, 0xFFF0, 0xFFF1, 0xFFF2, 0xFFF3,
    391     0xFFF4, 0xFFF5, /* codes for run E */
    392     0x7FC3, 0xFFF6, 0xFFF7, 0xFFF8, 0xFFF9, 0xFFFA, 0xFFFB, 0xFFFC, 0xFFFD,
    393     0xFFFE, 0x03FA  /* codes for run F */
    394 };
    395 
    396 /*****************************************************************************/
    397 /*  \brief   gChromaACSize                                                   */
    398 /*                                                                           */
    399 /*  Contains the code length of the code words that are used to encode the   */
    400 /*  chrominance AC coefficients. The code lengths as in table K.5 of         */
    401 /*  ISO/IEC 10918-1:1994(E), are arranged in the increasing order of run     */
    402 /*  followed by size                                                         */
    403 /*****************************************************************************/
    404 const IMG_UINT8 gChromaACSize[] = {
    405     0x02, 0x02, 0x03, 0x04, 0x05, 0x05, 0x06, 0x07, 0x09, 0x0A, 0x0C,/* run 0 */
    406     0x04, 0x06, 0x08, 0x09, 0x0B, 0x0C, 0x10, 0x10, 0x10, 0x10,/* run 1 */
    407     0x05, 0x08, 0x0A, 0x0C, 0x0F, 0x10, 0x10, 0x10, 0x10, 0x10,/* run 2 */
    408     0x05, 0x08, 0x0A, 0x0C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,/* run 3 */
    409     0x06, 0x09, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,/* run 4 */
    410     0x06, 0x0A, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,/* run 5 */
    411     0x07, 0x0B, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,/* run 6 */
    412     0x07, 0x0B, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,/* run 7 */
    413     0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,/* run 8 */
    414     0x09, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,/* run 9 */
    415     0x09, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,/* run A */
    416     0x09, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,/* run B */
    417     0x09, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,/* run C */
    418     0x0B, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,/* run D */
    419     0x0E, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,/* run E */
    420     0x0F, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0A /* run F */
    421 };
    422 
    423 /*****************************************************************************/
    424 /*  \brief   gSize                                                           */
    425 /*                                                                           */
    426 /*  Table used in the computation of 4 lease significant bits 'SSSS' as      */
    427 /*  specified in table F.1 and F.2 of ISO/IEC 10918-1:1994(E). These values  */
    428 /*  are used to computes the 4 least significant bits and are not exactly    */
    429 /*  the values mentioned in the table                                        */
    430 /*****************************************************************************/
    431 const IMG_UINT8 gSize[] = {
    432     0,
    433     1,
    434     2, 2,
    435     3, 3, 3, 3,
    436     4, 4, 4, 4, 4, 4, 4, 4,
    437     5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
    438 };
    439 
    440 int customize_quantization_tables(unsigned char *luma_matrix,
    441                                   unsigned char *chroma_matrix,
    442                                   unsigned int ui32Quality)
    443 {
    444     unsigned int uc_qVal;
    445     unsigned int uc_j;
    446 
    447     if((NULL == luma_matrix) || (NULL == chroma_matrix) ||
    448        (ui32Quality < 1) || (ui32Quality > 100))
    449         return 1;
    450 
    451     /* Compute luma quantization table */
    452     ui32Quality = (ui32Quality<50) ? (5000/ui32Quality) : (200-ui32Quality*2);
    453     for(uc_j=0; uc_j<QUANT_TABLE_SIZE_BYTES; ++uc_j) {
    454         uc_qVal = (gQuantLuma[uc_j] * ui32Quality + 50) / 100;
    455         uc_qVal =  (uc_qVal>0xFF)? 0xFF:uc_qVal;
    456         uc_qVal =  (uc_qVal<1)? 1:uc_qVal;
    457         luma_matrix[uc_j] = (unsigned char)uc_qVal;
    458     }
    459 
    460     /* Compute chroma quantization table */
    461     for(uc_j=0; uc_j<QUANT_TABLE_SIZE_BYTES; ++uc_j) {
    462         uc_qVal = (gQuantChroma[uc_j] * ui32Quality + 50) / 100;
    463         uc_qVal =  (uc_qVal>0xFF)? 0xFF:uc_qVal;
    464         uc_qVal =  (uc_qVal<1)? 1:uc_qVal;
    465         chroma_matrix[uc_j] = (unsigned char)uc_qVal;
    466     }
    467 
    468     return 0;
    469 }
    470 
    471 /*****************************************************************************/
    472 /*                                                                           */
    473 /* Function Name : fPutBitsToBuffer                                          */
    474 /*                                                                           */
    475 /* Description   : The function write a bit string into the stream           */
    476 /*                                                                           */
    477 /* Inputs        :                                                           */
    478 /* BitStream     : Pointer to the stream context                             */
    479 /* NoOfBits      : Size of the bit string                                    */
    480 /* ActualBits    : Bit string to be written                                  */
    481 /*                                                                           */
    482 /* Outputs       : On return the function has written the bit string into    */
    483 /*                 the stream                                                */
    484 /*                                                                           */
    485 /* Returns       : void                                                      */
    486 /*                                                                           */
    487 /* Revision History:                                                         */
    488 /*                                                                           */
    489 /* 14 12 2001 BG Creation                                                    */
    490 /*                                                                           */
    491 /*****************************************************************************/
    492 
    493 void fPutBitsToBuffer(STREAMTYPEW *BitStream, IMG_UINT8 NoOfBytes, IMG_UINT32 ActualBits)
    494 {
    495     IMG_UINT8 ui8Lp;
    496     IMG_UINT8 *pui8S;
    497 
    498     pui8S = (IMG_UINT8 *)BitStream->Buffer;
    499     pui8S += BitStream->Offset;
    500 
    501     for (ui8Lp = NoOfBytes; ui8Lp > 0; ui8Lp--)
    502         *(pui8S++) = ((IMG_UINT8 *) & ActualBits)[ui8Lp-1];
    503 
    504     BitStream->Offset += NoOfBytes;
    505 }
    506 
    507 
    508 
    509 /***********************************************************************************
    510  * Function Name      : AllocateCodedDataBuffers
    511  * Inputs             :
    512  * Outputs            :
    513  * Returns            : PVRRC
    514  * Description        : Allocates Device memory for coded buffers and build BUFFERINFO array
    515  ************************************************************************************/
    516 
    517 IMG_ERRORCODE AllocateCodedDataBuffers(TOPAZSC_JPEG_ENCODER_CONTEXT *pContext)
    518 {
    519     IMG_UINT8 ui8Loop;
    520 
    521     for (ui8Loop = 0 ; ui8Loop < pContext->sScan_Encode_Info.ui8NumberOfCodedBuffers; ui8Loop ++)
    522         if (pContext->sScan_Encode_Info.aBufferTable[ui8Loop].pMemInfo == NULL) {
    523             pContext->sScan_Encode_Info.aBufferTable[ui8Loop].ui32DataBufferSizeBytes = ((DATA_BUFFER_SIZE(pContext->sScan_Encode_Info.ui32NumberMCUsToEncodePerScan) + sizeof(BUFFER_HEADER)) + 3) & ~3;
    524             pContext->sScan_Encode_Info.aBufferTable[ui8Loop].ui32DataBufferUsedBytes = 0;
    525             pContext->sScan_Encode_Info.aBufferTable[ui8Loop].i8MTXNumber = 0; // Indicates buffer is idle
    526             pContext->sScan_Encode_Info.aBufferTable[ui8Loop].ui16ScanNumber = 0; // Indicates buffer is idle
    527             pContext->sScan_Encode_Info.aBufferTable[ui8Loop].pMemInfo =
    528                 (unsigned char *)pContext->jpeg_coded_buf.pMemInfo + PNW_JPEG_HEADER_MAX_SIZE + ui8Loop * pContext->ui32SizePerCodedBuffer;
    529 
    530         }
    531 
    532     return IMG_ERR_OK;
    533 }
    534 
    535 
    536 #if 0
    537 /***********************************************************************************
    538  * Function Name      : FreeCodedDataBuffers
    539  * Inputs             :
    540  * Outputs            :
    541  * Returns            : PVRRC
    542  * Description        : Loops through our coded data buffers and frees them
    543  ************************************************************************************/
    544 
    545 IMG_UINT32 FreeCodedDataBuffers(TOPAZSC_JPEG_ENCODER_CONTEXT *pContext)
    546 {
    547     IMG_UINT8 ui8Loop;
    548     ui8Loop = pContext->sScan_Encode_Info.ui8NumberOfCodedBuffers;
    549     /* Spin through and remove */
    550     while (ui8Loop--)
    551         if (pContext->sScan_Encode_Info.aBufferTable[ui8Loop].pMemInfo != NULL) {
    552             /*      MMFreeDeviceMemory( &(pContext->sScan_Encode_Info.aBufferTable[ui8Loop].pMemInfo));*/
    553             pContext->sScan_Encode_Info.aBufferTable[ui8Loop].pMemInfo = NULL;
    554         }
    555 
    556     return 0;
    557 }
    558 #endif
    559 
    560 
    561 
    562 void SetupMCUDetails(TOPAZSC_JPEG_ENCODER_CONTEXT *pContext,
    563                      const IMG_UINT32 uiComponentNumber ,
    564                      const IMG_UINT32 uiWidthBlocks ,
    565                      const IMG_UINT32 uiHeightBlocks,
    566                      const IMG_UINT32 uiLastRow,
    567                      const IMG_UINT32 uiLastCol)
    568 {
    569     MCUCOMPONENT* pMCUComp;
    570 
    571     if (uiComponentNumber >=  MTX_MAX_COMPONENTS)
    572         return;
    573 
    574     pMCUComp = &pContext->pMTXSetup->MCUComponent[uiComponentNumber];
    575 
    576     pMCUComp->ui32WidthBlocks = uiWidthBlocks * 8;
    577     pMCUComp->ui32HeightBlocks = uiHeightBlocks * 8;
    578 
    579     pMCUComp->ui32XLimit = uiLastCol;
    580     pMCUComp->ui32YLimit = uiLastRow;
    581 
    582     drv_debug_msg(VIDEO_DEBUG_GENERAL, "MCU Details %i : %ix%i  %i  %i\n", uiComponentNumber, uiWidthBlocks , uiHeightBlocks ,  uiLastCol , uiLastRow);
    583 
    584 }
    585 
    586 
    587 /*****************************************************************************/
    588 /*                                                                           */
    589 /* Function Name : InitializeJpegEncode                                      */
    590 /*                                                                           */
    591 /* Description   : The function initializes an instance of the JPEG encoder  */
    592 /* Inputs/Outputs: Pointer to the JPEG Host context                                                      */
    593 /*                 Pointer to a IMG_FRAME type which will be created to be filled        */
    594 /*                      with the source image data                                                                               */
    595 /*****************************************************************************/
    596 
    597 IMG_ERRORCODE InitializeJpegEncode(TOPAZSC_JPEG_ENCODER_CONTEXT * pContext, object_surface_p __maybe_unused pTFrame)
    598 {
    599     IMG_ERRORCODE rc = IMG_ERR_OK;
    600     IMG_UINT8  uc_i = 0;
    601     IMG_UINT16 ui16_height_min;
    602     IMG_UINT16 ui16_height_max;
    603     IMG_UINT16 ui16_width_min;
    604     IMG_UINT16 ui16_width_max;
    605     //IMG_UINT16 ui16_width;
    606     //IMG_UINT16 ui16_height;
    607     IMG_UINT32 uiBlockCount = 0;
    608     IMG_UINT16 ui16_comp_width, ui16_comp_height;
    609     IMG_UINT8  uc_h_scale_max = 0, uc_v_scale_max = 0, uc_h_scale = 0;
    610     IMG_UINT8  uc_v_scale;
    611     IMG_UINT16 ui16_height, ui16_width;
    612     context_ENC_p ctx = (context_ENC_p)pContext->ctx;
    613 
    614     /*************************************************************************/
    615     /* Determine the horizontal and the vertical scaling factor of each of   */
    616     /* the components of the image                                           */
    617     /*************************************************************************/
    618 
    619     /*FIXME: ONLY support NV12, YV12 here*/
    620     /*pTFrame->height isn't the real height of image, since vaCreateSurface
    621      * makes it aligned with 32*/
    622     ui16_height = pContext->ui32OutputHeight;
    623     ui16_width = pContext->ui32OutputWidth;
    624 
    625     switch (pContext->eFormat) {
    626     case IMG_CODEC_YV16: /*422 format*/
    627         ui16_height_min = ui16_height;
    628         ui16_height_max = ui16_height;
    629         ui16_width_min = ui16_width >> 1;
    630         ui16_width_max = ui16_width;
    631         break;
    632     case IMG_CODEC_NV12:
    633     case IMG_CODEC_IYUV:
    634     default:
    635         ui16_height_min = ui16_height >> 1;
    636         ui16_height_max = ui16_height;
    637         ui16_width_min = ui16_width >> 1;
    638         ui16_width_max = ui16_width;
    639         break;
    640     }
    641     /*ui16_height_min = ui16_width_min  = 65535;
    642     ui16_height_max = ui16_width_max  = 0;
    643 
    644     for(uc_i = 0; uc_i < pContext->pMTXSetup->ui32ComponentsInScan; uc_i++)
    645     {
    646     ui16_width  = pTFrame->Width;
    647     if(ui16_width_min > ui16_width)
    648     ui16_width_min  = ui16_width;
    649     if(ui16_width_max < ui16_width)
    650     ui16_width_max  = ui16_width;
    651 
    652     ui16_height = pTFrame->Height;
    653     if(ui16_height_min > ui16_height)
    654     ui16_height_min = ui16_height;
    655     if(ui16_height_max < ui16_height)
    656     ui16_height_max = ui16_height;
    657     }
    658     */
    659     /*********************************************************************/
    660     /* Determine the horizonal and the vertical sampling frequency of    */
    661     /* each of components in the image                                   */
    662     /*********************************************************************/
    663 
    664     uc_h_scale_max = (ui16_width_max + ui16_width_min - 1) /
    665                      ui16_width_min;
    666     uc_v_scale_max = (ui16_height_max + ui16_height_min - 1) /
    667                      ui16_height_min;
    668 
    669     for (uc_i = 0; uc_i < pContext->pMTXSetup->ui32ComponentsInScan; uc_i++) {
    670 
    671         /*      ui16_comp_width  = pTFrame->aui32ComponentInfo[uc_i].ui32Width;
    672                 ui16_comp_height = pTFrame->aui32ComponentInfo[uc_i].ui32Height;*/
    673         /*Support NV12, YV12, YV16 here. uc_h/v_scale should be
    674          * 2x2(Y) or 1x1(U/V)*/
    675         if (0 == uc_i) {
    676             ui16_comp_width  = ui16_width;
    677             ui16_comp_height = ui16_height;
    678         } else {
    679             switch (pContext->eFormat) {
    680             case IMG_CODEC_YV16: /*422 format*/
    681                 ui16_comp_width  = ui16_width >> 1;
    682                 ui16_comp_height = ui16_height;
    683                 break;
    684             case IMG_CODEC_NV12:
    685             case IMG_CODEC_IYUV:
    686             default:
    687                 ui16_comp_width  = ui16_width >> 1;
    688                 ui16_comp_height = ui16_height >> 1;
    689             }
    690         }
    691 
    692         uc_h_scale       = (ui16_comp_width *  uc_h_scale_max) /
    693                            ui16_width_max;
    694         uc_v_scale       = (ui16_comp_height * uc_v_scale_max) /
    695                            ui16_height_max;
    696 
    697         uiBlockCount += (uc_h_scale * uc_v_scale);
    698 
    699         switch (ISCHROMAINTERLEAVED(pContext->eFormat)) {
    700         case C_INTERLEAVE:
    701             // Chroma format is byte interleaved, as the engine runs using planar colour surfaces we need
    702             // to fool the engine into offsetting by 16 instead of 8
    703             if (uc_i > 0) { // if chroma, then double values
    704                 uc_h_scale <<= 1;
    705                 ui16_comp_width <<= 1;
    706             }
    707             break;
    708         case LC_UVINTERLEAVE:
    709             //Y0UY1V_8888 or Y0VY1U_8888 format
    710             ui16_comp_width <<= 1;
    711             break;
    712         case LC_VUINTERLEAVE:
    713             //Y0UY1V_8888 or Y0VY1U_8888 format
    714             ui16_comp_width <<= 1;
    715             break;
    716         default:
    717             break;
    718         }
    719 
    720         SetupMCUDetails(pContext, uc_i , uc_h_scale, uc_v_scale, ui16_comp_height, ui16_comp_width);
    721 
    722         if (uiBlockCount > BLOCKCOUNTMAXPERCOLOURPLANE) {
    723             return IMG_ERR_INVALID_SIZE;
    724         }
    725 
    726     }
    727 
    728     return rc;
    729 }
    730 
    731 
    732 /***********************************************************************************
    733   Function Name      : JPGEncodeBegin
    734 Inputs             : hInstance,psJpegInfo,ui32Quality
    735 Outputs            :
    736 Returns            : PVRRC
    737 Description        : Marks the begining of a JPEG encode and sets up encoder
    738  ************************************************************************************/
    739 
    740 /*IMG_ERRORCODE JPGEncodeBegin(TOPAZSC_JPEG_ENCODER_CONTEXT *pContext, IMG_FRAME *pTFrame)
    741 {
    742     IMG_UINT32 ReturnCode = 0;
    743     ReturnCode = InitializeJpegEncode(pContext, pTFrame);
    744 
    745     return ReturnCode;
    746 } */
    747 
    748 #if 0
    749 /*****************************************************************************/
    750 /*                                                                           */
    751 /* Function Name : EncodeMarkerSegment                                       */
    752 /*                                                                           */
    753 /* Description   : Writes the marker segment of a JPEG stream according to   */
    754 /*                 the syntax mentioned in section B.2.4 of                  */
    755 /*                 ISO/IEC 10918-1:1994E                                     */
    756 /*                                                                           */
    757 /* Inputs        : Pointer to the JPEG Context and coded output buffer       */
    758 /*                                                                           */
    759 /* Processing    : Writes each of the following into the marker segment of   */
    760 /*                 the JPEG stream                                           */
    761 /*                 - luminance and chrominance quantization tables           */
    762 /*                 - huffman tables used for encoding the luminance and      */
    763 /*                   chrominance AC coefficients                             */
    764 /*                 - huffman tables used for encoding the luminance and      */
    765 /*                   chorimance  DC coefficient differences                  */
    766 /*                                                                           */
    767 /*                                                                           */
    768 /*****************************************************************************/
    769 IMG_UINT32 Legacy_EncodeMarkerSegment(LEGACY_JPEG_ENCODER_CONTEXT *pContext,
    770                                       IMG_UINT8 *puc_stream_buff)
    771 {
    772     STREAMTYPEW s_streamW;
    773     IMG_UINT8 uc_i;
    774 
    775     s_streamW.Offset = 0;
    776     s_streamW.Buffer = puc_stream_buff;
    777 
    778     /* Writing the start of image marker */
    779     fPutBitsToBuffer(&s_streamW, 2, START_OF_IMAGE);
    780 
    781     /* Writing the quantization table for luminance into the stream */
    782     fPutBitsToBuffer(&s_streamW, 2, DQT_MARKER);
    783 
    784     fPutBitsToBuffer(&s_streamW, 3, LQPQ << 4); // 20 bits = LQPQ, 4 bits = 0 (Destination identifier for the luminance quantizer tables)
    785 
    786     for (uc_i = 0; uc_i < PELS_IN_BLOCK; uc_i++) {
    787         fPutBitsToBuffer(&s_streamW, 1, pContext->pvLowLevelEncContext->Qmatrix[0][gZigZag[uc_i]]);
    788     }
    789 
    790     /* Writing the quantization table for chrominance into the stream */
    791     fPutBitsToBuffer(&s_streamW, 2, DQT_MARKER);
    792 
    793     fPutBitsToBuffer(&s_streamW, 3, (LQPQ << 4) | 1); // 20 bits = LQPQ, 4 bits = 1 (Destination identifier for the chrominance quantizer tables)
    794 
    795     for (uc_i = 0; uc_i < PELS_IN_BLOCK; uc_i++) {
    796         fPutBitsToBuffer(&s_streamW, 1, pContext->pvLowLevelEncContext->Qmatrix[1][gZigZag[uc_i]]);
    797     }
    798 
    799     /* Writing the huffman tables for luminance dc coeffs */
    800     /* Write the DHT Marker */
    801     fPutBitsToBuffer(&s_streamW, 2, DHT_MARKER);
    802     fPutBitsToBuffer(&s_streamW, 2, LH_DC);
    803     for (uc_i = 0; uc_i < LH_DC - 2; uc_i++) {
    804         fPutBitsToBuffer(&s_streamW, 1, gMarkerDataLumaDc[uc_i]);
    805     }
    806     /* Writing the huffman tables for luminance ac coeffs */
    807     /* Write the DHT Marker */
    808     fPutBitsToBuffer(&s_streamW, 2, DHT_MARKER);
    809     fPutBitsToBuffer(&s_streamW, 2, LH_AC);
    810     for (uc_i = 0; uc_i < LH_AC - 2; uc_i++) {
    811         fPutBitsToBuffer(&s_streamW, 1, gMarkerDataLumaAc[uc_i]);
    812     }
    813     /* Writing the huffman tables for chrominance dc coeffs */
    814     fPutBitsToBuffer(&s_streamW, 2, DHT_MARKER);
    815     fPutBitsToBuffer(&s_streamW, 2, LH_DC);
    816     for (uc_i = 0; uc_i < LH_DC - 2; uc_i++) {
    817         fPutBitsToBuffer(&s_streamW, 1, gMarkerDataChromaDc[uc_i]);
    818     }
    819     /* Writing the huffman tables for luminance ac coeffs */
    820     /* Write the DHT Marker */
    821     fPutBitsToBuffer(&s_streamW, 2, DHT_MARKER);
    822     fPutBitsToBuffer(&s_streamW, 2, LH_AC);
    823     for (uc_i = 0; uc_i < LH_AC - 2; uc_i++) {
    824         fPutBitsToBuffer(&s_streamW, 1, gMarkerDataChromaAc[uc_i]);
    825     }
    826 
    827 
    828     return s_streamW.Offset;
    829 }
    830 #endif
    831 
    832 /*****************************************************************************/
    833 /*                                                                           */
    834 /* Function Name : EncodeMarkerSegment                                       */
    835 /*                                                                           */
    836 /* Description   : Writes the marker segment of a JPEG stream according to   */
    837 /*                 the syntax mentioned in section B.2.4 of                  */
    838 /*                 ISO/IEC 10918-1:1994E                                     */
    839 /*                                                                           */
    840 /* Inputs        : Pointer to the JPEG Context and coded output buffer       */
    841 /*                                                                           */
    842 /* Processing    : Writes each of the following into the marker segment of   */
    843 /*                 the JPEG stream                                           */
    844 /*                 - luminance and chrominance quantization tables           */
    845 /*                 - huffman tables used for encoding the luminance and      */
    846 /*                   chrominance AC coefficients                             */
    847 /*                 - huffman tables used for encoding the luminance and      */
    848 /*                   chorimance  DC coefficient differences                  */
    849 /*                                                                           */
    850 /*****************************************************************************/
    851 
    852 IMG_UINT32 EncodeMarkerSegment(TOPAZSC_JPEG_ENCODER_CONTEXT *pContext,
    853                                IMG_UINT8 *puc_stream_buff, IMG_BOOL bIncludeHuffmanTables)
    854 {
    855     STREAMTYPEW s_streamW;
    856     IMG_UINT8 uc_i;
    857 
    858     s_streamW.Offset = 0;
    859     s_streamW.Buffer = puc_stream_buff;
    860 
    861     /* Writing the start of image marker */
    862     fPutBitsToBuffer(&s_streamW, 2, START_OF_IMAGE);
    863 
    864     /* Writing the quantization table for luminance into the stream */
    865     fPutBitsToBuffer(&s_streamW, 2, DQT_MARKER);
    866 
    867     fPutBitsToBuffer(&s_streamW, 3, LQPQ << 4); // 20 bits = LQPQ, 4 bits = 0 (Destination identifier for the luminance quantizer tables)
    868 
    869     IMG_ASSERT(PELS_IN_BLOCK <= QUANT_TABLE_SIZE_BYTES);
    870     for (uc_i = 0; uc_i < PELS_IN_BLOCK; uc_i++) {
    871         // Write zigzag ordered luma quantization values to our JPEG header
    872         fPutBitsToBuffer(&s_streamW, 1, pContext->psTablesBlock->aui8LumaQuantParams[gZigZag[uc_i]]);
    873     }
    874 
    875     /* Writing the quantization table for chrominance into the stream */
    876     fPutBitsToBuffer(&s_streamW, 2, DQT_MARKER);
    877 
    878     fPutBitsToBuffer(&s_streamW, 3, (LQPQ << 4) | 1); // 20 bits = LQPQ, 4 bits = 1 (Destination identifier for the chrominance quantizer tables)
    879 
    880     for (uc_i = 0; uc_i < PELS_IN_BLOCK; uc_i++) {
    881         // Write zigzag ordered chroma quantization values to our JPEG header
    882         fPutBitsToBuffer(&s_streamW, 1, pContext->psTablesBlock->aui8ChromaQuantParams[gZigZag[uc_i]]);
    883     }
    884 
    885     if (bIncludeHuffmanTables) {
    886         /* Writing the huffman tables for luminance dc coeffs */
    887         /* Write the DHT Marker */
    888         fPutBitsToBuffer(&s_streamW, 2, DHT_MARKER);
    889         fPutBitsToBuffer(&s_streamW, 2, LH_DC);
    890         for (uc_i = 0; uc_i < LH_DC - 2; uc_i++) {
    891             fPutBitsToBuffer(&s_streamW, 1, gMarkerDataLumaDc[uc_i]);
    892         }
    893         /* Writing the huffman tables for luminance ac coeffs */
    894         /* Write the DHT Marker */
    895         fPutBitsToBuffer(&s_streamW, 2, DHT_MARKER);
    896         fPutBitsToBuffer(&s_streamW, 2, LH_AC);
    897         for (uc_i = 0; uc_i < LH_AC - 2; uc_i++) {
    898             fPutBitsToBuffer(&s_streamW, 1, gMarkerDataLumaAc[uc_i]);
    899         }
    900         /* Writing the huffman tables for chrominance dc coeffs */
    901         fPutBitsToBuffer(&s_streamW, 2, DHT_MARKER);
    902         fPutBitsToBuffer(&s_streamW, 2, LH_DC);
    903         for (uc_i = 0; uc_i < LH_DC - 2; uc_i++) {
    904             fPutBitsToBuffer(&s_streamW, 1, gMarkerDataChromaDc[uc_i]);
    905         }
    906         /* Writing the huffman tables for luminance ac coeffs */
    907         /* Write the DHT Marker */
    908         fPutBitsToBuffer(&s_streamW, 2, DHT_MARKER);
    909         fPutBitsToBuffer(&s_streamW, 2, LH_AC);
    910         for (uc_i = 0; uc_i < LH_AC - 2; uc_i++) {
    911             fPutBitsToBuffer(&s_streamW, 1, gMarkerDataChromaAc[uc_i]);
    912         }
    913     }
    914 
    915     // Activate Restart markers
    916     if (pContext->sScan_Encode_Info.ui16CScan > 1) {
    917         // Only use restart intervals if we need them (ie. multiple Scan encode and/or parallel CB encode)
    918         fPutBitsToBuffer(&s_streamW, 2, 0xFFDD); //Marker header
    919         fPutBitsToBuffer(&s_streamW, 2, 4); // Byte size of marker (header not included)
    920         fPutBitsToBuffer(&s_streamW, 2, pContext->sScan_Encode_Info.ui32NumberMCUsToEncodePerScan); // Restart Interval (same as MCUs per buffer)
    921     }
    922 
    923     return s_streamW.Offset;
    924 }
    925 
    926 #if 0
    927 /***********************************************************************************
    928   Function Name      : JPGEncodeMarker
    929 Inputs             :    Pointer to JPEG Encoder context
    930 Pointer to coded buffer stream
    931 Pointer to pui32BytesWritten value
    932 Outputs            : ui8BitStreamBuffer,pui32BytesWritten
    933 Description        : Writes a JPEG marker segment to the bit stream
    934  ************************************************************************************/
    935 
    936 IMG_UINT32 Legacy_JPGEncodeMarker(/*in */               LEGACY_JPEG_ENCODER_CONTEXT *pContext ,
    937         /*in */         IMG_UINT8* pui8BitStreamBuffer ,
    938         /*out*/         IMG_UINT32 *pui32BytesWritten)
    939 {
    940 #ifdef JPEG_VERBOSE
    941     printf("PVRJPGEncodeMarker");
    942 #endif
    943 
    944     if (pContext->eCurrentActive != LEGACY_JPEG_API_CURRENT_ACTIVE_ENCODE) {
    945         /* Cannot be called outside begin and end*/
    946         return 2;
    947     }
    948 
    949     *pui32BytesWritten += Legacy_EncodeMarkerSegment(pContext, pui8BitStreamBuffer);
    950 
    951     return 0;
    952 }
    953 #endif
    954 
    955 /***********************************************************************************
    956   Function Name      : JPGEncodeMarker
    957 Inputs             :    Pointer to JPEG Encoder context
    958 Pointer to coded buffer stream
    959 Pointer to Byteswritten value
    960 bIncludeHuffmanTables - Set to true to include the huffman tables in the stream
    961 Outputs            : ui8BitStreamBuffer,pui32BytesWritten
    962 Description        : Writes a JPEG marker segment to the bit stream
    963  ************************************************************************************/
    964 
    965 IMG_UINT32 JPGEncodeMarker(/*in */              TOPAZSC_JPEG_ENCODER_CONTEXT *pContext ,
    966         /*in */         IMG_UINT8* pui8BitStreamBuffer ,
    967         /*out*/         IMG_UINT32 *pui32BytesWritten, IMG_BOOL bIncludeHuffmanTables)
    968 {
    969 #ifdef JPEG_VERBOSE
    970     printf("PVRJPGEncodeMarker");
    971 #endif
    972 
    973 
    974     *pui32BytesWritten += EncodeMarkerSegment(pContext, pui8BitStreamBuffer + *pui32BytesWritten, bIncludeHuffmanTables);
    975 
    976     return 0;
    977 }
    978 
    979 #if 0
    980 /*****************************************************************************/
    981 /*                                                                           */
    982 /* Function Name : EncodeFrameHeader                                         */
    983 /*                                                                           */
    984 /* Description   : Writes the frame header of a JPEG stream according to     */
    985 /*                 the syntax mentioned in section B.2.2 of                  */
    986 /*                 ISO/IEC 10918-1:1994E .                                   */
    987 /*                                                                           */
    988 /* Inputs        :                                                           */
    989 /* ps_jpeg_params: Ptr to the JPEG encoder parameter context                 */
    990 /* ps_jpeg_comp  : Ptr to the JPEG image component context                   */
    991 /* puc_stream_buff:Ptr to the bistream buffer from where to start writing    */
    992 /*                                                                           */
    993 /* Processing    : Writes each of the following into the frame header of     */
    994 /*                 the JPEG stream                                           */
    995 /*                 - JPEG image component identifier                         */
    996 /*                 - Horizontal and vertical sampling factor                 */
    997 /*                 - Quantization table identifier for each of the components*/
    998 /*                                                                           */
    999 /* Returns       : Number of bytes written into the stream                   */
   1000 /*                                                                           */
   1001 /*****************************************************************************/
   1002 
   1003 IMG_UINT32 Legacy_EncodeFrameHeader(LEGACY_JPEGENC_ITTIAM_PARAMS *ps_jpeg_params,
   1004                                     LEGACY_JPEGENC_ITTIAM_COMPONENT *ps_jpeg_comp,
   1005                                     IMG_UINT8 *puc_stream_buff)
   1006 {
   1007     STREAMTYPEW ps_streamW;
   1008     IMG_UINT16 ui16_i;
   1009     IMG_UINT8  uc_num_comp_in_img;
   1010 
   1011     uc_num_comp_in_img = ps_jpeg_comp->uc_num_comp_in_img;
   1012 
   1013     ps_streamW.Offset = 0;
   1014     ps_streamW.Buffer = puc_stream_buff;
   1015 
   1016 
   1017     if (ps_jpeg_params->uc_isAbbreviated != 0)
   1018         fPutBitsToBuffer(&ps_streamW, 2, START_OF_IMAGE);
   1019 
   1020     /* Writing the frame header */
   1021     fPutBitsToBuffer(&ps_streamW, 2, SOF_BASELINE_DCT);
   1022     /* Frame header length */
   1023     fPutBitsToBuffer(&ps_streamW, 2, 8 + 3 * uc_num_comp_in_img);
   1024     /* Precision */
   1025     fPutBitsToBuffer(&ps_streamW, 1, 8);
   1026     /* Height : sample lines */
   1027     fPutBitsToBuffer(&ps_streamW, 2, ps_jpeg_params->ui16_height);
   1028     /* Width : samples per line */
   1029     fPutBitsToBuffer(&ps_streamW, 2, ps_jpeg_params->ui16_width);
   1030     /* Number of image components */
   1031     fPutBitsToBuffer(&ps_streamW, 1, uc_num_comp_in_img);
   1032 
   1033     if (uc_num_comp_in_img > MAX_COMP_IN_SCAN)
   1034         uc_num_comp_in_img = MAX_COMP_IN_SCAN;
   1035     for (ui16_i = 0; ui16_i < uc_num_comp_in_img; ui16_i++) {
   1036         /* Component identifier */
   1037         fPutBitsToBuffer(&ps_streamW, 1, ps_jpeg_comp->puc_comp_id[ui16_i]);
   1038 
   1039         /* 4 bit Horizontal and 4 bit vertical sampling factors */
   1040         fPutBitsToBuffer(&ps_streamW, 1, (ps_jpeg_comp->puc_horiz_scale[ui16_i] << 4) | ps_jpeg_comp->puc_vert_scale[ui16_i]);
   1041 
   1042         /* Quantization table destination selector */
   1043         fPutBitsToBuffer(&ps_streamW, 1, ps_jpeg_comp->puc_q_table_id[ui16_i]);
   1044 
   1045         ps_jpeg_comp->CompIdtoIndex[ ps_jpeg_comp->puc_comp_id[ui16_i] ] = (IMG_UINT8) ui16_i;
   1046     }
   1047 
   1048     //Use if you want start of scan (image data) to align to 32
   1049     //fPutBitsToBuffer(&ps_streamW, 1, 0xFF);
   1050 
   1051     return ps_streamW.Offset;
   1052 }
   1053 #endif
   1054 
   1055 /*****************************************************************************/
   1056 /*                                                                           */
   1057 /* Function Name : EncodeFrameHeader                                         */
   1058 /*                                                                           */
   1059 /* Description   : Writes the frame header of a JPEG stream according to     */
   1060 /*                 the syntax mentioned in section B.2.2 of                  */
   1061 /*                 ISO/IEC 10918-1:1994E .                                   */
   1062 /*                                                                           */
   1063 /* Inputs        :                                                           */
   1064 /*                                      pContext                        - Ptr to the JPEG encoder context        */
   1065 /*                                      puc_stream_buff         - Ptr to the bistream buffer from        */
   1066 /*                                                                                      where to start writing                   */
   1067 /*                                                                           */
   1068 /* Processing    : Writes each of the following into the frame header of     */
   1069 /*                 the JPEG stream                                           */
   1070 /*                 - JPEG image component identifier                         */
   1071 /*                 - Horizontal and vertical sampling factor                 */
   1072 /*                 - Quantization table identifier for each of the components*/
   1073 /*                                                                           */
   1074 /* Returns       : Number of bytes written into the stream                   */
   1075 /*                                                                           */
   1076 /*****************************************************************************/
   1077 
   1078 IMG_UINT32 EncodeFrameHeader(TOPAZSC_JPEG_ENCODER_CONTEXT *pContext,
   1079                              IMG_UINT8 *puc_stream_buff)
   1080 {
   1081     STREAMTYPEW ps_streamW;
   1082     IMG_UINT8  uc_num_comp_in_img;
   1083 
   1084     uc_num_comp_in_img = pContext->pMTXSetup->ui32ComponentsInScan;
   1085 
   1086     ps_streamW.Offset = 0;
   1087     ps_streamW.Buffer = puc_stream_buff;
   1088 
   1089 
   1090     //if(ps_jpeg_params->uc_isAbbreviated != 0)
   1091     //   fPutBitsToBuffer(&ps_streamW, 2, START_OF_IMAGE);
   1092 
   1093     /* Writing the frame header */
   1094     fPutBitsToBuffer(&ps_streamW, 2, SOF_BASELINE_DCT);
   1095     /* Frame header length */
   1096     fPutBitsToBuffer(&ps_streamW, 2, 8 + 3 * uc_num_comp_in_img);
   1097     /* Precision */
   1098     fPutBitsToBuffer(&ps_streamW, 1, 8);
   1099     /* Height : sample lines */
   1100     fPutBitsToBuffer(&ps_streamW, 2, pContext->ui32OutputHeight);
   1101     /* Width : samples per line */
   1102     fPutBitsToBuffer(&ps_streamW, 2, pContext->ui32OutputWidth);
   1103     /* Number of image components */
   1104     fPutBitsToBuffer(&ps_streamW, 1, uc_num_comp_in_img);
   1105 
   1106     //Luma Details
   1107     /* Component identifier */
   1108     fPutBitsToBuffer(&ps_streamW, 1, 1); //CompId 0 = 1, 1 = 2, 2 = 3
   1109     fPutBitsToBuffer(&ps_streamW, 1, ((pContext->pMTXSetup->MCUComponent[0].ui32WidthBlocks >> 3) << 4) | (pContext->pMTXSetup->MCUComponent[0].ui32HeightBlocks >> 3));
   1110     fPutBitsToBuffer(&ps_streamW, 1, 0); // 0 = Luma(0), 1,2 = Chroma(1)
   1111 
   1112     //Chroma Details
   1113     if (pContext->pMTXSetup->ui32DataInterleaveStatus < C_INTERLEAVE) { //Chroma planar
   1114         fPutBitsToBuffer(&ps_streamW, 1, 2); //CompId 0 = 1, 1 = 2, 2 = 3
   1115         /* 4 bit Horizontal and 4 bit vertical sampling factors */
   1116         fPutBitsToBuffer(&ps_streamW, 1, ((pContext->pMTXSetup->MCUComponent[1].ui32WidthBlocks >> 3) << 4) | (pContext->pMTXSetup->MCUComponent[1].ui32HeightBlocks >> 3));
   1117         fPutBitsToBuffer(&ps_streamW, 1, 1); // 0 = Luma(0), 1,2 = Chroma(1)
   1118         fPutBitsToBuffer(&ps_streamW, 1, 3); //CompId 0 = 1, 1 = 2, 2 = 3
   1119         /* 4 bit Horizontal and 4 bit vertical sampling factors */
   1120         fPutBitsToBuffer(&ps_streamW, 1, ((pContext->pMTXSetup->MCUComponent[2].ui32WidthBlocks >> 3) << 4) | (pContext->pMTXSetup->MCUComponent[2].ui32HeightBlocks >> 3));
   1121         fPutBitsToBuffer(&ps_streamW, 1, 1); // 0 = Luma(0), 1,2 = Chroma(1)
   1122     } else if (pContext->pMTXSetup->ui32DataInterleaveStatus == C_INTERLEAVE) { // Chroma Interleaved
   1123         fPutBitsToBuffer(&ps_streamW, 1, 2); //CompId 0 = 1, 1 = 2, 2 = 3
   1124         /* 4 bit Horizontal and 4 bit vertical sampling factors */
   1125         fPutBitsToBuffer(&ps_streamW, 1, ((pContext->pMTXSetup->MCUComponent[1].ui32WidthBlocks >> 3) << 3) | (pContext->pMTXSetup->MCUComponent[1].ui32HeightBlocks >> 3));
   1126         fPutBitsToBuffer(&ps_streamW, 1, 1); // 0 = Luma(0), 1,2 = Chroma(1)
   1127         fPutBitsToBuffer(&ps_streamW, 1, 3); //CompId 0 = 1, 1 = 2, 2 = 3
   1128         /* 4 bit Horizontal and 4 bit vertical sampling factors */
   1129         fPutBitsToBuffer(&ps_streamW, 1, ((pContext->pMTXSetup->MCUComponent[2].ui32WidthBlocks >> 3) << 3) | (pContext->pMTXSetup->MCUComponent[2].ui32HeightBlocks >> 3));
   1130         fPutBitsToBuffer(&ps_streamW, 1, 1); // 0 = Luma(0), 1,2 = Chroma(1)
   1131     } else { //Chroma YUYV - Special case
   1132         fPutBitsToBuffer(&ps_streamW, 1, 2); //CompId 0 = 1, 1 = 2, 2 = 3
   1133         /* 4 bit Horizontal and 4 bit vertical sampling factors */
   1134         fPutBitsToBuffer(&ps_streamW, 1, ((pContext->pMTXSetup->MCUComponent[1].ui32WidthBlocks >> 3) << 4) | (pContext->pMTXSetup->MCUComponent[1].ui32HeightBlocks >> 3));
   1135         fPutBitsToBuffer(&ps_streamW, 1, 1); // 0 = Luma(0), 1,2 = Chroma(1)
   1136         fPutBitsToBuffer(&ps_streamW, 1, 3); //CompId 0 = 1, 1 = 2, 2 = 3
   1137         /* 4 bit Horizontal and 4 bit vertical sampling factors */
   1138         fPutBitsToBuffer(&ps_streamW, 1, ((pContext->pMTXSetup->MCUComponent[2].ui32WidthBlocks >> 3) << 4) | (pContext->pMTXSetup->MCUComponent[2].ui32HeightBlocks >> 3));
   1139         fPutBitsToBuffer(&ps_streamW, 1, 1); // 0 = Luma(0), 1,2 = Chroma(1)
   1140     }
   1141 
   1142 
   1143     //Use if you want start of scan (image data) to align to 32
   1144     //fPutBitsToBuffer(&ps_streamW, 1, 0xFF);
   1145 
   1146     return ps_streamW.Offset;
   1147 }
   1148 
   1149 #if 0
   1150 /***********************************************************************************
   1151   Function Name      : JPGEncodeHeader
   1152 Inputs             : Pointer to JPEG Context
   1153 Outputs            : ui8BitStreamBuffer,pui32BytesWritten
   1154 Returns            : PVRRC
   1155 Description        : Writes a frame header to the bit stream
   1156 Max written 21 bytes
   1157  ************************************************************************************/
   1158 
   1159 IMG_UINT32 Legacy_JPGEncodeHeader(/*in */               LEGACY_JPEG_ENCODER_CONTEXT *pContext,
   1160         /*out */        IMG_UINT8*              pui8BitStreamBuffer ,
   1161         /*out*/         IMG_UINT32*             pui32BytesWritten)
   1162 {
   1163 #ifdef JPEG_VERBOSE
   1164     printf("PVRJPGEncodeHeader");
   1165 #endif
   1166 
   1167     if (pContext->eCurrentActive != LEGACY_JPEG_API_CURRENT_ACTIVE_ENCODE) {
   1168         /* Cannot be called outside begin and end*/
   1169         return 2;
   1170     }
   1171 
   1172     *pui32BytesWritten += Legacy_EncodeFrameHeader(&pContext->JPEGEncoderParams,
   1173                           &pContext->sJPEGEncoderComp,
   1174                           pui8BitStreamBuffer + *pui32BytesWritten);
   1175     return 0;
   1176 }
   1177 #endif
   1178 
   1179 /***********************************************************************************
   1180   Function Name      : JPGEncodeHeader
   1181 Inputs             : Pointer to JPEG context
   1182 Outputs            : ui8BitStreamBuffer,pui32BytesWritten
   1183 Description        : Writes a frame header to the bit stream
   1184 Max written 21 bytes
   1185  ************************************************************************************/
   1186 
   1187 IMG_UINT32 JPGEncodeHeader(/*in */              TOPAZSC_JPEG_ENCODER_CONTEXT *pContext,
   1188         /*out */        IMG_UINT8*              pui8BitStreamBuffer ,
   1189         /*out*/         IMG_UINT32*             pui32BytesWritten)
   1190 {
   1191 #ifdef JPEG_VERBOSE
   1192     printf("JPGEncodeHeader");
   1193 #endif
   1194 
   1195     *pui32BytesWritten += EncodeFrameHeader(pContext, pui8BitStreamBuffer + *pui32BytesWritten);
   1196 
   1197     return 0;
   1198 }
   1199 
   1200 
   1201 /***********************************************************************************
   1202  * Function Name      : SetupIssueSetup
   1203  * Inputs             :
   1204  pContext - Pointer to JPEG context
   1205  ui32ComponentsInScan - Number of components to be encoded in a scan
   1206  aui8Planes - Array of 3 bytes indexing YUV colour planes
   1207  pTFrame - Pointer to source data
   1208  ui32TableA, ui32TableB - Quantization table index values
   1209  * Outputs            :
   1210  * Returns            : PVRRC
   1211  * Description        : Issues the Setup structure to MTX
   1212  ************************************************************************************/
   1213 
   1214 IMG_UINT32 SetupIssueSetup(TOPAZSC_JPEG_ENCODER_CONTEXT *pContext, const IMG_UINT32 ui32ComponentsInScan, IMG_UINT8 __maybe_unused * aui8Planes,  object_surface_p pTFrame, const IMG_UINT32 ui32TableA , const IMG_UINT32 __maybe_unused ui32TableB)
   1215 {
   1216     IMG_UINT32 ReturnCode = 0;
   1217     IMG_INT32 i32Lp;
   1218     //COMPONENTPLANE* pSrcPlane;
   1219     IMG_UINT32 srf_buf_offset;
   1220     context_ENC_p ctx = (context_ENC_p)pContext->ctx;
   1221     pnw_cmdbuf_p cmdbuf = ctx->obj_context->pnw_cmdbuf;
   1222     /*TOPAZSC_JPEG_ENCODER_CONTEXT *pContext = pEncContext->psJpegHC;*/
   1223 
   1224 #ifdef JPEG_VERBOSE
   1225     printf("\nSetupIssueSetup");
   1226 #endif
   1227 
   1228     pContext->pMTXSetup->ui32ComponentsInScan = ui32ComponentsInScan;
   1229     pContext->pMTXSetup->ui32DataInterleaveStatus = ISCHROMAINTERLEAVED(pContext->eFormat);
   1230     pContext->pMTXSetup->ui32TableA = ui32TableA;
   1231 
   1232     /*MMUpdateDeviceMemory( pContext->pMemInfoMTXSetup )*/;
   1233     // we want to process the handles that have been placed into the buffer
   1234     /*for(n=0;n<pContext->pMTXSetup->ui32ComponentsInScan;n++)
   1235     {
   1236     pSrcPlane = &pContext->pMTXSetup->ComponentPlane[n];
   1237     TIMER_START(hardwareduration,"");
   1238     MMDeviceMemWriteDeviceMemRef(pContext->pMemInfoMTXSetup->iu32MemoryRegionID, pContext->pMemInfoMTXSetup->hShadowMem, (IMG_UINT32)   ((IMG_BYTE*)&pSrcPlane->ui32PhysAddr - (IMG_BYTE*)pContext->pMTXSetup),TAL_NULL_MANGLER_ID,(IMG_HANDLE) pTFrame->psBuffer->pMemInfo->hShadowMem, pTFrame->aui32ComponentOffset[aui8Planes[n]]);
   1239     TIMER_END("HW - MMDeviceMemWriteDeviceMemRef in SetupIssueSetup (hostjpeg.c)");
   1240     }*/
   1241     /*Support PL12/NV12, YV12/IYUV, YV16*/
   1242     srf_buf_offset = pTFrame->psb_surface->buf.buffer_ofs;
   1243     RELOC_PIC_PARAMS_PNW(&pContext->pMTXSetup->ComponentPlane[0].ui32PhysAddr, srf_buf_offset , &pTFrame->psb_surface->buf);
   1244     switch (pContext->eFormat) {
   1245     case IMG_CODEC_IYUV:
   1246     case IMG_CODEC_PL8:
   1247         RELOC_PIC_PARAMS_PNW(&pContext->pMTXSetup->ComponentPlane[1].ui32PhysAddr,
   1248                              srf_buf_offset + pTFrame->psb_surface->stride * pTFrame->height,
   1249                              &pTFrame->psb_surface->buf);
   1250         RELOC_PIC_PARAMS_PNW(&pContext->pMTXSetup->ComponentPlane[2].ui32PhysAddr,
   1251                              srf_buf_offset + pTFrame->psb_surface->stride * pTFrame->height
   1252                              + (pTFrame->psb_surface->stride / 2) *(pTFrame->height / 2),
   1253                              &pTFrame->psb_surface->buf);
   1254         break;
   1255     case IMG_CODEC_IMC2:
   1256     case IMG_CODEC_PL12:
   1257     case IMG_CODEC_NV12:
   1258         RELOC_PIC_PARAMS_PNW(&pContext->pMTXSetup->ComponentPlane[1].ui32PhysAddr,
   1259                              srf_buf_offset + pTFrame->psb_surface->stride * pTFrame->height,
   1260                              &pTFrame->psb_surface->buf);
   1261         //Byte interleaved surface, so need to force chroma to use single surface by fooling it into
   1262         //thinking it's dealing with standard 8x8 planaerblocks
   1263         RELOC_PIC_PARAMS_PNW(&pContext->pMTXSetup->ComponentPlane[2].ui32PhysAddr,
   1264                              srf_buf_offset + pTFrame->psb_surface->stride * pTFrame->height
   1265                              + 8,
   1266                              &pTFrame->psb_surface->buf);
   1267         break;
   1268     case IMG_CODEC_YV16:
   1269         /*V*/
   1270         RELOC_PIC_PARAMS_PNW(&pContext->pMTXSetup->ComponentPlane[2].ui32PhysAddr,
   1271                              srf_buf_offset + pTFrame->psb_surface->stride * pTFrame->height,
   1272                              &pTFrame->psb_surface->buf);
   1273         /*U*/
   1274         RELOC_PIC_PARAMS_PNW(&pContext->pMTXSetup->ComponentPlane[1].ui32PhysAddr,
   1275                              srf_buf_offset + pTFrame->psb_surface->stride * pTFrame->height
   1276                              + (pTFrame->psb_surface->stride) *(pTFrame->height) / 2,
   1277                              &pTFrame->psb_surface->buf);
   1278         break;
   1279     default:
   1280         drv_debug_msg(VIDEO_DEBUG_ERROR, " Not supported FOURCC %x!\n", pContext->eFormat);
   1281         return -1;
   1282 
   1283     }
   1284 
   1285 
   1286     drv_debug_msg(VIDEO_DEBUG_GENERAL, "TOPAZ_PDUMP: ui32DataInterleaveStatus %x\n", pContext->pMTXSetup->ui32DataInterleaveStatus);
   1287     drv_debug_msg(VIDEO_DEBUG_GENERAL, "TOPAZ_PDUMP: ui32TableA %x \n", pContext->pMTXSetup->ui32TableA);
   1288     drv_debug_msg(VIDEO_DEBUG_GENERAL, "TOPAZ_PDUMP:ui32ComponentsInScan %x\n", pContext->pMTXSetup->ui32ComponentsInScan);
   1289     for (i32Lp = 0; i32Lp < 3; i32Lp++) {
   1290         drv_debug_msg(VIDEO_DEBUG_GENERAL, "TOPAZ_PDUMP: ComponentPlane[%d]: 0x%x, %d, %d\n",
   1291                                  i32Lp, pContext->pMTXSetup->ComponentPlane[i32Lp].ui32PhysAddr, pContext->pMTXSetup->ComponentPlane[i32Lp].ui32Stride, pContext->pMTXSetup->ComponentPlane[i32Lp].ui32Height);
   1292         drv_debug_msg(VIDEO_DEBUG_GENERAL, "TOPAZ_PDUMP: MCUComponent[%d]: %d, %d, %d, %d\n", i32Lp, pContext->pMTXSetup->MCUComponent[i32Lp].ui32WidthBlocks, pContext->pMTXSetup->MCUComponent[i32Lp].ui32HeightBlocks, pContext->pMTXSetup->MCUComponent[i32Lp].ui32XLimit, pContext->pMTXSetup->MCUComponent[i32Lp].ui32YLimit);
   1293     }
   1294 
   1295     i32Lp = ctx->NumCores;
   1296     while (--i32Lp > -1) {
   1297         /*TOPAZ_InsertCommand(
   1298                 pEncContext,
   1299                 i32Lp,
   1300                 MTX_CMDID_SETUP,
   1301                 IMG_FALSE,
   1302                 IMG_NULL,
   1303                 pContext->pMemInfoMTXSetup );*/
   1304 
   1305         pnw_cmdbuf_insert_command_package(ctx->obj_context,
   1306                                           i32Lp,
   1307                                           MTX_CMDID_SETUP,
   1308                                           &(ctx->obj_context->pnw_cmdbuf->header_mem),
   1309                                           0);
   1310     }
   1311 
   1312     return ReturnCode;
   1313 }
   1314 
   1315 #if 0
   1316 IMG_UINT32 Legacy_JPGEncodeSOSHeader(LEGACY_JPEG_ENCODER_CONTEXT *pContext, IMG_CODED_BUFFER *pCBuffer)
   1317 {
   1318     IMG_UINT32  ui32TableIndex ;
   1319     IMG_UINT8 uc_comp_id, ui8Comp;
   1320     STREAMTYPEW s_streamW;
   1321     IMG_UINT8 *puc_stream_buff;
   1322 
   1323     puc_stream_buff = (IMG_UINT8 *)(pCBuffer->pMemInfo) + pCBuffer->ui32BytesWritten;
   1324 
   1325     s_streamW.Offset = 0;
   1326     s_streamW.Buffer = puc_stream_buff;
   1327     s_streamW.Limit = (pCBuffer->ui32Size - pCBuffer->ui32BytesWritten);
   1328 
   1329     /* Start of scan */
   1330     fPutBitsToBuffer(&s_streamW, 2, START_OF_SCAN);
   1331     /* Scan header length */
   1332     fPutBitsToBuffer(&s_streamW, 2, 6 + (pContext->JPEGEncoderParams.uc_num_comp_in_scan << 1));
   1333     /* Number of image components in scan */
   1334     fPutBitsToBuffer(&s_streamW, 1, pContext->JPEGEncoderParams.uc_num_comp_in_scan);
   1335 
   1336     if (pContext->JPEGEncoderParams.uc_num_comp_in_scan > MAX_COMP_IN_SCAN)
   1337         pContext->JPEGEncoderParams.uc_num_comp_in_scan = MAX_COMP_IN_SCAN;
   1338     for (ui8Comp = 0; ui8Comp < pContext->JPEGEncoderParams.uc_num_comp_in_scan; ui8Comp++) {
   1339         uc_comp_id = pContext->JPEGEncoderParams.puc_comp_id[ui8Comp];
   1340         if (uc_comp_id >= MAX_COMP_IN_SCAN) {
   1341             drv_debug_msg(VIDEO_DEBUG_ERROR, "Invalide component index %d\n", uc_comp_id);
   1342             uc_comp_id = MAX_COMP_IN_SCAN - 1;
   1343         }
   1344 
   1345         ui32TableIndex  = pContext->sJPEGEncoderComp.CompIdtoIndex[uc_comp_id];
   1346 
   1347         /* Scan component selector */
   1348         fPutBitsToBuffer(&s_streamW, 1, uc_comp_id);
   1349 
   1350         /*4 Bits Dc entropy coding table destination selector */
   1351         /*4 Bits Ac entropy coding table destination selector */
   1352         ui32TableIndex %= 255;
   1353         fPutBitsToBuffer(&s_streamW, 1, (pContext->sJPEGEncoderComp.puc_huff_table_id[ui32TableIndex] << 4) | pContext->sJPEGEncoderComp.puc_huff_table_id[ui32TableIndex]);
   1354     }
   1355 
   1356     /* Start of spectral or predictor selection  */
   1357     fPutBitsToBuffer(&s_streamW, 1, 0);
   1358     /* End of spectral selection */
   1359     fPutBitsToBuffer(&s_streamW, 1, 63);
   1360     /*4 Bits Successive approximation bit position high (0)*/
   1361     /*4 Bits Successive approximation bit position low or point transform (0)*/
   1362     fPutBitsToBuffer(&s_streamW, 1, 0);
   1363 
   1364     pCBuffer->ui32BytesWritten += s_streamW.Offset;
   1365 
   1366     return 0;
   1367 }
   1368 #endif
   1369 
   1370 /***********************************************************************************
   1371  * Function Name      : JPGEncodeSOSHeader
   1372  * Inputs             : PContext - Pointer to JPEG context
   1373  * Inputs             : pui8BitStreamBuffer start of the coded output buffer
   1374  * Inputs             : pui32BytesWritten pointer to offset into the coded output buffer at which to write
   1375  * Outputs            : pui8BitStreamBuffer - Start of Scan header written to the coded buffer
   1376  * Returns            : Bytes writtren
   1377  * Description        : This function writes the Start of Scan Header
   1378  ************************************************************************************/
   1379 
   1380 IMG_UINT32 JPGEncodeSOSHeader(/*in */           TOPAZSC_JPEG_ENCODER_CONTEXT *pContext,
   1381         /*out */        IMG_UINT8*              pui8BitStreamBuffer ,
   1382         /*out*/         IMG_UINT32*             pui32BytesWritten)
   1383 {
   1384     IMG_UINT8 uc_comp_id, ui8Comp;
   1385     STREAMTYPEW s_streamW;
   1386 
   1387     s_streamW.Offset = 0;
   1388     s_streamW.Buffer = pui8BitStreamBuffer + *pui32BytesWritten;
   1389 
   1390     /* Start of scan */
   1391     fPutBitsToBuffer(&s_streamW, 2, START_OF_SCAN);
   1392     /* Scan header length */
   1393     fPutBitsToBuffer(&s_streamW, 2, 6 + (pContext->pMTXSetup->ui32ComponentsInScan << 1));
   1394     /* Number of image components in scan */
   1395     fPutBitsToBuffer(&s_streamW, 1, pContext->pMTXSetup->ui32ComponentsInScan);
   1396     for (ui8Comp = 0; ui8Comp < pContext->pMTXSetup->ui32ComponentsInScan; ui8Comp++) {
   1397         uc_comp_id = ui8Comp + 1;
   1398 
   1399         /* Scan component selector */
   1400         fPutBitsToBuffer(&s_streamW, 1, uc_comp_id);
   1401 
   1402         /*4 Bits Dc entropy coding table destination selector */
   1403         /*4 Bits Ac entropy coding table destination selector */
   1404         fPutBitsToBuffer(&s_streamW, 1, ((ui8Comp != 0 ? 1 : 0) << 4) | (ui8Comp != 0 ? 1 : 0)); // Huffman table refs = 0 Luma 1 Chroma
   1405     }
   1406 
   1407     /* Start of spectral or predictor selection  */
   1408     fPutBitsToBuffer(&s_streamW, 1, 0);
   1409     /* End of spectral selection */
   1410     fPutBitsToBuffer(&s_streamW, 1, 63);
   1411     /*4 Bits Successive approximation bit position high (0)*/
   1412     /*4 Bits Successive approximation bit position low or point transform (0)*/
   1413     fPutBitsToBuffer(&s_streamW, 1, 0);
   1414 
   1415     *pui32BytesWritten += s_streamW.Offset;
   1416 
   1417     return 0;
   1418 }
   1419 
   1420 #if 0
   1421 /*****************************************************************************/
   1422 /*                                                                           */
   1423 /* Function Name : EncodeMJPEGAPP1Marker                                     */
   1424 /*                                                                           */
   1425 /* Description   : Writes a Quicktime MJPEG (A) marker                                       */
   1426 /*                                                                           */
   1427 /* Inputs        :                                                           */
   1428 /*                                      pContext                        - Ptr to the JPEG encoder context        */
   1429 /*                                      puc_stream_buff         - Ptr to the bistream buffer from        */
   1430 /*                                                                                      where to start writing                   */
   1431 /*                                                                           */
   1432 /* Processing    :                                                                                                                       */
   1433 /*                                                                           */
   1434 /* Returns       : Number of bytes written into the stream                   */
   1435 /*                                                                           */
   1436 /*****************************************************************************/
   1437 IMG_UINT32 Insert_QT_MJPEGA_APP1Marker(IMG_CODED_BUFFER *pCBuffer, IMG_UINT8 *pui8BitStreamBuffer, IMG_UINT32 ui32OffsetBytes, IMG_BOOL bIsFirstField)
   1438 {
   1439     STREAMTYPEW ps_streamW;
   1440 #ifdef JPEG_VERBOSE
   1441     printf("Insert_QT_MJPEGA_APP1Marker");
   1442 #endif
   1443 
   1444     ps_streamW.Offset = 0;
   1445     ps_streamW.Buffer = &pui8BitStreamBuffer[ui32OffsetBytes];
   1446 
   1447     /* Writing the start of image marker */
   1448     fPutBitsToBuffer(&ps_streamW, 2, START_OF_IMAGE);
   1449     /* Writing the Motion-JPEG APP1 marker */
   1450     fPutBitsToBuffer(&ps_streamW, 2, MJPEG_APP1);
   1451     /* Marker content length */
   1452     fPutBitsToBuffer(&ps_streamW, 2, 0x002A);
   1453     /* Reserved, set to zero */
   1454     fPutBitsToBuffer(&ps_streamW, 4, 0x00000000);
   1455     /* Motion-JPEG tag = "mjpg"*/
   1456     fPutBitsToBuffer(&ps_streamW, 4, 0x6D6A7067);
   1457     /* Field size*/
   1458     fPutBitsToBuffer(&ps_streamW, 4, pCBuffer->ui32BytesWritten + 2 - ui32OffsetBytes); // +2 because the EOI marker not written yet
   1459     /* Padded Field size*/
   1460     fPutBitsToBuffer(&ps_streamW, 4, pCBuffer->ui32BytesWritten + 2 - ui32OffsetBytes);
   1461     /* Offset to next field*/
   1462     if (bIsFirstField)
   1463         fPutBitsToBuffer(&ps_streamW, 4, pCBuffer->ui32BytesWritten + 2 - ui32OffsetBytes); // Points to start of next field
   1464     else
   1465         fPutBitsToBuffer(&ps_streamW, 4, 0); // Set to zero for second field
   1466 
   1467     /* Quantization Table Offset*/
   1468     // May be able to leave this at zero
   1469     fPutBitsToBuffer(&ps_streamW, 4, H_QT_OFFSET);
   1470     /* Huffman Table Offset*/
   1471     // May be able to leave this at zero
   1472     fPutBitsToBuffer(&ps_streamW, 4, H_HT_OFFSET);
   1473     /* Start Of Frame Offset*/
   1474     fPutBitsToBuffer(&ps_streamW, 4, H_SOF_OFFSET);
   1475     /* Start Of Scan Offset*/
   1476     fPutBitsToBuffer(&ps_streamW, 4, H_SOS_OFFSET);
   1477     /* Start of data offset*/
   1478     fPutBitsToBuffer(&ps_streamW, 4, H_SOI_OFFSET);
   1479 
   1480     return 0;
   1481 }
   1482 #endif
   1483 
   1484 /* JPEG Start picture function. Sets up all context information, Quantization details, Header output and MTX ready for the main encode loop*/
   1485 IMG_ERRORCODE SetupJPEGTables(TOPAZSC_JPEG_ENCODER_CONTEXT * pContext, IMG_CODED_BUFFER *pCBuffer,  object_surface_p pTFrame)
   1486 {
   1487     /*IMG_UINT32 rc = 0;
   1488     const IMG_UINT8* StandardQuantLuma;
   1489     const IMG_UINT8* StandardQuantChroma;
   1490     IMG_UINT8* QuantLumaTableOnHost;
   1491     IMG_UINT8* QuantChromaTableOnHost;
   1492     JPEG_MTX_QUANT_TABLE * psQuantTables;*/
   1493     IMG_UINT16 ui16Lp;
   1494     IMG_UINT8 ui8Planes[MAX_COMP_IN_SCAN];
   1495     /*IMG_ENC_CONTEXT * pEncContext = (IMG_ENC_CONTEXT*)hEncContext;*/
   1496     /*TOPAZSC_JPEG_ENCODER_CONTEXT * pContext = pEncContext->psJpegHC;*/
   1497     IMG_INT8 i;
   1498     context_ENC_p ctx = (context_ENC_p)pContext->ctx;
   1499 
   1500     // Lets add a pointer from our context to the source surface structure (remember we still need to use GETBUFFER commands if we want to get shared image memory, but info data structures are on host)
   1501     pContext->pSourceSurface = pTFrame;
   1502 
   1503     //Try setting MCU details from here
   1504     /*JPGEncodeBegin(pContext, pTFrame);*/
   1505     InitializeJpegEncode(pContext, pTFrame);
   1506 
   1507     // Special case for YUYV format
   1508     if (ISCHROMAINTERLEAVED(pContext->eFormat) > C_INTERLEAVE)
   1509         pContext->sScan_Encode_Info.ui32NumberMCUsX = (pContext->pMTXSetup->MCUComponent[0].ui32XLimit + ((pContext->pMTXSetup->MCUComponent[0].ui32WidthBlocks * 2) - 1)) / (pContext->pMTXSetup->MCUComponent[0].ui32WidthBlocks * 2);
   1510     else
   1511         pContext->sScan_Encode_Info.ui32NumberMCUsX = (pContext->pMTXSetup->MCUComponent[0].ui32XLimit + (pContext->pMTXSetup->MCUComponent[0].ui32WidthBlocks - 1)) / pContext->pMTXSetup->MCUComponent[0].ui32WidthBlocks;
   1512 
   1513     pContext->sScan_Encode_Info.ui32NumberMCUsY = (pContext->pMTXSetup->MCUComponent[0].ui32YLimit + (pContext->pMTXSetup->MCUComponent[0].ui32HeightBlocks - 1)) / pContext->pMTXSetup->MCUComponent[0].ui32HeightBlocks;
   1514     pContext->sScan_Encode_Info.ui32NumberMCUsToEncode = pContext->sScan_Encode_Info.ui32NumberMCUsX * pContext->sScan_Encode_Info.ui32NumberMCUsY;
   1515 
   1516     pContext->sScan_Encode_Info.ui32NumberMCUsToEncodePerScan =
   1517         JPEG_MCU_PER_SCAN(pContext->ui32OutputWidth, pContext->ui32OutputHeight, ctx->NumCores, pContext->eFormat);
   1518 
   1519     drv_debug_msg(VIDEO_DEBUG_GENERAL, "MCUs To Encode %dx%d\n",
   1520                              pContext->sScan_Encode_Info.ui32NumberMCUsX,
   1521                              pContext->sScan_Encode_Info.ui32NumberMCUsY);
   1522     drv_debug_msg(VIDEO_DEBUG_GENERAL, "Total MCU %d, per scan %d\n", pContext->sScan_Encode_Info.ui32NumberMCUsToEncode, pContext->sScan_Encode_Info.ui32NumberMCUsToEncodePerScan);
   1523 
   1524     //Allocate our coded data buffers here now we know the number of MCUs we're encoding
   1525     /*Use slice parameter buffer*/
   1526     if (AllocateCodedDataBuffers(pContext) != IMG_ERR_OK) return IMG_ERR_MEMORY;
   1527     // Send Setup message to MTX to initialise it
   1528     /*EncodeInitMTX(pEncContext);        Set predictors to zero */
   1529 
   1530     for (i = ctx->NumCores - 1; i >= 0; i--) {
   1531         pnw_cmdbuf_insert_command_package(
   1532             ((context_ENC_p)pContext->ctx)->obj_context,
   1533             i,
   1534             MTX_CMDID_RESET_ENCODE,
   1535             NULL,
   1536             0);
   1537     }
   1538     //CODE HERE SIMPLIFIED AS WE KNOW THERE WILL ONLY EVER BE 3 IMAGE COMPONENTS
   1539     /* Set up Source panes for HW */
   1540     // Reverse colour plane pointers fed to MTX when required by format
   1541 
   1542     switch (pContext->eFormat) {
   1543     case IMG_CODEC_YV16:
   1544         pContext->pMTXSetup->ComponentPlane[0].ui32Stride = pTFrame->psb_surface->stride;
   1545         pContext->pMTXSetup->ComponentPlane[1].ui32Stride = pContext->pMTXSetup->ComponentPlane[0].ui32Stride / 2;
   1546         pContext->pMTXSetup->ComponentPlane[2].ui32Stride = pContext->pMTXSetup->ComponentPlane[0].ui32Stride / 2;
   1547 
   1548         pContext->pMTXSetup->ComponentPlane[0].ui32Height = pTFrame->height;
   1549         pContext->pMTXSetup->ComponentPlane[1].ui32Height = pTFrame->height;
   1550         pContext->pMTXSetup->ComponentPlane[2].ui32Height = pTFrame->height;
   1551 
   1552         /*YV16's plane order is Y, V, U*/
   1553         ui8Planes[0] = 0;
   1554         ui8Planes[2] = 1;
   1555         ui8Planes[1] = 2;
   1556         break;
   1557     case IMG_CODEC_IYUV:
   1558     case IMG_CODEC_IMC2:
   1559         /*case IMG_CODEC_422_IMC2:
   1560             SetupYUVPlaneDetails(&(pContext->pMTXSetup->ComponentPlane[0]),
   1561                     &(pTFrame->aui32ComponentInfo[0]));
   1562 
   1563             SetupYUVPlaneDetails(&(pContext->pMTXSetup->ComponentPlane[2]),
   1564                     &(pTFrame->aui32ComponentInfo[1]));
   1565 
   1566             SetupYUVPlaneDetails(&(pContext->pMTXSetup->ComponentPlane[1]),
   1567                     &(pTFrame->aui32ComponentInfo[2]));*/
   1568         pContext->pMTXSetup->ComponentPlane[0].ui32Stride = pTFrame->psb_surface->stride;
   1569         pContext->pMTXSetup->ComponentPlane[1].ui32Stride = pContext->pMTXSetup->ComponentPlane[0].ui32Stride / 2;
   1570         pContext->pMTXSetup->ComponentPlane[2].ui32Stride = pContext->pMTXSetup->ComponentPlane[0].ui32Stride / 2;
   1571 
   1572         pContext->pMTXSetup->ComponentPlane[0].ui32Height = pTFrame->height;
   1573         pContext->pMTXSetup->ComponentPlane[1].ui32Height = pTFrame->height / 2;
   1574         pContext->pMTXSetup->ComponentPlane[2].ui32Height = pTFrame->height / 2;
   1575 
   1576         //ui8Planes[0]=0;ui8Planes[1]=2;ui8Planes[2]=1;
   1577         /*IYUV don't need to swap UV color space. Not sure about IMC12*/
   1578         ui8Planes[0] = 0;
   1579         ui8Planes[1] = 1;
   1580         ui8Planes[2] = 2;
   1581         break;
   1582     default:
   1583         /*SetupYUVPlaneDetails(&(pContext->pMTXSetup->ComponentPlane[0]),
   1584             &(pTFrame->aui32ComponentInfo[0]));
   1585 
   1586         SetupYUVPlaneDetails(&(pContext->pMTXSetup->ComponentPlane[1]),
   1587             &(pTFrame->aui32ComponentInfo[1]));
   1588 
   1589         SetupYUVPlaneDetails(&(pContext->pMTXSetup->ComponentPlane[2]),
   1590             &(pTFrame->aui32ComponentInfo[2]));*/
   1591         /* It's for NV12*/
   1592         pContext->pMTXSetup->ComponentPlane[0].ui32Stride = pTFrame->psb_surface->stride;
   1593         pContext->pMTXSetup->ComponentPlane[1].ui32Stride = pContext->pMTXSetup->ComponentPlane[0].ui32Stride;
   1594         pContext->pMTXSetup->ComponentPlane[2].ui32Stride = pContext->pMTXSetup->ComponentPlane[0].ui32Stride;
   1595 
   1596         pContext->pMTXSetup->ComponentPlane[0].ui32Height = pTFrame->height;
   1597         pContext->pMTXSetup->ComponentPlane[1].ui32Height = pTFrame->height / 2;
   1598         pContext->pMTXSetup->ComponentPlane[2].ui32Height = pTFrame->height / 2;
   1599 
   1600         ui8Planes[0] = 0;
   1601         ui8Planes[1] = 1;
   1602         ui8Planes[2] = 2;
   1603         break;
   1604     };
   1605 
   1606 
   1607     SetupIssueSetup(pContext, pContext->pMTXSetup->ui32ComponentsInScan, ui8Planes, pTFrame, 0 , 1);
   1608 
   1609     if (pContext->pMTXSetup->ui32ComponentsInScan > MAX_COMP_IN_SCAN) {
   1610         return IMG_ERR_UNDEFINED;
   1611     }
   1612 
   1613     if ((pCBuffer->ui32Size - pCBuffer->ui32BytesWritten) < 9 + 6 + (4 *(IMG_UINT32)pContext->pMTXSetup->ui32ComponentsInScan)) {
   1614         return  IMG_ERR_MEMORY;
   1615     }
   1616 
   1617     // Reset Scan Encode structures - just in case
   1618     for (ui16Lp = 0; ui16Lp < pContext->sScan_Encode_Info.ui8NumberOfCodedBuffers; ui16Lp++) {
   1619         BUFFER_HEADER *pbh;
   1620 
   1621         pContext->sScan_Encode_Info.aBufferTable[ui16Lp].i8MTXNumber = 0; // Indicates buffer is idle
   1622         pContext->sScan_Encode_Info.aBufferTable[ui16Lp].ui16ScanNumber = 0; // Indicates buffer is idle
   1623 
   1624         pContext->sScan_Encode_Info.aBufferTable[ui16Lp].ui32DataBufferUsedBytes = 0;
   1625 
   1626         //pbh = MMGetHostLinAddress(pContext->sScan_Encode_Info.aBufferTable[ui16Lp].pMemInfo );
   1627         pbh = (BUFFER_HEADER *)(pContext->sScan_Encode_Info.aBufferTable[ui16Lp].pMemInfo);
   1628         pbh->ui32BytesEncoded = 0;
   1629         pbh->ui32BytesUsed = sizeof(BUFFER_HEADER);
   1630     }
   1631 
   1632     //Prefill out MTXIdleTable with MTX references (0 is the Master, and will be the last sent)
   1633     for (pContext->sScan_Encode_Info.ui8MTXIdleCnt = 0; pContext->sScan_Encode_Info.ui8MTXIdleCnt < ctx->NumCores; pContext->sScan_Encode_Info.ui8MTXIdleCnt++) {
   1634         pContext->sScan_Encode_Info.aui8MTXIdleTable[pContext->sScan_Encode_Info.ui8MTXIdleCnt] = pContext->sScan_Encode_Info.ui8MTXIdleCnt + 1;
   1635     }
   1636 
   1637 
   1638     //Need to set up CB Output slicenumber to equal number of slices required to encode image
   1639     // Set current CB scan to maximum scan number (will count down as scans are output)
   1640     pContext->sScan_Encode_Info.ui16CScan = (pContext->sScan_Encode_Info.ui32NumberMCUsToEncode + (pContext->sScan_Encode_Info.ui32NumberMCUsToEncodePerScan - 1)) / pContext->sScan_Encode_Info.ui32NumberMCUsToEncodePerScan;
   1641     pContext->sScan_Encode_Info.ui16ScansInImage = pContext->sScan_Encode_Info.ui16CScan;
   1642     // Set next scan to send to MTX to maximum scan number
   1643     pContext->sScan_Encode_Info.ui16SScan = pContext->sScan_Encode_Info.ui16CScan;
   1644     pContext->ui32InitialCBOffset = 0;
   1645 
   1646     return IMG_ERR_OK;
   1647 }
   1648 
   1649 #if 0
   1650 IMG_ERRORCODE Legacy_PrepareHeader(LEGACY_JPEG_ENCODER_CONTEXT * pContext, IMG_CODED_BUFFER *pCBuffer)
   1651 {
   1652     IMG_ERRORCODE rc;
   1653     IMG_UINT8 *ui8OutputBuffer;
   1654 
   1655     ui8OutputBuffer = pCBuffer->pMemInfo;
   1656     //Lock our JPEG Coded buffer
   1657     /* if (IMG_JPEG_GetBuffer(pCBuffer, (IMG_VOID **) &ui8OutputBuffer)!=IMG_ERR_OK)
   1658      return IMG_ERR_SURFACE_LOCKED;*/
   1659 
   1660     pCBuffer->ui32BytesWritten = 0;
   1661     *((IMG_UINT32*) ui8OutputBuffer) = 0;
   1662 
   1663     // JPGEncodeMarker - Currently misses out the APP0 header
   1664     rc = Legacy_JPGEncodeMarker(pContext, (IMG_UINT8 *) ui8OutputBuffer,  &pCBuffer->ui32BytesWritten);
   1665     if (rc) return rc;
   1666 
   1667     rc = Legacy_JPGEncodeHeader(pContext , (IMG_UINT8 *) ui8OutputBuffer ,  &pCBuffer->ui32BytesWritten);
   1668     if (rc) return rc;
   1669 
   1670     //  JPGEncodeDRIMarker(pContext,pCBuffer);
   1671     Legacy_JPGEncodeSOSHeader(pContext, pCBuffer);
   1672 
   1673     //IMG_JPEG_ReleaseBuffer( pCBuffer);
   1674 
   1675 
   1676     return IMG_ERR_OK;
   1677 }
   1678 /* Send header will work for each type of header*/
   1679 #endif
   1680 
   1681 /***********************************************************************************
   1682  * Function Name      : PrepareHeader
   1683  * Inputs             : Pointer to JPEG Context, Point to coded buffer
   1684  * Outputs            :
   1685  * Returns            : IMG_ERRORCODE
   1686  * Description        : Writes required JPEG Header elements to the coded buffer
   1687  ************************************************************************************/
   1688 IMG_ERRORCODE PrepareHeader(TOPAZSC_JPEG_ENCODER_CONTEXT * pContext, IMG_CODED_BUFFER *pCBuffer, IMG_UINT32 ui32StartOffset, IMG_BOOL bIncludeHuffmanTables)
   1689 {
   1690     IMG_ERRORCODE rc;
   1691     IMG_UINT8 *ui8OutputBuffer;
   1692 
   1693     //Lock our JPEG Coded buffer
   1694     /*if (IMG_C_GetBuffer((IMG_HENC_CONTEXT) pContext, pCBuffer, (IMG_VOID **) &ui8OutputBuffer)!=IMG_ERR_OK)
   1695     return IMG_ERR_SURFACE_LOCKED;*/
   1696 
   1697     ui8OutputBuffer = (IMG_UINT8 *)pCBuffer->pMemInfo;
   1698     pCBuffer->ui32BytesWritten = ui32StartOffset;
   1699     *((IMG_UINT32*) ui8OutputBuffer + pCBuffer->ui32BytesWritten) = 0;
   1700 
   1701 
   1702     // JPGEncodeMarker - Currently misses out the APP0 header
   1703     rc = JPGEncodeMarker(pContext, (IMG_UINT8 *) ui8OutputBuffer,  &pCBuffer->ui32BytesWritten, bIncludeHuffmanTables);
   1704     if (rc) return rc;
   1705 
   1706     drv_debug_msg(VIDEO_DEBUG_GENERAL, "Current bytes of coded buf used: %d\n", pCBuffer->ui32BytesWritten);
   1707     rc = JPGEncodeHeader(pContext , (IMG_UINT8 *) ui8OutputBuffer ,  &pCBuffer->ui32BytesWritten);
   1708     if (rc) return rc;
   1709 
   1710     drv_debug_msg(VIDEO_DEBUG_GENERAL, "Current bytes of coded buf used: %d\n", pCBuffer->ui32BytesWritten);
   1711     rc = JPGEncodeSOSHeader(pContext, (IMG_UINT8 *) ui8OutputBuffer, &pCBuffer->ui32BytesWritten);
   1712     if (rc) return rc;
   1713 
   1714     drv_debug_msg(VIDEO_DEBUG_GENERAL, "Current bytes of coded buf used: %d\n", pCBuffer->ui32BytesWritten);
   1715     /*IMG_C_ReleaseBuffer((IMG_HENC_CONTEXT) pContext, pCBuffer);*/
   1716     return IMG_ERR_OK;
   1717 }
   1718 
   1719 
   1720 
   1721 
   1722 /***********************************************************************************
   1723  * Function Name      : IMG_JPEG_ISSUEBUFFERTOHW
   1724  * Inputs             :
   1725  * Outputs            : pui32MCUsToProccess
   1726  * Returns            :
   1727  * Description        : Issues a buffer to MTX to recieve coded data.
   1728  *
   1729  ************************************************************************************/
   1730 
   1731 IMG_ERRORCODE IssueBufferToHW(TOPAZSC_JPEG_ENCODER_CONTEXT *pContext, TOPAZSC_JPEG_BUFFER_INFO* pWriteBuf, IMG_UINT16 ui16BCnt, IMG_UINT32 ui32NoMCUsToEncode, IMG_INT8 i8MTXNumber)
   1732 {
   1733     MTX_ISSUE_BUFFERS *psBufferCmd;
   1734     context_ENC_p ctx = (context_ENC_p)pContext->ctx;
   1735     /*IMG_ENC_CONTEXT * pEncContext = (IMG_ENC_CONTEXT*)hContext;
   1736     TOPAZSC_JPEG_ENCODER_CONTEXT *pContext = pEncContext->psJpegHC;*/
   1737 
   1738 #ifdef JPEG_VERBOSE
   1739     printf("\n**************************************************************************\n");
   1740     printf("** HOST SENDING Scan:%i (%i MCUs) to MTX %i, using Buffer %i\n", pWriteBuf->ui16ScanNumber, ui32NoMCUsToEncode, i8MTXNumber - 1, ui16BCnt);
   1741 #endif
   1742     drv_debug_msg(VIDEO_DEBUG_GENERAL, "HOST SENDING Scan:%d (%d MCUs, offset %d MCUs)"
   1743                              " to MTX %d, using Buffer %d\n",
   1744                              pWriteBuf->ui16ScanNumber, ui32NoMCUsToEncode,
   1745                              pContext->sScan_Encode_Info.ui32CurMCUsOffset,
   1746                              i8MTXNumber, ui16BCnt);
   1747 
   1748     // Issue to MTX ////////////////////////////
   1749     ASSERT(pWriteBuf->pMemInfo);
   1750 
   1751     // Lets send our input parameters using the device memory allocated for the coded output
   1752     psBufferCmd = (MTX_ISSUE_BUFFERS *)(pWriteBuf->pMemInfo);
   1753 
   1754     // We've disabled size bound checking in firmware, so can use the full 31 bits for NoMCUsToEncode instead
   1755     //psBufferCmd->ui32MCUCntAndResetFlag       = ( DATA_BUFFER_SIZE(pContext->sScan_Encode_Info.ui32NumberMCUsToEncodePerScan) << 16) | (ui32NoMCUsToEncode << 1) | 0x1;
   1756 
   1757     psBufferCmd->ui32MCUCntAndResetFlag = (ui32NoMCUsToEncode << 1) | 0x1;
   1758     psBufferCmd->ui32CurrentMTXScanMCUPosition = pContext->sScan_Encode_Info.ui32CurMCUsOffset;
   1759     drv_debug_msg(VIDEO_DEBUG_GENERAL, "TOPAZ_PDUMP: ui32MCUCntAndResetFlag 0x%x\n", psBufferCmd->ui32MCUCntAndResetFlag);
   1760     drv_debug_msg(VIDEO_DEBUG_GENERAL, "TOPAZ_PDUMP: ui32CurrentMTXScanMCUPosition 0x%x\n", psBufferCmd->ui32CurrentMTXScanMCUPosition);
   1761     /* We do not need to do this but in order for params to match on HW we need to know whats in the buffer*/
   1762     /*MMUpdateDeviceMemory(pWriteBuf->pMemInfo );*/
   1763 
   1764     /*TOPAZ_InsertCommand(
   1765         pEncContext,
   1766         (IMG_INT32) (i8MTXNumber-1),
   1767         MTX_CMDID_ISSUEBUFF,
   1768         IMG_FALSE,
   1769         &pWriteBuf->ui32WriteBackVal,
   1770         pWriteBuf->pMemInfo );*/
   1771     pnw_cmdbuf_insert_command_package(ctx->obj_context,
   1772                                       (IMG_INT32)(i8MTXNumber) ,
   1773                                       MTX_CMDID_ISSUEBUFF,
   1774                                       ctx->coded_buf->psb_buffer,
   1775                                       ui16BCnt * pContext->ui32SizePerCodedBuffer + PNW_JPEG_HEADER_MAX_SIZE);
   1776 
   1777     return IMG_ERR_OK;
   1778 }
   1779 
   1780 /***********************************************************************************
   1781  * Function Name      : SubmitScanToMTX
   1782  * Inputs             :
   1783  *                                              pContext - Pointer to JPEG context
   1784  *                                              ui16BCnt - Index of the buffer to associate with the MTX
   1785  *                                              i8MTXNumber - The ID number of the MTX that will have a scan sent to it
   1786  * Outputs            : Status update to current buffer, MTX is activated
   1787  * Returns            : Errorcode
   1788  * Description        : Associates the empty buffer with the inactive MTX and then
   1789  *                                              starts a scan, with output to be sent to the buffer.
   1790  ************************************************************************************/
   1791 
   1792 IMG_ERRORCODE SubmitScanToMTX(TOPAZSC_JPEG_ENCODER_CONTEXT *pContext,
   1793                               IMG_UINT16 ui16BCnt,
   1794                               IMG_INT8 i8MTXNumber,
   1795                               IMG_UINT32 ui32NoMCUsToEncode)
   1796 {
   1797     /*IMG_ENC_CONTEXT * pEncContext = (IMG_ENC_CONTEXT*)hContext;
   1798     TOPAZSC_JPEG_ENCODER_CONTEXT *pContext = pEncContext->psJpegHC;*/
   1799 
   1800 
   1801 #if 0
   1802     // Submit a scan and buffer to the appropriate MTX unit
   1803     IMG_UINT32 ui32NoMCUsToEncode;
   1804 
   1805     if (pContext->sScan_Encode_Info.ui16SScan == 0) {
   1806         // Final scan, may need fewer MCUs than buffer size, calculate the remainder
   1807         ui32NoMCUsToEncode = pContext->sScan_Encode_Info.ui32NumberMCUsToEncode % pContext->sScan_Encode_Info.ui32NumberMCUsToEncodePerScan;
   1808         if (ui32NoMCUsToEncode == 0)    ui32NoMCUsToEncode = pContext->sScan_Encode_Info.ui32NumberMCUsToEncodePerScan;
   1809     } else
   1810         ui32NoMCUsToEncode = pContext->sScan_Encode_Info.ui32NumberMCUsToEncodePerScan;
   1811 #endif
   1812     //Set the buffer returned size to -1
   1813     pContext->sScan_Encode_Info.aBufferTable[ui16BCnt].ui32DataBufferUsedBytes = ((BUFFER_HEADER*)(pContext->sScan_Encode_Info.aBufferTable[ui16BCnt].pMemInfo))->ui32BytesUsed = -1; // Won't be necessary with SC Peek commands enabled
   1814     IssueBufferToHW(pContext, &(pContext->sScan_Encode_Info.aBufferTable[ui16BCnt]), ui16BCnt, ui32NoMCUsToEncode, i8MTXNumber);
   1815 
   1816     drv_debug_msg(VIDEO_DEBUG_GENERAL, "Submitting scan %i to MTX %i and Buffer %i\n", pContext->sScan_Encode_Info.aBufferTable[ui16BCnt].ui16ScanNumber, i8MTXNumber, ui16BCnt);
   1817     return IMG_ERR_OK;
   1818 }
   1819 
   1820 
   1821 void pnw_jpeg_set_default_qmatix(unsigned char *pMemInfoTableBlock)
   1822 {
   1823     JPEG_MTX_QUANT_TABLE *pQTable = (JPEG_MTX_QUANT_TABLE *)pMemInfoTableBlock;
   1824     memcpy(pQTable->aui8LumaQuantParams, gQuantLuma, QUANT_TABLE_SIZE_BYTES);
   1825     memcpy(pQTable->aui8ChromaQuantParams, gQuantChroma, QUANT_TABLE_SIZE_BYTES);
   1826     return;
   1827 }
   1828