Alien-FreeImage
view release on metacpan or search on metacpan
src/Source/LibJXR/image/encode/strenc.c view on Meta::CPAN
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;
//================================================
( run in 0.419 second using v1.01-cache-2.11-cpan-acebb50784d )