static void inline frame_mc_16x16( MPEG2_FRAME_GloARGs* dFRM, MPEG2_MB_DecARGs * dMB, unsigned int * dha) { uint16_t mbx = dMB->mb_x; uint16_t mby = dMB->mb_y; uint8_t dir = dMB->mv_dir & 0x3; if ( !dMB->interlaced_dct ) //if interlacd_dct, we have to use C version idct, so 'ofa' should be 0; { // ebms,esms,earm,epmv,esa,ebme,cae, pgc,ch2en,pri,ckge,ofa,rot,rotdir,wm,ccf,irqe,rst,en SET_REG1_CTRL(0, 0, 0, 0, 0, 0, 1, 0xF, 1, 3, 1, 1, 0, 0, 0, 1, 0, 0, 1); }else{ SET_REG1_CTRL(0, 0, 0, 0, 0, 0, 1, 0xF, 1, 3, 1, 0, 0, 0, 0, 1, 0, 0, 1); } int *ymv_f = dMB->mv[0][0]; int *ymv_b = dMB->mv[1][0]; int cmv_f[2]; int cmv_b[2]; cmv_f[0] = ymv_f[0]/2; cmv_f[1] = ymv_f[1]/2; cmv_b[0] = ymv_b[0]/2; cmv_b[1] = ymv_b[1]/2; /*--------------- MC chain ------------*/ unsigned int *tdd= dha; int tkn = 0; tdd[tkn++]=TDD_HEAD(1,/*vld*/ 1,/*lk*/ 0,/*op*/ SubPel[MPEG_HPEL]-1,/*ch1pel*/ SubPel[MPEG_HPEL]-1,/*ch2pel*/ 0,/*posmd*/ 1,/*mvmd*/ (dir==3)? 4: 2,/*tkn*/ mby,/*mby*/ mbx/*mbx*/ ); if (dir & 1){ tdd[tkn++] = TDD_MV(ymv_f[1], ymv_f[0]); tdd[tkn++] = TDD_CMD((dir==3)? 1: 0,/*bidir*/ 0,/*refdir*/ 0,/*fld*/ 0,/*fldsel*/ 0,/*rgr*/ 0,/*its*/ (dir & 2)?0:1,/*doe*/ (dir & 2)?0:1,/*cflo*/ 0,//pos_f[1],/*ypos*/ 3,//no_rnd?(IS_ILUT1):(IS_ILUT2),/*lilmd*/ /*--always no rnd??*/ 3,/*cilmd*/ 0,/*list*/ 0,/*boy*/ 0,/*box*/ BLK_H16,/*bh*/ BLK_W16,/*bw*/ 0//pos_f[0]/*xpos*/ ); } if (dir & 2){ tdd[tkn++] = TDD_MV (ymv_b[1], ymv_b[0]); tdd[tkn++] = TDD_CMD((dir==3)? 1: 0,/*bidir*/ 1,/*refdir*/ 0,/*fld*/ 0,/*fldsel*/ 0,/*rgr*/ 0,/*its*/ 1,/*doe*/ 1,/*cflo*/ 0,//pos_b[1],/*ypos*/ 3,//no_rnd?(IS_ILUT1):(IS_ILUT2),/*lilmd*/ 3,/*cilmd*/ 1,/*list*/ 0,/*boy*/ 0,/*box*/ BLK_H16,/*bh*/ BLK_W16,/*bw*/ 0//pos_b[0]/*xpos*/ ); } if (dir & 1){ tdd[tkn++] = TDD_MV((cmv_f[1]), (cmv_f[0])); tdd[tkn++] = TDD_CMD((dir==3)? 1: 0,/*bidir*/ 0,/*refdir*/ 0,/*fld*/ 0,/*fldsel*/ 0,/*rgr*/ 0,/*its*/ (dir & 2)?0:1,/*doe*/ 0,/*cflo*/ 0,//c_pos_f[1],/*ypos*/ 3,/*lilmd*/ 3,//no_rnd?(IS_ILUT1):(IS_ILUT2),/*cilmd*/ 0,/*list*/ 0,/*boy*/ 0,/*box*/ BLK_H16,/*bh*/ BLK_W16,/*bw*/ 0//c_pos_f[0]/*xpos*/ ); } if (dir & 2){ tdd[tkn++] = TDD_MV((cmv_b[1]), (cmv_b[0])); tdd[tkn++] = TDD_CMD((dir== 3)? 1: 0,/*bidir*/ 1,/*refdir*/ 0,/*fld*/ 0,/*fldsel*/ 0,/*rgr*/ 0,/*its*/ 1,/*doe*/ 0,/*cflo*/ 0,//c_pos_b[1],/*ypos*/ 3,/*lilmd*/ 3,//no_rnd?(IS_ILUT1):(IS_ILUT2),/*cilmd*/ 1,/*list*/ 0,/*boy*/ 0,/*box*/ BLK_H16,/*bh*/ BLK_W16,/*bw*/ 0//c_pos_b[0]/*xpos*/ ); } tdd[tkn++] = TDD_HEAD(1,/*vld*/ 1,/*lk*/ 0,/*op*/ SubPel[MPEG_HPEL]-1,/*ch1pel*/ SubPel[MPEG_HPEL]-1,/*ch2pel*/ 0,/*posmd*/ 1,/*mvmd*/ 0,/*tkn*/ 0x0,/*mby*/ 0x0 /*mbx*/); tdd[tkn++] = SYN_HEAD(1, 0, 2, 0, 0xFFFF); dMB->cbp |= (MAU_C_ERR_MSK << MAU_C_ERR_SFT ) | (MAU_Y_ERR_MSK << MAU_Y_ERR_SFT ); }
void motion_execute(H264_Slice_GlbARGs *SLICE_T, H264_MB_Ctrl_DecARGs *dmb, uint8_t *recon_buf, uint8_t *motion_dha) { uint8_t *motion_douty, *motion_doutc; uint8_t *motion_dsa = motion_dha + 0x108; const int mb_type= dmb->mb_type; motion_douty = recon_buf; motion_doutc = recon_buf + PREVIOUS_OFFSET_U; SET_REG1_DSTA(TCSM1_PADDR((int)motion_douty)); SET_REG1_DSA(TCSM1_PADDR((int)motion_dsa)); SET_REG2_DSTA(TCSM1_PADDR((int)motion_doutc)); SET_REG2_DSA(TCSM1_PADDR((int)motion_dsa)); volatile int *tdd = (int *)motion_dha; int tkn = 0; motion_dsa[0] = 0x0; tdd++; if(IS_16X16(mb_type)){ motion_task(SLICE_T, dmb, 0, 0, tdd, &tkn, IS_DIR(mb_type, 0, 0), IS_DIR(mb_type, 0, 1), 3/*blkh*/, 3/*blkw*/, 0/*boy*/, 0/*box*/); }else if(IS_16X8(mb_type)){ motion_task(SLICE_T, dmb, 0, 0, tdd, &tkn, IS_DIR(mb_type, 0, 0), IS_DIR(mb_type, 0, 1), 2/*blkh*/, 3/*blkw*/, 0/*boy*/, 0/*box*/); motion_task(SLICE_T, dmb, 1, 2, tdd, &tkn, IS_DIR(mb_type, 1, 0), IS_DIR(mb_type, 1, 1), 2/*blkh*/, 3/*blkw*/, 2/*boy*/, 0/*box*/); }else if(IS_8X16(mb_type)){ motion_task(SLICE_T, dmb, 0, 0, tdd, &tkn, IS_DIR(mb_type, 0, 0), IS_DIR(mb_type, 0, 1), 3/*blkh*/, 2/*blkw*/, 0/*boy*/, 0/*box*/); motion_task(SLICE_T, dmb, 1, 1, tdd, &tkn, IS_DIR(mb_type, 1, 0), IS_DIR(mb_type, 1, 1), 3/*blkh*/, 2/*blkw*/, 0/*boy*/, 2/*box*/); }else{ int i; int mv_n=0; for(i=0; i<4; i++){ const int sub_mb_type= dmb->sub_mb_type[i]; if(IS_SUB_8X8(sub_mb_type)){ motion_task(SLICE_T, dmb, mv_n, i, tdd, &tkn, IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1), 2/*blkh*/, 2/*blkw*/, (i & 0x2)/*boy*/, (i & 0x1)*2/*box*/); mv_n++; }else if(IS_SUB_8X4(sub_mb_type)){ motion_task(SLICE_T, dmb, mv_n, i, tdd, &tkn, IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1), 1/*blkh*/, 2/*blkw*/, (i & 0x2)/*boy*/, (i & 0x1)*2/*box*/); mv_n++; motion_task(SLICE_T, dmb, mv_n, i, tdd, &tkn, IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1), 1/*blkh*/, 2/*blkw*/, (i & 0x2)+1/*boy*/, (i & 0x1)*2/*box*/); mv_n++; }else if(IS_SUB_4X8(sub_mb_type)){ motion_task(SLICE_T, dmb, mv_n, i, tdd, &tkn, IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1), 2/*blkh*/, 1/*blkw*/, (i & 0x2)/*boy*/, (i & 0x1)*2/*box*/); mv_n++; motion_task(SLICE_T, dmb, mv_n, i, tdd, &tkn, IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1), 2/*blkh*/, 1/*blkw*/, (i & 0x2)/*boy*/, (i & 0x1)*2+1/*box*/); mv_n++; }else{ int j; for(j=0; j<4; j++){ motion_task(SLICE_T, dmb, mv_n, i, tdd, &tkn, IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1), 1/*blkh*/, 1/*blkw*/, (i & 0x2) + (j & 0x2)/2/*boy*/, (i & 0x1)*2 + (j & 0x1)/*box*/); mv_n++; } //j } //BLK4X4 } //i } //BLK8X8 tdd[2*tkn-1] |= 0x1<<TDD_DOE_SFT; tdd[-1] = TDD_HEAD(1,/*vld*/ 1,/*lk*/ 0,/*sync*/ 1,/*ch1pel*/ 2,/*ch2pel*/ TDD_POS_SPEC,/*posmd*/ TDD_MV_AUTO,/*mvmd*/ 1,/*ch2en*/ tkn,/*tkn*/ dmb->mb_y,/*mby*/ dmb->mb_x/*mbx*/); tdd[2*tkn] = TDD_HEAD(1,/*vld*/ 0,/*lk*/ 1,/*sync*/ 1,/*ch1pel*/ 2,/*ch2pel*/ TDD_POS_SPEC,/*posmd*/ TDD_MV_AUTO,/*mvmd*/ 1,/*ch2en*/ 0,/*tkn*/ 0xFF,/*mby*/ 0xFF/*mbx*/); }