diff --git a/include/freerdp/codec/progressive.h b/include/freerdp/codec/progressive.h index d8181cdda..f373e6172 100644 --- a/include/freerdp/codec/progressive.h +++ b/include/freerdp/codec/progressive.h @@ -31,209 +31,6 @@ typedef struct _PROGRESSIVE_CONTEXT PROGRESSIVE_CONTEXT; #include #include -#define RFX_SUBBAND_DIFFING 0x01 - -#define RFX_TILE_DIFFERENCE 0x01 - -#define RFX_DWT_REDUCE_EXTRAPOLATE 0x01 - -#define PROGRESSIVE_WBT_SYNC 0xCCC0 -#define PROGRESSIVE_WBT_FRAME_BEGIN 0xCCC1 -#define PROGRESSIVE_WBT_FRAME_END 0xCCC2 -#define PROGRESSIVE_WBT_CONTEXT 0xCCC3 -#define PROGRESSIVE_WBT_REGION 0xCCC4 -#define PROGRESSIVE_WBT_TILE_SIMPLE 0xCCC5 -#define PROGRESSIVE_WBT_TILE_FIRST 0xCCC6 -#define PROGRESSIVE_WBT_TILE_UPGRADE 0xCCC7 - -struct _RFX_COMPONENT_CODEC_QUANT -{ - BYTE LL3; - BYTE HL3; - BYTE LH3; - BYTE HH3; - BYTE HL2; - BYTE LH2; - BYTE HH2; - BYTE HL1; - BYTE LH1; - BYTE HH1; -}; -typedef struct _RFX_COMPONENT_CODEC_QUANT RFX_COMPONENT_CODEC_QUANT; - -struct _RFX_PROGRESSIVE_CODEC_QUANT -{ - BYTE quality; - RFX_COMPONENT_CODEC_QUANT yQuantValues; - RFX_COMPONENT_CODEC_QUANT cbQuantValues; - RFX_COMPONENT_CODEC_QUANT crQuantValues; -}; -typedef struct _RFX_PROGRESSIVE_CODEC_QUANT RFX_PROGRESSIVE_CODEC_QUANT; - -struct _PROGRESSIVE_BLOCK -{ - UINT16 blockType; - UINT32 blockLen; -}; -typedef struct _PROGRESSIVE_BLOCK PROGRESSIVE_BLOCK; - -struct _PROGRESSIVE_BLOCK_SYNC -{ - UINT16 blockType; - UINT32 blockLen; - - UINT32 magic; - UINT16 version; -}; -typedef struct _PROGRESSIVE_BLOCK_SYNC PROGRESSIVE_BLOCK_SYNC; - -struct _PROGRESSIVE_BLOCK_CONTEXT -{ - UINT16 blockType; - UINT32 blockLen; - - BYTE ctxId; - UINT16 tileSize; - BYTE flags; -}; -typedef struct _PROGRESSIVE_BLOCK_CONTEXT PROGRESSIVE_BLOCK_CONTEXT; - -struct _RFX_PROGRESSIVE_TILE -{ - UINT16 blockType; - UINT32 blockLen; - - BYTE quantIdxY; - BYTE quantIdxCb; - BYTE quantIdxCr; - UINT16 xIdx; - UINT16 yIdx; - - BYTE flags; - BYTE quality; - - UINT16 yLen; - UINT16 cbLen; - UINT16 crLen; - UINT16 tailLen; - const BYTE* yData; - const BYTE* cbData; - const BYTE* crData; - const BYTE* tailData; - - UINT16 ySrlLen; - UINT16 yRawLen; - UINT16 cbSrlLen; - UINT16 cbRawLen; - UINT16 crSrlLen; - UINT16 crRawLen; - const BYTE* ySrlData; - const BYTE* yRawData; - const BYTE* cbSrlData; - const BYTE* cbRawData; - const BYTE* crSrlData; - const BYTE* crRawData; - - UINT32 x; - UINT32 y; - UINT32 width; - UINT32 height; - UINT32 format; - UINT32 stride; - - BYTE* data; - BYTE* current; - - UINT16 pass; - BYTE* sign; - RFX_COMPONENT_CODEC_QUANT yBitPos; - RFX_COMPONENT_CODEC_QUANT cbBitPos; - RFX_COMPONENT_CODEC_QUANT crBitPos; - RFX_COMPONENT_CODEC_QUANT yQuant; - RFX_COMPONENT_CODEC_QUANT cbQuant; - RFX_COMPONENT_CODEC_QUANT crQuant; - RFX_COMPONENT_CODEC_QUANT yProgQuant; - RFX_COMPONENT_CODEC_QUANT cbProgQuant; - RFX_COMPONENT_CODEC_QUANT crProgQuant; -}; -typedef struct _RFX_PROGRESSIVE_TILE RFX_PROGRESSIVE_TILE; - -struct _PROGRESSIVE_BLOCK_REGION -{ - UINT16 blockType; - UINT32 blockLen; - - BYTE tileSize; - UINT16 numRects; - BYTE numQuant; - BYTE numProgQuant; - BYTE flags; - UINT16 numTiles; - UINT32 tileDataSize; - RFX_RECT* rects; - RFX_COMPONENT_CODEC_QUANT* quantVals; - RFX_PROGRESSIVE_CODEC_QUANT* quantProgVals; - RFX_PROGRESSIVE_TILE** tiles; -}; -typedef struct _PROGRESSIVE_BLOCK_REGION PROGRESSIVE_BLOCK_REGION; - -struct _PROGRESSIVE_BLOCK_FRAME_BEGIN -{ - UINT16 blockType; - UINT32 blockLen; - - UINT32 frameIndex; - UINT16 regionCount; - PROGRESSIVE_BLOCK_REGION* regions; -}; -typedef struct _PROGRESSIVE_BLOCK_FRAME_BEGIN PROGRESSIVE_BLOCK_FRAME_BEGIN; - -struct _PROGRESSIVE_BLOCK_FRAME_END -{ - UINT16 blockType; - UINT32 blockLen; -}; -typedef struct _PROGRESSIVE_BLOCK_FRAME_END PROGRESSIVE_BLOCK_FRAME_END; - -struct _PROGRESSIVE_SURFACE_CONTEXT -{ - UINT16 id; - UINT32 width; - UINT32 height; - UINT32 gridWidth; - UINT32 gridHeight; - UINT32 gridSize; - RFX_PROGRESSIVE_TILE* tiles; -}; -typedef struct _PROGRESSIVE_SURFACE_CONTEXT PROGRESSIVE_SURFACE_CONTEXT; - -struct _PROGRESSIVE_CONTEXT -{ - BOOL Compressor; - - wBufferPool* bufferPool; - - UINT32 cRects; - RFX_RECT* rects; - - UINT32 format; - - UINT32 cTiles; - RFX_PROGRESSIVE_TILE** tiles; - - UINT32 cQuant; - RFX_COMPONENT_CODEC_QUANT* quantVals; - - UINT32 cProgQuant; - RFX_PROGRESSIVE_CODEC_QUANT* quantProgVals; - - PROGRESSIVE_BLOCK_REGION region; - RFX_PROGRESSIVE_CODEC_QUANT quantProgValFull; - - wHashTable* SurfaceContexts; - wLog* log; -}; - #ifdef __cplusplus extern "C" { #endif diff --git a/libfreerdp/codec/progressive.c b/libfreerdp/codec/progressive.c index ba1cb912f..ddbb01a66 100644 --- a/libfreerdp/codec/progressive.c +++ b/libfreerdp/codec/progressive.c @@ -37,6 +37,209 @@ #define TAG FREERDP_TAG("codec.progressive") +#define RFX_SUBBAND_DIFFING 0x01 + +#define RFX_TILE_DIFFERENCE 0x01 + +#define RFX_DWT_REDUCE_EXTRAPOLATE 0x01 + +#define PROGRESSIVE_WBT_SYNC 0xCCC0 +#define PROGRESSIVE_WBT_FRAME_BEGIN 0xCCC1 +#define PROGRESSIVE_WBT_FRAME_END 0xCCC2 +#define PROGRESSIVE_WBT_CONTEXT 0xCCC3 +#define PROGRESSIVE_WBT_REGION 0xCCC4 +#define PROGRESSIVE_WBT_TILE_SIMPLE 0xCCC5 +#define PROGRESSIVE_WBT_TILE_FIRST 0xCCC6 +#define PROGRESSIVE_WBT_TILE_UPGRADE 0xCCC7 + +struct _RFX_COMPONENT_CODEC_QUANT +{ + BYTE LL3; + BYTE HL3; + BYTE LH3; + BYTE HH3; + BYTE HL2; + BYTE LH2; + BYTE HH2; + BYTE HL1; + BYTE LH1; + BYTE HH1; +}; +typedef struct _RFX_COMPONENT_CODEC_QUANT RFX_COMPONENT_CODEC_QUANT; + +struct _RFX_PROGRESSIVE_CODEC_QUANT +{ + BYTE quality; + RFX_COMPONENT_CODEC_QUANT yQuantValues; + RFX_COMPONENT_CODEC_QUANT cbQuantValues; + RFX_COMPONENT_CODEC_QUANT crQuantValues; +}; +typedef struct _RFX_PROGRESSIVE_CODEC_QUANT RFX_PROGRESSIVE_CODEC_QUANT; + +struct _PROGRESSIVE_BLOCK +{ + UINT16 blockType; + UINT32 blockLen; +}; +typedef struct _PROGRESSIVE_BLOCK PROGRESSIVE_BLOCK; + +struct _PROGRESSIVE_BLOCK_SYNC +{ + UINT16 blockType; + UINT32 blockLen; + + UINT32 magic; + UINT16 version; +}; +typedef struct _PROGRESSIVE_BLOCK_SYNC PROGRESSIVE_BLOCK_SYNC; + +struct _PROGRESSIVE_BLOCK_CONTEXT +{ + UINT16 blockType; + UINT32 blockLen; + + BYTE ctxId; + UINT16 tileSize; + BYTE flags; +}; +typedef struct _PROGRESSIVE_BLOCK_CONTEXT PROGRESSIVE_BLOCK_CONTEXT; + +struct _RFX_PROGRESSIVE_TILE +{ + UINT16 blockType; + UINT32 blockLen; + + BYTE quantIdxY; + BYTE quantIdxCb; + BYTE quantIdxCr; + UINT16 xIdx; + UINT16 yIdx; + + BYTE flags; + BYTE quality; + + UINT16 yLen; + UINT16 cbLen; + UINT16 crLen; + UINT16 tailLen; + const BYTE* yData; + const BYTE* cbData; + const BYTE* crData; + const BYTE* tailData; + + UINT16 ySrlLen; + UINT16 yRawLen; + UINT16 cbSrlLen; + UINT16 cbRawLen; + UINT16 crSrlLen; + UINT16 crRawLen; + const BYTE* ySrlData; + const BYTE* yRawData; + const BYTE* cbSrlData; + const BYTE* cbRawData; + const BYTE* crSrlData; + const BYTE* crRawData; + + UINT32 x; + UINT32 y; + UINT32 width; + UINT32 height; + UINT32 format; + UINT32 stride; + + BYTE* data; + BYTE* current; + + UINT16 pass; + BYTE* sign; + RFX_COMPONENT_CODEC_QUANT yBitPos; + RFX_COMPONENT_CODEC_QUANT cbBitPos; + RFX_COMPONENT_CODEC_QUANT crBitPos; + RFX_COMPONENT_CODEC_QUANT yQuant; + RFX_COMPONENT_CODEC_QUANT cbQuant; + RFX_COMPONENT_CODEC_QUANT crQuant; + RFX_COMPONENT_CODEC_QUANT yProgQuant; + RFX_COMPONENT_CODEC_QUANT cbProgQuant; + RFX_COMPONENT_CODEC_QUANT crProgQuant; +}; +typedef struct _RFX_PROGRESSIVE_TILE RFX_PROGRESSIVE_TILE; + +struct _PROGRESSIVE_BLOCK_REGION +{ + UINT16 blockType; + UINT32 blockLen; + + BYTE tileSize; + UINT16 numRects; + BYTE numQuant; + BYTE numProgQuant; + BYTE flags; + UINT16 numTiles; + UINT32 tileDataSize; + RFX_RECT* rects; + RFX_COMPONENT_CODEC_QUANT* quantVals; + RFX_PROGRESSIVE_CODEC_QUANT* quantProgVals; + RFX_PROGRESSIVE_TILE** tiles; +}; +typedef struct _PROGRESSIVE_BLOCK_REGION PROGRESSIVE_BLOCK_REGION; + +struct _PROGRESSIVE_BLOCK_FRAME_BEGIN +{ + UINT16 blockType; + UINT32 blockLen; + + UINT32 frameIndex; + UINT16 regionCount; + PROGRESSIVE_BLOCK_REGION* regions; +}; +typedef struct _PROGRESSIVE_BLOCK_FRAME_BEGIN PROGRESSIVE_BLOCK_FRAME_BEGIN; + +struct _PROGRESSIVE_BLOCK_FRAME_END +{ + UINT16 blockType; + UINT32 blockLen; +}; +typedef struct _PROGRESSIVE_BLOCK_FRAME_END PROGRESSIVE_BLOCK_FRAME_END; + +struct _PROGRESSIVE_SURFACE_CONTEXT +{ + UINT16 id; + UINT32 width; + UINT32 height; + UINT32 gridWidth; + UINT32 gridHeight; + UINT32 gridSize; + RFX_PROGRESSIVE_TILE* tiles; +}; +typedef struct _PROGRESSIVE_SURFACE_CONTEXT PROGRESSIVE_SURFACE_CONTEXT; + +struct _PROGRESSIVE_CONTEXT +{ + BOOL Compressor; + + wBufferPool* bufferPool; + + UINT32 cRects; + RFX_RECT* rects; + + UINT32 format; + + UINT32 cTiles; + RFX_PROGRESSIVE_TILE** tiles; + + UINT32 cQuant; + RFX_COMPONENT_CODEC_QUANT* quantVals; + + UINT32 cProgQuant; + RFX_PROGRESSIVE_CODEC_QUANT* quantProgVals; + + PROGRESSIVE_BLOCK_REGION region; + RFX_PROGRESSIVE_CODEC_QUANT quantProgValFull; + + wHashTable* SurfaceContexts; + wLog* log; +}; + static const char* progressive_get_block_type_string(UINT16 blockType) { switch (blockType) @@ -846,7 +1049,7 @@ static INLINE int progressive_decompress_tile_first(PROGRESSIVE_CONTEXT* progres pSrcDst[2], pCurrent[2], pSign[2], diff); /* Cr */ prims->yCbCrToRGB_16s8u_P3AC4R((const INT16**) pSrcDst, 64 * 2, tile->data, tile->format, - 64 * GetBytesPerPixel(progressive->format), &roi_64x64); + tile->stride, &roi_64x64); BufferPool_Return(progressive->bufferPool, pBuffer); return 1; }