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 );
}
Пример #2
0
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)++;
    }
  }
}