Alien-FreeImage
view release on metacpan or search on metacpan
src/Source/LibJXR/image/decode/strdec.c view on Meta::CPAN
if(pSC->m_Dparam->cThumbnailScale >= 4)
pSC->m_Dparam->bDecodeHP = FALSE; // no need to decode HP
if(pSC->m_Dparam->cThumbnailScale >= 16)
pSC->m_Dparam->bDecodeLP = FALSE; // only need to decode DC
}
// original image size
pWMII->cWidth += pSC->m_param.cExtraPixelsLeft + pSC->m_param.cExtraPixelsRight;
pWMII->cHeight += pSC->m_param.cExtraPixelsTop + pSC->m_param.cExtraPixelsBottom;
/** region decode stuff */
pSC->m_Dparam->cROILeftX = pWMII->cROILeftX * pSC->m_Dparam->cThumbnailScale + pSC->m_param.cExtraPixelsLeft;
pSC->m_Dparam->cROIRightX = pSC->m_Dparam->cROILeftX + pWMII->cROIWidth * pSC->m_Dparam->cThumbnailScale - 1;
pSC->m_Dparam->cROITopY = pWMII->cROITopY * pSC->m_Dparam->cThumbnailScale + pSC->m_param.cExtraPixelsTop;
pSC->m_Dparam->cROIBottomY = pSC->m_Dparam->cROITopY + pWMII->cROIHeight * pSC->m_Dparam->cThumbnailScale - 1;
if(pSC->m_Dparam->cROIRightX >= pWMII->cWidth)
pSC->m_Dparam->cROIRightX = pWMII->cWidth - 1;
if(pSC->m_Dparam->cROIBottomY >= pWMII->cHeight)
pSC->m_Dparam->cROIBottomY = pWMII->cHeight - 1;
pSC->m_Dparam->bDecodeFullFrame = (pSC->m_Dparam->cROILeftX + pSC->m_Dparam->cROITopY == 0 &&
((pSC->m_Dparam->cROIRightX + 15) / 16 >= (pWMII->cWidth + 14) / 16) && ((pSC->m_Dparam->cROIBottomY + 15) / 16 >= (pWMII->cHeight + 14) / 16));
pSC->m_Dparam->bDecodeFullWidth = (pSC->m_Dparam->cROILeftX == 0 && ((pSC->m_Dparam->cROIRightX + 15) / 16 >= (pWMII->cWidth + 14) / 16));
// inscribed image size
pWMII->cWidth -= pSC->m_param.cExtraPixelsLeft + pSC->m_param.cExtraPixelsRight;
pWMII->cHeight -= pSC->m_param.cExtraPixelsTop + pSC->m_param.cExtraPixelsBottom;
if(pSC->WMISCP.bfBitstreamFormat == FREQUENCY && pWMII->bSkipFlexbits == TRUE)
pSC->m_Dparam->bSkipFlexbits = TRUE;
pSC->cTileColumn = pSC->cTileRow = 0;
}
Int StrDecInit(CWMImageStrCodec* pSC)
{
// CWMImageInfo * pWMII = &pSC->WMII;
COLORFORMAT cfInt = pSC->m_param.cfColorFormat;
COLORFORMAT cfExt = pSC->WMII.cfColorFormat;
size_t i;
/** color transcoding with resolution change **/
pSC->m_bUVResolutionChange = ((cfExt != Y_ONLY) && ((cfInt == YUV_420 && cfExt != YUV_420) ||
(cfInt == YUV_422 && cfExt != YUV_422))) && !pSC->WMISCP.bYUVData;
if(pSC->m_bUVResolutionChange){
pSC->pResU = (PixelI *)malloc((cfExt == YUV_422 ? 128 : 256) * pSC->cmbWidth * sizeof(PixelI));
pSC->pResV = (PixelI *)malloc((cfExt == YUV_422 ? 128 : 256) * pSC->cmbWidth * sizeof(PixelI));
if(pSC->pResU == NULL || pSC->pResV == NULL || (cfExt == YUV_422 ? 128 : 256) * pSC->cmbWidth * sizeof(PixelI) < pSC->cmbWidth){
return ICERR_ERROR;
}
}
if(allocatePredInfo(pSC) != ICERR_OK){
return ICERR_ERROR;
}
if(allocateTileInfo(pSC) != ICERR_OK)
return ICERR_ERROR;
if((pSC->m_param.uQPMode & 1) == 0){ // DC frame uniform quantization
if(allocateQuantizer(pSC->pTile[0].pQuantizerDC, pSC->m_param.cNumChannels, 1) != ICERR_OK)
return ICERR_ERROR;
setUniformQuantizer(pSC, 0);
for(i = 0; i < pSC->m_param.cNumChannels; i ++)
pSC->pTile[0].pQuantizerDC[i]->iIndex = pSC->m_param.uiQPIndexDC[i];
formatQuantizer(pSC->pTile[0].pQuantizerDC, (pSC->m_param.uQPMode >> 3) & 3, pSC->m_param.cNumChannels, 0, TRUE, pSC->m_param.bScaledArith);
}
if(pSC->WMISCP.sbSubband != SB_DC_ONLY){
if((pSC->m_param.uQPMode & 2) == 0){ // LP frame uniform quantization
if(allocateQuantizer(pSC->pTile[0].pQuantizerLP, pSC->m_param.cNumChannels, 1) != ICERR_OK)
return ICERR_ERROR;
setUniformQuantizer(pSC, 1);
if((pSC->m_param.uQPMode & 0x200) == 0) // use DC quantizer
useDCQuantizer(pSC, 0);
else{
for(i = 0; i < pSC->m_param.cNumChannels; i ++)
pSC->pTile[0].pQuantizerLP[i]->iIndex = pSC->m_param.uiQPIndexLP[i];
formatQuantizer(pSC->pTile[0].pQuantizerLP, (pSC->m_param.uQPMode >> 5) & 3, pSC->m_param.cNumChannels, 0, TRUE, pSC->m_param.bScaledArith);
}
}
if(pSC->WMISCP.sbSubband != SB_NO_HIGHPASS){
if((pSC->m_param.uQPMode & 4) == 0){ // HP frame uniform quantization
if(allocateQuantizer(pSC->pTile[0].pQuantizerHP, pSC->m_param.cNumChannels, 1) != ICERR_OK)
return ICERR_ERROR;
setUniformQuantizer(pSC, 2);
if((pSC->m_param.uQPMode & 0x400) == 0) // use LP quantizer
useLPQuantizer(pSC, 1, 0);
else{
for(i = 0; i < pSC->m_param.cNumChannels; i ++)
pSC->pTile[0].pQuantizerHP[i]->iIndex = pSC->m_param.uiQPIndexHP[i];
formatQuantizer(pSC->pTile[0].pQuantizerHP, (pSC->m_param.uQPMode >> 7) & 3, pSC->m_param.cNumChannels, 0, FALSE, pSC->m_param.bScaledArith);
}
}
}
}
if(pSC->WMISCP.cNumOfSliceMinus1V >= MAX_TILES || AllocateCodingContextDec(pSC, pSC->WMISCP.cNumOfSliceMinus1V + 1) != ICERR_OK){
return ICERR_ERROR;
}
if (pSC->m_bSecondary) {
pSC->pIOHeader = pSC->m_pNextSC->pIOHeader;
pSC->m_ppBitIO = pSC->m_pNextSC->m_ppBitIO;
pSC->cNumBitIO = pSC->m_pNextSC->cNumBitIO;
pSC->cSB = pSC->m_pNextSC->cSB;
}
setBitIOPointers(pSC);
return ICERR_OK;
}
Int StrDecTerm(CWMImageStrCodec* pSC)
{
size_t j, jend = (pSC->m_pNextSC != NULL);
for (j = 0; j <= jend; j++) {
if(pSC->m_bUVResolutionChange){
if(pSC->pResU != NULL)
free(pSC->pResU);
if(pSC->pResV != NULL)
free(pSC->pResV);
}
freePredInfo(pSC);
freeTileInfo(pSC);
FreeCodingContextDec(pSC);
if (j == 0) {
StrIODecTerm(pSC);
// free lookup tables for rotation and flipping
if(pSC->m_Dparam->pOffsetX != NULL)
free(pSC->m_Dparam->pOffsetX);
if(pSC->m_Dparam->pOffsetY != NULL)
free(pSC->m_Dparam->pOffsetY);
}
pSC = pSC->m_pNextSC;
src/Source/LibJXR/image/decode/strdec.c view on Meta::CPAN
break;
case CMYK:
pSC->cNumChannels = 4;
break;
default:
break;
}
// float and 32s additional parameters
switch (pII->bdBitDepth) {
case BD_16:
case BD_16S:
case BD_32:
case BD_32S:
pSCP->nLenMantissaOrShift = (U8) getBit32_SB(pSB, 8);
break;
case BD_32F:
pSCP->nLenMantissaOrShift = (U8) getBit32_SB(pSB, 8);//float conversion parameters
pSCP->nExpBias = (I8) getBit32_SB(pSB, 8);
break;
default:
break;
}
// quantization
pSC->uQPMode = 0;
if(getBit32_SB(pSB, 1) == 1) // DC uniform
pSC->uQPMode += (readQuantizerSB(pSC->uiQPIndexDC, pSB, pSC->cNumChannels) << 3);
else
pSC->uQPMode ++;
if(pSCP->sbSubband != SB_DC_ONLY){
if(getBit32_SB(pSB, 1) == 0){ // don't use DC QP
pSC->uQPMode += 0x200;
if(getBit32_SB(pSB, 1) == 1) // LP uniform
pSC->uQPMode += (readQuantizerSB(pSC->uiQPIndexLP, pSB, pSC->cNumChannels) << 5);
else
pSC->uQPMode += 2;
}
else
pSC->uQPMode += ((pSC->uQPMode & 1) << 1) + ((pSC->uQPMode & 0x18) << 2);
if(pSCP->sbSubband != SB_NO_HIGHPASS){
if(getBit32_SB(pSB, 1) == 0){ // don't use LP QP
pSC->uQPMode += 0x400;
if(getBit32_SB(pSB, 1) == 1) // HP uniform
pSC->uQPMode += (readQuantizerSB(pSC->uiQPIndexHP, pSB, pSC->cNumChannels) << 7);
else
pSC->uQPMode += 4;
}
else
pSC->uQPMode += ((pSC->uQPMode & 2) << 1) + ((pSC->uQPMode & 0x60) << 2);
}
}
if(pSCP->sbSubband == SB_DC_ONLY)
pSC->uQPMode |= 0x200;
else if(pSCP->sbSubband == SB_NO_HIGHPASS)
pSC->uQPMode |= 0x400;
FailIf((pSC->uQPMode & 0x600) == 0, WMP_errInvalidParameter); // frame level QPs must be specified independently!
flushToByte_SB(pSB); // remove this later
Cleanup:
return WMP_errSuccess == err ? ICERR_OK : ICERR_ERROR;
}
/*************************************************************************
Read header of image, and header of FIRST PLANE only
*************************************************************************/
Int ReadWMIHeader(
CWMImageInfo* pII,
CWMIStrCodecParam *pSCP,
CCoreParameters *pSC)
{
U32 i;
ERR err = WMP_errSuccess;
Bool bTilingPresent, bInscribed, bTileStretch, bAbbreviatedHeader;
struct WMPStream* pWS = pSCP->pWStream;
SimpleBitIO SB = {0};
SimpleBitIO* pSB = &SB;
U8 szMS[8] = {0};
U32 cbStream = 0;
// U32 bits = 0;
// Int HEADERSIZE = 0;
assert(pSC != NULL);
//================================
// 0
/** signature **/
Call(pWS->Read(pWS, szMS, sizeof(szMS)));
FailIf(szMS != (U8 *) strstr((char *) szMS, "WMPHOTO"), WMP_errUnsupportedFormat);
//================================
Call(attach_SB(pSB, pWS));
// 8
/** codec version and subversion **/
i = getBit32_SB(pSB, 4);
FailIf((i != CODEC_VERSION), WMP_errIncorrectCodecVersion);
pSC->cVersion = i;
i = getBit32_SB(pSB, 4); // subversion
FailIf((i != CODEC_SUBVERSION &&
i != CODEC_SUBVERSION_NEWSCALING_SOFT_TILES && i != CODEC_SUBVERSION_NEWSCALING_HARD_TILES),
WMP_errIncorrectCodecSubVersion);
pSC->cSubVersion = i;
pSC->bUseHardTileBoundaries = FALSE;
if (pSC->cSubVersion == CODEC_SUBVERSION_NEWSCALING_HARD_TILES)
pSC->bUseHardTileBoundaries = TRUE;
pSCP->bUseHardTileBoundaries = pSC->bUseHardTileBoundaries;
// 9 primary parameters
bTilingPresent = (Bool) getBit32_SB(pSB, 1); // tiling present
pSCP->bfBitstreamFormat = getBit32_SB(pSB, 1); // bitstream layout
pII->oOrientation = (ORIENTATION)getBit32_SB(pSB, 3); // presentation orientation
pSC->bIndexTable = getBit32_SB(pSB, 1);
( run in 1.340 second using v1.01-cache-2.11-cpan-df04353d9ac )