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

📄 encoder.c

📁 基于Linux的ffmepg decoder
💻 C
📖 第 1 页 / 共 5 页
字号:
      if (enc_image_create(&(pEnc->current1->reconstruct), pEnc->mbParam.mb_width, pEnc->mbParam.mb_height,pCodec)) {
        goto Faraday_err_memory1;
	  }
	}
	
	if(ptParam->pu8ReConFrameRef) // if it is not NULL, use user-provided buffer
	  enc_image_adjust(&(pEnc->reference->reconstruct), pEnc->mbParam.mb_width, pEnc->mbParam.mb_height,ptParam->pu8ReConFrameRef);
	else {
	  if (enc_image_create(&(pEnc->reference->reconstruct), pEnc->mbParam.mb_width, pEnc->mbParam.mb_height,pCodec)) {
		enc_image_destroy(&(pEnc->current1->reconstruct), pEnc->mbParam.mb_width,pCodec);
		goto Faraday_err_memory2;
	  }
	}


	/* try to allocate mb memory */

#if 0
	pEnc->current->mbs =
		Faraday_malloc(sizeof(MACROBLOCK) * (pEnc->mbParam.mb_width *
					pEnc->mbParam.mb_height + 1), CACHE_LINE);
	pEnc->reference->mbs =
		Faraday_malloc(sizeof(MACROBLOCK) * (pEnc->mbParam.mb_width *
					pEnc->mbParam.mb_height + 1), CACHE_LINE);
#else
	pEnc->current1->mbs =kmalloc(sizeof(MACROBLOCK) * (pEnc->mbParam.mb_width *
					pEnc->mbParam.mb_height + 1), GFP_KERNEL|GFP_ATOMIC);
	pEnc->reference->mbs = kmalloc(sizeof(MACROBLOCK) * (pEnc->mbParam.mb_width *
					pEnc->mbParam.mb_height + 1), GFP_KERNEL|GFP_ATOMIC);
#endif

	if (pEnc->current1->mbs == NULL || pEnc->reference->mbs == NULL)
		goto Faraday_err_memory2;

	/* try to allocate image memory */

	image_null(&pEnc->current1->image);
	image_null(&pEnc->reference->image);

	if (pEnc->bitrate) {
	    RateControlInit(&pEnc->rate_control, pEnc->bitrate,
						pCodec->DELAY_FACTOR,
						pCodec->RC_AVERAGE_PERIOD, pCodec->ARG_RC_BUFFER,
						fbase * 1000 / fincr,
						ptParam->u32MaxQuant, ptParam->u32MinQuant);
		/* RateControlInit(&pEnc->rate_control, pParam->rc_bitrate,
						pParam->rc_reaction_delay_factor,
						pParam->rc_averaging_period, pParam->rc_buffer,
						pParam->fbase * 1000 / pParam->fincr,
						pParam->max_quantizer, pParam->min_quantizer); */
	}

    return pEnc;

	/*
	 * We handle all Faraday_ERR_MEMORY here, this makes the code lighter
	 */

 Faraday_err_memory2:
#if 0
	Faraday_free(pEnc->current->mbs);
	Faraday_free(pEnc->reference->mbs);

  Faraday_err_memory1:
	Faraday_free(pEnc->current);
	Faraday_free(pEnc->reference);
	Faraday_free(pEnc);
#else
	kfree(pEnc->current1->mbs);
	kfree(pEnc->reference->mbs);

  Faraday_err_memory1:
	kfree(pEnc->current1);
	kfree(pEnc->reference);
	kfree(pEnc);
#endif
	return NULL;
}

/*****************************************************************************
 * Encoder destruction
 *
 * This function destroy the entire encoder structure created by a previous
 * successful encoder_create call.
 *
 * Returned values (for now only one returned value) :
 *    - Faraday_ERR_OK     - no errors
 *
 ****************************************************************************/

int
encoder_destroy(Encoder * pEnc)
{

    enc_image_destroy(&(pEnc->current1->reconstruct), pEnc->mbParam.mb_width,pEnc->pCodec);
	enc_image_destroy(&(pEnc->reference->reconstruct), pEnc->mbParam.mb_width,pEnc->pCodec);


	/* Encoder structure */
#if 0
	Faraday_free(pEnc->current->mbs);
	Faraday_free(pEnc->current);
	Faraday_free(pEnc->reference->mbs);
	Faraday_free(pEnc->reference);

	Faraday_free(pEnc);
#else
	kfree(pEnc->current1->mbs);
	kfree(pEnc->current1);
	kfree(pEnc->reference->mbs);
	kfree(pEnc->reference);
	kfree(pEnc);
#endif

	return Faraday_ERR_OK;
}


void inc_frame_num(Encoder * pEnc)
{
	pEnc->mbParam.m_ticks += pEnc->mbParam.fincr;
	pEnc->mbParam.m_seconds = pEnc->mbParam.m_ticks / pEnc->mbParam.fbase;
	pEnc->mbParam.m_ticks = pEnc->mbParam.m_ticks % pEnc->mbParam.fbase;
}

static __inline void
CodeIntraMB(Encoder * pEnc,MACROBLOCK * pMB)
{
	//	if the QP required modification, do it in this subroutine
	pMB->quant = pEnc->current1->quant;
}

/*****************************************************************************
 * "original" IP frame encoder entry point
 *
 * Returned values :
 *    - Faraday_ERR_OK     - no errors
 *    - Faraday_ERR_FORMAT - the image subsystem reported the image had a wrong
 *                        format
 ****************************************************************************/
static int FrameCodeI(Encoder * pEnc,Bitstream * bs,uint32_t * pBits)
{
    FTMCP100_CODEC *pCodec=(FTMCP100_CODEC *)pEnc->pCodec;
	MACROBLOCK *pMB;
	uint16_t x, y;
	unsigned int data_64b;
	volatile MDMA *pmdma = MDMA1;	
	int32_t bit_header;
	
	DECLARE_MP4_PTR
	
	#if defined(CORE_VERSION_2)

      // set system memory to current image y and automatically increment 512 bytes while DMA is done.
      // because of double buffer of DMA queue
      pCodec->DMA_COMMAND_local[12] = ((uint32_t) pEnc->current1->image.y | 0x07);
      pCodec->DMA_COMMAND_local[12+DMA_COMMAND_QUEUE_STRIDE] = ((uint32_t) (pEnc->current1->image.y+256) | 0x07);
	

	  pCodec->DMA_COMMAND_local[13] = TRANSLATE_LOCAL_MEMORY_BASE_ADDRESS(CUR_Y0);
	  pCodec->DMA_COMMAND_local[13+DMA_COMMAND_QUEUE_STRIDE] = TRANSLATE_LOCAL_MEMORY_BASE_ADDRESS(CUR_Y1);
	
	  pCodec->DMA_COMMAND_local[15] = (uint32_t) 0x4A00040; // enable Transfer Done flag mask
	                                                // Enable DMA start transferring
	                                                // Enable chain transfer
	                                                // From sequential System memory to sequential Local memory
	                                                // transfer 0x40 words (256 bytes)
	  pCodec->DMA_COMMAND_local[15+DMA_COMMAND_QUEUE_STRIDE] = (uint32_t) 0x4A00040; // enable Transfer Done flag mask
	                                                // Enable DMA start transferring
	                                                // Enable chain transfer
	                                                // From sequential System memory to sequential Local memory
	                                                // transfer 0x40 words (256 bytes)
	                                              

	  // set system memory to current image u and automatically increment 64*2=128 bytes 
	  // while DMA is done because of DMA double buffer.
	  pCodec->DMA_COMMAND_local[16] = ((uint32_t) pEnc->current1->image.u | 0x05);
	  pCodec->DMA_COMMAND_local[16+DMA_COMMAND_QUEUE_STRIDE] = ((uint32_t) (pEnc->current1->image.u+64) | 0x05);
	

	  pCodec->DMA_COMMAND_local[17] = TRANSLATE_LOCAL_MEMORY_BASE_ADDRESS(CUR_U0);
	  pCodec->DMA_COMMAND_local[17+DMA_COMMAND_QUEUE_STRIDE] = TRANSLATE_LOCAL_MEMORY_BASE_ADDRESS(CUR_U1);	  
	
	  pCodec->DMA_COMMAND_local[19] = (uint32_t) 0x4A00010; // enable Transfer Done flag mask
	                                                // Enable DMA start transferring
	                                                // Enable chain transfer
	                                                // From sequential System memory to sequential Local memory
	                                                // transfer 0x10 words (64 bytes)
	  pCodec->DMA_COMMAND_local[19+DMA_COMMAND_QUEUE_STRIDE] = (uint32_t) 0x4A00010; // enable Transfer Done flag mask
	                                                // Enable DMA start transferring
	                                                // Enable chain transfer
	                                                // From sequential System memory to sequential Local memory
	                                                // transfer 0x10 words (64 bytes)
    

	  // set system memory to current image v and automatically increment 64*2=128 bytes while DMA is done because of dobule buffer of DMA command queue.
	  pCodec->DMA_COMMAND_local[20] = ((uint32_t) pEnc->current1->image.v | 0x05);
	  pCodec->DMA_COMMAND_local[20+DMA_COMMAND_QUEUE_STRIDE] = ((uint32_t) (pEnc->current1->image.v+64) | 0x05);
	  
	  pCodec->DMA_COMMAND_local[21] = TRANSLATE_LOCAL_MEMORY_BASE_ADDRESS(CUR_V0);
	  pCodec->DMA_COMMAND_local[21+DMA_COMMAND_QUEUE_STRIDE] = TRANSLATE_LOCAL_MEMORY_BASE_ADDRESS(CUR_V1);
	
	  pCodec->DMA_COMMAND_local[23] = (uint32_t) 0x4A00010;  //  chain disenable
	  pCodec->DMA_COMMAND_local[23+DMA_COMMAND_QUEUE_STRIDE] = (uint32_t) 0x4A00010;  //  chain disenable	  
	  
	  // to set predictor related DMA commands
	  pCodec->DMA_COMMAND_local[36] = (uint32_t) NULL;           //  predictor
	  pCodec->DMA_COMMAND_local[36+DMA_COMMAND_QUEUE_STRIDE] = (uint32_t) NULL;           //  predictor
	  pCodec->DMA_COMMAND_local[37] = TRANSLATE_LOCAL_MEMORY_BASE_ADDRESS(LOCAL_PREDICTOR0);
	  pCodec->DMA_COMMAND_local[37+DMA_COMMAND_QUEUE_STRIDE] = TRANSLATE_LOCAL_MEMORY_BASE_ADDRESS(LOCAL_PREDICTOR0);
	  pCodec->DMA_COMMAND_local[39] = (uint32_t) 0x840010;  // disable Transfer Done flag mask
	                                                // Enable DMA start transferring
	                                                // Disable chain transfer
	                                                // From sequqntial System memory to 2D Local memory
	                                                // transfer 0x10 words (64 bytes)
	  pCodec->DMA_COMMAND_local[39+DMA_COMMAND_QUEUE_STRIDE] = (uint32_t) 0x840010;  // disable Transfer Done flag mask
	                                                // Enable DMA start transferring
	                                                // Disable chain transfer
	                                                // From sequqntial System memory to 2D Local memory
	                                                // transfer 0x10 words (64 bytes)

	
	  pCodec->DMA_COMMAND_local[24] = ((uint32_t) pEnc->current1->reconstruct.y) | 0x07;
	  pCodec->DMA_COMMAND_local[28] = ((uint32_t) pEnc->current1->reconstruct.u) | 0x05;
	  pCodec->DMA_COMMAND_local[32] = ((uint32_t) pEnc->current1->reconstruct.v) | 0x05;
	  pCodec->DMA_COMMAND_local[24+DMA_COMMAND_QUEUE_STRIDE] = ((uint32_t) pEnc->current1->reconstruct.y+256) | 0x07;
	  pCodec->DMA_COMMAND_local[28+DMA_COMMAND_QUEUE_STRIDE] = ((uint32_t) pEnc->current1->reconstruct.u+64)  | 0x05;
	  pCodec->DMA_COMMAND_local[32+DMA_COMMAND_QUEUE_STRIDE] = ((uint32_t) pEnc->current1->reconstruct.v+64)  | 0x05;	      

      pCodec->DMA_COMMAND_local[25] = TRANSLATE_LOCAL_MEMORY_BASE_ADDRESS((unsigned int)INTER_Y0);
      pCodec->DMA_COMMAND_local[25+DMA_COMMAND_QUEUE_STRIDE] = TRANSLATE_LOCAL_MEMORY_BASE_ADDRESS((unsigned int)INTER_Y1);
	  pCodec->DMA_COMMAND_local[29] = TRANSLATE_LOCAL_MEMORY_BASE_ADDRESS((unsigned int)INTER_U0);
	  pCodec->DMA_COMMAND_local[29+DMA_COMMAND_QUEUE_STRIDE] = TRANSLATE_LOCAL_MEMORY_BASE_ADDRESS((unsigned int)INTER_U1);
	  pCodec->DMA_COMMAND_local[33] = TRANSLATE_LOCAL_MEMORY_BASE_ADDRESS((unsigned int)INTER_V0);
	  pCodec->DMA_COMMAND_local[33+DMA_COMMAND_QUEUE_STRIDE] = TRANSLATE_LOCAL_MEMORY_BASE_ADDRESS((unsigned int)INTER_V1);

      // set reconstructed buffer related DMA command buffer
	  pCodec->DMA_COMMAND_local[27] = (uint32_t) 0x4B01040; // make it group ID 1 for skipping command
      pCodec->DMA_COMMAND_local[27+DMA_COMMAND_QUEUE_STRIDE] = (uint32_t) 0x4B01040; // make it group ID 1 for skipping command

	  pCodec->DMA_COMMAND_local[31] = (uint32_t) 0x4B01010;	// make it group ID 1 for skipping command
	  pCodec->DMA_COMMAND_local[31+DMA_COMMAND_QUEUE_STRIDE] = (uint32_t) 0x4B01010; // make it group ID 1 for skipping command

	  pCodec->DMA_COMMAND_local[35] = (uint32_t) 0x4B01010; // make it group ID 1 for skipping command
	  pCodec->DMA_COMMAND_local[35+DMA_COMMAND_QUEUE_STRIDE] = (uint32_t) 0x4B01010; // make it group ID 1 for skipping command
	  
	  //  load predictor
	  pCodec->DMA_COMMAND_local[39] = (uint32_t) 0x840010;                                              //  chain disenable
	  pCodec->DMA_COMMAND_local[39+DMA_COMMAND_QUEUE_STRIDE] = (uint32_t) 0x840010;						//  chain disenable
      //  end load predictor
      
    #elif defined(CORE_VERSION_1)
	
	  // set the related DMA commands to move the current blocks to local memory
	  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; // enable Transfer Done flag mask
	                                                // Enable DMA start transferring
	                                                // Enable chain transfer
	                                                // From sequential System memory to sequential Local memory
	                                                // transfer 0x40 words (256 bytes)
	                                              
	  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; // enable Transfer Done flag mask
	                                                // Enable DMA start transferring
	                                                // Enable chain transfer
	                                                // From sequential System memory to sequential Local memory
	                                                // transfer 0x10 words (64 bytes)
    
      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) NULL;				//	predictor
	
      pCodec->DMA_COMMAND_local[25] = LOCAL_PREDICTOR0;

	  pCodec->DMA_COMMAND_local[27] = (uint32_t) 0x840010;  // disable Transfer Done flag mask
	                                                // Enable DMA start transferring
	                                                // Disable chain transfer
	                                                // From sequqntial System memory to 2D Local memory
	                                                // transfer 0x10 words (64 bytes)
	
	  
	  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;

⌨️ 快捷键说明

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