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_task(H264_Slice_GlbARGs *SLICE_T, H264_MB_Ctrl_DecARGs *dmb, int mv_n, int i8x8, int *tdd, int *tkn, int list0, int list1, int blkh, int blkw, int boy, int box) { int i, dir[2], is_bidir, mvy, mvx; int8_t * Inter_Dec_base=(uint32_t)dmb+sizeof(struct H264_MB_Ctrl_DecARGs); int mv_num=*(uint32_t*)Inter_Dec_base; int8_t (*ref_base)[8]=Inter_Dec_base+4; short (*mv_base)[2]=Inter_Dec_base+4+4+((32+8)<<(SLICE_T->slice_type-2)); dir[0] = list0 != 0; dir[1] = list1 != 0; is_bidir = dir[0] && dir[1]; for(i=0; i<2; i++){ if(dir[i]){ i_movn(mv_base,mv_base+mv_num,i); mvx = mv_base[mv_n][0]; mvy = mv_base[mv_n][1]; int ref_cnt= ref_base[i][i8x8]; int mx = mvx + dmb->mb_x*16*4 + box*4; int my = mvy + dmb->mb_y*16*4 + boy*4; const int full_mx= mx>>2; const int full_my= my>>2; if(full_mx < -EDGE_WIDTH + 2){ mvx += (-EDGE_WIDTH+2-full_mx)<<2; } if(full_mx + 16 > 16*SLICE_T->mb_width + EDGE_WIDTH - 3){ mvx -= (full_mx+16-16*SLICE_T->mb_width-EDGE_WIDTH+3)<<2; } if(full_my < -EDGE_WIDTH + 2){ mvy += (-EDGE_WIDTH+2-full_my)<<2; } if(full_my + 16 > 16*SLICE_T->mb_height + EDGE_WIDTH - 3){ mvy -= (full_my+16-16*SLICE_T->mb_height-EDGE_WIDTH+3)<<2; } tdd[ 2*tkn[0] ] = TDD_MV(mvy, mvx); tdd[ 2*tkn[0]+1 ] = TDD_CMD(is_bidir,/*bidir*/ i,/*refdir*/ 0,/*fld*/ 0,/*fldsel*/ 0,/*rgr*/ 0,/*its*/ 0,/*doe*/ 0,/*cflo*/ mvy & 0x7,/*ypos*/ IS_ILUT0,/*lilmd*/ IS_EC,/*cilmd*/ ref_cnt, /*list*/ boy,/*boy*/ box,/*box*/ blkh,/*bh*/ blkw,/*bw*/ mvx & 0x7/*xpos*/); (*tkn)++; } } }