📄 jpeg_mcubuffer.c
字号:
progressiveFrameWidth += BLOCK_WIDTH - 1;
progressiveFrameWidth /= BLOCK_WIDTH;
progressiveFrameWidth *= BLOCK_WIDTH;
progressiveFrameHeight += BLOCK_WIDTH - 1;
progressiveFrameHeight /= BLOCK_WIDTH;
progressiveFrameHeight *= BLOCK_WIDTH;
/* Save for use in JPEG_McuBuffer_Progressive_NEXT() */
mcu->progressiveFrameWidth_next = progressiveFrameWidth;
mcu->progressiveFrameHeight_next = progressiveFrameHeight;
progressiveFrameWidth /= BLOCK_WIDTH;
progressiveFrameHeight /= BLOCK_WIDTH;
mcu->progressiveBlockCount_next = progressiveFrameWidth * progressiveFrameHeight;
}
}
else
{
/* Decoder only: */
int32 lCount;
mcu->mcuBufferIndex = -1;
mcu->processBufferIndex = -1;
mcu->mcuLossy = 1; /* Lossless not supported */
for(lCount = 0; lCount < mcu->numberOfBuffers; lCount++)
{
mcu->mcuFree[lCount] = FREE;
}
}
return E_TRUE;
}
/*
********************************************************************************
** Function: JPEG_McuBuffer_READ
**
** Description: This function is used to preload a data buffer for
** processing. (Encoder only)
**
** Arguments:
** mcuHandle[IN] Handle to the Mcu Buffer data access instance.
**
** Outputs:
**
** Return value: E_TRUE or E_FALSE
********************************************************************************
*/
#ifdef JPEGBUFFERVALIDATED
asm(".section data1;\n.align 8;\n"
".byte4 JBRTBL[4] = JMCUBR1, _JPEG_McuBuffer_Sequential_READ,\n"
"_JPEG_McuBuffer_Progressive_READ, _JPEG_McuBuffer_Lossless_READ;\n"
".section program;\n.align 8;\n_JPEG_McuBuffer_READ:\n"
" P0 = R0;\n"
" R2.L = JBRTBL; R2.H = JBRTBL; R3 = 3; R0 = 0;\n"
" R1 = [P0 + 72];\n"
" R3 = R3 & R1;\n"
" R3 = R3 << 2;\n"
" R3 = R2 + R3;\n"
" P2 = R3;\n"
" link 12;\n"
" P2 = [P2];\n"
" R0 = P0; NOP; NOP; NOP;\n"
" CALL (P2);\n"
" unlink;\n"
"JMCUBR1: RTS;\n"
".global _JPEG_McuBuffer_READ;\n");
#else
int JPEG_McuBuffer_READ(tMcuBuffer *mcu)
{
switch(mcu->encodingMode)
{
case SEQUENTIAL:
return JPEG_McuBuffer_Sequential_READ(mcu);
case PROGRESSIVE:
return JPEG_McuBuffer_Progressive_READ(mcu);
case LOSSLESS:
return JPEG_McuBuffer_Lossless_READ(mcu);
default:
return E_FALSE;
}
}
#endif
/*
********************************************************************************
** Function: JPEG_McuBuffer_Sequential_READ
**
** Description: This function is used to preload a data buffer for
** processing (sequential mode only; encoder only).
**
** Arguments:
** mcuHandle[IN] Handle to the Mcu Buffer data access instance.
**
** Outputs:
**
** Return value: E_TRUE or E_FALSE
********************************************************************************
*/
#ifdef JPEGBUFFERVALIDATED
int POSVAL[5][8] = {
{ 16, 16, 8, 8, 16, 15, 7, 7},
{ 16, 16, 8, 8, 8, 7, 7, 7},
{ 8, 8, 8, 8, 8, 7, 14, 14},
{ 8, 8, 0, 0, 8, 7, 0, 0},
{ 8, 8, 8, 8, 8, 7, 14, 14}
};
asm(
".extern _gFormMCU420JpegEnc_BLACKFIN;\n"
".extern _gFormMCU422JpegEnc_BLACKFIN;\n"
".extern _gFormMCU444JpegEnc_BLACKFIN;\n"
".extern _gFormMCU400JpegEnc_BLACKFIN;\n"
".extern _gFormMCU444JpegEnc_BLACKFIN;\n"
".section data1;\n.byte4 JMSRTBL[5] = _gFormMCU420JpegEnc_BLACKFIN,\n"
"_gFormMCU422JpegEnc_BLACKFIN, _gFormMCU444JpegEnc_BLACKFIN,\n"
"_gFormMCU400JpegEnc_BLACKFIN, _gFormMCU444JpegEnc_BLACKFIN;\n"
".section program;\n.align 8;\n"
"_JPEG_McuBuffer_Sequential_READ:\n"
" link 0;\n"
" [--SP] = P5;\n"
" P5 = R0;\n"
" [--SP] = P4;\n"
" [--SP] = P3;\n"
" R1 = 1;\n"
" SP += -12;\n"
" R0 = R2-|-R2 || R2 = [P5 + 48];\n"
" CC = R2 == 0;\n"
" IF CC JUMP JMSR3;\n"
" R3 = [P5 + 32];\n"
" R3 = R3 - R1 (NS) || R0 = [P5 + 60];\n"
" R3 = R3 << 2 || R2 = [P5 + 40];\n"
" P4 = R3;\n"
" R0 = R0.L * R2.L (IS) || R1 = [P5 + 52];\n"
" R1 = R0 + R1 (NS) || R2 = [P5 + 4];\n"
" R0 = R3 << 3 || R3 = [P5 + 12];\n"
" CC = R2 < R3;\n"
" P3 = R0;\n"
" IF !CC JUMP JMSR1;\n"
" P2.H = JMSRTBL; P2.L = JMSRTBL;\n"
" P2 = P2 + P4;\n"
" P0 = [P2];\n"
" R0 = P5;\n"
" CALL (P0);\n"
"JMSR1: R1 = [P5];\n"
" P1.L = _POSVAL; P1.H = _POSVAL;\n"
" P4 = P1 + P3;\n"
" R2 = [P4];\n"
" R1 = R2 + R1 (NS) || R0 = [P5 + 8];\n"
" CC = R0 <= R1;\n"
" R3 = [P4 + 4];\n"
" R2 = [P5 + 16];\n"
" R3 = R2 + R3 (NS) || [P5] = R1;\n"
" R2 = [P5 + 20];\n"
" R1 = [P4 + 8];\n"
" R1 = R2 + R1 (NS) || [P5 + 16] = R3;\n"
" R0 = [P4 + 12];\n"
" R2 = [P5 + 24];\n"
" R2 = R2 + R0 (NS) || [P5 + 20] = R1;\n"
" [P5 + 24] = R2;\n"
" IF !CC JUMP JMSR2;\n"
" R1 = R1 -|- R1 || R0 = [P5+ 4];\n"
" [P5] = R1;\n"
" R1 = [P4 + 16];\n"
" R0 = R1 + R0 (NS) || R1 = [P5 + 8];\n"
" R2 = [P4 + 20];\n"
" R0 = R1.L * R2.L (IS) || [P5 + 4] = R0;\n"
" R1 = R1 >>> 1 (S) || R3 = [P5 + 16];\n"
" R3 = R3 + R0 (NS) || R2 = [P4 + 24];\n"
" R0 = R1 >> 0 || [P5 + 16] = R3;\n"
" R1 = R2.L * R1.L (IS) || R2 = [P5 + 20];\n"
" R2 = R2 + R1 (NS) || R1 = [P4 + 28];\n"
" R0 = R1.L * R0.L (IS) || R3 = [P5 + 24];\n"
" R0 = R3 + R0 (NS) || [P5 + 20] = R2;\n"
" [P5 + 24] = R0;\n"
"JMSR2: R0 = 1; R2 = [P5 + 48];\n"
" R2 = R2 - R0 (NS) || R3 = [P5 + 40];\n"
" R3 = R3 + R0 (NS) || [P5 + 48] = R2;\n"
" R2 = R2 -|- R2 || R1 = [P5 + 36];\n"
" CC = R1 <= R3;\n"
" IF CC R3 = R2;\n"
" [P5 + 40] = R3;\n"
"JMSR3: SP += 12; P3 = [SP++]; P4 = [SP++];\n"
" P5 = [SP++]; unlink; RTS;\n"
".global _JPEG_McuBuffer_Sequential_READ;\n");
#else
static int32 JPEG_McuBuffer_Sequential_READ(tMcuBuffer *mcuHandle)
{
int32 lReturn = E_TRUE;
uint8 *lMcuData;
if(mcuHandle->numberOfEmptyBuffers)
{
lMcuData = mcuHandle->mcubuffer + (mcuHandle->mcuBufferIndex *
mcuHandle->mcuSize);
switch(mcuHandle->interLeaveFormat)
{
case YUV420: //4:2:0
if(mcuHandle->y < mcuHandle->frameHeight)
{
#if USE_DMA
mcuHandle->dmaIDs[mcuHandle->mcuBufferIndex] = DMA_MCU420(mcuHandle,lMcuData);
#else
#ifndef BLACKFIN_JPEG_ENC
sFormMCU420(mcuHandle,lMcuData);
#else
gFormMCU420JpegEnc_BLACKFIN(mcuHandle,lMcuData);
#endif // BLACKFIN_JPEG_ENC
#endif // USE_DMA
}
mcuHandle->lumCurrPos += 16;
mcuHandle->cbCurrPos += 8;
mcuHandle->crCurrPos += 8;
mcuHandle->x += 16;
if(mcuHandle->x >= mcuHandle->frameWidth)
{
mcuHandle->x = 0;
mcuHandle->y += 16;
mcuHandle->lumCurrPos += (15 * mcuHandle->frameWidth);
mcuHandle->cbCurrPos += (7 * (mcuHandle->frameWidth >> 1));
mcuHandle->crCurrPos += (7 * (mcuHandle->frameWidth >> 1));
}
break;
case YUV422: //4:2:2
if(mcuHandle->y < mcuHandle->frameHeight)
{
#if USE_DMA
mcuHandle->dmaIDs[mcuHandle->mcuBufferIndex] = DMA_MCU422(mcuHandle,lMcuData);
#else
#ifndef BLACKFIN_JPEG_ENC
sFormMCU422(mcuHandle,lMcuData);
#else
gFormMCU422JpegEnc_BLACKFIN(mcuHandle,lMcuData);
#endif // BLACKFIN_JPEG_ENC
#endif // USE_DMA
}
mcuHandle->lumCurrPos += 16;
mcuHandle->cbCurrPos += 8;
mcuHandle->crCurrPos += 8;
mcuHandle->x += 16;
if(mcuHandle->x >= mcuHandle->frameWidth)
{
mcuHandle->x = 0;
mcuHandle->y += 8;
mcuHandle->lumCurrPos += (7 * mcuHandle->frameWidth);
mcuHandle->cbCurrPos += (7 * (mcuHandle->frameWidth >> 1));
mcuHandle->crCurrPos += (7 * (mcuHandle->frameWidth >> 1));
}
break;
case YUV444: //4:4:4
if(mcuHandle->y < mcuHandle->frameHeight)
{
#if USE_DMA
mcuHandle->dmaIDs[mcuHandle->mcuBufferIndex] = DMA_MCU444(mcuHandle,lMcuData);
#else
#ifndef BLACKFIN_JPEG_ENC
sFormMCU444(mcuHandle,lMcuData);
#else
gFormMCU444JpegEnc_BLACKFIN(mcuHandle,lMcuData);
#endif // BLACKFIN_JPEG_ENC
#endif // USE_DMA
}
mcuHandle->lumCurrPos += 8;
mcuHandle->cbCurrPos += 8;
mcuHandle->crCurrPos += 8;
mcuHandle->x += 8;
if(mcuHandle->x >= mcuHandle->frameWidth)
{
mcuHandle->x = 0;
mcuHandle->y += 8;
mcuHandle->lumCurrPos += (7 * mcuHandle->frameWidth);
mcuHandle->cbCurrPos += (7 * mcuHandle->frameWidth);
mcuHandle->crCurrPos += (7 * mcuHandle->frameWidth);
}
break;
case MONOCHROME: //4:0:0
if(mcuHandle->y < mcuHandle->frameHeight)
{
#if USE_DMA
mcuHandle->dmaIDs[mcuHandle->mcuBufferIndex] = DMA_MCU400(mcuHandle,lMcuData);
#else
#ifndef BLACKFIN_JPEG_ENC
sFormMCU400(mcuHandle,lMcuData);
#else
gFormMCU400JpegEnc_BLACKFIN(mcuHandle,lMcuData);
#endif // BLACKFIN_JPEG_ENC
#endif // USE_DMA
}
mcuHandle->lumCurrPos += 8;
mcuHandle->x += 8;
if(mcuHandle->x >= mcuHandle->frameWidth)
{
mcuHandle->x = 0;
mcuHandle->y += 8;
mcuHandle->lumCurrPos += (7 * mcuHandle->frameWidth);
}
break;
case RGB: //RGB
if(mcuHandle->y < mcuHandle->frameHeight)
{
#if USE_DMA
mcuHandle->dmaIDs[mcuHandle->mcuBufferIndex] = DMA_MCU444(mcuHandle,lMcuData);
#else
#ifndef BLACKFIN_JPEG_ENC
sFormMCU444(mcuHandle,lMcuData);
#else
gFormMCU444JpegEnc_BLACKFIN(mcuHandle,lMcuData);
#endif // BLACKFIN_JPEG_ENC
#endif // USE_DMA
}
mcuHandle->lumCurrPos += 8;
mcuHandle->cbCurrPos += 8;
mcuHandle->crCurrPos += 8;
mcuHandle->x += 8;
if(mcuHandle->x >= mcuHandle->frameWidth)
{
mcuHandle->x = 0;
mcuHandle->y += 8;
mcuHandle->lumCurrPos += (7 * mcuHandle->frameWidth);
mcuHandle->cbCurrPos += (7 * mcuHandle->frameWidth);
mcuHandle->crCurrPos += (7 * mcuHandle->frameWidth);
}
break;
}
mcuHandle->mcuBufferIndex++;
if(mcuHandle->mcuBufferIndex >= mcuHandle->numberOfBuffers)
{
mcuHandle->mcuBufferIndex = 0;
}
mcuHandle->numberOfEmptyBuffers--;
}
else
{
// No Empty Buffers available
lReturn = E_FALSE;
}
return (lReturn);
}
#endif
/*
********************************************************************************
** Function: JPEG_McuBuffer_Progressive__READ
**
** Description: This function is used to preload a data buffer for
** processing (progressive mode only; encoder only).
**
** Arguments:
** mcuHandle[IN] Handle to the Mcu Buffer data access instance.
**
** Outputs:
**
** Return value: E_TRUE or E_FALSE
********************************************************************************
*/
#ifdef JPEGBUFFERVALIDATED
asm(".section program;\n"
".align 8;\n"
"_JPEG_McuBuffer_Progressive_READ:\n"
" link 28;\n"
" [SP + 12] = P5;\n"
" P5 = R0;\n"
" R3 = R0-|-R0 || [SP + 20] = R7;\n"
" R7 = 8;\n"
" [SP + 24] = R6;\n"
" R6 = 1;\n"
" R1 = [P5 + 48];\n"
" CC = R1 == 0;\n"
" R3 = CC;\n"
" [SP + 16] = R3;\n"
" IF CC JUMP JMPR2;\n"
" R2 = [P5 + 60];\n"
" R0 = [P5 + 40];\n"
" R0 = R0.L * R2.L (FU) || R3 = [P5 + 4];\n"
" R1 = [P5 + 68];\n"
" CC = R3 < R1;\n"
" IF !CC JUMP JMPR1;\n"
" R1 = [P5 + 52];\n"
" R1 = R1 + R0;\n"
" R0 = P5;\n"
" CALL.X _gFormMCU400JpegEnc_BLACKFIN;\n"
"JMPR1: R2 = R1 -|- R1 || R1 = [P5];\n"
" R1 = R1 + R7 (NS) || R3 = [P5 + 16];\n"
" R0 = [P5 + 64];\n"
" CC = R0 <= R1;\n"
" IF !CC R2 = R1;\n"
" R0 = R3 + R7 (NS) || [P5] = R2;\n"
" R2 = R0 - R1 (NS) || R3 = [P5 + 8];\n"
" R3 = R3 << 3 || R1 = [P5 + 4];\n"
" R2 = R2 + R3 (NS) || R3 = [P5 + 40];\n"
" IF !CC R2 = R0;\n"
" R0 = R1 + R7 (NS) || [P5 + 16] = R2;\n"
" IF CC R1 = R0;\n"
" R2 = R0 -|- R0 || [P5 + 4] = R1;\n"
" R3 = R3 + R6 (NS) || R1 = [P5 + 36];\n"
" CC = R1 <= R3;\n"
" IF CC R3 = R2;\n"
" R1 = [P5 + 48];\n"
" R1 = R1 - R6 (NS) || [P5 + 40] = R3;\n"
" [P5 + 48] = R1;\n"
"JMPR2: R1 = [P5 + 92];\n"
" CC = R1 == 0;\n"
" IF CC JUMP JMPR3;\n"
" R2 = R2 -|- R2 || R1 = [P5 + 36];\n"
" [P5 + 48] = R1;\n"
" [P5 + 92] = R2;\n"
" [P5 + 44] = R2;\n"
" [P5 + 40] = R2;\n"
" [P5 + 4] = R2;\n"
" R1 = [P5 + 56];\n"
" CC = R1;\n"
" R2 = R1 + R6 (NS) || [P5] = R2;\n"
" [P5 + 56] = R2;\n"
" R3 = [P5 + 20];\n"
" R2 = [P5 + 24];\n"
" IF !CC R2 = R3;\n"
" R1 = [P5 + 32];\n"
" R1 = R1 >> 0 || [P5 + 16] = R2;\n"
" CC |= AZ;\n"
" R0 = 2;\n"
" R0 = R0 - R1 (S) || R3 = [P5 + 8];\n"
" CC |= AN;\n"
" IF CC JUMP JMPR3;\n"
" R2 = [P5 + 84];\n"
" R3 = R3 >>> 1;\n"
" [P5 + 64] = R2;\n"
" [P5 + 8] = R3;\n"
" R3 = [P5 + 88];\n"
" R2 = [P5 + 68];\n"
" CC = R1 == 1;\n"
" IF !CC R3 = R2;\n"
" [P5 + 68] = R3;\n"
"JMPR3: R0 = [SP + 16];\n"
" R7 = [SP + 20];\n"
" R6 = [SP + 24];\n"
" P5 = [SP + 12];\n"
" unlink;\n"
" RTS;\n"
".global _JPEG_McuBuffer_Progressive_READ;\n");
#else
static int32 JPEG_McuBuffer_Progressive_READ(tMcuBuffer *mcuHandle)
{
int32 lReturn = E_TRUE;
uint8 *lMcuData;
if(mcuHandle->numberOfEmptyBuffers)
{
lMcuData = mcuHandle->mcubuffer + (mcuHandle->mcuBufferIndex *
mcuHandle->mcuSize);
if(mcuHandle->y < mcuHandle->originalFramHeight)
{
#if USE_DMA
mcuHandle->dmaIDs[mcuHandle->mcuBufferIndex] = DMA_MCU400(mcuHandle,lMcuData);
#else
#ifndef BLACKFIN_JPEG_ENC
sFormMCU400(mcuHandle,lMcuData);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -