#pragma once
#include <stddef.h>
#include "windowsmediaphoto.h"
#include "common.h"
#ifdef __ppc__
#define _BIG__ENDIAN_
#endif
#ifdef ENABLE_OPTIMIZATIONS
#if defined(WIN32) && !defined(_WIN64)
#define WMP_OPT_SSE2
#define WMP_OPT_CC_ENC
#define WMP_OPT_CC_DEC
#define WMP_OPT_TRFM_DEC
#define X86OPT_INLINE
#endif
#endif
#if defined(WIN32) && !defined(UNDER_CE)
#define PLATFORM_X86
#include "../x86/x86.h"
#endif
#ifndef UNREFERENCED_PARAMETER
#define UNREFERENCED_PARAMETER(P) { (P) = (P); }
#endif
#ifdef UNDER_CE
#define PLATFORM_WCE
#include "arm.h"
#endif
#ifdef __ANSI__
#define PLATFORM_ANSI
#include "ansi.h"
#endif
#ifdef PLATFORM_ANSI
typedef unsigned long long U64;
#else
typedef unsigned __int64 U64;
#endif
#define MARKERCOUNT (PACKETLENGTH * 2)
CT_ASSERT(sizeof(UINTPTR_T) == sizeof(void*), strcodec1);
CT_ASSERT(sizeof(INTPTR_T) == sizeof(void*), strcodec2);
#define WRAPPTR(p, s) ((void*)((UINTPTR_T)(p) & ~(UINTPTR_T)(s)))
#define MASKPTR(p, m) ((void*)((UINTPTR_T)(p) & (INTPTR_T)(m)))
#define PACKET1(ps, pc, s) (((INTPTR_T)(ps) ^ (INTPTR_T)(pc)) & ((UINTPTR_T)(s)))
#define ALIGNUP(p, s) ((void*)(((UINTPTR_T)(p) + ((UINTPTR_T)(s) - 1)) & ~((UINTPTR_T)(s) - 1)))
#define ALIGNDOWN(p, s) ((void*)((UINTPTR_T)(p) & ~((UINTPTR_T)(s) - 1)))
#define TraceResult(a)
typedef enum tagPacketType
{
PK_NULL = 0,
PK_DC = 1, PK_AD, PK_AC, PK_CP,
PK_MAX,
} PACKETTYPE;
typedef struct tagIOContext
{
U8 P0[PACKETLENGTH];
U8 P1[PACKETLENGTH];
union
{
U8 P2[PACKETLENGTH];
struct
{
U32 uiShadow;
U32 uiAccumulator;
U32 cBitsUsed;
U8* pbPacket;
U8* pbCurrent;
struct WMPStream* pWS;
long offPacket;
U32 cIndex;
long offIndex;
}State;
}P2Info;
U8 P3[PACKETLENGTH];
} IOContext;
typedef struct tagMemReadState
{
U8* pbBuf;
size_t cbBuf;
size_t cbCur;
} MemReadState;
typedef struct tagBitIOInfo
{
U32 uiShadow;
U32 uiAccumulator;
U32 cBitsUsed;
#ifdef ARMOPT_BITIO
U32 cBitsUnused;
#endif
I32 iMask;
U8* pbStart;
#ifndef ARMOPT_BITIO
U8* pbCurrent;
#else
U32* pbCurrent;
#endif
struct WMPStream* pWS;
size_t offRef;
} BitIOInfo;
typedef struct tagCWMIQuantizer {
U8 iIndex;
I32 iQP;
I32 iOffset;
I32 iMan;
I32 iExp;
#if defined(WMP_OPT_QT)
float f1_QP;
double d1_QP;
#endif
} CWMIQuantizer;
typedef struct tagCWMIMBInfo {
I32 iBlockDC[MAX_CHANNELS][16];
I32 iOrientation;
Int iCBP[MAX_CHANNELS];
Int iDiffCBP[MAX_CHANNELS];
U8 iQIndexLP;
U8 iQIndexHP;
} CWMIMBInfo;
struct CWMImageStrCodec;
typedef Int (*ImageDataProc)(struct CWMImageStrCodec*);
typedef struct CAdaptiveScan {
U32 uTotal;
U32 uScan;
} CAdaptiveScan;
typedef struct CCodingContext {
BitIOInfo * m_pIODC;
BitIOInfo * m_pIOLP;
BitIOInfo * m_pIOAC;
BitIOInfo * m_pIOFL;
CAdaptiveHuffman *m_pAdaptHuffCBPCY;
CAdaptiveHuffman *m_pAdaptHuffCBPCY1;
CAdaptiveHuffman *m_pAHexpt[NUMVLCTABLES];
CAdaptiveScan m_aScanLowpass[16];
CAdaptiveScan m_aScanHoriz[16];
CAdaptiveScan m_aScanVert[16];
CAdaptiveModel m_aModelAC;
CAdaptiveModel m_aModelLP;
CAdaptiveModel m_aModelDC;
Int m_iCBPCountZero;
Int m_iCBPCountMax;
CCBPModel m_aCBPModel;
Int m_iTrimFlexBits;
Bool m_bInROI;
} CCodingContext;
typedef struct tagCWMIPredInfo {
Int iQPIndex;
Int iCBP;
PixelI iDC;
PixelI iAD[6];
PixelI * piAD;
}CWMIPredInfo;
typedef struct CWMImageStrCodecParameters {
size_t cVersion;
size_t cSubVersion;
COLORFORMAT cfColorFormat;
Bool bRBSwapped;
Bool bAlphaChannel;
Bool bScaledArith;
Bool bIndexTable;
Bool bTrimFlexbitsFlag;
Bool bUseHardTileBoundaries;
size_t cNumChannels;
size_t cExtraPixelsTop;
size_t cExtraPixelsLeft;
size_t cExtraPixelsBottom;
size_t cExtraPixelsRight;
Bool bTranscode;
U32 uQPMode;
U8 uiQPIndexDC[MAX_CHANNELS];
U8 uiQPIndexLP[MAX_CHANNELS];
U8 uiQPIndexHP[MAX_CHANNELS];
}CCoreParameters;
typedef struct CWMITile
{
CWMIQuantizer * pQuantizerDC[MAX_CHANNELS];
CWMIQuantizer * pQuantizerLP[MAX_CHANNELS];
CWMIQuantizer * pQuantizerHP[MAX_CHANNELS];
U8 cNumQPLP;
U8 cNumQPHP;
U8 cBitsLP;
U8 cBitsHP;
Bool bUseDC;
Bool bUseLP;
U8 cChModeDC;
U8 cChModeLP[16];
U8 cChModeHP[16];
} CWMITile;
#ifdef ARMOPT_COLORCONVERSION_C
#include "ARM_InvColorConversion.h"
#endif
struct tagPostProcInfo{
Int iMBDC;
U8 ucMBTexture;
Int iBlockDC[4][4];
U8 ucBlockTexture[4][4];
};
typedef struct CWMImageStrCodec {
#ifdef ARMOPT_COLORCONVERSION_C
CWMImageStrInvCCParam InvCCParam;
#endif
size_t cbStruct;
CWMImageInfo WMII;
CWMIStrCodecParam WMISCP;
CWMImageBufferInfo WMIBI;
CWMIMBInfo MBInfo;
CCoreParameters m_param;
struct CWMDecoderParameters *m_Dparam;
U8 cSB;
Bool m_bUVResolutionChange;
Bool bTileExtraction;
BitIOInfo * pIOHeader;
Bool bUseHardTileBoundaries;
PixelI * pInterU;
PixelI * pInterV;
size_t *pIndexTable;
size_t cTileRow;
size_t cTileColumn;
Bool m_bCtxLeft;
Bool m_bCtxTop;
Bool m_bResetRGITotals;
Bool m_bResetContext;
CWMITile * pTile;
BitIOInfo ** m_ppBitIO;
size_t cNumBitIO;
size_t cHeaderSize;
struct CCodingContext *m_pCodingContext;
size_t cNumCodingContext;
size_t cNumOfQPIndex;
U8 cBitsDQUANT;
size_t cRow;
size_t cColumn;
size_t cmbWidth;
size_t cmbHeight;
size_t cbChannel;
size_t mbX, mbY;
size_t tileX, tileY;
Bool bVertTileBoundary, bHoriTileBoundary;
Bool bOneMBLeftVertTB, bOneMBRightVertTB;
PixelI iPredBefore[2][2];
PixelI iPredAfter[2][2];
ImageDataProc Load;
ImageDataProc Transform;
ImageDataProc TransformCenter;
ImageDataProc Quantize;
ImageDataProc ProcessTopLeft;
ImageDataProc ProcessTop;
ImageDataProc ProcessTopRight;
ImageDataProc ProcessLeft;
ImageDataProc ProcessCenter;
ImageDataProc ProcessRight;
ImageDataProc ProcessBottomLeft;
ImageDataProc ProcessBottom;
ImageDataProc ProcessBottomRight;
PixelI *pPlane[MAX_CHANNELS];
PixelI *a0MBbuffer[MAX_CHANNELS];
PixelI *a1MBbuffer[MAX_CHANNELS];
PixelI *p0MBbuffer[MAX_CHANNELS];
PixelI *p1MBbuffer[MAX_CHANNELS];
PixelI * pResU;
PixelI * pResV;
CWMIPredInfo *PredInfo[MAX_CHANNELS];
CWMIPredInfo *PredInfoPrevRow[MAX_CHANNELS];
CWMIPredInfo *pPredInfoMemory;
struct WMPStream ** ppWStream;
#ifdef _WINDOWS_
TCHAR **ppTempFile;
#else
char **ppTempFile;
#endif
struct CWMImageStrCodec *m_pNextSC;
Bool m_bSecondary;
#ifndef DISABLE_PERF_MEASUREMENT
Bool m_fMeasurePerf;
struct PERFTIMERSTATE *m_ptEndToEndPerf;
struct PERFTIMERSTATE *m_ptEncDecPerf;
#endif
struct tagPostProcInfo * pPostProcInfo[MAX_CHANNELS][2];
} CWMImageStrCodec;
ERR WMPAlloc(void** ppv, size_t cb);
ERR WMPFree(void** ppv);
Void initMRPtr(CWMImageStrCodec*);
Void advanceMRPtr(CWMImageStrCodec*);
Void swapMRPtr(CWMImageStrCodec*);
Int IDPEmpty(CWMImageStrCodec*);
extern const int dctIndex[3][16];
extern const int blkOffset[16];
extern const int blkOffsetUV[4];
extern const int blkOffsetUV_422[8];
extern const U8 idxCC[16][16];
extern const U8 idxCC_420[8][8];
extern const Char gGDISignature[];
Int allocatePredInfo(CWMImageStrCodec*);
Void freePredInfo(CWMImageStrCodec*);
Void advanceOneMBRow(CWMImageStrCodec*);
Int allocateBitIOInfo(CWMImageStrCodec*);
Int setBitIOPointers(CWMImageStrCodec* pSC);
#ifndef ARMOPT_BITIO
U32 peekBit16(BitIOInfo* pIO, U32 cBits);
U32 flushBit16(BitIOInfo* pIO, U32 cBits);
U32 getBit16(BitIOInfo* pIO, U32 cBits);
U32 getBool16(BitIOInfo* pIO);
I32 getBit16s(BitIOInfo* pIO, U32 cBits);
U32 getBit32(BitIOInfo* pIO, U32 cBits);
U32 flushToByte(BitIOInfo* pIO);
#endif
Void putBit16z(BitIOInfo* pIO, U32 uiBits, U32 cBits);
Void putBit16(BitIOInfo* pIO, U32 uiBits, U32 cBits);
Void putBit32(BitIOInfo* pIO, U32 uiBits, U32 cBits);
Void fillToByte(BitIOInfo* pIO);
U32 getSizeRead(BitIOInfo* pIO);
U32 getSizeWrite(BitIOInfo* pIO);
U32 getPosRead(BitIOInfo* pIO);
#ifndef ARMOPT_BITIO
U32 getBit16_S(CWMImageStrCodec* pSC, BitIOInfo* pIO, U32 cBits);
#endif
ERR attachISRead(BitIOInfo* pIO, struct WMPStream* pWS, CWMImageStrCodec* pSC);
ERR readIS(CWMImageStrCodec* pSC, BitIOInfo* pIO);
ERR detachISRead(CWMImageStrCodec* pSC, BitIOInfo* pIO);
ERR attachISWrite(BitIOInfo* pIO, struct WMPStream* pWS);
ERR writeIS(CWMImageStrCodec* pSC, BitIOInfo* pIO);
ERR detachISWrite(CWMImageStrCodec* pSC, BitIOInfo* pIO);
Int initPostProc(struct tagPostProcInfo * strPostProcInfo[MAX_CHANNELS][2], size_t mbWidth, size_t iNumChannels);
Void termPostProc(struct tagPostProcInfo * strPostProcInfo[MAX_CHANNELS][2], size_t iNumChannels);
Void slideOneMBRow(struct tagPostProcInfo * strPostProcInfo[MAX_CHANNELS][2], size_t iNumChannels, size_t mbWidth, Bool top, Bool bottom);
Void updatePostProcInfo(struct tagPostProcInfo * strPostProcInfo[MAX_CHANNELS][2], PixelI * p, size_t mbX, size_t cc);
Void postProcMB(struct tagPostProcInfo * strPostProcInfo[MAX_CHANNELS][2], PixelI * p0, PixelI * p1, size_t mbX, size_t cc, Int threshold);
Void postProcBlock(struct tagPostProcInfo * strPostProcInfo[MAX_CHANNELS][2], PixelI * p0, PixelI * p1, size_t mbX, size_t cc, Int threshold);
typedef struct tagSimpleBitIO
{
struct WMPStream* pWS;
U32 cbRead;
U8 bAccumulator;
U32 cBitLeft;
} SimpleBitIO;
ERR attach_SB(SimpleBitIO* pSB, struct WMPStream* pWS);
U32 getBit32_SB(SimpleBitIO* pSB, U32 cBits);
Void flushToByte_SB(SimpleBitIO* pSB);
U32 getByteRead_SB(SimpleBitIO* pSB);
ERR detach_SB(SimpleBitIO* pSB);
EXTERN_C Bool EOSWS_File(struct WMPStream* pWS);
EXTERN_C ERR ReadWS_File(struct WMPStream* pWS, void* pv, size_t cb);
EXTERN_C ERR WriteWS_File(struct WMPStream* pWS, const void* pv, size_t cb);
EXTERN_C ERR SetPosWS_File(struct WMPStream* pWS, size_t offPos);
EXTERN_C ERR GetPosWS_File(struct WMPStream* pWS, size_t* poffPos);
EXTERN_C Bool EOSWS_Memory(struct WMPStream* pWS);
EXTERN_C ERR ReadWS_Memory(struct WMPStream* pWS, void* pv, size_t cb);
EXTERN_C ERR WriteWS_Memory(struct WMPStream* pWS, const void* pv, size_t cb);
EXTERN_C ERR SetPosWS_Memory(struct WMPStream* pWS, size_t offPos);
EXTERN_C ERR GetPosWS_Memory(struct WMPStream* pWS, size_t* poffPos);
EXTERN_C Bool EOSWS_List(struct WMPStream* pWS);
EXTERN_C ERR ReadWS_List(struct WMPStream* pWS, void* pv, size_t cb);
EXTERN_C ERR WriteWS_List(struct WMPStream* pWS, const void* pv, size_t cb);
EXTERN_C ERR SetPosWS_List(struct WMPStream* pWS, size_t offPos);
EXTERN_C ERR GetPosWS_List(struct WMPStream* pWS, size_t* poffPos);
EXTERN_C ERR CreateWS_List(struct WMPStream** ppWS);
EXTERN_C ERR CloseWS_List(struct WMPStream** ppWS);
typedef struct PacketInfo
{
BAND m_iBand;
size_t m_iSize;
size_t m_iOffset;
struct PacketInfo *m_pNext;
} PacketInfo;
const static Int blkIdxByRow[4][4] = {{0, 1, 4, 5}, {2, 3, 6, 7}, {8, 9, 12, 13}, {10, 11, 14, 15}};
const static Int blkIdxByColumn[4][4] = {{0, 2, 8, 10}, {1, 3, 9, 11},{4, 6, 12, 14},{5, 7, 13, 15}};
Int getACPredMode(CWMIMBInfo *, COLORFORMAT);
Int getDCACPredMode(CWMImageStrCodec *, size_t);
Void updatePredInfo(CWMImageStrCodec* pSC, CWMIMBInfo *, size_t, COLORFORMAT);
Int AllocateCodingContextDec(struct CWMImageStrCodec *pSC, Int iNumContexts);
Void ResetCodingContext(CCodingContext *pContext);
Void getTilePos(CWMImageStrCodec* pSC, size_t mbX, size_t mbY);
Void InitZigzagScan(CCodingContext * pSC);
Int checkImageBuffer(CWMImageStrCodec *, size_t, size_t);
EXTERN_C Void remapQP(CWMIQuantizer *, I32, Bool);
Int allocateTileInfo(CWMImageStrCodec *);
Void freeTileInfo(CWMImageStrCodec *);
Int allocateQuantizer(CWMIQuantizer * pQuantizer[MAX_CHANNELS], size_t, size_t);
Void freeQuantizer(CWMIQuantizer * pQuantizer[MAX_CHANNELS]);
Void setUniformQuantizer(CWMImageStrCodec *, size_t);
Void useDCQuantizer(CWMImageStrCodec *, size_t);
Void useLPQuantizer(CWMImageStrCodec *, size_t, size_t);
Void formatQuantizer(CWMIQuantizer * pQuantizer[MAX_CHANNELS], U8, size_t, size_t, Bool, Bool);
U8 dquantBits(U8);
#ifdef ARMOPT_BITIO
#define peekBit16 peekBits
#define flushBit16 flushBits
#define getBit16 getBits
#define getBit32 getBits
#define getBit16s getBitsS
#define getBool16(pIO) getBits(pIO, 1)
U32 peekBits(BitIOInfo* pIO, U32 cBits);
void flushBits(BitIOInfo* pIO, U32 cBits);
U32 getBits(BitIOInfo* pIO, U32 cBits);
U32 getBitsS(BitIOInfo* pIO, U32 cBits);
void flushToByte(BitIOInfo* pIO);
#endif
#define PEEKBIT16(pIO, cBits) \
assert(0 <= (I32)cBits && cBits <= 16);\
return (pIO->uiAccumulator >> (32 - cBits));
#define FLUSHBIT16(pIO, cBits) \
assert(0 <= (I32)cBits && cBits <= 16);\
assert((pIO->iMask & 1) == 0);\
pIO->cBitsUsed += cBits;\
pIO->pbCurrent = MASKPTR(pIO->pbCurrent + ((pIO->cBitsUsed >> 3)), pIO->iMask);\
pIO->cBitsUsed &= 16 - 1;\
pIO->uiAccumulator = LOAD16(pIO->pbCurrent) << pIO->cBitsUsed;\
return 0;
void OutputPerfTimerReport(CWMImageStrCodec *pState);