?? jpeg_mcubuffer.c
字號:
#else
gFormMCU400JpegEnc_BLACKFIN(mcuHandle,lMcuData);
#endif // BLACKFIN_JPEG_ENC
#endif // USE_DMA
}
mcuHandle->lumCurrPos += 8;
mcuHandle->x += 8;
if(mcuHandle->x >= mcuHandle->originalFramWidth)
{
mcuHandle->lumCurrPos -= mcuHandle->x;
mcuHandle->lumCurrPos += (8 * mcuHandle->frameWidth);
mcuHandle->x = 0;
mcuHandle->y += 8;
}
mcuHandle->mcuBufferIndex++;
if(mcuHandle->mcuBufferIndex >= mcuHandle->numberOfBuffers)
{
mcuHandle->mcuBufferIndex = 0;
}
mcuHandle->numberOfEmptyBuffers--;
}
else
{
// No Empty Buffers available
lReturn = E_FALSE;
}
/* Reset fields for next component */
if(mcuHandle->component_next)
{
mcuHandle->component_next = 0;
JPEG_McuBuffer_Progressive_NEXT(mcuHandle);
}
return lReturn;
}
#endif
/*
********************************************************************************
** Function: JPEG_McuBuffer_Lossless_READ
**
** Description: This function is used to preload a data buffer for
** processing (lossless mode only; encoder only).
**
** Arguments:
** mcuHandle[IN] Handle to the Mcu Buffer data access instance.
**
** Outputs:
**
** Return value: E_TRUE or E_FALSE
********************************************************************************
*/
//static
int32 JPEG_McuBuffer_Lossless_READ(tMcuBuffer *mcuHandle)
{
int32 lReturn = E_TRUE;
uint8 *lMcuData;
if(mcuHandle->numberOfEmptyBuffers)
{
lMcuData = mcuHandle->mcubuffer + (mcuHandle->mcuBufferIndex *
mcuHandle->mcuSize);
if(mcuHandle->y < mcuHandle->frameHeight)
{
#if USE_DMA
mcuHandle->dmaIDs[mcuHandle->mcuBufferIndex] = DMA_MCU400(mcuHandle,lMcuData);
#else
#ifndef BLACKFIN_JPEG_ENC
sFormRowLossless(mcuHandle,lMcuData);
#else
gFormRowLosslessJpegEnc_BLACKFIN(mcuHandle,lMcuData);
#endif // BLACKFIN_JPEG_ENC
#endif // USE_DMA
}
mcuHandle->lumCurrPos += mcuHandle->frameWidth;
mcuHandle->y += 1;
mcuHandle->mcuBufferIndex++;
if(mcuHandle->mcuBufferIndex >= mcuHandle->numberOfBuffers)
{
mcuHandle->mcuBufferIndex = 0;
}
mcuHandle->numberOfEmptyBuffers--;
}
else
{
// No Empty Buffers available
lReturn = E_FALSE;
}
/* Reset fields for next component */
if(mcuHandle->component_next)
{
mcuHandle->component_next = 0;
JPEG_McuBuffer_Lossless_NEXT(mcuHandle);
}
return lReturn;
}
/*
********************************************************************************
** Function: JPEG_McuBuffer_PROCESS
**
** Description: This function indicates to the system that the next available
** Mcu buffer is about to be processed. (Encoder only)
**
** Arguments:
** mcu[IN] Handle to the Mcu Buffer data access instance.
**
** Outputs:
**
** Return value: Pointer to the data buffer contained data ready for
** processing.
********************************************************************************
*/
#if 0
unsigned char *JPEG_McuBuffer_PROCESS(tMcuBuffer *mcu)
{
uint8 *lPointer;
#if USE_DMA
// wait until current DMA completed
dma_done(mcu->dmaIDs[mcu->processBufferIndex]);
#else
// test if buffers are empty
if(mcu->numberOfBuffers != mcu->numberOfEmptyBuffers)
{
#endif // USE_DMA
lPointer = mcu->mcubuffer + (mcu->processBufferIndex * mcu->mcuSize);
mcu->processBufferIndex++;
if(mcu->processBufferIndex >= mcu->numberOfBuffers)
{
mcu->processBufferIndex = 0;
}
return (unsigned char *)lPointer;
#if USE_DMA
#else
}
else
{
return (NULL);
}
#endif // USE_DMA
}
#else
#ifdef JPEGBUFFERVALIDATED
asm(".section program;\n.align 8;\n_JPEG_McuBuffer_PROCESS:\n"
" P0 = R0;\n"
" [--SP] = (R7:6);\n"
" R6 = 1;\n"
" R0 = R3 -|- R3 || R1 = [P0 + 44];\n"
" R6 = R6 + R1 (NS) || R3 = [P0 + 60];\n"
" R3 = R1.L * R3.L (FU) || R2 = [P0 + 36];\n"
" CC = R6 < R2;\n"
" IF !CC R6 = R0;\n"
" R7 = [P0 + 48];\n"
" CC = R7 == R2;\n"
" IF CC R6 = R1;\n"
" R1 = [P0 + 52];\n"
" R1 = R3 + R1 (NS) || [P0 + 44] = R6;\n"
" IF !CC R0 = R1;\n"
" (R7:6) = [SP++]; RTS;\n"
".global _JPEG_McuBuffer_PROCESS;\n");
#else
unsigned char *JPEG_McuBuffer_PROCESS(tMcuBuffer *mcu) {
uint8 *lPointer;
if(mcu->numberOfBuffers != mcu->numberOfEmptyBuffers) {
lPointer = mcu->mcubuffer + (mcu->processBufferIndex * mcu->mcuSize);
mcu->processBufferIndex++;
if(mcu->processBufferIndex >= mcu->numberOfBuffers) mcu->processBufferIndex = 0;
return (unsigned char *)lPointer;
}
return (NULL);
}
#endif
#endif
/*
********************************************************************************
** Function: JPEG_McuBuffer_RELEASE
**
** Description: This function is used to release a data buffer that is
** currently being processed. (Encoder only)
**
** Arguments:
** mcu[IN] Handle to the Mcu Buffer data access instance.
**
** Outputs:
**
** Return value: None
********************************************************************************
*/
#ifdef JPEGBUFFERVALIDATED
asm(".section program;\n.align 8;\n_JPEG_McuBuffer_RELEASE:\n"
" P0 = R0;\n"
" R2 = 1;NOP; NOP; NOP;\n"
" R3 = [P0 + 72];\n"
" CC = R3 == 2;\n"
" R0 = [P0 + 48];\n"
" R0 = R0 + R2 ; R3 = [P0 + 76];\n"
" [P0 + 48] = R0; IF !CC JUMP JMRL1;\n"
" R0 = R3 - R2 ; R1 = [P0 + 80];\n"
" CC = R0 == 0; IF CC R0 = R1;\n"
" [P0 + 76] = R0;\n"
" R1 = [P0 + 92];\n"
" IF !CC R2 = R1;\n"
" [P0 + 92] = R2;\n"
"JMRL1: RTS;\n.global _JPEG_McuBuffer_RELEASE;\n");
#else
void JPEG_McuBuffer_RELEASE(tMcuBuffer *mcu)
{
mcu->numberOfEmptyBuffers++;
/* Count the number of MCUs for each progressive component frame: */
if(mcu->encodingMode == PROGRESSIVE)
{
if( --(mcu->progressiveBlockCount) == 0)
{
/* Flag the next frame: */
mcu->component_next = 1;
mcu->progressiveBlockCount = mcu->progressiveBlockCount_next;
}
}
}
#endif
/*
********************************************************************************
Function Name: JPEG_McuBuffer_REQUEST
Parameters:
handle [IN]: Handle to Mcu Buffer data access instance.
Return Value: char * : Pointer to a empty data buffer ready for storing the
processing output.
Description: This function is used to obtain the next available Mcu buffer about
to be filled by the processed output data. When processing is
finished, the user must call JPEG_McuBuffer_WRITE to empty and
release the data buffer. NULL is returned if there is no valid data
buffer available for filling.
(Decoder only)
********************************************************************************
*/
#ifdef JPEGBUFFERVALIDATED
asm(".section program;\n"
".align 8;\n"
"_JPEG_Mcu_div: R3 = R0 ^ R1;\n"
" R2 = abs R0;\n"
"#if defined(__ADSPBF535__) || defined(__AD6532__)\n"
" CC = AV0;\n"
"#else\n"
" CC = V;\n"
"#endif\n"
" R1 = ABS R1;\n"
" CC = R2 < R1;\n"
" R0 = 0;\n"
" IF CC JUMP JPEG_Mcu_ZRET;\n"
" R0 = R2;\n"
" R2 = R1 >> 15;\n"
" R3 = ROT R3 BY -1;\n"
" CC = R2;\n"
" IF CC JUMP JPEG_Mcu_IDENT;\n"
" r2 = r1 << 16;\n"
" cc = r2 <= r0;\n"
" IF cc jump JPEG_Mcu_IDENT;\n"
" p0 = 16;\n"
" DIVS(R0, R1);\n"
" lsetup (JPEG_Mcu_dl, JPEG_Mcu_dl) lc0 = p0;\n"
"JPEG_Mcu_dl: DIVQ(R0, R1);\n"
" R0 = R0.L (Z);\n"
" R1 = R3 >> 31; R0 = R0 + R1; R1 = -R0;\n"
" CC = BITTST(R3, 30); IF CC R0 = R1;\n"
" RTS;\n"
"JPEG_Mcu_IDENT: R0 = R2; CC = R0 == 0; IF CC JUMP JPEG_Mcu_ZRET;\n"
" R2 = -1(X); R2 >>= 1; CC = R1 == 0; IF CC JUMP JPEG_Mcu_IRET;\n"
" R2 = 1 (Z); CC = R0 == R1; IF CC JUMP JPEG_Mcu_IRET;\n"
" R2 = R0; CC = R1 == 1; IF CC JUMP JPEG_Mcu_IRET;\n"
" I0 = R3;\n"
" [--SP] = (R7:4);\n"
" R3 = 0;\n"
" R2 = R0 << 1;\n"
" R4 = R0^R1;\n"
" R5 = R4 >> 31;\n"
" R2 = R2|R5; P2 = 31;\n"
" R4 = R3^R1;\n"
" LSETUP(JPEG_Mcu_LST,JPEG_Mcu_LEND) LC0 = P2;\n"
"JPEG_Mcu_LST: R5 = R2 >> 31;\n"
" R2 = R2 << 1;\n"
" R3 = R3 << 1;\n"
" R3 = R3 | R5;\n"
" CC = R4 < 0;\n"
" R5 = -R1;\n"
" IF CC R5 = R1;\n"
" R3 = R3 + R5;\n"
" R4 = R3^R1;\n"
" R5 = R4 >> 31;\n"
" BITCLR(R2,0);\n"
" BITTGL(R5,0);\n"
"JPEG_Mcu_LEND: R2 = R2 + R5;\n"
" R3 = I0;\n"
" R1 = R3 >> 31;\n"
" R2 = R2 + R1;\n"
" (R7:4)= [SP++];\n"
"JPEG_Mcu_IRET: R0 = -R2; cc = bittst(r3,30); if !cc r0 = r2;\n"
"JPEG_Mcu_ZRET: RTS;\n"
".section program;\n"
".align 8;\n"
"_JPEG_McuBuffer_REQUEST:\n"
" LINK 0; [--SP] = P5; P5 = R0;\n"
" [--SP] = R7; [--SP] = R6; R6 = 1; SP += -12;\n"
" R0 = R2 -|- R2 || R1 = [P5 + 36];\n"
" R1 = R1 >> 0 || R2 = [P5 + 40];\n"
" CC = AZ;\n"
" R2 = R2 + R6;\n"
" CC |= AZ;\n"
" R3 = R2 - R1;\n"
" CC |= AZ;\n"
" R6 = R1 + R6, R3 = R1 - R6;\n"
" CC |= AZ;\n"
" IF CC JUMP JMBRQ0;\n"
" R7 = R2;\n"
" R6 = R1;\n"
" R0 = R2;\n"
" SP += -12;\n"
" CALL.X _JPEG_Mcu_div;\n"
" SP += 12;\n"
" R0 *= R6;\n"
" R0 = R7 - R0;\n"
"JMBRQ0: P2 = [P5 + 108];\n"
" P0 = R0;\n"
" R7 = [P5 + 36];\n"
" R1 = R7 - R0;\n"
" P1 = R1;\n"
" CC = R7 <= R0;\n"
" R3 = R0;\n"
" P0 = P2 + (P0<<2);\n"
" R1 = 1;\n"
" R0 = R1-|-R1 || R2 = [P0++];\n"
" IF CC JUMP JMBRQ4;\n"
" LSETUP (JMBRQ1, JMBRQ2) LC0 = P1;\n"
"JMBRQ1: CC = R2 == 0;\n"
" IF CC JUMP JMBRQ3;\n"
"JMBRQ2: R3 = R3 + R1 (NS) || R2 = [P0++];\n"
" JUMP JMBRQ4;\n"
"JMBRQ3: [P0 - 4] = R1;\n"
" R1 = [P5 + 116];\n"
" CC = R1 == 0;\n"
" R2 = [P5 + 8];\n"
" R1 = [P5 + 60];\n"
" IF CC R1 = R2;\n"
" R0 = [P5 + 52];\n"
" R1 = R3.L * R1.L (FU) || [P5 + 40] = R3;\n"
" R0 = R1 + R0;\n"
"JMBRQ4: SP += 12;\n"
" R6 = [SP++];\n"
" R7 = [SP++];\n"
" P5 = [SP++];\n"
" UNLINK;\n"
" RTS;\n"
".global _JPEG_McuBuffer_REQUEST;\n");
#else
uint8 *JPEG_McuBuffer_REQUEST(tMcuBuffer *lDer)
{
int32 lTemp, lCount1, lCount2;
lCount2 = lDer->mcuBufferIndex + 1;
lCount2 %= (lDer->numberOfBuffers);
for(lCount1 = lCount2; lCount1 < lDer->numberOfBuffers; lCount1++)
{
if(lDer->mcuFree[lCount1] == FREE)
{
lDer->mcuFree[lCount1] = BUSY;
goto VALID_BUFFER;
}
}
return NULL; // no valid data buffers
VALID_BUFFER:
lDer->mcuBufferIndex = lCount1;
if(lDer->mcuLossy)
{
lTemp = lDer->mcuSize * lCount1;
}
else
{
lTemp = lDer->frameWidth * lCount1;
}
return (lDer->mcubuffer + lTemp);
}
#endif
/*
********************************************************************************
Function Name: JPEG_McuBuffer_WRITE
Parameters:
handle [IN]: Handle to Mcu Buffer data access instance.
Return Value: int : TRUE(1) or FALSE(0).
Description: This function is used to empty a data buffer after processing.
FALSE is returned if there was no data buffer being processed. This
must be called after calling the function JPEG_McuBuffer_REQUEST.
(Decoder only)
********************************************************************************
*/
#ifdef JPEGBUFFERVALIDATED
asm(".section program;\n"
".align 8;\n"
"_JPEG_McuBuffer_WRITE:\n"
".extern _sStoreLosslessMcuBuffer;\n"
" LINK 0;\n"
" [--SP] = (P5:4);\n"
" P5 = R0;\n"
" [--SP] = (R7:6);\n"
" SP += -12; R1 = 1;\n"
" R0 = [P5 + 44];\n"
" P4 = [P5 + 108];\n"
" R0 += 1;\n"
" R2 = [P5 + 116];\n"
" CC = R2 == 0;\n"
" R7 = R7 -|- R7 || R6 = [P5 + 36];\n"
" IF CC JUMP JMBW4;\n"
" CC = R6 <= R0;\n"
" IF !CC R7 = R0;\n"
" P0 = R7;\n"
" CC = R6 <= R0;\n"
" R0 = R6 - R0;\n"
" IF CC R0 = R6;\n"
" P1 = R0;\n"
" CC = R6 <= R7;\n"
" P0 = P4 + (P0<<2);\n"
" R0 = R0 -|- R0 || R2 = [P0++];\n"
" IF CC JUMP JMBW15;\n"
" R1 = 1;\n"
" LSETUP (JMBW1, JMBW2) LC0 = P1;\n"
"JMBW1: CC = R2 == R1;\n"
" IF CC JUMP JMBW3;\n"
"JMBW2: R7 = R7 + R1 (NS) || R2 = [P0++];\n"
" JUMP JMBW15;\n"
"JMBW3: R3 = [P5 + 32]; P1.H = JMBWRTS; P1.L = JMBWRTS;\n"
" P0.H = _sStore420McuBuffer; P0.L = _sStore420McuBuffer;\n"
" R1 = 1; CC = R3 == R1; IF CC P1 = P0;\n"
" P0.H = _sStore422McuBuffer; P0.L = _sStore422McuBuffer;\n"
" R1 = 2; CC = R3 == R1; IF CC P1 = P0;\n"
" P0.H = _sStore444McuBuffer; P0.L = _sStore444McuBuffer;\n"
" R1 = 3; CC = R3 == R1; IF CC P1 = P0;\n"
" P0.H = _sStoreMonoMcuBuffer; P0.L = _sStoreMonoMcuBuffer;\n"
" R1 = 4; CC = R3 == R1; IF CC P1 = P0;\n"
" P0.H = _sStore444McuBuffer; P0.L = _sStore444McuBuffer;\n"
" R1 = 5; CC = R3 == R1; IF CC P1 = P0;\n"
" R0 = P5; NOP; NOP; NOP;\n"
" CALL (P1);\n"
" JUMP JMBW14;\n"
"JMBW4: R1 = R6 >> 0;\n"
" CC = AZ;\n"
" R2 = R0 >> 0;\n"
" CC |= AZ;\n"
" R3 = 1;\n"
" R0 = R1 + R3, R3 = R1 - R3;\n"
" CC |= AZ;\n"
" R3 = R2 - R1;\n"
" CC |= AZ;\n"
" R0 = 0;\n"
" IF CC JUMP JMBW5;\n"
" [--SP] = (R7:6);\n"
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -