?? encoder.c
字號:
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
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -