📄 encoder.c
字号:
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 + -