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

📄 framecode.c

📁 DM642的mpeg4编码
💻 C
📖 第 1 页 / 共 2 页
字号:
			for (i = 0; i < 4; i++)
			{
				iPosition =  iStride * ((i/2)*8) + ix*16+ (i%2)*8;
				//将当前块的值拷贝到pCurImage图象中去   
				TransferBlock16ToImage8(iPosition+CurRecFrameBufferPong->Y,  DCT_COEFF+i*64,iStride);
			}
			iPosition = ix*8;
			TransferBlock16ToImage8(iPosition+CurRecFrameBufferPong->Cb,  DCT_COEFF+256, iStrideHalf);
			TransferBlock16ToImage8(iPosition+CurRecFrameBufferPong->Cr, DCT_COEFF+320, iStrideHalf);
				
					
	   }//for (ix = 0; ix < iMBWidth; ix++)
		CurRecFrameBufferPong->Y-=IMAGE_EDGE;
		CurRecFrameBufferPong->Cb-=IMAGE_EDGE_HALF;
		CurRecFrameBufferPong->Cr-=IMAGE_EDGE_HALF;
		
		if(iy>0)
			DAT_wait(transferIdYRec);

		SWAP(Image8*,CurRecFrameBufferPing, CurRecFrameBufferPong);
		
		//起始行的地址
	   iPositionLum = iy * iStride * 16-IMAGE_EDGE;
	   iPositionChro =iy * iStrideHalf * 8-IMAGE_EDGE_HALF;
		DAT_copy(CurRecFrameBufferPing->Cb,iPositionChro + pEncoder->pCurImage8->Cb,64*iExtMBWidth);
		DAT_copy(CurRecFrameBufferPing->Cr,iPositionChro + pEncoder->pCurImage8->Cr,64*iExtMBWidth);
		transferIdYRec=DAT_copy(CurRecFrameBufferPing->Y,iPositionLum + pEncoder->pCurImage8->Y,4*64*iExtMBWidth);
   }
   StreamPad(bs);
			
   return 1;
}

//***********************************************************************************************
//函 数 名:P_MBCoding()
//函数功能:
//形式参数:
//返 回 值:void
//***********************************************************************************************
int P_MBCoding(Stream* bs, Encoder* pEncoder,Image8* pCurImage,Image8* pRefImage,Image8* pCurRecFrame,short ix,short iy)
{
	int i, iPosition,iPositionLum, iPositionChro;

	short iMBWidth;

	short iMBNo = 0, iQuant;

	short iDcScalarLum, iDcScalarChr;

	short iStride = pEncoder->pCurFrameInfo->vop_extwidth;

	short  iStrideHalf = iStride/2 ;

//	short DCT_COEFF[6*64], PIXEL_COEFF[6*64];

	MacroBlock * pCurMB = NULL;

	MacroBlock * MBs =  pEncoder->pCurFrameInfo->pMB;

	//StreamPad(bs);

	if (pEncoder->pCurFrameInfo->vop_quant > 31)
	{
		pEncoder->pCurFrameInfo->vop_quant = 31;
	}

	iMBWidth = pEncoder->pCurFrameInfo->vop_width / 16;
/*	for (iy = 0; iy < iMBHeight; iy++)
	{
		for (ix = 0; ix < iMBWidth; ix++)
		{
		*/
			iMBNo = ix + iy * iMBWidth;
			pCurMB = &MBs[iMBNo];
			

			if (pCurMB->mb_type == MB_SKIP)
			{
				StreamPutBit(bs, 1);
				pCurMB->Mv[1].x = pCurMB->Mv[2].x = pCurMB->Mv[3].x = pCurMB->Mv[0].x = 0;
				pCurMB->Mv[1].y = pCurMB->Mv[2].y = pCurMB->Mv[3].y = pCurMB->Mv[0].y = 0;
				//			    
				for (i = 0; i < 4; i++)
				{
					iPosition = iStride * (i/2)*8 + ix*16+ (i%2)*8;
					TransferImage8ToImage8(iPosition+pCurRecFrame->Y, iPosition+pRefImage->Y, iStride);
				}
				iPosition = ix*8;
				TransferImage8ToImage8(iPosition+pCurRecFrame->Cb, iPosition+pRefImage->Cb, iStrideHalf);
				TransferImage8ToImage8(iPosition+pCurRecFrame->Cr, iPosition+pRefImage->Cr, iStrideHalf);	  
	//			continue;
			}


			//***********************************************************
			iQuant =  pCurMB->quant = pEncoder->pCurFrameInfo->vop_quant;

			if (pCurMB->mb_type == MB_INTRA_Q || pCurMB->mb_type == MB_INTER_Q)
			{
				iQuant = pCurMB->quant + pCurMB->dquant;
				CLIP(iQuant, 1, 31);
			}

			/*  DCT transform, and get the pEncoder->pDctImage  */
			iPositionLum = ix * 16;
			iPositionChro =ix * 8;


			/*  macroblock coding  */
			if (pCurMB->mb_type == MB_INTRA || pCurMB->mb_type == MB_INTRA_Q)
			{ 
				//****************************************
			/*	for (i = 0; i < 4; i++)
				{   
					iPositionLum = ix * 16+ (i>>1) * 8 * pEncoder->pCurFrameInfo->vop_extwidth + (i%2) * 8;
					//将图象当前块的亮度值读到PIXEL_COEFF中
					TransferImage8ToBlock16(PIXEL_COEFF+i*64, iPositionLum + pCurImage->Y ,iStride);
					fdct(DCT_COEFF+i*64,PIXEL_COEFF+i*64);
				}
				iPositionChro =ix * 8;
				//U
				TransferImage8ToBlock16(PIXEL_COEFF+4*64,  iPositionChro + pCurImage->Cb, iStrideHalf);
				fdct(DCT_COEFF+4*64,PIXEL_COEFF+4*64);
				//V
				TransferImage8ToBlock16(PIXEL_COEFF+5*64,  iPositionChro + pCurImage->Cr, iStrideHalf);
				fdct(DCT_COEFF+5*64,PIXEL_COEFF+5*64);
			*/
			for (i = 0; i < 4; i++)
		   {   
			   	iPositionLum = ix*16+iStride * ((i/2)*8)+ (i%2)*8;
			   //将图象当前块的亮度值读到PIXEL_COEFF中
			    TransferImage8ToBlock16(DCT_COEFF+i*64, iPositionLum + pCurImage->Y ,iStride);  
		   }
		     iPositionChro =ix * 8;
			//U
            TransferImage8ToBlock16(DCT_COEFF+4*64,  iPositionChro + pCurImage->Cb, iStrideHalf);
			//V
		    TransferImage8ToBlock16(DCT_COEFF+5*64,  iPositionChro + pCurImage->Cr, iStrideHalf);
			//对Y/U/V分量进行fdct变换
		  	IMG_fdct_8x8(DCT_COEFF,6);
				//******************************************

				iDcScalarLum = GetDcScaler(iQuant, 1);
				iDcScalarChr = GetDcScaler(iQuant, 0);

				/*  quant, default h263 quant-type  */
				if (!pEncoder->pVol->quant_type)
				{
					Mpeg4IntraQuant2(DCT_COEFF, DCT_COEFF, iQuant, iDcScalarLum);
					Mpeg4IntraQuant2(DCT_COEFF+64, DCT_COEFF+64, iQuant, iDcScalarLum);
					Mpeg4IntraQuant2(DCT_COEFF+128, DCT_COEFF+128, iQuant, iDcScalarLum);
					Mpeg4IntraQuant2(DCT_COEFF+192, DCT_COEFF+192, iQuant, iDcScalarLum);

					Mpeg4IntraQuant2(DCT_COEFF+256, DCT_COEFF+256, iQuant, iDcScalarChr);
					Mpeg4IntraQuant2(DCT_COEFF+320, DCT_COEFF+320, iQuant, iDcScalarChr);
				}
				else 
				{
					Mpeg4IntraQuant1(DCT_COEFF, DCT_COEFF, iQuant, iDcScalarLum, pEncoder->pVol->load_intra_quant_mat);
					Mpeg4IntraQuant1(DCT_COEFF+64, DCT_COEFF+64, iQuant, iDcScalarLum, pEncoder->pVol->load_intra_quant_mat);
					Mpeg4IntraQuant1(DCT_COEFF+128, DCT_COEFF+128, iQuant, iDcScalarLum, pEncoder->pVol->load_intra_quant_mat);
					Mpeg4IntraQuant1(DCT_COEFF+192, DCT_COEFF+192, iQuant, iDcScalarLum, pEncoder->pVol->load_intra_quant_mat);

					Mpeg4IntraQuant1(DCT_COEFF+256, DCT_COEFF+256, iQuant, iDcScalarChr, pEncoder->pVol->load_intra_quant_mat);
					Mpeg4IntraQuant1(DCT_COEFF+320, DCT_COEFF+320, iQuant, iDcScalarChr, pEncoder->pVol->load_intra_quant_mat);
				}			  

				/*  macroblock coding  */
				CodeIntraMB(bs, pEncoder, pCurMB, ix, iy, DCT_COEFF);

				/*  dequant */
				if (!pEncoder->pVol->quant_type)
				{
					Mpeg4IntraDeQuant2(DCT_COEFF, DCT_COEFF, iQuant, iDcScalarLum);
					Mpeg4IntraDeQuant2(DCT_COEFF+64, DCT_COEFF+64, iQuant, iDcScalarLum);
					Mpeg4IntraDeQuant2(DCT_COEFF+128, DCT_COEFF+128, iQuant, iDcScalarLum);
					Mpeg4IntraDeQuant2(DCT_COEFF+192, DCT_COEFF+192, iQuant, iDcScalarLum);

					Mpeg4IntraDeQuant2(DCT_COEFF+256, DCT_COEFF+256, iQuant, iDcScalarChr);
					Mpeg4IntraDeQuant2(DCT_COEFF+320, DCT_COEFF+320, iQuant, iDcScalarChr);
				}
				else 
				{
					Mpeg4IntraDeQuant1(DCT_COEFF, DCT_COEFF, iQuant, iDcScalarLum, pEncoder->pVol->load_intra_quant_mat);
					Mpeg4IntraDeQuant1(DCT_COEFF+64, DCT_COEFF+64, iQuant, iDcScalarLum, pEncoder->pVol->load_intra_quant_mat);
					Mpeg4IntraDeQuant1(DCT_COEFF+128, DCT_COEFF+128, iQuant, iDcScalarLum, pEncoder->pVol->load_intra_quant_mat);
					Mpeg4IntraDeQuant1(DCT_COEFF+192, DCT_COEFF+192, iQuant, iDcScalarLum, pEncoder->pVol->load_intra_quant_mat);

					Mpeg4IntraDeQuant1(DCT_COEFF+256, DCT_COEFF+256, iQuant, iDcScalarChr, pEncoder->pVol->load_intra_quant_mat);
					Mpeg4IntraDeQuant1(DCT_COEFF+320, DCT_COEFF+320, iQuant, iDcScalarChr, pEncoder->pVol->load_intra_quant_mat);
				}

				//帧的重建
			//	for(i=0; i<6; i++)
			//		idct(DCT_COEFF+64*i);
				IMG_idct_8x8(DCT_COEFF,6);
				for (i = 0; i < 384; i++)
				{
					CLIP(DCT_COEFF[i],0,255);
				}
				//********************************
				for (i = 0; i < 4; i++)
				{
					iPosition = iStride * (i/2)*8 + ix*16+ (i%2)*8;
					//将当前块的值拷贝到Ref图象中去
					TransferBlock16ToImage8(iPosition+pCurRecFrame->Y, DCT_COEFF+i*64, iStride);
				}
				iPosition = ix*8;
				TransferBlock16ToImage8(iPosition+pCurRecFrame->Cb, DCT_COEFF+256, iStrideHalf);
				TransferBlock16ToImage8(iPosition+pCurRecFrame->Cr, DCT_COEFF+320, iStrideHalf);
				//*******************************************

			}
			else if (pCurMB->mb_type == MB_INTER || pCurMB->mb_type == MB_INTER_Q || pCurMB->mb_type == MB_INTER_4V)
			{
				//进行前向帧的运动补偿,将运动补偿后的数据放到iCurMBData1中
				if (pCurMB->mb_type == MB_INTER || pCurMB->mb_type == MB_INTER_Q)
				{ 
					OneMvCompensation_Encoder(pEncoder, pCurMB,pRefImage, ix,iy, iCurMBData1, 0);
				}
				if (pCurMB->mb_type == MB_INTER_4V)
				{
					FourMVCompensation_Encoder(pEncoder, pCurMB,pRefImage, ix, iy, iCurMBData1, 0);
				}
				//***************************
				//宏块的补偿和补偿后的DCT变换
				/*
				for (i = 0; i < 4; i++)
				{
					iPosition = iStride*(i/2)*8 + ix*16+ (i%2)*8;
					TransferImage8ToBlock16(PIXEL_COEFF+i*64, pCurImage->Y+iPosition,iStride);
					TransferBlock16SubBlock16(PIXEL_COEFF+i*64,iCurMBData1+64*i);
					fdct(DCT_COEFF+i*64,PIXEL_COEFF+i*64);
				}
				iPosition = ix*8;
				TransferImage8ToBlock16(PIXEL_COEFF+4*64,pCurImage->Cb+iPosition,iStrideHalf);
				TransferBlock16SubBlock16(PIXEL_COEFF+4*64,iCurMBData1+256);
				fdct(DCT_COEFF+4*64,PIXEL_COEFF+4*64);

				TransferImage8ToBlock16(PIXEL_COEFF+5*64,pCurImage->Cr+iPosition,iStrideHalf);
				TransferBlock16SubBlock16(PIXEL_COEFF+5*64,iCurMBData1+320);
				fdct(DCT_COEFF+5*64,PIXEL_COEFF+5*64);
				*/
				for (i = 0; i < 4; i++)
				{
					iPosition = iStride*(i/2)*8 + ix*16+ (i%2)*8;
					TransferImage8ToBlock16(DCT_COEFF+i*64, pCurImage->Y+iPosition,iStride);
					TransferBlock16SubBlock16(DCT_COEFF+i*64,iCurMBData1+64*i);
				}
				iPosition = ix*8;
				TransferImage8ToBlock16(DCT_COEFF+4*64,pCurImage->Cb+iPosition,iStrideHalf);
				TransferBlock16SubBlock16(DCT_COEFF+4*64,iCurMBData1+256);

				TransferImage8ToBlock16(DCT_COEFF+5*64,pCurImage->Cr+iPosition,iStrideHalf);
				TransferBlock16SubBlock16(DCT_COEFF+5*64,iCurMBData1+320);
				
				IMG_fdct_8x8(DCT_COEFF,6);
			
				//*************************
				//宏块的编码
				//  quant, quant-type h263 
				if (!pEncoder->pVol->quant_type)
				{
					Mpeg4InterQuant2(DCT_COEFF, DCT_COEFF, iQuant);
					Mpeg4InterQuant2(DCT_COEFF+64, DCT_COEFF+64, iQuant);
					Mpeg4InterQuant2(DCT_COEFF+128, DCT_COEFF+128, iQuant);
					Mpeg4InterQuant2(DCT_COEFF+192, DCT_COEFF+192, iQuant);

					Mpeg4InterQuant2(DCT_COEFF+256, DCT_COEFF+256, iQuant);
					Mpeg4InterQuant2(DCT_COEFF+320, DCT_COEFF+320, iQuant);
				}
				else 
				{
					Mpeg4InterQuant1(DCT_COEFF, DCT_COEFF, iQuant, pEncoder->pVol->load_inter_quant_mat);
					Mpeg4InterQuant1(DCT_COEFF+64, DCT_COEFF+64, iQuant, pEncoder->pVol->load_inter_quant_mat);
					Mpeg4InterQuant1(DCT_COEFF+128, DCT_COEFF+128, iQuant, pEncoder->pVol->load_inter_quant_mat);
					Mpeg4InterQuant1(DCT_COEFF+192, DCT_COEFF+192, iQuant, pEncoder->pVol->load_inter_quant_mat);

					Mpeg4InterQuant1(DCT_COEFF+256, DCT_COEFF+256, iQuant, pEncoder->pVol->load_intra_quant_mat);
					Mpeg4InterQuant1(DCT_COEFF+320, DCT_COEFF+320, iQuant, pEncoder->pVol->load_intra_quant_mat);
				}


				pCurMB->cbp = GetMBlockCBP(DCT_COEFF, pCurMB->mb_type);

				CodeInterMB(bs, pEncoder, pCurMB, ix, iy, DCT_COEFF);

				//  dequant  
				if (!pEncoder->pVol->quant_type)
				{
					Mpeg4InterDeQuant2(DCT_COEFF, DCT_COEFF, iQuant);
					Mpeg4InterDeQuant2(DCT_COEFF+64, DCT_COEFF+64, iQuant);
					Mpeg4InterDeQuant2(DCT_COEFF+128, DCT_COEFF+128, iQuant);
					Mpeg4InterDeQuant2(DCT_COEFF+192, DCT_COEFF+192, iQuant);

					Mpeg4InterDeQuant2(DCT_COEFF+256, DCT_COEFF+256, iQuant);
					Mpeg4InterDeQuant2(DCT_COEFF+320, DCT_COEFF+320, iQuant);
				}
				else 
				{
					Mpeg4InterDeQuant1(DCT_COEFF, DCT_COEFF, iQuant, pEncoder->pVol->load_inter_quant_mat);
					Mpeg4InterDeQuant1(DCT_COEFF+64, DCT_COEFF+64, iQuant, pEncoder->pVol->load_inter_quant_mat);
					Mpeg4InterDeQuant1(DCT_COEFF+128, DCT_COEFF+128, iQuant, pEncoder->pVol->load_inter_quant_mat);
					Mpeg4InterDeQuant1(DCT_COEFF+192, DCT_COEFF+192, iQuant, pEncoder->pVol->load_inter_quant_mat);

					Mpeg4InterDeQuant1(DCT_COEFF+256, DCT_COEFF+256, iQuant, pEncoder->pVol->load_inter_quant_mat);
					Mpeg4InterDeQuant1(DCT_COEFF+320, DCT_COEFF+320, iQuant, pEncoder->pVol->load_inter_quant_mat);
				}

				//帧的重建
			//	for(i=0; i<6; i++)
			//		idct(DCT_COEFF+64*i);
					IMG_idct_8x8(DCT_COEFF,6);
				//将残差图象叠加上运动补偿后的图象,得到重建的块数据
				for (i = 0; i < 6; i++)
				{
					TransferBlock16AddBlock16(DCT_COEFF+i*64, iCurMBData1+i*64);
				}

				//将重建后的宏块拷贝到pCurImage
				for (i = 0; i < 4; i++)
				{
					iPosition = iStride * (i/2)*8 + ix*16+ (i%2)*8;
					//将当前块的值拷贝到Ref图象中去
					TransferBlock16ToImage8(iPosition+pCurRecFrame->Y, DCT_COEFF+i*64, iStride);
				}
				iPosition =ix*8;
				TransferBlock16ToImage8(iPosition+pCurRecFrame->Cb, DCT_COEFF+256, iStrideHalf);
				TransferBlock16ToImage8(iPosition+pCurRecFrame->Cr, DCT_COEFF+320, iStrideHalf);

			}

	return 1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -