📄 jpeg_mcubuffer.c
字号:
{
int32 lCount1;
int32 lCount2;
tPixel *lTempFrame;
uint8 *block;
int32 lLumWidth = mbdata->frameWidth;
int32 lChroWidth = mbdata->frameWidth;
block = mcudata;
/* Luminance Block(s) */
lTempFrame = mbdata->lumCurrPos;
for(lCount1 = 0; lCount1 < BLOCK_WIDTH; lCount1 ++)
{
for(lCount2 = 0; lCount2 < BLOCK_WIDTH; lCount2 ++)
{
block[lCount2] = lTempFrame[lCount2];
}
block += BLOCK_WIDTH;
lTempFrame += lLumWidth;
}
/* Chrominance Block(s) "Cb" */
lTempFrame = mbdata->cbCurrPos;
for(lCount1 = 0; lCount1 < BLOCK_WIDTH; lCount1 ++)
{
for(lCount2 = 0; lCount2 < BLOCK_WIDTH; lCount2 ++)
{
block[lCount2] = lTempFrame[lCount2];
}
block += BLOCK_WIDTH;
lTempFrame += lChroWidth;
}
/* Chrominance Block(s) "Cr" */
lTempFrame = mbdata->crCurrPos;
for(lCount1 = 0; lCount1 < BLOCK_WIDTH; lCount1 ++)
{
for(lCount2 = 0; lCount2 < BLOCK_WIDTH; lCount2 ++)
{
block[lCount2] = lTempFrame[lCount2];
}
block += BLOCK_WIDTH;
lTempFrame += lChroWidth;
}
return;
}
/*
********************************************************************************
** Function: sFormMCU400
**
** Description: Copy block corresponding to the yuv400 data from the
** frame store. (Encoder only)
**
** Arguments:
** mcuHandle[IN] Handle to the Mcu Buffer data access instance.
** mcuData [OUT] Pointer to macroblock data structures.
**
** Outputs:
**
** Return value: None
********************************************************************************
*/
static void sFormMCU400(tMcuBuffer *mbdata, uint8 *mcudata)
{
int32 lCount1;
int32 lCount2;
tPixel *lTempFrame;
uint8 *block;
int32 lLumWidth = mbdata->frameWidth;
block = mcudata;
/* Luminance Block(s) */
lTempFrame = mbdata->lumCurrPos;
for(lCount1 = 0; lCount1 < BLOCK_WIDTH; lCount1 ++)
{
for(lCount2 = 0; lCount2 < BLOCK_WIDTH; lCount2 ++)
{
block[lCount2] = lTempFrame[lCount2];
}
block += BLOCK_WIDTH;
lTempFrame += lLumWidth;
}
return;
}
/*
*******************************************************************************
Name : sStoreMcuBuffer
Description : Stores into external memory for one data unit. (Decoder only)
Parameter : uint8 *currFrame: External memory location,
uint8 *outBuffer: Mcu buffer output location,
int32 x : X coordinate
int32 y : Y coordinate,
int32 frameWidth: FrameWidth.
Return Value : void
*******************************************************************************
*/
void sStoreMcuBuffer(uint8 *currFrame, uint8 *outBuffer, int32 x,
int32 y, int32 frameWidth)
{
int32 *lMBStart0;
int32 *lBlockStart0;
int32 lOffset;
int32 lValue;
//Store a data unit in the frame buffer
lMBStart0 = (int32 *) (currFrame + frameWidth * y + x);
lBlockStart0 = (int32 *) outBuffer;
frameWidth >>= 2;
for (lOffset = 0; lOffset < BLOCK_WIDTH; lOffset++)
{
lValue = lBlockStart0[0];
lMBStart0[0] = lValue;
lValue = lBlockStart0[1];
lMBStart0[1] = lValue;
lMBStart0 += frameWidth;
lBlockStart0 += 2;
}
return;
}
#endif
/*
*******************************************************************************
Name : sStore420McuBuffer
Description : Stores into external memory from the mcu buffer for 420 image
(Decoder only)
Parameter : tMcuBuffer *: pointer to jpeg mcu object
Return Value : void
*******************************************************************************
*/
#ifdef JPEGBUFFERVALIDATED
asm(
".section program;\n"
".align 8;\n"
"_sStore420McuBuffer:\n"
" P2 = R0;\n"
" [--SP] = R5;\n"
" [--SP] = R7;\n"
" [--SP] = P5;\n"
" R3 = 8;\n"
" R0 = [P2 + 60];\n"
" R1 = R0 -|- R0 || R2 = [P2 + 40];\n"
" R0 = R2.L * R0.L (FU) || R2 = [P2 + 52];\n"
" R0 = R0 + R2 (NS) || R2 = [P2 + 4];\n"
" I0 = R0;\n"
" R2.H = R2.L + R3.L (S) || R5 = [P2 + 8];\n"
" R0 = R5 >> 2;\n"
" R0 = R0 << 2 || R7 = [P2];\n"
" R0 += -4;\n"
" M3 = R0;\n"
" R3 = R5.L * R2.L, R2 = R5.L * R2.H (FU) || R0 = [P2 + 16];\n"
" R0 = R0 + R7;\n"
" R3 = R3 + R0;\n"
" I1 = R3;\n"
" I2 = R3;\n"
" R0 = R2 + R0;\n"
" I3 = R0;\n"
" R3 = 16;\n"
" R0 = R3 + R7 (NS) || R2 = [P2 + 4];\n"
" CC = R5 <= R0;\n"
" IF CC R0 = R1;\n"
" R0 = R2 + R3 (NS) || [P2] = R0;\n"
" IF !CC R0 = R2;\n"
" R7 = R7 >>> 1 || [P2 + 4] = R0;\n"
" R3 = R2 >>> 1;\n"
" A1 = R7;\n"
" R1 = R5 >>> 1;\n"
" R0 = R1 >> 2;\n"
" R0 = R0 << 2 || I2 += 4;\n"
" R0 += -4;\n"
" P1 = R0;\n"
" R3 = (A1 += R1.L * R3.L) (FU) || R0 = [P2 + 20];\n"
" R0 = R3 + R0 (NS) || R2 = [P2 + 24];\n"
" P0 = R0;\n"
" R2 = R3 + R2 (NS) || R1 = [I0++] || I2 += 4;\n"
" P2 = 8;\n"
" P5 = R2;\n"
" LSETUP (ss4201, ss4202) LC0=P2;\n"
"ss4201: [I1++] = R1 || R0 = [I0++];\n"
"ss4202: [I1++M3]= R0 || R1 = [I0++];\n"
" LSETUP (ss4203, ss4204) LC0=P2;\n"
"ss4203: [I2++] = R1 || R0 = [I0++];\n"
"ss4204: [I2++M3]= R0 || R1 = [I0++];\n"
" I2 = I3;\n"
" I2 += 4;\n"
" I2 += 4;\n"
" LSETUP (ss4205, ss4206) LC0=P2;\n"
"ss4205: [I3++] = R1 || R0 = [I0++];\n"
"ss4206: [I3++M3]= R0 || R1 = [I0++];\n"
" LSETUP (ss4207, ss4208) LC0=P2;\n"
"ss4207: [I2++] = R1 || R0 = [I0++];\n"
"ss4208: [I2++M3]= R0 || R1 = [I0++];\n"
" LSETUP (ss4209, ss42010) LC0=P2;\n"
"ss4209: [P0++] = R1 || R0 = [I0++];\n"
"ss42010: [P0++P1]= R0 || R1 = [I0++];\n"
" LSETUP (ss42011, ss42012) LC0=P2;\n"
"ss42011: [P5++] = R1 || R0 = [I0++];\n"
"ss42012: [P5++P1]= R0 || R1 = [I0++];\n"
" P5 = [SP++]; R7 = [SP++]; R5 = [SP++]; RTS;\n"
".global _sStore420McuBuffer;\n");
#else
static void sStore420McuBuffer(tMcuBuffer *lDer)
{
int32 lX, lY;
uint8 *lBuffer;
lBuffer = lDer->mcubuffer + (lDer->mcuBufferIndex * lDer->mcuSize);
lX = lDer->x;
lY = lDer->y;
sStoreMcuBuffer(lDer->lumCurrPos, lBuffer,
lX, lY, lDer->frameWidth);
sStoreMcuBuffer(lDer->lumCurrPos, lBuffer + (1 << LOG_BLOCK_SIZE),
lX + BLOCK_WIDTH, lY, lDer->frameWidth);
sStoreMcuBuffer(lDer->lumCurrPos, lBuffer + (2 << LOG_BLOCK_SIZE),
lX, lY + BLOCK_WIDTH, lDer->frameWidth);
sStoreMcuBuffer(lDer->lumCurrPos, lBuffer + (3 << LOG_BLOCK_SIZE),
lX + BLOCK_WIDTH, lY + BLOCK_WIDTH,
lDer->frameWidth);
lX >>= 1;
lY >>= 1;
sStoreMcuBuffer(lDer->cbCurrPos, lBuffer + (4 << LOG_BLOCK_SIZE),
lX, lY, lDer->frameWidth >> 1);
sStoreMcuBuffer(lDer->crCurrPos, lBuffer + (5 << LOG_BLOCK_SIZE),
lX, lY, lDer->frameWidth >> 1);
lDer->x += 16;
if(lDer->x >= lDer->frameWidth)
{
lDer->x = 0;
lDer->y += 16;
}
return;
}
#endif
/*
*******************************************************************************
Name : sStore422McuBuffer
(Decoder only)
Description : Stores into external memory from the mcu buffer for 422 image
Parameter : tMcuBuffer *: pointer to jpeg mcu object
Return Value : void
*******************************************************************************
*/
#ifdef JPEGBUFFERVALIDATED
asm(".section program;\n"
".align 8;\n"
"_sStore422McuBuffer:\n"
" P0 = R0;\n"
" [--SP] = (P5:3); [--SP] = R7; [--SP] = R6; [--SP] = R5; \n"
" P3 = 8;\n"
" R2 = [P0 + 52];\n"
" A0 = R2 || R0 = [P0 + 60];\n"
" R2 = [P0 + 40];\n"
" A0 += R2.L * R0.L (FU) || R3 = [P0 + 56];\n"
" R0 = A0;\n"
" I0 = R0;\n"
" CC = R1 == R3;\n"
" R1 = R1 -|- R1 || R5 = [P0 + 8];\n"
" R0 = R5 >> 2 || R7 = [P0];\n"
" R0 = R0 << 2 || R2 = [P0 + 16];\n"
" R0 += -4; M1 = R0;\n"
" R2 = R7 + R2 (NS) || R6 = [P0 + 4];\n"
" M2 = R2; R3 = 16;\n"
" R0 = R7 + R3;\n"
" IF CC JUMP s4229;\n"
" CC = R5 <= R0;\n"
" IF CC R0 = R1;\n"
" R3 = ROT R1 BY 4;\n"
" R3 = R3 + R6 (NS) || [P0] = R0;\n"
" R7 = R7 >>> 1 || [P0 + 4] = R3;\n"
" R3 = R5.L * R6.L (FU);\n"
" I1 = R3;\n"
" R3 = R5 >>> 3 ;\n"
" R1 = R5 >>> 1 || R0 = [P0 + 20];\n"
" R2 = R1.L * R6.L (FU) || R1 = [P0 + 24];\n"
" R2 = R7 + R2 (NS) || R5 = [SP++]; \n"
" R0 = R2 + R0 (NS) || R6 = [SP++]; I2 = R0;\n"
" R1 = R2 + R1 (NS) || R7 = [SP++];\n"
" R3 = R3 << 2 || R0 = [I0++] || I1 += M2; R3 += -4; M0 = R3;\n"
" I3 = I1; I3+=4; I3 += 4;\n"
" LSETUP (s4221, s4222) LC0=P3;\n"
"s4221: [I1++] = R0 || R0 = [I0++];\n"
"s4222: [I1++M1] = R0 || R0 = [I0++];\n"
" LSETUP (s4223, s4224) LC0=P3;\n"
"s4223: [I3++] = R0 || R0 = [I0++];\n"
"s4224: [I3++M1] = R0 || R0 = [I0++];\n"
" I3 = R1;\n"
" LSETUP (s4225, s4226) LC0=P3;\n"
"s4225: [I2++] = R0 || R0 = [I0++];\n"
"s4226: [I2++M0] = R0 || R0 = [I0++];\n"
" LSETUP (s4227, s4228) LC0=P3;\n"
"s4227: [I3++] = R0 || R0 = [I0++];\n"
"s4228: [I3++M0] = R0 || R0 = [I0++];\n"
" (P5:3) = [SP++];\n"
" RTS;\n"
"s4229: CC = R5 <= R0;\n"
" IF CC R0 = R1;\n"
" R3 = R6 + R3 (NS) || [P0] = R0;\n"
" IF CC R3 = R6;\n"
" R6.H = 8;\n"
" R6.H = R6.H + R6.L (NS) || [P0 + 4] = R3;\n"
" R1 = R5.L * R6.L, R0 = R5.L * R6.H (FU);\n"
" I3 = R0; I2 = R1;\n"
" R0 = R5 >>> 3 || R2 = [P0 + 20];\n"
" R0 = R0 << 2 || R1 = [P0 + 24]; R0 += -4; P2 = R0;\n"
" R7 = R7 >>> 1 || I2 += M2; I1=I2;\n"
" R3 = R5 >>> 1 || I3 += M2; \n"
" R2 = R7 + R2;\n"
" R1 = R7 + R1;\n"
" R7 = R3.L * R6.L, R6 = R3.L * R6.H (FU) || I1 += 4;\n"
" R0 = R7 + R2; P0 = R0;\n"
" R0 = R6 + R2; P1 = R0;\n"
" R0 = R7 + R1; P4 = R0;\n"
" R1 = R6 + R1 (NS) || R0 = [I0++] || I1 += 4; P5 = R1;\n"
" LSETUP (s42210, s42211) LC0=P3;\n"
"s42210: [I2++] = R0 || R0 = [I0++];\n"
"s42211: [I2++M1] = R0 || R0 = [I0++];\n"
" LSETUP (s42212, s42213) LC0=P3;\n"
"s42212: [I1++] = R0 || R0 = [I0++];\n"
"s42213: [I1++M1] = R0 || R0 = [I0++];\n"
" I1 = I3; I1 += 4; I1 += 4;\n"
" LSETUP (s42214, s42215) LC0=P3;\n"
"s42214: [I3++] = R0 || R0 = [I0++];\n"
"s42215: [I3++M1] = R0 || R0 = [I0++];\n"
" LSETUP (s42216, s42217) LC0=P3;\n"
"s42216: [I1++] = R0 || R0 = [I0++];\n"
"s42217: [I1++M1] = R0 || R0 = [I0++];\n"
" LSETUP (s42218, s42219) LC0=P3;\n"
"s42218: [P0++] = R0 || R0 = [I0++];\n"
"s42219: [P0++P2] = R0 || R0 = [I0++];\n"
" LSETUP (s42220, s42221) LC0=P3;\n"
"s42220: [P1++] = R0 || R0 = [I0++];\n"
"s42221: [P1++P2] = R0 || R0 = [I0++];\n"
" LSETUP (s42222, s42223) LC0=P3;\n"
"s42222: [P4++] = R0 || R0 = [I0++];\n"
"s42223: [P4++P2] = R0 || R0 = [I0++];\n"
" LSETUP (s42224, s42225) LC0=P3;\n"
"s42224: [P5++] = R0 || R0 = [I0++];\n"
"s42225: [P5++P2] = R0 || R0 = [I0++];\n"
" R5 = [SP++]; R6 = [SP++]; R7 = [SP++];\n"
" (P5:3) = [SP++];\n"
" RTS;\n.global _sStore422McuBuffer;\n");
#else
static void sStore422McuBuffer(tMcuBuffer *lDer)
{
int32 lX, lY;
uint8 *lBuffer;
lBuffer = lDer->mcubuffer + (lDer->mcuBufferIndex * lDer->mcuSize);
lX = lDer->x;
lY = lDer->y;
if(lDer->componentNumber != 8)
{
sStoreMcuBuffer(lDer->lumCurrPos, lBuffer,
lX, lY, lDer->frameWidth);
sStoreMcuBuffer(lDer->lumCurrPos, lBuffer + (1 << LOG_BLOCK_SIZE),
lX + BLOCK_WIDTH, lY, lDer->frameWidth);
lX >>= 1;
sStoreMcuBuffer(lDer->cbCurrPos, lBuffer + (2 << LOG_BLOCK_SIZE),
lX, lY, lDer->frameWidth >> 1);
sStoreMcuBuffer(lDer->crCurrPos, lBuffer + (3 << LOG_BLOCK_SIZE),
lX, lY, lDer->frameWidth >> 1);
lDer->x += 16;
if(lDer->x >= lDer->frameWidth)
{
lDer->x = 0;
lDer->y += 8;
}
}
else
{
sStoreMcuBuffer(lDer->lumCurrPos, lBuffer,
lX, lY, lDer->frameWidth);
sStoreMcuBuffer(lDer->lumCurrPos, lBuffer + (1 << LOG_BLOCK_SIZE),
lX + BLOCK_WIDTH, lY, lDer->frameWidth);
sStoreMcuBuffer(lDer->lumCurrPos, lBuffer + (2 << LOG_BLOCK_SIZE),
lX, lY + BLOCK_WIDTH, lDer->frameWidth);
sStoreMcuBuffer(lDer->lumCurrPos, lBuffer + (3 << LOG_BLOCK_SIZE),
lX + BLOCK_WIDTH, lY + BLOCK_WIDTH, lDer->frameWidth);
lX >>= 1;
sStoreMcuBuffer(lDer->cbCurrPos, lBuffer + (4 << LOG_BLOCK_SIZE),
lX, lY, lDer->frameWidth >> 1);
sStoreMcuBuffer(lDer->cbCurrPos, lBuffer + (5 << LOG_BLOCK_SIZE),
lX, lY + BLOCK_WIDTH, lDer->frameWidth >> 1);
sStoreMcuBuffer(lDer->crCurrPos, lBuffer + (6 << LOG_BLOCK_SIZE),
lX, lY, lDer->frameWidth >> 1);
sStoreMcuBuffer(lDer->crCurrPos, lBuffer + (7 << LOG_BLOCK_SIZE),
lX, lY + BLOCK_WIDTH, lDer->frameWidth >> 1);
lDer->x += 16;
if(lDer->x >= lDer->frameWidth)
{
lDer->x = 0;
lDer->y += 16;
}
}
return;
}
#endif
/*
*******************************************************************************
Name : sStore444McuBuffer
(Decoder only)
Description : Stores into external memory from the mcu buffer for 444 image
Parameter : tMcuBuffer *: pointer to jpeg mcu object
Return Value : void
*******************************************************************************
*/
#ifdef JPEGBUFFERVALIDATED
asm(".section program;\n"
".align 8;\n"
"_sStore444McuBuffer:\n"
" P0 = R0;\n"
" M0 = 60(X); M1 = -124(X); P2 = 8;\n"
" [--SP] = R7; [--SP] = R6; [--SP] = R5;\n"
" R0 = [P0 + 60];\n"
" R1 = R1 -|- R1 || R2 = [P0 + 40];\n"
" R0 = R2.L * R0.L (FU) || R2 = [P0 + 52];\n"
" R0 = R0 + R2 (NS) || R5 = [P0 + 8];\n"
" I0 = R0 ;\n"
" R0 = R5 >> 2 || R7 = [P0];\n"
" R0 = R0 << 2 || R6 = [P0 + 4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -