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*/
26
27#ifndef _PTG_JPEG_H_
28#define _PTG_JPEG_H_
29
30#include "img_types.h"
31#include "tng_hostdefs.h"
32#include "va/va_enc_jpeg.h"
33
34#define QUANT_TABLE_SIZE_BYTES  (64)
35#define MTX_MAX_COMPONENTS  (3)
36#define MAX_NUMBER_OF_MTX_UNITS 4 // Number of MTX units
37
38typedef enum {
39    IMG_ERR_OK                  = 0,    //!< OK
40    IMG_ERR_SURFACE_LOCKED      = 1,    //!< The requested surface was locked
41    IMG_ERR_MEMORY              = 2,    //!< A memory error occured
42    IMG_ERR_FILE                = 3,    //!< A file error occured
43    IMG_ERR_NOBUFFERAVAILABLE   = 4,    //!< No buffer was available
44    IMG_ERR_COMPLETE            = 5,    //!< Command is complete
45    IMG_ERR_INVALID_CONTEXT     = 6,    //!< An invalid context was given
46    IMG_ERR_INVALID_SIZE        = 7,    //!< An invalid size was given
47    IMG_ERR_TIMEOUT             = 8,    //!< Timeout
48    IMG_ERR_UNDEFINED           = -1
49
50} IMG_ERRORCODE;
51
52/*****************************************************************************/
53/*  STREAMTYPEW                                                              */
54/*  Container to store the stream context                                    */
55/*****************************************************************************/
56typedef struct {
57    IMG_UINT8 *Buffer; /*!< Ptr to the bitstream buffer */
58    IMG_UINT32 Offset;  /*!< Offset in the bitstream buffer */
59    IMG_UINT32 Limit;
60} STREAMTYPEW;
61
62
63typedef struct {
64    IMG_UINT8   aui8LumaQuantParams[QUANT_TABLE_SIZE_BYTES];    //!< Luma quant params
65    IMG_UINT8   aui8ChromaQuantParams[QUANT_TABLE_SIZE_BYTES];  //!< Chroma quant params
66
67} JPEG_MTX_QUANT_TABLE;
68
69typedef struct {
70    IMG_UINT32  ui32MCUPositionOfScanAndPipeNo; //!< Scan start position in MCUs
71    IMG_UINT32  ui32MCUCntAndResetFlag;     //!< [32:2] Number of MCU's to encode or decode, [1] Reset predictors (1=Reset, 0=No Reset)
72
73} MTX_ISSUE_BUFFERS;
74
75
76typedef struct {
77    IMG_UINT32  ui32PhysAddr;   //!< Physical address Component plane in shared memory
78    IMG_UINT32  ui32Stride;     //!< Stride of source plane */
79    IMG_UINT32  ui32Height;     //!< Height of avaliable data in plane.  shall be a minumum of one MCU high
80
81} COMPONENTPLANE;
82
83typedef struct {
84    IMG_UINT32  ui32WidthBlocks;    //!< Width in pixels, shall be a multiple of 8
85    IMG_UINT32  ui32HeightBlocks;   //!< Height in pixels, shall be a multiple of 8
86    IMG_UINT32  ui32XLimit;         //!< Blocks will not be encoded beyond this
87    IMG_UINT32  ui32YLimit;         //!< Blocks will not be encoded beyond this
88
89} MCUCOMPONENT;
90
91
92typedef struct {
93    COMPONENTPLANE  ComponentPlane[MTX_MAX_COMPONENTS]; //!< Array of component plane source information (detailing physical address, stride and height)
94    MCUCOMPONENT    MCUComponent[MTX_MAX_COMPONENTS];   //!< Array of Minimum Coded Unit information for each component plane
95    IMG_UINT32      ui32ComponentsInScan;               //!< Number of components
96    IMG_UINT32      ui32TableA;                         //!< Quantisation table for Luma component
97    IMG_UINT16      ui16DataInterleaveStatus;           //!< Source component interleave status (0, C_INTERLEAVE, LC_UVINTERLEAVE or LC_VUINTERLEAVE)
98    IMG_UINT16      ui16MaxPipes;                       //!< Maximum number of pipes to use in the encode
99} JPEG_MTX_DMA_SETUP;
100
101typedef struct
102{
103	IMG_UINT32	apWritebackRegions[WB_FIFO_SIZE];       //!< Data section
104} JPEG_MTX_WRITEBACK_MEMORY;
105
106typedef struct {
107    IMG_UINT32  ui32BytesUsed;      //!<
108    IMG_UINT32  ui32BytesEncoded;   //!<
109    IMG_UINT32  ui32BytesToEncode;  //!<
110    IMG_UINT32  ui32Reserved3;      //!<
111
112} BUFFER_HEADER;
113
114typedef enum {
115    BUFFER_FREE = 1,  //!< Buffer is not locked
116    HW_LOCK,          //!< Buffer is locked by hardware
117    SW_LOCK,          //!< Buffer is locked by software
118    NOTDEVICEMEMORY,  //!< Buffer is not a device memory buffer
119
120} LOCK_STATUS;
121
122typedef struct {
123    void* pMemInfo;   //!< Pointer to the memory handle for the buffer
124    LOCK_STATUS sLock;                  //!< Lock status for the buffer
125    IMG_UINT32  ui32Size;               //!< Size in bytes of the buffer
126    IMG_UINT32  ui32BytesWritten;       //!< Number of bytes written into buffer
127
128} IMG_BUFFER, IMG_CODED_BUFFER;
129
130typedef struct {
131    void *pMemInfo;
132    IMG_UINT16 ui16ScanNumber;
133    IMG_UINT32 ui32WriteBackVal;
134    IMG_INT8 i8PipeNumber; // Doubles as status indicator ( <0 = Awaiting output to CB, 0 = Idle, >0 = Being filled by MTX)
135    IMG_UINT32  MTXOpNum; // Handle returned from MTX issuebuff command, can be used to check for completion
136    IMG_UINT32 ui32DataBufferSizeBytes;
137    IMG_UINT32 ui32DataBufferUsedBytes;
138} TOPAZHP_JPEG_BUFFER_INFO;
139
140typedef struct {
141    IMG_UINT16 ui16CScan;
142    IMG_UINT16 ui16SScan;
143    IMG_UINT16 ui16ScansInImage;
144    IMG_UINT8 ui8MTXIdleCnt;
145    IMG_UINT8 aui8MTXIdleTable[MAX_NUMBER_OF_MTX_UNITS];
146    TOPAZHP_JPEG_BUFFER_INFO *aBufferTable;
147    IMG_UINT32 ui32NumberMCUsX;
148    IMG_UINT32 ui32NumberMCUsY;
149    IMG_UINT32 ui32NumberMCUsToEncode;
150    IMG_UINT32 ui32NumberMCUsToEncodePerScan;
151    IMG_UINT8 ui8NumberOfCodedBuffers;
152} TOPAZHP_SCAN_ENCODE_INFO;
153
154typedef struct {
155    IMG_UINT32 eFormat;
156    IMG_UINT16 ui16Quality;
157    IMG_UINT32 ui32OutputWidth;
158    IMG_UINT32 ui32OutputHeight;
159    IMG_UINT32 ui32InitialCBOffset;
160
161    object_surface_p pSourceSurface;
162    void *pMemInfoMTXSetup;
163    JPEG_MTX_DMA_SETUP*    pMTXSetup;
164
165    void *pMemInfoWritebackMemory;
166    JPEG_MTX_WRITEBACK_MEMORY *pMTXWritebackMemory;
167
168    void *pMemInfoTableBlock;
169    JPEG_MTX_QUANT_TABLE   *psTablesBlock;
170
171    IMG_UINT32 ui32Offsets[MTX_MAX_COMPONENTS];
172
173    TOPAZHP_SCAN_ENCODE_INFO sScan_Encode_Info;
174
175    /* New added elements after porting */
176    void *ctx;
177    IMG_INT32 NumCores;
178    IMG_CODED_BUFFER jpeg_coded_buf;
179    IMG_UINT32 ui32SizePerCodedBuffer;
180    MCUCOMPONENT MCUComponent[MTX_MAX_COMPONENTS];
181} TOPAZHP_JPEG_ENCODER_CONTEXT;
182
183#define PTG_JPEG_MAX_SCAN_NUM 7
184extern struct format_vtable_s tng_JPEGES_vtable;
185extern VAStatus tng_jpeg_AppendMarkers(object_context_p obj_context, void *raw_coded_buf);
186
187#endif //_PTG_JPEG_H_
188