⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jpeg_mcubuffer.c

📁 ADI blackfin DSP的基于device friver的jpeg压缩算法
💻 C
📖 第 1 页 / 共 5 页
字号:
#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 + -