Alien-FreeImage
view release on metacpan or search on metacpan
src/Source/LibJXR/image/encode/strenc.c view on Meta::CPAN
else{
copyTo(pSC->ppWStream[j * pSC->cSB + l], pDst, pTable[k]);
k += pSC->cSB;
}
}
}
}
if (pSC->cmbHeight * pSC->cmbWidth * pSC->WMISCP.cChannel >= MAX_MEMORY_SIZE_IN_WORDS){
for(i = 0; i < pSC->cNumBitIO; i ++){
if(pSC->ppWStream && pSC->ppWStream[i]){
if((*(pSC->ppWStream + i))->state.file.pFile){
fclose((*(pSC->ppWStream + i))->state.file.pFile);
#ifdef _WINDOWS_
if(DeleteFileA((LPCSTR)pSC->ppTempFile[i]) == 0)
return ICERR_ERROR;
#else
if (remove(pSC->ppTempFile[i]) == -1)
return ICERR_ERROR;
#endif
}
if (*(pSC->ppWStream + i))
free(*(pSC->ppWStream + i));
}
if(pSC->ppTempFile){
if(pSC->ppTempFile[i])
free(pSC->ppTempFile[i]);
}
}
if(pSC->ppTempFile)
free(pSC->ppTempFile);
}
else{
for(i = 0; i < pSC->cNumBitIO; i ++){
if(pSC->ppWStream && pSC->ppWStream[i])
pSC->ppWStream[i]->Close(pSC->ppWStream + i);
}
}
free(pSC->ppWStream);
free(pSC->m_ppBitIO);
free(pSC->pIndexTable);
}
return 0;
}
/*************************************************************************
Write header of image plane
*************************************************************************/
Int WriteImagePlaneHeader(CWMImageStrCodec * pSC)
{
CWMImageInfo * pII = &pSC->WMII;
CWMIStrCodecParam * pSCP = &pSC->WMISCP;
BitIOInfo* pIO = pSC->pIOHeader;
PUTBITS(pIO, (Int) pSC->m_param.cfColorFormat, 3); // internal color format
PUTBITS(pIO, (Int) pSC->m_param.bScaledArith, 1); // lossless mode
// subbands
PUTBITS(pIO, (U32)pSCP->sbSubband, 4);
// color parameters
switch (pSC->m_param.cfColorFormat) {
case YUV_420:
case YUV_422:
case YUV_444:
PUTBITS(pIO, 0, 4);
PUTBITS(pIO, 0, 4);
break;
case NCOMPONENT:
PUTBITS(pIO, (Int) pSC->m_param.cNumChannels - 1, 4);
PUTBITS(pIO, 0, 4);
break;
default:
break;
}
// float and 32s additional parameters
switch (pII->bdBitDepth) {
case BD_16:
case BD_16S:
PUTBITS(pIO, pSCP->nLenMantissaOrShift, 8);
break;
case BD_32:
case BD_32S:
if(pSCP->nLenMantissaOrShift == 0)
pSCP->nLenMantissaOrShift = 10;//default
PUTBITS(pIO, pSCP->nLenMantissaOrShift, 8);
break;
case BD_32F:
if(pSCP->nLenMantissaOrShift == 0)
pSCP->nLenMantissaOrShift = 13;//default
PUTBITS(pIO, pSCP->nLenMantissaOrShift, 8);//float conversion parameters
PUTBITS(pIO, pSCP->nExpBias, 8);
break;
default:
break;
}
// quantization
PUTBITS(pIO, (pSC->m_param.uQPMode & 1) == 1 ? 0 : 1, 1); // DC frame uniform quantization?
if((pSC->m_param.uQPMode & 1) == 0)
writeQuantizer(pSC->pTile[0].pQuantizerDC, pIO, (pSC->m_param.uQPMode >> 3) & 3, pSC->m_param.cNumChannels, 0);
if(pSC->WMISCP.sbSubband != SB_DC_ONLY){
PUTBITS(pIO, (pSC->m_param.uQPMode & 0x200) == 0 ? 1 : 0, 1); // use DC quantization?
if((pSC->m_param.uQPMode & 0x200) != 0){
PUTBITS(pIO, (pSC->m_param.uQPMode & 2) == 2 ? 0 : 1, 1); // LP frame uniform quantization?
if((pSC->m_param.uQPMode & 2) == 0)
writeQuantizer(pSC->pTile[0].pQuantizerLP, pIO, (pSC->m_param.uQPMode >> 5) & 3, pSC->m_param.cNumChannels, 0);
}
if(pSC->WMISCP.sbSubband != SB_NO_HIGHPASS){
PUTBITS(pIO, (pSC->m_param.uQPMode & 0x400) == 0 ? 1 : 0, 1); // use LP quantization?
if((pSC->m_param.uQPMode & 0x400) != 0){
PUTBITS(pIO, (pSC->m_param.uQPMode & 4) == 4 ? 0 : 1, 1); // HP frame uniform quantization?
if((pSC->m_param.uQPMode & 4) == 0)
writeQuantizer(pSC->pTile[0].pQuantizerHP, pIO, (pSC->m_param.uQPMode >> 7) & 3, pSC->m_param.cNumChannels, 0);
src/Source/LibJXR/image/encode/strenc.c view on Meta::CPAN
PUTBITS(pIO, pSCP->uiTileY[i + 1] - pSCP->uiTileY[i], bAbbreviatedHeader ? 8 : 16);
}
// window due to compressed domain processing
if (bInscribed) {
PUTBITS(pIO, (U32)pCoreParam->cExtraPixelsTop, 6);
PUTBITS(pIO, (U32)pCoreParam->cExtraPixelsLeft, 6);
PUTBITS(pIO, (U32)pCoreParam->cExtraPixelsBottom, 6);
PUTBITS(pIO, (U32)pCoreParam->cExtraPixelsRight, 6);
}
fillToByte(pIO); // redundant
// write image plane headers
WriteImagePlaneHeader(pSC);
return ICERR_OK;
}
// streaming codec init/term
Int StrEncInit(CWMImageStrCodec* pSC)
{
COLORFORMAT cf = pSC->m_param.cfColorFormat;
COLORFORMAT cfE = pSC->WMII.cfColorFormat;
U16 iQPIndexY = 0, iQPIndexYLP = 0, iQPIndexYHP = 0;
U16 iQPIndexU = 0, iQPIndexULP = 0, iQPIndexUHP = 0;
U16 iQPIndexV = 0, iQPIndexVLP = 0, iQPIndexVHP = 0;
size_t i;
Bool b32bit = sizeof(size_t) == 4;
/** color transcoding with resolution change **/
pSC->m_bUVResolutionChange = (((cfE == CF_RGB || cfE == YUV_444 || cfE == CMYK || cfE == CF_RGBE) &&
(cf == YUV_422 || cf == YUV_420))
|| (cfE == YUV_422 && cf == YUV_420)) && !pSC->WMISCP.bYUVData;
if(pSC->m_bUVResolutionChange){
size_t cSize = ((cfE == YUV_422 ? 128 : 256) + (cf == YUV_420 ? 32 : 0)) * pSC->cmbWidth + 256;
if(b32bit){ // integer overlow/underflow check for 32-bit system
if(((pSC->cmbWidth >> 16) * ((cfE == YUV_422 ? 128 : 256) + (cf == YUV_420 ? 32 : 0))) & 0xffff0000)
return ICERR_ERROR;
if(cSize >= 0x3fffffff)
return ICERR_ERROR;
}
pSC->pResU = (PixelI *)malloc(cSize * sizeof(PixelI));
pSC->pResV = (PixelI *)malloc(cSize * sizeof(PixelI));
if(pSC->pResU == NULL || pSC->pResV == NULL){
return ICERR_ERROR;
}
}
pSC->cTileColumn = pSC->cTileRow = 0;
if(allocateTileInfo(pSC) != ICERR_OK)
return ICERR_ERROR;
if(pSC->m_param.bTranscode == FALSE){
pSC->m_param.uQPMode = 0x150; // 101010 000
// 000 == uniform (not per tile) DC, LP, HP
// 101010 == cChMode == 2 == independent (not same) DC, LP, HP
/** lossless or Y component lossless condition: all subbands present, uniform quantization with QPIndex 1 **/
pSC->m_param.bScaledArith = !((pSC->m_param.uQPMode & 7) == 0 &&
1 == pSC->WMISCP.uiDefaultQPIndex <= 1 &&
pSC->WMISCP.sbSubband == SB_ALL &&
pSC->m_bUVResolutionChange == FALSE) &&
!pSC->WMISCP.bUnscaledArith;
if (BD_32 == pSC->WMII.bdBitDepth || BD_32S == pSC->WMII.bdBitDepth || BD_32F == pSC->WMII.bdBitDepth) {
pSC->m_param.bScaledArith = FALSE;
}
pSC->m_param.uQPMode |= 0x600; // don't use DC QP for LP, LP QP for HP
// default QPs
iQPIndexY = pSC->m_param.bAlphaChannel && pSC->m_param.cNumChannels == 1?
pSC->WMISCP.uiDefaultQPIndexAlpha : pSC->WMISCP.uiDefaultQPIndex;
// determine the U,V index
iQPIndexU = pSC->WMISCP.uiDefaultQPIndexU!=0?
pSC->WMISCP.uiDefaultQPIndexU: iQPIndexY;
iQPIndexV = pSC->WMISCP.uiDefaultQPIndexV!=0?
pSC->WMISCP.uiDefaultQPIndexV: iQPIndexY;
// determine the QPIndexYLP
iQPIndexYLP = pSC->m_param.bAlphaChannel && pSC->m_param.cNumChannels == 1 ?
pSC->WMISCP.uiDefaultQPIndexAlpha :
(pSC->WMISCP.uiDefaultQPIndexYLP == 0 ?
pSC->WMISCP.uiDefaultQPIndex : pSC->WMISCP.uiDefaultQPIndexYLP); // default to QPIndex if not set
// determine the QPIndexYHP
iQPIndexYHP = pSC->m_param.bAlphaChannel && pSC->m_param.cNumChannels == 1 ?
pSC->WMISCP.uiDefaultQPIndexAlpha :
(pSC->WMISCP.uiDefaultQPIndexYHP == 0 ?
pSC->WMISCP.uiDefaultQPIndex : pSC->WMISCP.uiDefaultQPIndexYHP); // default to QPIndex if not set
// determine the U,V LP index
iQPIndexULP = pSC->WMISCP.uiDefaultQPIndexULP!=0?
pSC->WMISCP.uiDefaultQPIndexULP: iQPIndexU;
iQPIndexVLP = pSC->WMISCP.uiDefaultQPIndexVLP!=0?
pSC->WMISCP.uiDefaultQPIndexVLP: iQPIndexV;
// determine the U,V HP index
iQPIndexUHP = pSC->WMISCP.uiDefaultQPIndexUHP!=0?
pSC->WMISCP.uiDefaultQPIndexUHP: iQPIndexU;
iQPIndexVHP = pSC->WMISCP.uiDefaultQPIndexVHP!=0?
pSC->WMISCP.uiDefaultQPIndexVHP: iQPIndexV;
// clamp the QPIndex - 0 is lossless mode
if(iQPIndexY < 2)
iQPIndexY = 0;
if (iQPIndexYLP < 2)
iQPIndexYLP = 0;
if (iQPIndexYHP < 2)
iQPIndexYHP = 0;
if(iQPIndexU < 2)
iQPIndexU = 0;
if (iQPIndexULP < 2)
iQPIndexULP = 0;
if (iQPIndexUHP < 2)
iQPIndexUHP = 0;
if(iQPIndexV < 2)
iQPIndexV = 0;
if (iQPIndexVLP < 2)
iQPIndexVLP = 0;
if (iQPIndexVHP < 2)
iQPIndexVHP = 0;
}
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 ++)
if(pSC->m_param.bTranscode)
pSC->pTile[0].pQuantizerDC[i]->iIndex = pSC->m_param.uiQPIndexDC[i];
else
pSC->pTile[0].pQuantizerDC[i]->iIndex = pSC->m_param.uiQPIndexDC[i] = (U8)(((i == 0 ? iQPIndexY : (i == 1) ? iQPIndexU: iQPIndexV)) & 0xff);
formatQuantizer(pSC->pTile[0].pQuantizerDC, (pSC->m_param.uQPMode >> 3) & 3, pSC->m_param.cNumChannels, 0, TRUE, pSC->m_param.bScaledArith);
for(i = 0; i < pSC->m_param.cNumChannels; i ++)
pSC->pTile[0].pQuantizerDC[i]->iOffset = (pSC->pTile[0].pQuantizerDC[i]->iQP >> 1);
}
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);
for(i = 0; i < pSC->m_param.cNumChannels; i ++)
if(pSC->m_param.bTranscode)
pSC->pTile[0].pQuantizerLP[i]->iIndex = pSC->m_param.uiQPIndexLP[i];
else
pSC->pTile[0].pQuantizerLP[i]->iIndex = pSC->m_param.uiQPIndexLP[i] = (U8)(((i == 0 ? iQPIndexYLP : (i == 1) ? iQPIndexULP: iQPIndexVLP)) & 0xff);
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);
for(i = 0; i < pSC->m_param.cNumChannels; i ++)
if(pSC->m_param.bTranscode)
pSC->pTile[0].pQuantizerHP[i]->iIndex = pSC->m_param.uiQPIndexHP[i];
else
pSC->pTile[0].pQuantizerHP[i]->iIndex = pSC->m_param.uiQPIndexHP[i] = (U8)(((i == 0 ? iQPIndexYHP : (i == 1) ? iQPIndexUHP: iQPIndexVHP)) & 0xff);
formatQuantizer(pSC->pTile[0].pQuantizerHP, (pSC->m_param.uQPMode >> 7) & 3, pSC->m_param.cNumChannels, 0, FALSE, pSC->m_param.bScaledArith);
}
( run in 0.961 second using v1.01-cache-2.11-cpan-acf6aa7dc9e )