Alien-FreeImage
view release on metacpan or search on metacpan
src/Source/LibJXR/image/encode/strenc.c view on Meta::CPAN
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);
}
}
}
fillToByte(pIO); // remove this later
return ICERR_OK;
}
/*************************************************************************
Write header to buffer
*************************************************************************/
Int WriteWMIHeader(CWMImageStrCodec * pSC)
{
CWMImageInfo * pII = &pSC->WMII;
CWMIStrCodecParam * pSCP = &pSC->WMISCP;
CCoreParameters * pCoreParam = &pSC->m_param;
BitIOInfo* pIO = pSC->pIOHeader;
U32 /*iSizeOfSize = 2,*/ i;
// temporary assignments / reserved words
// const Int HEADERSIZE = 0;
Bool bInscribed = FALSE;
Bool bAbbreviatedHeader = (((pII->cWidth + 15) / 16 > 255 || (pII->cHeight + 15) / 16 > 255) ? FALSE : TRUE);
if(pCoreParam->bTranscode == FALSE)
pCoreParam->cExtraPixelsTop = pCoreParam->cExtraPixelsLeft = pCoreParam->cExtraPixelsRight = pCoreParam->cExtraPixelsBottom = 0;
// num of extra boundary pixels due to compressed domain processing
bInscribed = (pCoreParam->cExtraPixelsTop || pCoreParam->cExtraPixelsLeft || pCoreParam->cExtraPixelsBottom || pCoreParam->cExtraPixelsRight);
// 0
/** signature **/
for (i = 0; i < 8; PUTBITS(pSC->pIOHeader, gGDISignature[i++], 8));
// 8
/** codec version and subversion **/
PUTBITS(pIO, CODEC_VERSION, 4); // this should be changed to "profile" in RTM
if (pSC->WMISCP.bUseHardTileBoundaries)
PUTBITS(pIO, CODEC_SUBVERSION_NEWSCALING_HARD_TILES, 4);
else
PUTBITS(pIO, CODEC_SUBVERSION_NEWSCALING_SOFT_TILES, 4);
// 9 primary parameters
PUTBITS(pIO, (pSCP->cNumOfSliceMinus1V || pSCP->cNumOfSliceMinus1H) ? 1 : 0, 1); // tiling present
PUTBITS(pIO, (Int) pSCP->bfBitstreamFormat, 1); // bitstream layout
PUTBITS(pIO, pII->oOrientation, 3); // m_iRotateFlip
PUTBITS(pIO, pSC->m_param.bIndexTable, 1); // index table present
PUTBITS(pIO, pSCP->olOverlap, 2); // overlap
// 10
PUTBITS(pIO, bAbbreviatedHeader, 1); // short words for size and tiles
PUTBITS(pIO, 1, 1); // long word length (use intelligence later)
PUTBITS(pIO, bInscribed, 1); // windowing
PUTBITS(pIO, pSC->m_param.bTrimFlexbitsFlag, 1); // trim flexbits flag sent
PUTBITS(pIO, 0, 1); // tile stretching parameters (not enabled)
PUTBITS(pIO, 0, 2); // reserved bits
PUTBITS(pIO, (Int) pSC->m_param.bAlphaChannel, 1); // alpha channel present
// 11 - informational
src/Source/LibJXR/image/encode/strenc.c view on Meta::CPAN
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);
}
}
}
if(allocatePredInfo(pSC) != ICERR_OK){
return ICERR_ERROR;
}
if(pSC->WMISCP.cNumOfSliceMinus1V >= MAX_TILES || AllocateCodingContextEnc (pSC, pSC->WMISCP.cNumOfSliceMinus1V + 1, pSC->WMISCP.uiTrimFlexBits) != 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;
pSC->ppWStream = pSC->m_pNextSC->ppWStream;
pSC->pIndexTable = pSC->m_pNextSC->pIndexTable;
setBitIOPointers(pSC);
}
else {
StrIOEncInit(pSC);
setBitIOPointers(pSC);
WriteWMIHeader(pSC);
}
return ICERR_OK;
}
static Int StrEncTerm(CTXSTRCODEC ctxSC)
{
CWMImageStrCodec* pSC = (CWMImageStrCodec*)ctxSC;
size_t j, jend = (pSC->m_pNextSC != NULL);
for (j = 0; j <= jend; j++) {
if (sizeof(*pSC) != pSC->cbStruct) {
return ICERR_ERROR;
}
if(pSC->m_bUVResolutionChange){
if(pSC->pResU != NULL)
free(pSC->pResU);
if(pSC->pResV != NULL)
free(pSC->pResV);
}
freePredInfo(pSC);
if (j == 0)
StrIOEncTerm(pSC);
( run in 0.773 second using v1.01-cache-2.11-cpan-df04353d9ac )