⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mv-search.c

📁 网络MPEG4IP流媒体开发源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
      best_inter_sad = FastFullIntegerSearch (mv_mul, ip0, ip1, curr_search_range,                                              refindex, blocktype, mb_x, mb_y,                                              &center_h2, &center_v2, pic_pix_x, pic_pix_y,                                              lambda);#endif // _FAST_FULL_ME_      // Adjust center to 1/4 pel positions      center_h2 *=4;      center_v2 *=4;      if ((pic4_pix_x + center_h2 > 1) &&          (pic4_pix_y + center_v2 > 1) &&          (pic4_pix_x + center_h2 < 4*(img->width  - blockshape_x + 1) - 2) &&          (pic4_pix_y + center_v2 < 4*(img->height - blockshape_y + 1) - 2)   )        PelY_14 = FastPelY_14;      else        PelY_14 = UMVPelY_14;      //  1/2 pixel search.  In this version the search is over 9 vector positions.      best_inter_sad = HalfPelSearch (pic4_pix_x, pic4_pix_y, mv_mul, blockshape_x, blockshape_y,                                      &s_pos_x1, &s_pos_y1, &s_pos_x2, &s_pos_y2, center_h2, center_v2,                                      ip0, ip1, blocktype, mo, CurrRefPic, tmp_mv, all_mv, block_x,                                      block_y, ref_frame, pic_block_x, pic_block_y,                                      lambda);      //  1/4 pixel search.      if ((pic4_pix_x + s_pos_x2 > 0) &&          (pic4_pix_y + s_pos_y2 > 0) &&          (pic4_pix_x + s_pos_x2 < 4*(img->width  - blockshape_x + 1) - 1) &&          (pic4_pix_y + s_pos_y2 < 4*(img->height - blockshape_y + 1) - 1)   )        PelY_14 = FastPelY_14;      else        PelY_14 = UMVPelY_14;      best_inter_sad = QuarterPelSearch (pic4_pix_x, pic4_pix_y, mv_mul, blockshape_x, blockshape_y,                                         &s_pos_x1, &s_pos_y1, &s_pos_x2, &s_pos_y2, center_h2, center_v2,                                         ip0, ip1, blocktype, mo, CurrRefPic, tmp_mv, all_mv, block_x, block_y, ref_frame,                                         pic_block_x, pic_block_y, best_inter_sad,                                         lambda);      //  1/8 pixel search.      if(input->mv_res)      {        pic8_pix_x=2*pic4_pix_x;        pic8_pix_y=2*pic4_pix_y;        if ((pic8_pix_x + s_pos_x2 > 0) &&            (pic8_pix_y + s_pos_y2 > 0) &&            (pic8_pix_x + s_pos_x2 < 8*(img->width  - blockshape_x + 1) - 2) &&            (pic8_pix_y + s_pos_y2 < 8*(img->height - blockshape_y + 1) - 2)   )          PelY_18 = FastPelY_18;        else          PelY_18 = UMVPelY_18;        best_inter_sad = EighthPelSearch(pic8_pix_x, pic8_pix_y, mv_mul, blockshape_x, blockshape_y,                                        &s_pos_x1, &s_pos_y1, &s_pos_x2, &s_pos_y2, center_h2, center_v2,                                        ip0, ip1, blocktype, mo, CurrRefPic, tmp_mv, all_mv, block_x, block_y, ref_frame,                                        pic_block_x, pic_block_y, best_inter_sad,                                        lambda);      }      tot_inter_sad += best_inter_sad;    }  }  return tot_inter_sad;}/*! ************************************************************************ * \brief *    motion search for P-frames ************************************************************************ */int motion_search(int tot_intra_sad){  int predframe_no, min_inter_sad, hv, i, j;  predframe_no = UnifiedMotionSearch(tot_intra_sad, refFrArr, tmp_mv, img->mv, &img->mb_mode,    &img->blc_size_h, &img->blc_size_v, &img->multframe_no, PFRAME, &min_inter_sad, img->all_mv);  // tot_intra_sad is now the minimum SAD for intra.  min_inter_sad is the best (min) SAD for inter (see above).  // Inter/intra is determined depending on which is smallest  if (tot_intra_sad < min_inter_sad)  {    img->mb_mode=img->imod+8*img->type; // set intra mode in inter frame    for (hv=0; hv < 2; hv++)      for (i=0; i < 4; i++)        for (j=0; j < 4; j++)          tmp_mv[hv][img->block_y+j][img->block_x+i+4]=0;  }  else  {    img->mb_data[img->current_mb_nr].intraOrInter = INTER_MB;    img->imod=INTRA_MB_INTER; // Set inter mode    for (hv=0; hv < 2; hv++)      for (i=0; i < 4; i++)        for (j=0; j < 4; j++)          tmp_mv[hv][img->block_y+j][img->block_x+i+4]=img->all_mv[i][j][predframe_no][img->mb_mode][hv];  }  return predframe_no;};/*! ************************************************************************ * \brief *    forward motion search for B-frames ************************************************************************ */int get_fwMV(int *min_fw_sad, int tot_intra_sad){  int fw_predframe_no, hv, i, j;  fw_predframe_no = UnifiedMotionSearch(tot_intra_sad, fw_refFrArr, tmp_fwMV,                                        img->p_fwMV, &img->fw_mb_mode,                                        &img->fw_blc_size_h, &img->fw_blc_size_v,                                        &img->fw_multframe_no, B_FORWARD,                                        min_fw_sad, img->all_mv);  // save forward MV to tmp_fwMV  for (hv=0; hv < 2; hv++)    for (i=0; i < 4; i++)      for (j=0; j < 4; j++)      {        if(img->fw_mb_mode==1)          tmp_fwMV[hv][img->block_y+j][img->block_x+i+4]=img->all_mv[i][j][fw_predframe_no][1][hv];        else          tmp_fwMV[hv][img->block_y+j][img->block_x+i+4]=img->all_mv[i][j][fw_predframe_no][(img->fw_mb_mode)/2][hv];      }  return fw_predframe_no;}/*! ************************************************************************ * \brief *    backward motion search for B-frames ************************************************************************ */void get_bwMV(int *min_bw_sad){  int bw_predframe_no, hv, i, j;  bw_predframe_no = UnifiedMotionSearch(MAX_VALUE, bw_refFrArr, tmp_bwMV,          img->p_bwMV, &img->bw_mb_mode,          &img->bw_blc_size_h, &img->bw_blc_size_v,          &img->bw_multframe_no, B_BACKWARD,          min_bw_sad, img->all_mv);  // save backward MV to tmp_bwMV  for (hv=0; hv < 2; hv++)    for (i=0; i < 4; i++)      for (j=0; j < 4; j++)      {        if(img->bw_mb_mode==2)          tmp_bwMV[hv][img->block_y+j][img->block_x+i+4]=img->all_mv[i][j][bw_predframe_no][1][hv];        else          tmp_bwMV[hv][img->block_y+j][img->block_x+i+4]=img->all_mv[i][j][bw_predframe_no][(img->bw_mb_mode-1)/2][hv];      }}/*! ************************************************************************ * \brief *    Do hadamard transform or normal SAD calculation. *    If Hadamard=1 4x4 Hadamard transform is performed and SAD of transform *    levels is calculated * * \par Input: *    hadamard=0 : normal SAD                                                  \n *    hadamard=1 : 4x4 Hadamard transform is performed and SAD of transform *                 levels is calculated * * \par Output: *    SAD/hadamard transform value * * \note *    This function was optimized by manual loop unrolling and pointer arithmetic ************************************************************************ */int find_sad(int hadamard, int m7[16][16]){  int i, j,x, y, best_sad,current_sad;  int m1[BLOCK_SIZE*BLOCK_SIZE], m[BLOCK_SIZE*BLOCK_SIZE], *mp;#ifdef COMPLEXITY    SadCalls++;#endif  current_sad=0;  if (hadamard != 0)  {    best_sad=0;// Copy img->m7[][] into local variable, to avoid costly address arithmetic and cache misses    mp=m;    for (y=0; y<BLOCK_SIZE; y++)      for (x=0; x<BLOCK_SIZE; x++)        *mp++= m7[y][x];    m1[0] = m[0] + m[12];    m1[4] = m[4] + m[8];    m1[8] = m[4] - m[8];    m1[12]= m[0] - m[12];    m1[1] = m[1] + m[13];    m1[5] = m[5] + m[9];    m1[9] = m[5] - m[9];    m1[13]= m[1] - m[13];    m1[2] = m[2] + m[14];    m1[6] = m[6] + m[10];    m1[10]= m[6] - m[10];    m1[14]= m[2] - m[14];    m1[3] = m[3] + m[15];    m1[7] = m[7] + m[11];    m1[11]= m[7] - m[11];    m1[15]= m[3] - m[15];    m[0] = m1[0] + m1[4];    m[8] = m1[0] - m1[4];    m[4] = m1[8] + m1[12];    m[12]= m1[12]- m1[8];    m[1] = m1[1] + m1[5];    m[9] = m1[1] - m1[5];    m[5] = m1[9] + m1[13];    m[13]= m1[13]- m1[9];    m[2] = m1[2] + m1[6];    m[10] = m1[2] - m1[6];    m[6] = m1[10] + m1[14];    m[14]= m1[14]- m1[10];    m[3] = m1[3] + m1[7];    m[11]= m1[3] - m1[7];    m[7] = m1[11]+ m1[15];    m[15]= m1[15]- m1[11];    m1[0] = m[0] + m[3];    m1[1] = m[1] + m[2];    m1[2] = m[1] - m[2];    m1[3] = m[0] - m[3];    m1[4] = m[4] + m[7];    m1[5] = m[5] + m[6];    m1[6] = m[5] - m[6];    m1[7] = m[4] - m[7];    m1[8] = m[8] + m[11];    m1[9] = m[9] + m[10];    m1[10]= m[9] - m[10];    m1[11]= m[8] - m[11];    m1[12]= m[12]+ m[15];    m1[13]= m[13]+ m[14];    m1[14]= m[13]- m[14];    m1[15]= m[12]- m[15];    m[0] = m1[0] + m1[1];    m[1] = m1[0] - m1[1];    m[2] = m1[2] + m1[3];    m[3] = m1[3] - m1[2];    m[4] = m1[4] + m1[5];    m[5] = m1[4] - m1[5];    m[6] = m1[6] + m1[7];    m[7] = m1[7] - m1[6];    m[8] = m1[8] + m1[9];    m[9] = m1[8] - m1[9];    m[10]= m1[10]+ m1[11];    m[11]= m1[11]- m1[10];    m[12]= m1[12]+ m1[13];    m[13]= m1[12]- m1[13];    m[14]= m1[14]+ m1[15];    m[15]= m1[15]- m1[14];    // Note: we cannot use ByteAbs() here because the absolute values can be bigger    // than +- 256.  WOuld either need to enhance ByteAbs to WordAbs (or something)    // or leave it as is (use of absm*( macro)    for (j=0; j< BLOCK_SIZE * BLOCK_SIZE; j++)      best_sad += absm (m[j]);      /*    Calculation of normalized Hadamard transforms would require divison by 4 here.    However,we flevel  that divison by 2 is better (assuming we give the same penalty for    bituse for Hadamard=0 and 1)    */    current_sad += best_sad/2;  }  else  {    register int *p;    {      for (i=0;i<4;i++)      {        p = m7[i];        for (j=0;j<4;j++)          current_sad+=ByteAbs(*p++);      }    }  }  return current_sad;}/*! ************************************************************************ * \brief *    control the sign of a with b ************************************************************************ */int sign(int a,int b){  int x;  x=absm(a);  if (b >= 0)    return x;  else    return -x;}static int ByteAbsLookup[] = {  255,254,253,252,251,250,249,248,247,246,245,244,243,242,241,240,  239,238,237,236,235,234,233,232,231,230,229,228,227,226,225,224,  223,222,221,220,219,218,217,216,215,214,213,212,211,210,209,208,  207,206,205,204,203,202,201,200,199,198,197,196,195,194,193,192,  191,190,189,188,187,186,185,184,183,182,181,180,179,178,177,176,  175,174,173,172,171,170,169,168,167,166,165,164,163,162,161,160,  159,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144,  143,142,141,140,139,138,137,136,135,134,133,132,131,130,129,128,  127,126,125,124,123,122,121,120,119,118,117,116,115,114,113,112,  111,110,109,108,107,106,105,104,103,102,101,100, 99, 98, 97, 96,   95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80,   79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64,   63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48,   47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32,   31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16,   15, 14, 13, 12, 11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  1,  0,    1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,   17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,   33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,   49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,   65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,   81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96,   97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,112,  113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,  129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,  145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,  161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,  177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,  193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,  209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,  225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,  241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 };__inline int ByteAbs (int foo){  return ByteAbsLookup [foo+255];}void InitMotionVectorSearchModule (){  int i,j,k,l,l2;  // Set up the static pointer for MV_bituse;  MVBitUse = img->mv_bituse;  // initialize Spiral Search statics  k=1;  for (l=1; l < 41; l++)  {    l2=l+l;    for (i=-l+1; i < l; i++)    {      for (j=-l; j < l+1; j += l2)      {        SpiralX[k] = i;        SpiralY[k] = j;        k++;      }    }    for (j=-l; j <= l; j++)    {      for (i=-l;i <= l; i += l2)      {        SpiralX[k] = i;        SpiralY[k] = j;        k++;      }    }  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -