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

📄 jpeg_mcubuffer.c

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