/*
* Copyright (c) 2011 Intel Corporation. All Rights Reserved.
* Copyright (c) Imagination Technologies Limited, UK
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sub license, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice (including the
* next paragraph) shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
* IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
*/
#ifndef _PTG_JPEG_H_
#define _PTG_JPEG_H_
#include "img_types.h"
#include "tng_hostdefs.h"
#include "va/va_enc_jpeg.h"
#define QUANT_TABLE_SIZE_BYTES (64)
#define MTX_MAX_COMPONENTS (3)
#define MAX_NUMBER_OF_MTX_UNITS 4 // Number of MTX units
typedef enum {
IMG_ERR_OK = 0, //!< OK
IMG_ERR_SURFACE_LOCKED = 1, //!< The requested surface was locked
IMG_ERR_MEMORY = 2, //!< A memory error occured
IMG_ERR_FILE = 3, //!< A file error occured
IMG_ERR_NOBUFFERAVAILABLE = 4, //!< No buffer was available
IMG_ERR_COMPLETE = 5, //!< Command is complete
IMG_ERR_INVALID_CONTEXT = 6, //!< An invalid context was given
IMG_ERR_INVALID_SIZE = 7, //!< An invalid size was given
IMG_ERR_TIMEOUT = 8, //!< Timeout
IMG_ERR_UNDEFINED = -1
} IMG_ERRORCODE;
/*****************************************************************************/
/* STREAMTYPEW */
/* Container to store the stream context */
/*****************************************************************************/
typedef struct {
IMG_UINT8 *Buffer; /*!< Ptr to the bitstream buffer */
IMG_UINT32 Offset; /*!< Offset in the bitstream buffer */
IMG_UINT32 Limit;
} STREAMTYPEW;
typedef struct {
IMG_UINT8 aui8LumaQuantParams[QUANT_TABLE_SIZE_BYTES]; //!< Luma quant params
IMG_UINT8 aui8ChromaQuantParams[QUANT_TABLE_SIZE_BYTES]; //!< Chroma quant params
} JPEG_MTX_QUANT_TABLE;
typedef struct {
IMG_UINT32 ui32MCUPositionOfScanAndPipeNo; //!< Scan start position in MCUs
IMG_UINT32 ui32MCUCntAndResetFlag; //!< [32:2] Number of MCU's to encode or decode, [1] Reset predictors (1=Reset, 0=No Reset)
} MTX_ISSUE_BUFFERS;
typedef struct {
IMG_UINT32 ui32PhysAddr; //!< Physical address Component plane in shared memory
IMG_UINT32 ui32Stride; //!< Stride of source plane */
IMG_UINT32 ui32Height; //!< Height of avaliable data in plane. shall be a minumum of one MCU high
} COMPONENTPLANE;
typedef struct {
IMG_UINT32 ui32WidthBlocks; //!< Width in pixels, shall be a multiple of 8
IMG_UINT32 ui32HeightBlocks; //!< Height in pixels, shall be a multiple of 8
IMG_UINT32 ui32XLimit; //!< Blocks will not be encoded beyond this
IMG_UINT32 ui32YLimit; //!< Blocks will not be encoded beyond this
} MCUCOMPONENT;
typedef struct {
COMPONENTPLANE ComponentPlane[MTX_MAX_COMPONENTS]; //!< Array of component plane source information (detailing physical address, stride and height)
MCUCOMPONENT MCUComponent[MTX_MAX_COMPONENTS]; //!< Array of Minimum Coded Unit information for each component plane
IMG_UINT32 ui32ComponentsInScan; //!< Number of components
IMG_UINT32 ui32TableA; //!< Quantisation table for Luma component
IMG_UINT16 ui16DataInterleaveStatus; //!< Source component interleave status (0, C_INTERLEAVE, LC_UVINTERLEAVE or LC_VUINTERLEAVE)
IMG_UINT16 ui16MaxPipes; //!< Maximum number of pipes to use in the encode
} JPEG_MTX_DMA_SETUP;
typedef struct
{
IMG_UINT32 apWritebackRegions[WB_FIFO_SIZE]; //!< Data section
} JPEG_MTX_WRITEBACK_MEMORY;
typedef struct {
IMG_UINT32 ui32BytesUsed; //!<
IMG_UINT32 ui32BytesEncoded; //!<
IMG_UINT32 ui32BytesToEncode; //!<
IMG_UINT32 ui32Reserved3; //!<
} BUFFER_HEADER;
typedef enum {
BUFFER_FREE = 1, //!< Buffer is not locked
HW_LOCK, //!< Buffer is locked by hardware
SW_LOCK, //!< Buffer is locked by software
NOTDEVICEMEMORY, //!< Buffer is not a device memory buffer
} LOCK_STATUS;
typedef struct {
void* pMemInfo; //!< Pointer to the memory handle for the buffer
LOCK_STATUS sLock; //!< Lock status for the buffer
IMG_UINT32 ui32Size; //!< Size in bytes of the buffer
IMG_UINT32 ui32BytesWritten; //!< Number of bytes written into buffer
} IMG_BUFFER, IMG_CODED_BUFFER;
typedef struct {
void *pMemInfo;
IMG_UINT16 ui16ScanNumber;
IMG_UINT32 ui32WriteBackVal;
IMG_INT8 i8PipeNumber; // Doubles as status indicator ( <0 = Awaiting output to CB, 0 = Idle, >0 = Being filled by MTX)
IMG_UINT32 MTXOpNum; // Handle returned from MTX issuebuff command, can be used to check for completion
IMG_UINT32 ui32DataBufferSizeBytes;
IMG_UINT32 ui32DataBufferUsedBytes;
} TOPAZHP_JPEG_BUFFER_INFO;
typedef struct {
IMG_UINT16 ui16CScan;
IMG_UINT16 ui16SScan;
IMG_UINT16 ui16ScansInImage;
IMG_UINT8 ui8MTXIdleCnt;
IMG_UINT8 aui8MTXIdleTable[MAX_NUMBER_OF_MTX_UNITS];
TOPAZHP_JPEG_BUFFER_INFO *aBufferTable;
IMG_UINT32 ui32NumberMCUsX;
IMG_UINT32 ui32NumberMCUsY;
IMG_UINT32 ui32NumberMCUsToEncode;
IMG_UINT32 ui32NumberMCUsToEncodePerScan;
IMG_UINT8 ui8NumberOfCodedBuffers;
} TOPAZHP_SCAN_ENCODE_INFO;
typedef struct {
IMG_UINT32 eFormat;
IMG_UINT16 ui16Quality;
IMG_UINT32 ui32OutputWidth;
IMG_UINT32 ui32OutputHeight;
IMG_UINT32 ui32InitialCBOffset;
object_surface_p pSourceSurface;
void *pMemInfoMTXSetup;
JPEG_MTX_DMA_SETUP* pMTXSetup;
void *pMemInfoWritebackMemory;
JPEG_MTX_WRITEBACK_MEMORY *pMTXWritebackMemory;
void *pMemInfoTableBlock;
JPEG_MTX_QUANT_TABLE *psTablesBlock;
IMG_UINT32 ui32Offsets[MTX_MAX_COMPONENTS];
TOPAZHP_SCAN_ENCODE_INFO sScan_Encode_Info;
/* New added elements after porting */
void *ctx;
IMG_INT32 NumCores;
IMG_CODED_BUFFER jpeg_coded_buf;
IMG_UINT32 ui32SizePerCodedBuffer;
MCUCOMPONENT MCUComponent[MTX_MAX_COMPONENTS];
} TOPAZHP_JPEG_ENCODER_CONTEXT;
#define PTG_JPEG_MAX_SCAN_NUM 7
extern struct format_vtable_s tng_JPEGES_vtable;
extern VAStatus tng_jpeg_AppendMarkers(object_context_p obj_context, void *raw_coded_buf);
#endif //_PTG_JPEG_H_