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 );
}
Beispiel #2
0
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*/);

}