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

📄 jpeg_mcubuffer.c

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