Alien-FreeImage
view release on metacpan or search on metacpan
src/Source/LibJXR/image/sys/strcodec.c view on Meta::CPAN
memcpy(pWS->state.buf.pbBuf + pWS->state.buf.cbCur, pv, cl);
pWS->state.buf.cbCur += cl;
pv = (const void *)((U8 *)pv + cl);
cb -= cl;
if (pWS->state.buf.cbCur == PACKETLENGTH) { // allocate next packet in list
U8 *pBuf = NULL;
void **pPtrLoc = (void **)(pWS->state.buf.pbBuf - sizeof(void *));
Call(WMPAlloc((void **)&pBuf, PACKETLENGTH + sizeof(void *)));
pPtrLoc[0] = (void *)pBuf;
pWS->state.buf.pbBuf = pBuf + sizeof(void *);
pWS->state.buf.cbBuf += PACKETLENGTH;
memset(pBuf, 0, sizeof(void *));
pWS->state.buf.cbCur = 0;
pWS->state.buf.cbBufCount++;
//printf ("create buffer %d: %x\n", pWS->state.buf.cbBufCount, pWS->state.buf.pbBuf);
}
}
Cleanup:
return err;
}
ERR SetPosWS_List(struct WMPStream* pWS, size_t offPos)
{
ERR err = WMP_errSuccess;
// get the first buffer
U8 *pBuf = (U8 *)(pWS + 1); // pointer to buffer
pWS->state.buf.cbCur = 0;
pWS->state.buf.cbBufCount = 0;
while (offPos >= PACKETLENGTH && pBuf != NULL) {
pBuf = (U8 *)(((void **)pBuf)[0]);
offPos -= PACKETLENGTH;
pWS->state.buf.cbBufCount++;
}
if (pBuf == NULL)
goto Cleanup;
pWS->state.buf.cbCur = offPos;
pWS->state.buf.pbBuf = pBuf + sizeof(void *);
//printf ("seek buffer %d: %x\n", pWS->state.buf.cbBufCount, pWS->state.buf.pbBuf);
Cleanup:
return err;
}
ERR GetPosWS_List(struct WMPStream* pWS, size_t* poffPos)
{
*poffPos = pWS->state.buf.cbCur + PACKETLENGTH * pWS->state.buf.cbBufCount;
return WMP_errSuccess;
}
//================================================================
// Simple BitIO access functions
//================================================================
// init SimpleBitIO
ERR attach_SB(SimpleBitIO* pSB, struct WMPStream* pWS)
{
pSB->pWS = pWS;
pSB->cbRead = 0;
pSB->bAccumulator = 0;
pSB->cBitLeft = 0;
return WMP_errSuccess;
}
// extract upto 32bit from input stream
U32 getBit32_SB(SimpleBitIO* pSB, U32 cBits)
{
U32 rc = 0;
while (pSB->cBitLeft < cBits)
{
rc <<= pSB->cBitLeft;
rc |= pSB->bAccumulator >> (8 - pSB->cBitLeft);
cBits -= pSB->cBitLeft;
pSB->pWS->Read(pSB->pWS, &pSB->bAccumulator, 1);
pSB->cbRead++;
pSB->cBitLeft = 8;
}
rc <<= cBits;
rc |= pSB->bAccumulator >> (8 - cBits);
pSB->bAccumulator <<= cBits;
pSB->cBitLeft -= cBits;
return rc;
}
// ignore input to byte boundary
Void flushToByte_SB(SimpleBitIO* pSB)
{
pSB->bAccumulator = 0;
pSB->cBitLeft = 0;
}
// return read byte count
U32 getByteRead_SB(SimpleBitIO* pSB)
{
return pSB->cbRead;
}
ERR detach_SB(SimpleBitIO* pSB)
{
assert(0 == pSB->cBitLeft);
pSB->pWS = NULL;
return WMP_errSuccess;
}
//================================================================
// Memory access functions
//================================================================
#if (defined(WIN32) && !defined(UNDER_CE) && (!defined(__MINGW32__) || defined(__MINGW64_TOOLCHAIN__))) || (defined(UNDER_CE) && defined(_ARM_))
// WinCE ARM and Desktop x86
src/Source/LibJXR/image/sys/strcodec.c view on Meta::CPAN
Void putBit16(BitIOInfo* pIO, U32 uiBits, U32 cBits)
{
assert(cBits <= 16);
uiBits &= ~(-1 << cBits);
putBit16z(pIO, uiBits, cBits);
}
Void putBit32(BitIOInfo* pIO, U32 uiBits, U32 cBits)
{
assert(0 <= (I32)cBits && cBits <= 32);
if (16 < cBits)
{
putBit16(pIO, uiBits >> (cBits - 16), 16);
cBits -= 16;
}
putBit16(pIO, uiBits, cBits);
}
Void fillToByte(BitIOInfo* pIO)
{
putBit16z(pIO, 0, (16 - pIO->cBitsUsed) & 7);
}
//----------------------------------------------------------------
U32 getBit16_S(CWMImageStrCodec* pSC, BitIOInfo* pIO, U32 cBits)
{
U32 rc = getBit16(pIO, cBits);
readIS_L1(pSC, pIO);
return rc;
}
U32 putBit16_S(CWMImageStrCodec* pSC, BitIOInfo* pIO, U32 uiBits, U32 cBits)
{
putBit16(pIO, uiBits, cBits);
writeIS_L1(pSC, pIO);
return 0;
}
//----------------------------------------------------------------
// Query buffered data size held in BitIOInfo
// Write() for Enc, Read() for Dec
//----------------------------------------------------------------
U32 getSizeRead(BitIOInfo* pIO)
{
return (U32)(UINTPTR_T)(pIO->pbStart + PACKETLENGTH * 2 - pIO->pbCurrent) - pIO->cBitsUsed / 8;
}
U32 getSizeWrite(BitIOInfo* pIO)
{
return (U32)(UINTPTR_T)(pIO->pbCurrent + (pIO->pbStart <= pIO->pbCurrent ? 0 : PACKETLENGTH * 2) - pIO->pbStart) + pIO->cBitsUsed / 8;
}
//----------------------------------------------------------------
// Query stream offset from attached BitIO object for dec
//----------------------------------------------------------------
U32 getPosRead(BitIOInfo* pIO)
{
size_t cbCached = (pIO->pbStart + PACKETLENGTH * 2 - pIO->pbCurrent) - pIO->cBitsUsed / 8;
return (U32)(pIO->offRef - cbCached);
}
//================================================================
// Block I/O functions
//================================================================
#ifndef ARMOPT_BITIO
ERR attachISRead(BitIOInfo* pIO, struct WMPStream* pWS, CWMImageStrCodec* pSC)
{
UNREFERENCED_PARAMETER( pSC );
pWS->GetPos(pWS, &pIO->offRef);
pIO->pbStart = (U8*)pIO - PACKETLENGTH * 2;
pIO->pbCurrent = pIO->pbStart;
PERFTIMER_STOP(pSC->m_fMeasurePerf, pSC->m_ptEncDecPerf);
pWS->SetPos(pWS, pIO->offRef);
pWS->Read(pWS, pIO->pbStart, PACKETLENGTH * 2);
PERFTIMER_START(pSC->m_fMeasurePerf, pSC->m_ptEncDecPerf);
pIO->offRef += PACKETLENGTH * 2;
pIO->uiAccumulator = load4BE(pIO->pbStart);
pIO->cBitsUsed = 0;
pIO->iMask = ~(PACKETLENGTH * 2);
pIO->iMask &= ~1;
pIO->pWS = pWS;
return WMP_errSuccess;
}
ERR readIS(CWMImageStrCodec* pSC, BitIOInfo* pIO)
{
ERR err = WMP_errSuccess;
UNREFERENCED_PARAMETER( pSC );
if (PACKET1(pIO->pbStart, pIO->pbCurrent, PACKETLENGTH))
{
struct WMPStream *pWS = pIO->pWS;
PERFTIMER_STOP(pSC->m_fMeasurePerf, pSC->m_ptEncDecPerf);
//Call(0 != pIO->pWS->Read(pIO->pWS, pIO->pbStart, PACKETLENGTH));
// TODO: add error checking code
pWS->SetPos(pWS, pIO->offRef);
pWS->Read(pWS, pIO->pbStart, PACKETLENGTH);
pIO->offRef += PACKETLENGTH;
PERFTIMER_START(pSC->m_fMeasurePerf, pSC->m_ptEncDecPerf);
// make shadow copy for first 4B
pIO->uiShadow = *(U32*)pIO->pbStart;
// reposition pbPacket pointer
pIO->pbStart = MASKPTR(pIO->pbStart + PACKETLENGTH, pIO->iMask);
}
//Cleanup:
return err;
}
ERR detachISRead(CWMImageStrCodec* pSC, BitIOInfo* pIO)
{
ERR err = WMP_errSuccess;
struct WMPStream* pWS = pIO->pWS;
size_t cbRemain = 0;
// we can ONLY detach IStream at byte boundary
flushToByte(pIO);
assert(0 == (pIO->cBitsUsed % 8));
Call(readIS_L1(pSC, pIO));
// set stream to right offset, undo buffering
cbRemain = (pIO->pbStart + PACKETLENGTH * 2) - (pIO->pbCurrent + pIO->cBitsUsed / 8);
pWS->SetPos(pWS, pIO->offRef - cbRemain);
pIO->pWS = NULL;
Cleanup:
return err;
}
#endif // ARMOPT_BITIO
//----------------------------------------------------------------
ERR attachISWrite(BitIOInfo* pIO, struct WMPStream* pWS)
{
pWS->GetPos(pWS, &pIO->offRef);
pIO->pbStart = (U8*)pIO - PACKETLENGTH * 2;
pIO->pbCurrent = pIO->pbStart;
pIO->uiAccumulator = 0;
pIO->cBitsUsed = 0;
pIO->iMask = ~(PACKETLENGTH * 2);
pIO->pWS = pWS;
return WMP_errSuccess;
}
// write out packet if we have >=1 packet data filled
ERR writeIS(CWMImageStrCodec* pSC, BitIOInfo* pIO)
{
ERR err = WMP_errSuccess;
UNREFERENCED_PARAMETER( pSC );
if (PACKET1(pIO->pbStart, pIO->pbCurrent, PACKETLENGTH))
{
PERFTIMER_STOP(pSC->m_fMeasurePerf, pSC->m_ptEncDecPerf);
err = pIO->pWS->Write(pIO->pWS, pIO->pbStart, PACKETLENGTH);
PERFTIMER_START(pSC->m_fMeasurePerf, pSC->m_ptEncDecPerf);
Call(err);
// reposition pbStart pointer
pIO->pbStart = MASKPTR(pIO->pbStart + PACKETLENGTH, pIO->iMask);
}
Cleanup:
return err;
}
// write out partially filled buffer and detach bitIO from IStream
ERR detachISWrite(CWMImageStrCodec* pSC, BitIOInfo* pIO)
{
ERR err = WMP_errSuccess;
// we can ONLY detach IStream at byte boundary
assert(0 == (pIO->cBitsUsed % 8));
Call(writeIS_L1(pSC, pIO));
PERFTIMER_STOP(pSC->m_fMeasurePerf, pSC->m_ptEncDecPerf);
err = pIO->pWS->Write(pIO->pWS, pIO->pbStart, pIO->pbCurrent + pIO->cBitsUsed / 8 - pIO->pbStart);
PERFTIMER_START(pSC->m_fMeasurePerf, pSC->m_ptEncDecPerf);
Call(err);
pIO->pWS = NULL;
Cleanup:
return err;
}
//=========================
// Performance Measurement
//=========================
#ifndef DISABLE_PERF_MEASUREMENT
( run in 1.957 second using v1.01-cache-2.11-cpan-4991d5b9bd9 )