📄 mae_fe.c
字号:
uint32 exp_bc; int32 first_mb_of_frame; int32 last_mb_of_frame; int32 interlaced_div; uint8 * ppxliCurrQY; uint8 * ppxliCurrQU; uint8 * ppxliCurrQV; int32 overlap; int32 deblock; uint32 imbY; uint8 sb0 = 0; uint8 sb1 = 0; uint8 sb2 = 0; uint8 sb3 = 0; uint32 chroma_height = (mae_fe_cfg->bc) ? mae_fe_cfg->height : mae_fe_cfg->height/2; uint32 chroma_ypos = (mae_fe_cfg->bc) ? mb_in->ypos : mb_in->ypos/2; // For pointing to global structure so don't have to change code // Can't copy yet because initial memset hasn't happend MAE_tWMVDecInternalMember *MAE_pWMVDec; uint8 *cur_y_sub; uint8 *cur_cr_sub; uint8 *cur_cb_sub; uint8 *wm_intra_y; uint8 *wm_intra_c; uint8 *wm_inter_y; uint8 *wm_inter_c;#ifndef HAVE_MAE int nFrameNum; int nFrameType; unsigned char bPureIntra; unsigned char nDeadZone; int iquant_output[64]; unsigned char idct_output[64];#ifdef REF_WMV9 int16 iquant_output_16[64]; int16 idct_output_16[64]; U8_WMV *xStartY, *xStartU, *xStartV;#elif REF_DIVX int16 iquant_output_16[64]; int16 idct_out16[64];#endif char szFileName[MAX_FILE_SIZE], szFrameNum[MAX_FRAME_NUM_SIZE]; INTERMEDITATE_BLOCK_CHECKERS MAEBlkChecks;#endif // // Hack for things done once at the beginning of time // static int first = 1;#ifndef HAVE_MAE memset (&MAEBlkChecks, 0, sizeof(INTERMEDITATE_BLOCK_CHECKERS));#endif if (first) { cmodel_check_global();#ifndef HAVE_MAE mae_init_once(mae_fe_cfg, mb_in);#endif }#ifdef MAE_FE_MPEG_COVERAGE // macroblockwise coverage... // (plus framewise one) if(mae_fe_cfg->bc) { sprintf(tmp_cov_str, "mae_fe_mpeg__macroblockwise_422_cbp/bblk=%d/cbp=%d", mb_in->bblk, mb_in->cbp); fcov_coverage_point_hit(tmp_cov_str); sprintf(tmp_cov_str, "mae_fe_mpeg__macroblockwise_422_wtchgmsk/bblk=%d/wtchgmsk=%d", mb_in->bblk, mb_in->wtchgmsk); fcov_coverage_point_hit(tmp_cov_str); } else { sprintf(tmp_cov_str, "mae_fe_mpeg__macroblockwise_420_cbp/bblk=%d/cbp=%d", mb_in->bblk, (mb_in->cbp) >> 2); fcov_coverage_point_hit(tmp_cov_str); sprintf(tmp_cov_str, "mae_fe_mpeg__macroblockwise_420_wtchgmsk/bblk=%d/wtchgmsk=%d", mb_in->bblk, mb_in->wtchgmsk); fcov_coverage_point_hit(tmp_cov_str); } sprintf(tmp_cov_str, "mae_fe_mpeg__framewise/mis=%d/sat=%d", mae_fe_cfg->mis, mae_fe_cfg->satiq); fcov_coverage_point_hit(tmp_cov_str); // Macroblock back-to-back parm changing... if(mb_num>0) { // MAE HEADER WORD 0 sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_bblk/prev=%d/now=%d", fcov_prev_bblk, mb_in->bblk); fcov_coverage_point_hit(tmp_cov_str); sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_iqmul2/prev=%d/now=%d", fcov_prev_iqmul2, mb_in->iqmul2); fcov_coverage_point_hit(tmp_cov_str);; sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_wtchgmsk/prev=%d/now=%d", fcov_prev_wtchgmsk, mb_in->wtchgmsk); fcov_coverage_point_hit(tmp_cov_str);; sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_iqadd1/prev=%d/now=%d", fcov_prev_iqadd1, mb_in->iqadd1); fcov_coverage_point_hit(tmp_cov_str);; sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_dcluma/prev=%d/now=%d", fcov_prev_dcluma, mb_in->dcluma); fcov_coverage_point_hit(tmp_cov_str);; sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_dcchroma/prev=%d/now=%d", fcov_prev_dcchroma, mb_in->dcchroma); fcov_coverage_point_hit(tmp_cov_str);; // MAE HEADER WORD 1 sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_cbp_y0/prev=%d/now=%d", fcov_prev_cbp_y0, (mb_in->cbp >> 7) & 0x1); fcov_coverage_point_hit(tmp_cov_str); sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_cbp_y1/prev=%d/now=%d", fcov_prev_cbp_y1, (mb_in->cbp >> 6) & 0x1); fcov_coverage_point_hit(tmp_cov_str); sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_cbp_y2/prev=%d/now=%d", fcov_prev_cbp_y2, (mb_in->cbp >> 5) & 0x1); fcov_coverage_point_hit(tmp_cov_str); sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_cbp_y3/prev=%d/now=%d", fcov_prev_cbp_y3, (mb_in->cbp >> 4) & 0x1); fcov_coverage_point_hit(tmp_cov_str); sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_cbp_cb0/prev=%d/now=%d", fcov_prev_cbp_cb0, (mb_in->cbp >> 3) & 0x1); fcov_coverage_point_hit(tmp_cov_str); sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_cbp_cr0/prev=%d/now=%d", fcov_prev_cbp_cr0, (mb_in->cbp >> 2) & 0x1); fcov_coverage_point_hit(tmp_cov_str); sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_cbp_cb1/prev=%d/now=%d", fcov_prev_cbp_cb1, (mb_in->cbp >> 1) & 0x1); fcov_coverage_point_hit(tmp_cov_str); sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_cbp_cr1/prev=%d/now=%d", fcov_prev_cbp_cr1, mb_in->cbp & 0x1); fcov_coverage_point_hit(tmp_cov_str); sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_iqdiv3/prev=%d/now=%d", fcov_prev_iqdiv3, mb_in->iqdiv3); fcov_coverage_point_hit(tmp_cov_str);; sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_iqadd2/prev=%d/now=%d", fcov_prev_iqadd2, mb_in->iqadd2); fcov_coverage_point_hit(tmp_cov_str);; // MAE HEADER WORD 2 sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_mbmode_y0/prev=%d/now=%d", fcov_prev_mbmode_y0, (mb_in->mbmode >> 14) & 0x3); fcov_coverage_point_hit(tmp_cov_str); sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_mbmode_y1/prev=%d/now=%d", fcov_prev_mbmode_y1, (mb_in->mbmode >> 12) & 0x3); fcov_coverage_point_hit(tmp_cov_str); sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_mbmode_y2/prev=%d/now=%d", fcov_prev_mbmode_y2, (mb_in->mbmode >> 10) & 0x3); fcov_coverage_point_hit(tmp_cov_str); sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_mbmode_y3/prev=%d/now=%d", fcov_prev_mbmode_y3, (mb_in->mbmode >> 8) & 0x3); fcov_coverage_point_hit(tmp_cov_str); sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_mbmode_cb0/prev=%d/now=%d", fcov_prev_mbmode_cb0, (mb_in->mbmode >> 6) & 0x3); fcov_coverage_point_hit(tmp_cov_str); sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_mbmode_cr0/prev=%d/now=%d", fcov_prev_mbmode_cr0, (mb_in->mbmode >> 4) & 0x3); fcov_coverage_point_hit(tmp_cov_str); sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_mbmode_cb1/prev=%d/now=%d", fcov_prev_mbmode_cb1, (mb_in->mbmode >> 2) & 0x3); fcov_coverage_point_hit(tmp_cov_str); sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_mbmode_cr1/prev=%d/now=%d", fcov_prev_mbmode_cr1, mb_in->mbmode & 0x3); fcov_coverage_point_hit(tmp_cov_str); sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_xformsize_y0/prev=%d/now=%d", fcov_prev_xformsize_y0, (mb_in->xformsize >> 14) & 0x3); fcov_coverage_point_hit(tmp_cov_str); sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_xformsize_y1/prev=%d/now=%d", fcov_prev_xformsize_y1, (mb_in->xformsize >> 12) & 0x3); fcov_coverage_point_hit(tmp_cov_str); sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_xformsize_y2/prev=%d/now=%d", fcov_prev_xformsize_y2, (mb_in->xformsize >> 10) & 0x3); fcov_coverage_point_hit(tmp_cov_str); sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_xformsize_y3/prev=%d/now=%d", fcov_prev_xformsize_y3, (mb_in->xformsize >> 8) & 0x3); fcov_coverage_point_hit(tmp_cov_str); sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_xformsize_cb0/prev=%d/now=%d", fcov_prev_xformsize_cb0, (mb_in->xformsize >> 6) & 0x3); fcov_coverage_point_hit(tmp_cov_str); sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_xformsize_cr0/prev=%d/now=%d", fcov_prev_xformsize_cr0, (mb_in->xformsize >> 4) & 0x3); fcov_coverage_point_hit(tmp_cov_str); sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_xformsize_cb1/prev=%d/now=%d", fcov_prev_xformsize_cb1, (mb_in->xformsize >> 2) & 0x3); fcov_coverage_point_hit(tmp_cov_str); sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_xformsize_cr1/prev=%d/now=%d", fcov_prev_xformsize_cr1, mb_in->xformsize & 0x3); fcov_coverage_point_hit(tmp_cov_str); // MAE HEADER WORD 3 sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_rnd/prev=%d/now=%d", mb_in->rnd , fcov_prev_rnd); fcov_coverage_point_hit(tmp_cov_str); sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_ps/prev=%d/now=%d", mb_in->ps , fcov_prev_ps); fcov_coverage_point_hit(tmp_cov_str); sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_dctt/prev=%d/now=%d", mb_in->dctt , fcov_prev_dctt); fcov_coverage_point_hit(tmp_cov_str); sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_fp/prev=%d/now=%d", mb_in->fp , fcov_prev_fp); fcov_coverage_point_hit(tmp_cov_str); sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_ft/prev=%d/now=%d", mb_in->ft , fcov_prev_ft); fcov_coverage_point_hit(tmp_cov_str); sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_fb/prev=%d/now=%d", mb_in->fb , fcov_prev_fb); fcov_coverage_point_hit(tmp_cov_str); sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_bt/prev=%d/now=%d", mb_in->bt , fcov_prev_bt); fcov_coverage_point_hit(tmp_cov_str); sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_bb/prev=%d/now=%d", mb_in->bb , fcov_prev_bb); fcov_coverage_point_hit(tmp_cov_str); sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_mbtype/prev=%d/now=%d", mb_in->mbtype , fcov_prev_mbtype); fcov_coverage_point_hit(tmp_cov_str); sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_mcprecy/prev=%d/now=%d", mae_fe_cfg->mcprec , fcov_prev_mcprecy); fcov_coverage_point_hit(tmp_cov_str); sprintf(tmp_cov_str, "mae_fe_mpeg__back2back_mbparm_mcprecuv/prev=%d/now=%d", mae_fe_cfg->mcprecuv, fcov_prev_mcprecuv); fcov_coverage_point_hit(tmp_cov_str); } // storing the actual parms for next mb... // MAE HEADER WORD 0 fcov_prev_bblk = mb_in->bblk; // MAE HEADER WORD 1 fcov_prev_cbp_y0 = (mb_in->cbp >> 7) & 0x1; fcov_prev_cbp_y1 = (mb_in->cbp >> 6) & 0x1; fcov_prev_cbp_y2 = (mb_in->cbp >> 5) & 0x1; fcov_prev_cbp_y3 = (mb_in->cbp >> 4) & 0x1; fcov_prev_cbp_cb0 = (mb_in->cbp >> 3) & 0x1; fcov_prev_cbp_cr0 = (mb_in->cbp >> 2) & 0x1; fcov_prev_cbp_cb1 = (mb_in->cbp >> 1) & 0x1; fcov_prev_cbp_cr1 = mb_in->cbp & 0x1; // MAE HEADER WORD 2 fcov_prev_mbmode_y0 = (mb_in->mbmode >> 14) & 0x3; fcov_prev_mbmode_y1 = (mb_in->mbmode >> 12) & 0x3; fcov_prev_mbmode_y2 = (mb_in->mbmode >> 10) & 0x3; fcov_prev_mbmode_y3 = (mb_in->mbmode >> 8) & 0x3; fcov_prev_mbmode_cb0 = (mb_in->mbmode >> 6) & 0x3; fcov_prev_mbmode_cr0 = (mb_in->mbmode >> 4) & 0x3; fcov_prev_mbmode_cb1 = (mb_in->mbmode >> 2) & 0x3; fcov_prev_mbmode_cr1 = mb_in->mbmode & 0x3; fcov_prev_xformsize_y0 = (mb_in->xformsize >> 14) & 0x3; fcov_prev_xformsize_y1 = (mb_in->xformsize >> 12) & 0x3; fcov_prev_xformsize_y2 = (mb_in->xformsize >> 10) & 0x3; fcov_prev_xformsize_y3 = (mb_in->xformsize >> 8) & 0x3; fcov_prev_xformsize_cb0 = (mb_in->xformsize >> 6) & 0x3; fcov_prev_xformsize_cr0 = (mb_in->xformsize >> 4) & 0x3; fcov_prev_xformsize_cb1 = (mb_in->xformsize >> 2) & 0x3; fcov_prev_xformsize_cr1 = mb_in->xformsize & 0x3; // MAE HEADER WORD 3 fcov_prev_rnd = mb_in->rnd; fcov_prev_ps = mb_in->ps; fcov_prev_dctt = mb_in->dctt; fcov_prev_fp = mb_in->fp; fcov_prev_ft = mb_in->ft; fcov_prev_fb = mb_in->fb; fcov_prev_bt = mb_in->bt; fcov_prev_bb = mb_in->bb; fcov_prev_mbtype = mb_in->mbtype; fcov_prev_mcprecy = mae_fe_cfg->mcprec; fcov_prev_mcprecuv = mae_fe_cfg->mcprecuv; #endif dp_width = (mae_fe_cfg->codstyl) ? dp_width_wmv9 : dp_width_mpeg; whole_number_prec = (mae_fe_cfg->codstyl) ? whole_number_prec_wmv9 : whole_number_prec_mpeg; check_param_size(mae_fe_cfg, mb_in); exp_bc = mae_fe_cfg->bc ? 8 : 6; first_mb_of_frame = !(mb_num%(mae_fe_cfg->height*mae_fe_cfg->linesiz/256)); if (first_mb_of_frame) { RTL_printf("First mb of frame detected\n"); if (first || (gCM.cfg.cur_y_frame_ptr != mae_fe_cfg->cur_y_frame_ptr)) { for(i = 0; i < mae_fe_cfg->height; i++) { for(j = 0; j < mae_fe_cfg->linesiz; j++) { cur_y_unsat[(i*mae_fe_cfg->linesiz) + j] = cur_y_frame[(i*mae_fe_cfg->linesiz) + j]; } } } for(i = 0; i < chroma_height; i++) { for(j = 0; j < mae_fe_cfg->linesiz/2; j++) { if(first || (gCM.cfg.cur_cb_frame_ptr != mae_fe_cfg->cur_cb_frame_ptr)) cur_cb_unsat[(i*mae_fe_cfg->linesiz/2) + j] = cur_cb_frame[(i*mae_fe_cfg->linesiz/2) + j]; if(first || (gCM.cfg.cur_cr_frame_ptr != mae_fe_cfg->cur_cr_frame_ptr)) cur_cr_unsat[(i*mae_fe_cfg->linesiz/2) + j] = cur_cr_frame[(i*mae_fe_cfg->linesiz/2) + j]; } } gCM.change_addr = 0; } if (!first_mb_of_frame) check_valid_cfg_changes(mae_fe_cfg, mb_in, mb_num); do_malloc_if_necessary(mae_fe_cfg); // -------------------------------------------------------------------------- // // GLOBAL STRUCTURE EVILNESS (must be after do_malloc_if_necessary!) // // Information *TO* global structure gCM.nMB = mb_num; // Copy structures for check_valid_changes() check gCM.mb = *mb_in; gCM.cfg = *mae_fe_cfg; // Information *FROM* global structure so don't have to change code cur_y_sub = gCM.current_y; cur_cr_sub = gCM.current_cr; cur_cb_sub = gCM.current_cb; MAE_pWMVDec = gCM.MAE_pWMVDec; wm_intra_y = gCM.wm_intra_y; wm_intra_c = gCM.wm_intra_c; wm_inter_y = gCM.wm_inter_y; wm_inter_c = gCM.wm_inter_c;#ifndef HAVE_MAE nFrameNum = gCM.nFrameNum; nFrameType = gCM.nFrameType; bPureIntra = gCM.bPureIntra; nDeadZone = gCM.nDeadZone;#endif // // -------------------------------------------------------------------------- if (gCM.nMB == 0) any_bwd = any_fwd = any_fp = 0; #ifdef DEBUG_BUFFER_DATA print_buffer_data(mae_fe_cfg, mb_num);#endif#ifdef PROTOTYPING // This function packs up the registers and writes to .txt file // The file is to be used when prototyping the MAE pack_proto_reg(mae_fe_cfg, mb_in, mb_num);#endif // blk_mbmode is used to determine if motion comp will be done on the mb blk_mbmode = 0; for(bn = 0; bn < exp_bc; bn++){ blk_mbmode |= (mb_in->mbmode>>(14 - 2*bn)) & 0x3; } // y_mbmode & uv_mbmode are used to determine if interlaced frames can be created y_mbmode = 0; for(bn = 0; bn < 4; bn++){ y_mbmode |= (mb_in->mbmode>>(14 - 2*bn)) & 0x3; } uv_mbmode = 0; for(bn = 4; bn < exp_bc; bn++){ uv_mbmode |= (mb_in->mbmode>>(14 - 2*bn)) & 0x3; } print_macroblock_data(mae_fe_cfg, mb_in, mb_num); // Grab whatever wm's are passed in and store them off if (mb_in->wtchgmsk & WM_INTRA_Y) for(i=0; i < 64; i++) { wm_intra_y[i] = mb_in->wm0[i]; } if (mb_in->wtchgmsk & WM_INTRA_C) for(i=0; i < 64; i++) { wm_intra_c[i] = mb_in->wm1[i]; } if (mb_in->wtchgmsk & WM_INTER_Y) for(i=0; i < 64; i++) { wm_inter_y[i] = mb_in->wm2[i]; } if (mb_in->wtchgmsk & WM_INTER_C) for(i=0; i < 64; i++) { wm_inter_c[i] = mb_in->wm3[i]; } if (mb_in->fp) any_fp = 1; if (blk_mbmode) { // Initializes mcomp MAE_rtl2mae(&s, mae_fe_cfg, mb_in); // Call mcomp // In the mplayer code, the nomenclature of cur, prev, and fut is used. // It can get a little confusing, so here are the parings // fwd in mae means that mplayer uses the previous frame => prev_y = fwd_y // bwd in mae means that mplayer uses the future frame => fut_y = bwd_y // It actually makes sense in some twisted logic MAE_MPV_motion(&s); }#if (defined(REF_WMV9) && defined(USING_NEW_PK_1063)) else if(nFrameType != IFRAME) { // If we hit this case, it means that for this MB, there is no // MotionComp. Just print out that stuff to the RefBlksMV file. DumpNoDataForRefBlks(mb_num); }#endif else { // re-use old reference frame pointers
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -