Alien-FreeImage
view release on metacpan or search on metacpan
src/Source/LibJXR/image/encode/strenc.c view on Meta::CPAN
if(allocateQuantizer(pTile->pQuantizerHP, pSC->m_param.cNumChannels, pTile->cNumQPHP) != ICERR_OK)
return ICERR_ERROR;
if(pTile->bUseLP == TRUE)
useLPQuantizer(pSC, pTile->cNumQPHP, pSC->cTileColumn);
else{
putBit16(pIO, pTile->cNumQPHP - 1, 4);
pTile->cBitsHP = dquantBits(pTile->cNumQPHP);
for(i = 0; i < pTile->cNumQPHP; i ++){
pTile->cChModeHP[i] = (U8)(rand() & 3); // channel mode, just for concept proofing!
for(j = 0; j < pSC->m_param.cNumChannels; j ++)
pTile->pQuantizerHP[j][i].iIndex = (U8)((rand() & 0xfe) + 1); // QP indexes, just for concept proofing!
formatQuantizer(pTile->pQuantizerHP, pTile->cChModeHP[i], pSC->m_param.cNumChannels, i, FALSE, pSC->m_param.bScaledArith);
writeQuantizer(pTile->pQuantizerHP, pIO, pTile->cChModeHP[i], pSC->m_param.cNumChannels, i);
}
}
}
pSC = pSC->m_pNextSC;
}
return ICERR_OK;
}
Int encodeMB(CWMImageStrCodec * pSC, Int iMBX, Int iMBY)
{
CCodingContext * pContext = &pSC->m_pCodingContext[pSC->cTileColumn];
if(pSC->m_bCtxLeft && pSC->m_bCtxTop && pSC->m_bSecondary == FALSE && pSC->m_param.bTranscode == FALSE){ // write packet headers
U8 pID = (U8)((pSC->cTileRow * (pSC->WMISCP.cNumOfSliceMinus1V + 1) + pSC->cTileColumn) & 0x1F);
if(pSC->WMISCP.bfBitstreamFormat == SPATIAL) {
writePacketHeader(pContext->m_pIODC, 0, pID);
if (pSC->m_param.bTrimFlexbitsFlag)
putBit16(pContext->m_pIODC, pContext->m_iTrimFlexBits, 4);
writeTileHeaderDC(pSC, pContext->m_pIODC);
writeTileHeaderLP(pSC, pContext->m_pIODC);
writeTileHeaderHP(pSC, pContext->m_pIODC);
}
else{
writePacketHeader(pContext->m_pIODC, 1, pID);
writeTileHeaderDC(pSC, pContext->m_pIODC);
if(pSC->cSB > 1){
writePacketHeader(pContext->m_pIOLP, 2, pID);
writeTileHeaderLP(pSC, pContext->m_pIOLP);
}
if(pSC->cSB > 2){
writePacketHeader(pContext->m_pIOAC, 3, pID);
writeTileHeaderHP(pSC, pContext->m_pIOAC);
}
if(pSC->cSB > 3) {
writePacketHeader(pContext->m_pIOFL, 4, pID);
if (pSC->m_param.bTrimFlexbitsFlag)
putBit16(pContext->m_pIOFL, pContext->m_iTrimFlexBits, 4);
}
}
}
if(EncodeMacroblockDC(pSC, pContext, iMBX, iMBY) != ICERR_OK)
return ICERR_ERROR;
if(pSC->WMISCP.sbSubband != SB_DC_ONLY)
if(EncodeMacroblockLowpass(pSC, pContext, iMBX, iMBY) != ICERR_OK)
return ICERR_ERROR;
if(pSC->WMISCP.sbSubband != SB_DC_ONLY && pSC->WMISCP.sbSubband != SB_NO_HIGHPASS)
if(EncodeMacroblockHighpass(pSC, pContext, iMBX, iMBY) != ICERR_OK)
return ICERR_ERROR;
if(iMBX + 1 == (int) pSC->cmbWidth && (iMBY + 1 == (int) pSC->cmbHeight ||
(pSC->cTileRow < pSC->WMISCP.cNumOfSliceMinus1H && iMBY == (int) pSC->WMISCP.uiTileY[pSC->cTileRow + 1] - 1)))
{ // end of a horizontal slice
size_t k, l;
// get sizes of each packet and update index table
if (pSC->m_pNextSC == NULL || pSC->m_bSecondary) {
for(k = 0; k < pSC->cNumBitIO; k ++){
fillToByte(pSC->m_ppBitIO[k]);
pSC->ppWStream[k]->GetPos(pSC->ppWStream[k], &l);
pSC->pIndexTable[pSC->cNumBitIO * pSC->cTileRow + k] = l + getSizeWrite(pSC->m_ppBitIO[k]); // offset
}
}
// reset coding contexts
if(iMBY + 1 != (int) pSC->cmbHeight){
for(k = 0; k <= pSC->WMISCP.cNumOfSliceMinus1V; k ++)
ResetCodingContextEnc(&pSC->m_pCodingContext[k]);
}
}
return ICERR_OK;
}
/*************************************************************************
Top level function for processing a macroblock worth of input
*************************************************************************/
Int processMacroblock(CWMImageStrCodec *pSC)
{
Bool topORleft = (pSC->cColumn == 0 || pSC->cRow == 0);
ERR_CODE result = ICERR_OK;
size_t j, jend = (pSC->m_pNextSC != NULL);
for (j = 0; j <= jend; j++) {
transformMacroblock(pSC);
if(!topORleft){
getTilePos(pSC, (Int)pSC->cColumn - 1, (Int)pSC->cRow - 1);
if(jend){
pSC->m_pNextSC->cTileRow = pSC->cTileRow;
pSC->m_pNextSC->cTileColumn = pSC->cTileColumn;
}
if ((result = encodeMB(pSC, (Int)pSC->cColumn - 1, (Int)pSC->cRow - 1)) != ICERR_OK)
return result;
}
if (jend) {
pSC->m_pNextSC->cRow = pSC->cRow;
pSC->m_pNextSC->cColumn = pSC->cColumn;
pSC = pSC->m_pNextSC;
}
}
return ICERR_OK;
}
/*************************************************************************
forwardRGBE: forward conversion from RGBE to RGB
*************************************************************************/
static _FORCEINLINE PixelI forwardRGBE (PixelI RGB, PixelI E)
{
PixelI iResult = 0, iAppend = 1;
if (E == 0)
return 0;
assert (E!=0);
E--;
while (((RGB & 0x80) == 0) && (E > 0)) {
RGB = (RGB << 1) + iAppend;
iAppend = 0;
E--;
}
// result will always be one of 3 cases
// E RGB convert to
// 0 [0.x] [0 x]
// 0 [1.x] [1 x]
// e [1.x] [e+1 x]
if (E == 0) {
iResult = RGB;
}
else {
E++;
iResult = (RGB & 0x7f) + (E << 7);
}
return iResult;
}
/*************************************************************************
convert float-32 into float with (c, lm)!!
*************************************************************************/
static _FORCEINLINE PixelI float2pixel (float f, const char _c, const unsigned char _lm)
{
src/Source/LibJXR/image/encode/strenc.c view on Meta::CPAN
/** YUV_420 => Y_ONLY **/
/** unsupported color transcoding **/
/** Y_ONLY, YUV_420, YUV_422 => YUV_444 **/
/** Y_ONLY, YUV_420 => YUV_422 **/
/** Y_ONLY => YUV_420 **/
if((pII->cfColorFormat == Y_ONLY && pSCP->cfColorFormat != Y_ONLY) ||
(pSCP->cfColorFormat == YUV_422 && (pII->cfColorFormat == YUV_420 || pII->cfColorFormat == Y_ONLY)) ||
(pSCP->cfColorFormat == YUV_444 && (pII->cfColorFormat == YUV_422 || pII->cfColorFormat == YUV_420 || pII->cfColorFormat == Y_ONLY))){
pSCP->cfColorFormat = pII->cfColorFormat; // force not to do color transcoding!
}
else if (pII->cfColorFormat == NCOMPONENT) {
pSCP->cfColorFormat = NCOMPONENT; // force not to do color transcoding!
}
if (CMYK == pII->cfColorFormat && pSCP->cfColorFormat == NCOMPONENT)
{
pSCP->cfColorFormat = CMYK;
}
if(pSCP->cfColorFormat != NCOMPONENT){
if(pSCP->cfColorFormat == Y_ONLY)
pSCP->cChannel = 1;
else if(pSCP->cfColorFormat == CMYK)
pSCP->cChannel = 4;
else
pSCP->cChannel = 3;
}
if(pSCP->sbSubband >= SB_MAX)
pSCP->sbSubband = SB_ALL;
pII->cChromaCenteringX = 0;
pII->cChromaCenteringY = 0;
return ICERR_OK;
}
/*************************************************************************
Initialization of CWMImageStrCodec struct
*************************************************************************/
static Void InitializeStrEnc(CWMImageStrCodec *pSC,
const CWMImageInfo* pII, const CWMIStrCodecParam *pSCP)
{
pSC->cbStruct = sizeof(*pSC);
pSC->WMII = *pII;
pSC->WMISCP = *pSCP;
// set nExpBias
if (pSC->WMISCP.nExpBias == 0)
pSC->WMISCP.nExpBias = 4 + 128;//default
pSC->WMISCP.nExpBias += 128; // rollover arithmetic
pSC->cRow = 0;
pSC->cColumn = 0;
pSC->cmbWidth = (pSC->WMII.cWidth + 15) / 16;
pSC->cmbHeight = (pSC->WMII.cHeight + 15) / 16;
pSC->Load = inputMBRow;
pSC->Quantize = quantizeMacroblock;
pSC->ProcessTopLeft = processMacroblock;
pSC->ProcessTop = processMacroblock;
pSC->ProcessTopRight = processMacroblock;
pSC->ProcessLeft = processMacroblock;
pSC->ProcessCenter = processMacroblock;
pSC->ProcessRight = processMacroblock;
pSC->ProcessBottomLeft = processMacroblock;
pSC->ProcessBottom = processMacroblock;
pSC->ProcessBottomRight = processMacroblock;
pSC->m_pNextSC = NULL;
pSC->m_bSecondary = FALSE;
}
/*************************************************************************
Streaming API init
*************************************************************************/
Int ImageStrEncInit(
CWMImageInfo* pII,
CWMIStrCodecParam *pSCP,
CTXSTRCODEC* pctxSC)
{
static size_t cbChannels[BD_MAX] = {2, 4};
size_t cbChannel = 0, cblkChroma = 0, i;
size_t cbMacBlockStride = 0, cbMacBlockChroma = 0, cMacBlock = 0;
CWMImageStrCodec* pSC = NULL, *pNextSC = NULL;
char* pb = NULL;
size_t cb = 0;
Bool b32bit = sizeof(size_t) == 4;
Int err;
if(ValidateArgs(pII, pSCP) != ICERR_OK){
goto ErrorExit;
}
//================================================
*pctxSC = NULL;
//================================================
cbChannel = cbChannels[pSCP->bdBitDepth];
cblkChroma = cblkChromas[pSCP->cfColorFormat];
cbMacBlockStride = cbChannel * 16 * 16;
cbMacBlockChroma = cbChannel * 16 * cblkChroma;
cMacBlock = (pII->cWidth + 15) / 16;
//================================================
cb = sizeof(*pSC) + (128 - 1) + (PACKETLENGTH * 4 - 1) + (PACKETLENGTH * 2 ) + sizeof(*pSC->pIOHeader);
i = cbMacBlockStride + cbMacBlockChroma * (pSCP->cChannel - 1);
if(b32bit) // integer overlow/underflow check for 32-bit system
if(((cMacBlock >> 15) * i) & 0xffff0000)
return ICERR_ERROR;
i *= cMacBlock * 2;
cb += i;
pb = malloc(cb);
if (NULL == pb)
{
goto ErrorExit;
}
memset(pb, 0, cb);
//================================================
pSC = (CWMImageStrCodec*)pb; pb += sizeof(*pSC);
// Set up perf timers
PERFTIMER_ONLY(pSC->m_fMeasurePerf = pSCP->fMeasurePerf);
PERFTIMER_NEW(pSC->m_fMeasurePerf, &pSC->m_ptEndToEndPerf);
PERFTIMER_NEW(pSC->m_fMeasurePerf, &pSC->m_ptEncDecPerf);
PERFTIMER_START(pSC->m_fMeasurePerf, pSC->m_ptEndToEndPerf);
PERFTIMER_START(pSC->m_fMeasurePerf, pSC->m_ptEncDecPerf);
PERFTIMER_COPYSTARTTIME(pSC->m_fMeasurePerf, pSC->m_ptEncDecPerf, pSC->m_ptEndToEndPerf);
pSC->m_param.cfColorFormat = pSCP->cfColorFormat;
pSC->m_param.bAlphaChannel = (pSCP->uAlphaMode == 3);
pSC->m_param.cNumChannels = pSCP->cChannel;
pSC->m_param.cExtraPixelsTop = pSC->m_param.cExtraPixelsBottom
= pSC->m_param.cExtraPixelsLeft = pSC->m_param.cExtraPixelsRight = 0;
pSC->cbChannel = cbChannel;
pSC->m_param.bTranscode = pSC->bTileExtraction = FALSE;
//================================================
InitializeStrEnc(pSC, pII, pSCP);
//================================================
// 2 Macro Row buffers for each channel
pb = ALIGNUP(pb, 128);
for (i = 0; i < pSC->m_param.cNumChannels; i++) {
pSC->a0MBbuffer[i] = (PixelI*)pb; pb += cbMacBlockStride * pSC->cmbWidth;
pSC->a1MBbuffer[i] = (PixelI*)pb; pb += cbMacBlockStride * pSC->cmbWidth;
cbMacBlockStride = cbMacBlockChroma;
}
//================================================
// lay 2 aligned IO buffers just below pIO struct
pb = (char*)ALIGNUP(pb, PACKETLENGTH * 4) + PACKETLENGTH * 2;
pSC->pIOHeader = (BitIOInfo*)pb;
//================================================
err = StrEncInit(pSC);
if (ICERR_OK != err)
goto ErrorExit;
// if interleaved alpha is needed
if (pSC->m_param.bAlphaChannel) {
cbMacBlockStride = cbChannel * 16 * 16;
// 1. allocate new pNextSC info
//================================================
cb = sizeof(*pNextSC) + (128 - 1) + cbMacBlockStride * cMacBlock * 2;
pb = malloc(cb);
if (NULL == pb)
{
goto ErrorExit;
}
memset(pb, 0, cb);
//================================================
pNextSC = (CWMImageStrCodec*)pb; pb += sizeof(*pNextSC);
// 2. initialize pNextSC
pNextSC->m_param.cfColorFormat = Y_ONLY;
pNextSC->m_param.cNumChannels = 1;
pNextSC->m_param.bAlphaChannel = TRUE;
pNextSC->cbChannel = cbChannel;
//================================================
// 3. initialize arrays
InitializeStrEnc(pNextSC, pII, pSCP);
//================================================
// 2 Macro Row buffers for each channel
pb = ALIGNUP(pb, 128);
pNextSC->a0MBbuffer[0] = (PixelI*)pb; pb += cbMacBlockStride * pNextSC->cmbWidth;
pNextSC->a1MBbuffer[0] = (PixelI*)pb; pb += cbMacBlockStride * pNextSC->cmbWidth;
//================================================
pNextSC->pIOHeader = pSC->pIOHeader;
//================================================
// 4. link pSC->pNextSC = pNextSC
pNextSC->m_pNextSC = pSC;
pNextSC->m_bSecondary = TRUE;
// 5. StrEncInit
StrEncInit(pNextSC);
// 6. Write header of image plane
WriteImagePlaneHeader(pNextSC);
}
pSC->m_pNextSC = pNextSC;
//================================================
*pctxSC = (CTXSTRCODEC)pSC;
writeIndexTableNull(pSC);
#if defined(WMP_OPT_SSE2) || defined(WMP_OPT_CC_ENC) || defined(WMP_OPT_TRFM_ENC)
StrEncOpt(pSC);
#endif // OPT defined
PERFTIMER_STOP(pSC->m_fMeasurePerf, pSC->m_ptEncDecPerf);
return ICERR_OK;
ErrorExit:
return ICERR_ERROR;
}
/*************************************************************************
Streaming API encode
*************************************************************************/
Int ImageStrEncEncode(
CTXSTRCODEC ctxSC,
const CWMImageBufferInfo* pBI)
{
CWMImageStrCodec* pSC = (CWMImageStrCodec*)ctxSC;
CWMImageStrCodec* pNextSC = pSC->m_pNextSC;
ImageDataProc ProcessLeft, ProcessCenter, ProcessRight;
if (sizeof(*pSC) != pSC->cbStruct)
{
return ICERR_ERROR;
}
//================================
PERFTIMER_START(pSC->m_fMeasurePerf, pSC->m_ptEncDecPerf);
pSC->WMIBI = *pBI;
pSC->cColumn = 0;
initMRPtr(pSC);
if (pNextSC)
pNextSC->WMIBI = *pBI;
if (0 == pSC->cRow) {
( run in 0.932 second using v1.01-cache-2.11-cpan-0bd6704ced7 )