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

📄 encoder.c

📁 基于Linux的ffmepg decoder
💻 C
📖 第 1 页 / 共 5 页
字号:
		pFrame->length = data_64b + ((bits+7)>>3);
	}
	#else
      #error "Please define the platfrom flags in project setting (either FPGA_PLATFORM or RTL_PLATFORM)"
    #endif

	if (pFrame->quant == 0) {
		RateControlUpdate(&pEnc->rate_control, (int16_t)pEnc->current1->quant,
						  pFrame->length, pFrame->intra);
	}

	inc_frame_num(pEnc);
	pEnc->iFrameNum++;

	return Faraday_ERR_OK;
}

#define FCODEBITS	3
#define MODEBITS	5

#define INTRA_THRESHOLD 0.5


static int FrameCodeP(Encoder * pEnc, Bitstream * bs, uint32_t * pBits, bool vol_header)
{
  #if defined(CORE_VERSION_1)
    FTMCP100_CODEC *pCodec=(FTMCP100_CODEC *)pEnc->pCodec;
    
    DECLARE_MP4_PTR
  
	MACROBLOCK *pMB, *pMB_mc;
	unsigned int x, y, data_64b;
	int bIntra;
	volatile MDMA *pmdma = MDMA1;

	int32_t bit_header;
	
	unsigned int XDIM=pEnc->mEncParam.u32FrameWidth;
	
	// --------------------------------------------------------------------
	//		load reference block
	//			x  .  .
	//		    x  .  .
	//			x  .  .
	// --------------------------------------------------------------------
	while((pmdma->Status & 0x1) == 0);			// waiting for DMA transfer done
	
	pCodec->cmd0 = pCodec->DMA_COMMAND_local[0] = (uint32_t) pEnc->reference->reconstruct.y - (256*XDIM/16);
	pCodec->DMA_COMMAND_local[1] = REF_Y;
	pCodec->DMA_COMMAND_local[2] = ((16+1-4)<<24) | 4 << 20 | ((XDIM*4)-63)<<8 | 64;	//
	pCodec->DMA_COMMAND_local[3] = 0x4A50000 | 192;			/// 2D to 2D transfer
	

	pCodec->cmd4 = pCodec->DMA_COMMAND_local[4] = (uint32_t) pEnc->reference->reconstruct.u - (64*XDIM/16);		//	4 - 7 for Ref U Load Next MB
	pCodec->DMA_COMMAND_local[5] = REF_U;
	pCodec->DMA_COMMAND_local[6] = (uint32_t) ((8+1-2)<<24) | 2 << 20 | ((XDIM)-15)<<8 | 16;
	pCodec->DMA_COMMAND_local[7] = 0x4A50000 | 48;										//  chain enable, 2*16
	

	pCodec->cmd8 = pCodec->DMA_COMMAND_local[8] = (uint32_t) pEnc->reference->reconstruct.v - (64*XDIM/16);		//	16 - 19 for Ref V Load Next MB
	pCodec->DMA_COMMAND_local[9] = REF_V;
	pCodec->DMA_COMMAND_local[10] = (uint32_t) ((8+1-2)<<24) | 2 << 20 | ((XDIM)-15)<<8 | 16;
	pCodec->DMA_COMMAND_local[11] = 0x4A50000 | 48;					//  chain disable

	// --------------------------------------------------------------------
	//		load current mb
	//			x .
	// --------------------------------------------------------------------
	pCodec->cmd12 = pCodec->DMA_COMMAND_local[12] = (uint32_t) pEnc->current1->image.y;
	pCodec->DMA_COMMAND_local[13] = (uint32_t) CUR_Y0;
	pCodec->DMA_COMMAND_local[15] = (uint32_t) 0x4A00040;						//  chain enable
	pCodec->cmd16 = pCodec->DMA_COMMAND_local[16] = (uint32_t) pEnc->current1->image.u;
	pCodec->DMA_COMMAND_local[17] = (uint32_t) (CUR_U0);	
	pCodec->DMA_COMMAND_local[19] = (uint32_t) 0x4A00010;						//  chain enable
	pCodec->cmd20 = pCodec->DMA_COMMAND_local[20] = (uint32_t) pEnc->current1->image.v;
	pCodec->DMA_COMMAND_local[21] = (uint32_t) (CUR_V0);
	pCodec->DMA_COMMAND_local[23] = (uint32_t) 0x4A00010;						//  chain disenable

	pCodec->DMA_COMMAND_local[24] = (uint32_t) pCodec->pred_value_phy;				//	predictor
	pCodec->DMA_COMMAND_local[25] = LOCAL_PREDICTOR0;
	pCodec->DMA_COMMAND_local[27] = (uint32_t) 0x840010;						//  chain disenable
    

    pCodec->DMA_COMMAND_local[28] = (uint32_t) pEnc->current1->reconstruct.y - 256;
	pCodec->DMA_COMMAND_local[32] = (uint32_t) pEnc->current1->reconstruct.u - 64;
	pCodec->DMA_COMMAND_local[36] = (uint32_t) pEnc->current1->reconstruct.v - 64;
    
	pCodec->DMA_COMMAND_local[29] = (uint32_t) INTER_Y0;
	pCodec->DMA_COMMAND_local[33] = (uint32_t) INTER_U0;
	pCodec->DMA_COMMAND_local[37] = (uint32_t) INTER_V0;
	pCodec->DMA_COMMAND_local[39] = (uint32_t) 0x4B00010;						//  chain disenable

	pCodec->DMA_COMMAND_local[41] = LOCAL_PREDICTOR8;
	pCodec->DMA_COMMAND_local[43] = (uint32_t) 0x940010;						//  chain enable

	DMA_MOVE(0, 0x4B0001C)

	RTL_DEBUG_OUT(0x95000000 | (uint32_t) pCodec->pred_value_phy)

	pEnc->current1->fcode = pEnc->mbParam.m_fcode;

	READ_ASADR(*pBits)						//	64 byte
	READ_BALR(x)							//	compressed data in local memory (words)
	READ_VOADR(y)							//	compressed data in local memory (bits)
	x = (x & 0x3c);
	y = y & 0xff;
	bit_header = y + x*8;							//	total bits in local memory

	pEnc->current1->coding_type = P_VOP;
	if (pEnc->mbParam.h263) {
		pEnc->mbParam.m_rounding_type = 0;
		pEnc->current1->rounding_type = pEnc->mbParam.m_rounding_type;
		BitstreamWriteShortHeader(&pEnc->mbParam, pEnc->current1, 1,pEnc->pCodec);
	} else {
		pEnc->mbParam.m_rounding_type = 1 - pEnc->mbParam.m_rounding_type;
		pEnc->current1->rounding_type = pEnc->mbParam.m_rounding_type;
		if (vol_header)
			BitstreamWriteVolHeader(&pEnc->mbParam, pEnc->current1,pEnc->pCodec);
		BitstreamWriteVopHeader(&pEnc->mbParam, pEnc->current1, 1,pEnc->pCodec);
	}

	// --------------------------------------------------------------------
	//		load reference block
	//			.  x  .
	//		    .  x  .
	//			.  x  .
	// --------------------------------------------------------------------
	while((pmdma->Status & 0x1) == 0);
	pCodec->cmd0 += 256;
	pCodec->DMA_COMMAND_local[0] = pCodec->cmd0;
	pCodec->cmd4 += 64;
	pCodec->DMA_COMMAND_local[4] = pCodec->cmd4;
	pCodec->cmd8 += 64;
	pCodec->DMA_COMMAND_local[8] = pCodec->cmd8;
	pCodec->DMA_COMMAND_local[1] = pCodec->DMA_COMMAND_local[1] + 16;		//	REF_Y + 16
	pCodec->DMA_COMMAND_local[5] = pCodec->DMA_COMMAND_local[5] + 8;		//	REF_U + 8
	pCodec->DMA_COMMAND_local[9] = pCodec->DMA_COMMAND_local[9] + 8;		//	REF_V + 8
	pCodec->DMA_COMMAND_local[11] = 0x850000 | 48;

//	while((pmdma->Status & 0x1) == 0);
	DMA_MOVE(0, 0x4B0000C)

	SET_MCCADDR(CUR_Y2)			//  MC current block start address register
	SET_QAR(DZQAR)				//  Quantization block address register


	RTL_DEBUG_OUT(0x91000000)

	
	pCodec->even_odd_1 = 0;
	pCodec->even_odd_I = 0;
	pCodec->acdc_status = 7;
	pCodec->DMA_COMMAND_local[11] = 0x4A50000 | 48;					//  chain disable
	pMB = pEnc->current1->mbs;
	pMB->quant = pEnc->current1->quant;
	pCodec->Raddr = (((uint32_t) REF_Y + 64*16) >> 2) & 0xfff;
	pCodec->Raddr23 = (((uint32_t) REF_Y + 64*(16+8)) >> 2) & 0xfff; //for block 2,3
	
	#ifdef DUMP_PMV_RESULT                
    fprintf(pmv_result_file,"Macroblock %d (x=%d,y=%d)\n",0,0,0);
    #endif

	bIntra = MotionEstimation_block0(pMB,pEnc);
	
	#ifdef DUMP_ME_RESULT
      fprintf(me_result_file,"Macroblock %d (x=%d,y=%d) :",0,0,0);
      
	  if(pEnc->mbParam.enable_4mv)	  
        fprintf(me_result_file,"0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x\n",(pMB->mv16x_0&0x07f), (pMB->mv16y_0&0x07f), (pMB->mv16x_1&0x07f), (pMB->mv16y_1&0x07f), (pMB->mv16x_2&0x07f), (pMB->mv16y_2&0x07f), (pMB->mv16x_3&0x07f), (pMB->mv16y_3&0x07f));
      else
        // to be compatible with C Model encoder's output format
        fprintf(me_result_file,"0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x\n",(pMB->mv16x_3&0x07f), (pMB->mv16y_3&0x07f), (pMB->mv16x_3&0x07f), (pMB->mv16y_3&0x07f), (pMB->mv16x_3&0x07f), (pMB->mv16y_3&0x07f), (pMB->mv16x_3&0x07f), (pMB->mv16y_3&0x07f));
    #endif
	

	RTL_DEBUG_OUT(0x92000000)

	x = 1;
	data_64b = 2;
  	for (y = 0; y < pEnc->mbParam.mb_height; y++) {
		for ( ; x < pEnc->mbParam.mb_width; x++) {
			pMB->quant = pEnc->current1->quant;
            if (pEnc->mbParam.resyn==1)
			{
  		        if (!pEnc->mbParam.h263)
				{
					if ((y!=0) & (x==1))
					{
						BitstreamPadAlways(pCodec);
						BitstreamPutBits(VIDO_RESYN_MARKER, 17,pCodec);
						BitstreamPutBits((x-1) + y*pEnc->mbParam.mb_width, log2bin(pEnc->mbParam.mb_width *  pEnc->mbParam.mb_height - 1),pCodec);
						BitstreamPutBits(pMB->quant, 5,pCodec);
						BitstreamPutBit(0,pCodec);
					}
				}
				else
				{
					if ((y!=0) & (x==1))
					{
						BitstreamPutBits(VIDO_RESYN_MARKER, 17,pCodec);
						BitstreamPutBits(y, 5,pCodec);
						BitstreamPutBits(0, 2,pCodec);		// ID
						BitstreamPutBits(pMB->quant, 5,pCodec);
					}
				}
			}
			pMB_mc = pMB;
			pMB++;
			pCodec->even_odd_1 ^= 1;
			

			RTL_DEBUG_OUT(0x91000000 | y << 12 | x)
			
			#ifdef DUMP_PMV_RESULT                
            fprintf(pmv_result_file,"Macroblock %d (x=%d,y=%d)\n",x+y*pEnc->mbParam.mb_width,x,y);
            #endif
            
            bIntra = MotionEstimation(pMB, pMB_mc, x, y, &pEnc->mbParam, pEnc, data_64b);
			
			#ifdef DUMP_ME_RESULT
            fprintf(me_result_file,"Macroblock %d (x=%d,y=%d) :",x+y*pEnc->mbParam.mb_width,x,y);
	        if(pEnc->mbParam.enable_4mv)
              fprintf(me_result_file,"0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x\n",(pMB->mv16x_0&0x07f), (pMB->mv16y_0&0x07f), (pMB->mv16x_1&0x07f), (pMB->mv16y_1&0x07f), (pMB->mv16x_2&0x07f), (pMB->mv16y_2&0x07f), (pMB->mv16x_3&0x07f), (pMB->mv16y_3&0x07f));
            else
              // to be compatible with C Model encoder's output format
              fprintf(me_result_file,"0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x\n",(pMB->mv16x_3&0x07f), (pMB->mv16y_3&0x07f), (pMB->mv16x_3&0x07f), (pMB->mv16y_3&0x07f), (pMB->mv16x_3&0x07f), (pMB->mv16y_3&0x07f), (pMB->mv16x_3&0x07f), (pMB->mv16y_3&0x07f));
            #endif
            
			data_64b++;

			RTL_DEBUG_OUT(0x92000000 | y << 12 | x)
		}
		x = 0;
	}
    pMB_mc = pMB;
	pCodec->even_odd_1 ^= 1;
	

	bIntra = MotionEstimation_blocklast(pMB_mc, &pEnc->mbParam, pEnc);

	
	BitstreamPadAlways(pCodec);
	
	/// wait for auto buffer clean
	do {
	  READ_VLDSTS(y)
	} while(!(y&0x0400));

	READ_ASADR(data_64b)					//	64 byte
	READ_BALR(x)							//	compressed data in local memory (words)
	READ_VOADR(y)							//	compressed data in local memory (bits)
	x = (x & 0x3c);
	y = y & 0x1f;
	y = y + x*8;							//	total bits in local memory
	data_64b = data_64b - *pBits;				//	total bytes in system memory
	*pBits = y + data_64b * 8 - bit_header;
	
	#ifdef DUMP_ME_RESULT
      fprintf(me_result_file,"**********************************************************************\n");
    #endif

	return 0;					// inter
  
  #elif defined(CORE_VERSION_2) // core version 2 of FrameCodeP() procedure
  
    FTMCP100_CODEC *pCodec=(FTMCP100_CODEC *)pEnc->pCodec;
    
    DECLARE_MP4_PTR
  
	MACROBLOCK *pMB, *pMB_mc;
	unsigned int x, y, data_64b;
	int bIntra;
	volatile MDMA *pmdma = MDMA1;	

	int32_t bit_header;

	unsigned int XDIM=pEnc->mEncParam.u32FrameWidth;
	
	// --------------------------------------------------------------------
	//		load reference block
	//			x  .  .
	//		    x  .  .
	//			x  .  .
	// --------------------------------------------------------------------
	POLL_MARKER_S
	while((pmdma->Status & 0x1) == 0);			/// waiting for DMA transfer done
	POLL_MARKER_E
	

	  //pCodec->DMA_COMMAND_local[38] = (uint32_t) (8+1-4) << 24 | 4 << 20;
	  pCodec->DMA_COMMAND_local[39] = (uint32_t) 0x840010;
	  //pCodec->DMA_COMMAND_local[26] = (uint32_t) 0;
	  pCodec->DMA_COMMAND_local[27] = (uint32_t) 0x4B01040; // make it group ID 1, disable this command
	  //pCodec->DMA_COMMAND_local[30] = (uint32_t) 0;
	  pCodec->DMA_COMMAND_local[31] = (uint32_t) 0x4B01010; // make it group ID 1, disable this command

⌨️ 快捷键说明

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