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

📄 epzs.c

📁 H264视频编解码程序
💻 C
📖 第 1 页 / 共 5 页
字号:
      for (j = 0; j < fs->size_y >> 2; j++)
      {
        for (i = 0; i < fs->size_x >> 2; i++)
        {
          if ((!img->MbaffFrameFlag && !img->structure && fs->field_frame[j][i]) || (img->MbaffFrameFlag && fs->field_frame[j][i]))
          {
            p->mv[LIST_0][j][i][1] *= 2;        
            p->mv[LIST_1][j][i][1] *= 2;
          }
          else if (img->structure && !fs->field_frame[j][i])
          {
            p->mv[LIST_0][j][i][1] = (p->mv[LIST_0][j][i][1] + 1) >> 1;
            p->mv[LIST_1][j][i][1] = (p->mv[LIST_1][j][i][1] + 1) >> 1;
          }
        }
      }
    }
  }
}

/*!
***********************************************************************
* \brief
*    Spatial Predictors
*    AMT/HYC
***********************************************************************
*/
static short EPZSSpatialPredictors (PixelPos block_a, 
                                    PixelPos block_b,
                                    PixelPos block_c, 
                                    PixelPos block_d,
                                    int list, 
                                    int list_offset, 
                                    short ref,
                                    char **refPic, 
                                    short ***tmp_mv,
                                    EPZSStructure * predictor)
{
  int refA, refB, refC, refD;
  int *mot_scale = mv_scale[list + list_offset][ref];
  
  // zero predictor
  predictor->point[0].x = 0;
  predictor->point[0].y = 0;
  
  // Non MB-AFF mode
  if (!img->MbaffFrameFlag)
  {
    refA = block_a.available ? (int) refPic[block_a.pos_y][block_a.pos_x] : -1;
    refB = block_b.available ? (int) refPic[block_b.pos_y][block_b.pos_x] : -1;
    refC = block_c.available ? (int) refPic[block_c.pos_y][block_c.pos_x] : -1;
    refD = block_d.available ? (int) refPic[block_d.pos_y][block_d.pos_x] : -1;
    
    // Left Predictor
    predictor->point[1].x = (block_a.available) 
      ? (mot_scale[refA] * tmp_mv[block_a.pos_y][block_a.pos_x][0] + 512) >> 10 :  3;
    predictor->point[1].y = (block_a.available) 
      ? (mot_scale[refA] * tmp_mv[block_a.pos_y][block_a.pos_x][1] + 512) >> 10 :  0;
    
    // Up predictor
    predictor->point[2].x = (block_b.available) 
      ? (mot_scale[refB] * tmp_mv[block_b.pos_y][block_b.pos_x][0] + 512) >> 10 :  0;
    predictor->point[2].y = (block_b.available) 
      ? (mot_scale[refB] * tmp_mv[block_b.pos_y][block_b.pos_x][1] + 512) >> 10 :  3;
    
    // Up-Right predictor
    predictor->point[3].x = (block_c.available) 
      ? (mot_scale[refC] * tmp_mv[block_c.pos_y][block_c.pos_x][0] + 512) >> 10 : -3;
    predictor->point[3].y = (block_c.available) 
      ? (mot_scale[refC] * tmp_mv[block_c.pos_y][block_c.pos_x][1] + 512) >> 10 :  0;
    
    //Up-Left predictor
    predictor->point[4].x = (block_d.available) 
      ? (mot_scale[refD] * tmp_mv[block_d.pos_y][block_d.pos_x][0] + 512) >> 10 :  0;
    predictor->point[4].y = (block_d.available) 
      ? (mot_scale[refD] * tmp_mv[block_d.pos_y][block_d.pos_x][1] + 512) >> 10 : -3;    
  }
  else  // MB-AFF mode
  {    
    // Field Macroblock
    if (list_offset)
    {
      refA = block_a.available 
        ? img->mb_data[block_a.mb_addr].mb_field 
        ? (int) refPic[block_a.pos_y][block_a.pos_x] 
        : (int) refPic[block_a.pos_y][block_a.pos_x] * 2 : -1;
      refB =block_b.available 
        ? img->mb_data[block_b.mb_addr].mb_field 
        ? (int) refPic[block_b.pos_y][block_b.pos_x]
        : (int) refPic[block_b.pos_y][block_b.pos_x] * 2 : -1;
      refC = block_c.available 
        ? img->mb_data[block_c.mb_addr].mb_field 
        ? (int) refPic[block_c.pos_y][block_c.pos_x] 
        : (int) refPic[block_c.pos_y][block_c.pos_x] * 2 : -1;
      refD = block_d.available 
        ? img->mb_data[block_d.mb_addr].mb_field 
        ? (int) refPic[block_d.pos_y][block_d.pos_x] 
        : (int) refPic[block_d.pos_y][block_d.pos_x] * 2 : -1;
      
      // Left Predictor
      predictor->point[1].x = (block_a.available) 
        ? (mot_scale[refA] * tmp_mv[block_a.pos_y][block_a.pos_x][0] + 512 ) >> 10 :  3;
      predictor->point[1].y = (block_a.available) 
        ? img->mb_data[block_a.mb_addr].mb_field 
        ? (mot_scale[refA] * tmp_mv[block_a.pos_y][block_a.pos_x][1] + 512 ) >> 10 
        : (mot_scale[refA] * tmp_mv[block_a.pos_y][block_a.pos_x][1] + 1024) >> 11 :  0;
      
      // Up predictor
      predictor->point[2].x = (block_b.available) 
        ? (mot_scale[refB] * tmp_mv[block_b.pos_y][block_b.pos_x][0] + 512 ) >> 10 :  0;
      predictor->point[2].y = (block_b.available) 
        ? img->mb_data[block_b.mb_addr].mb_field 
        ? (mot_scale[refB] * tmp_mv[block_b.pos_y][block_b.pos_x][1] + 512 ) >> 10 
        : (mot_scale[refB] * tmp_mv[block_b.pos_y][block_b.pos_x][1] + 1024) >> 11 :  3;
      
      // Up-Right predictor
      predictor->point[3].x = (block_c.available) 
        ? (mot_scale[refC] * tmp_mv[block_c.pos_y][block_c.pos_x][0] + 512 ) >> 10 : -3;
      predictor->point[3].y = (block_c.available) 
        ? img->mb_data[block_c.mb_addr].mb_field 
        ? (mot_scale[refC] * tmp_mv[block_c.pos_y][block_c.pos_x][1] + 512 ) >> 10 
        : (mot_scale[refC] * tmp_mv[block_c.pos_y][block_c.pos_x][1] + 1024) >> 11 :  0;
      
      //Up-Left predictor
      predictor->point[4].x = (block_d.available) 
        ? (mot_scale[refD] * tmp_mv[block_d.pos_y][block_d.pos_x][0] + 512 ) >> 10 :  0;
      predictor->point[4].y = (block_d.available) 
        ? img->mb_data[block_d.mb_addr].mb_field 
        ? (mot_scale[refD] * tmp_mv[block_d.pos_y][block_d.pos_x][1] + 512 ) >> 10 
        : (mot_scale[refD] * tmp_mv[block_d.pos_y][block_d.pos_x][1] + 1024) >> 11 : -3;
    }
    else // Frame macroblock
    {
      refA = block_a.available 
        ? img->mb_data[block_a.mb_addr].mb_field 
        ? (int) refPic[block_a.pos_y][block_a.pos_x] >> 1
        : (int) refPic[block_a.pos_y][block_a.pos_x] : -1;
      refB = block_b.available 
        ? img->mb_data[block_b.mb_addr].mb_field 
        ? (int) refPic[block_b.pos_y][block_b.pos_x] >> 1 
        : (int) refPic[block_b.pos_y][block_b.pos_x] : -1;
      refC = block_c.available 
        ? img->mb_data[block_c.mb_addr].mb_field 
        ? (int) refPic[block_c.pos_y][block_c.pos_x] >> 1 
        : (int) refPic[block_c.pos_y][block_c.pos_x] : -1;
      refD = block_d.available 
        ? img->mb_data[block_d.mb_addr].mb_field 
        ? (int) refPic[block_d.pos_y][block_d.pos_x] >> 1 
        : (int) refPic[block_d.pos_y][block_d.pos_x] : -1;
      
      // Left Predictor
      predictor->point[1].x = (block_a.available) 
        ? (mot_scale[refA] * tmp_mv[block_a.pos_y][block_a.pos_x][0] + 512) >> 10 :  3;
      predictor->point[1].y = (block_a.available) 
        ? img->mb_data[block_a.mb_addr].mb_field 
        ? (mot_scale[refA] * tmp_mv[block_a.pos_y][block_a.pos_x][1] + 256) >> 9  
        : (mot_scale[refA] * tmp_mv[block_a.pos_y][block_a.pos_x][1] + 512) >> 10 :  0;
      
      // Up predictor
      predictor->point[2].x = (block_b.available) 
        ? (mot_scale[refB] * tmp_mv[block_b.pos_y][block_b.pos_x][0] + 512) >> 10 :  0;
      predictor->point[2].y = (block_b.available) 
        ? img->mb_data[block_b.mb_addr].mb_field 
        ? (mot_scale[refB] * tmp_mv[block_b.pos_y][block_b.pos_x][1] + 256) >> 9  
        : (mot_scale[refB] * tmp_mv[block_b.pos_y][block_b.pos_x][1] + 512) >> 10 :  3;
      
      // Up-Right predictor
      predictor->point[3].x = (block_c.available) 
        ? (mot_scale[refC] * tmp_mv[block_c.pos_y][block_c.pos_x][0] + 512) >> 10 : -3;
      predictor->point[3].y = (block_c.available) 
        ? img->mb_data[block_c.mb_addr].mb_field 
        ? (mot_scale[refC] * tmp_mv[block_c.pos_y][block_c.pos_x][1] + 256) >> 9  
        : (mot_scale[refC] * tmp_mv[block_c.pos_y][block_c.pos_x][1] + 512) >> 10 :  3;
      
      //Up-Left predictor
      predictor->point[4].x = (block_d.available) 
        ? (mot_scale[refD] * tmp_mv[block_d.pos_y][block_d.pos_x][0] + 512) >> 10 :  0;
      predictor->point[4].y = (block_d.available) 
        ? img->mb_data[block_d.mb_addr].mb_field 
        ? (mot_scale[refD] * tmp_mv[block_d.pos_y][block_d.pos_x][1] + 256) >>  9 
        : (mot_scale[refD] * tmp_mv[block_d.pos_y][block_d.pos_x][1] + 512) >> 10 : -3;
    }
  }
  
  return ((refA == -1) + (refB == -1) + (refC == -1 && refD == -1));
}

/*!
***********************************************************************
* \brief
*    Spatial Predictors
*    AMT/HYC
***********************************************************************
*/

static void EPZSSpatialMemPredictors (int list, 
                                      short ref,
                                      int blocktype,
                                      int pic_x, 
                                      int bs_x, 
                                      int bs_y, 
                                      int by,
                                      int *prednum,
                                      int img_width,
                                      EPZSStructure * predictor)
{
#if EPZSREF
  short ***mv = EPZSMotion[list][ref][blocktype];  
  
  // Left Predictor
  predictor->point[*prednum].x = (pic_x > 0) ? mv[by][pic_x - bs_x][0] :  0;
  predictor->point[*prednum].y = (pic_x > 0) ? mv[by][pic_x - bs_x][1] :  0;
  *prednum += ((predictor->point[*prednum].x != 0) || (predictor->point[*prednum].y != 0));
  
  // Up predictor
  predictor->point[*prednum].x = (by > 0) ? mv[by - bs_y][pic_x][0] : mv[4 - bs_y][pic_x][0] ;
  predictor->point[*prednum].y = (by > 0) ? mv[by - bs_y][pic_x][1] : mv[4 - bs_y][pic_x][1];
  *prednum += ((predictor->point[*prednum].x != 0) || (predictor->point[*prednum].y != 0));
  
  // Up-Right predictor
  predictor->point[*prednum].x = (pic_x + bs_x < img_width) ? (by > 0) 
    ? mv[by - bs_y][pic_x + bs_x][0] : mv[4 - bs_y][pic_x + bs_x][0] : 0;
  predictor->point[*prednum].y = (pic_x + bs_x < img_width) ? (by > 0) 
    ? mv[by - bs_y][pic_x + bs_x][1] : mv[4 - bs_y][pic_x + bs_x][1] : 0;
  *prednum += ((predictor->point[*prednum].x != 0) || (predictor->point[*prednum].y != 0));
  
#else
  int mot_scale = mv_scale[list][ref][0];
  short **mv = EPZSMotion[list][blocktype];  
  
  // Left Predictor
  predictor->point[*prednum].x = (pic_x > 0) 
    ? (mot_scale * mv[by][pic_x - bs_x][0] + 128) >> 8 
    : 0;
  predictor->point[*prednum].y = (pic_x > 0) 
    ? (mot_scale * mv[by][pic_x - bs_x][1] + 128) >> 8 
    : 0;
  *prednum += ((predictor->point[*prednum].x != 0) || (predictor->point[*prednum].y != 0));
  
  // Up predictor
  predictor->point[*prednum].x = (by > 0) 
    ? (mot_scale * mv[by - bs_y][pic_x][0] + 128) >> 8
    : (mot_scale * mv[4  - bs_y][pic_x][0] + 128) >> 8;
  predictor->point[*prednum].y = (by > 0) 
    ? (mot_scale * mv[by - bs_y][pic_x][1] + 128) >> 8
    : (mot_scale * mv[4  - bs_y][pic_x][0] + 128) >> 8;
  *prednum += ((predictor->point[*prednum].x != 0) || (predictor->point[*prednum].y != 0));
  
  // Up-Right predictor
  predictor->point[*prednum].x = (pic_x + bs_x < img_width) 
    ? (by > 0) 
    ? (mot_scale * mv[by - bs_y][pic_x + bs_x][0] + 128) >> 8
    : (mot_scale * mv[4  - bs_y][pic_x + bs_x][0] + 128) >> 8
    : 0;
  predictor->point[*prednum].y = (pic_x + bs_x < img_width) 
    ? (by > 0) 
    ? (mot_scale * mv[by - bs_y][pic_x + bs_x][1] + 128) >> 8
    : (mot_scale * mv[4  - bs_y][pic_x + bs_x][1] + 128) >> 8
    : 0;
  *prednum += ((predictor->point[*prednum].x != 0) || (predictor->point[*prednum].y != 0));
#endif
}

/*!
***********************************************************************
* \brief
*    Temporal Predictors
*    AMT/HYC
***********************************************************************
*/
static void
EPZSTemporalPredictors (int list,         // <--  current list
                        int list_offset,  // <--  list offset for MBAFF
                        short ref,        // <--  current reference frame
                        int o_block_x,	// <--  absolute x-coordinate of regarded AxB block
                        int o_block_y,	// <--  absolute y-coordinate of regarded AxB block
                        EPZSStructure * predictor, 
                        int *prednum,
                        int block_available_left, 
                        int block_available_up,
                        int block_available_right, 
                        int block_available_below,
                        int blockshape_x, 
                        int blockshape_y,
                        int stopCriterion, 
                        int min_mcost)
{  
  int mvScale = mv_scale[list + list_offset][ref][0];
  short ***col_mv = (list_offset == 0) ? EPZSCo_located->mv[list]
    : (list_offset == 2) ? EPZSCo_located->top_mv[list] : EPZSCo_located->bottom_mv[list];
  
  predictor->point[*prednum].x = (mvScale * col_mv[o_block_y][o_block_x][0] + 2048) >> 12;
  predictor->point[*prednum].y = (mvScale * col_mv[o_block_y][o_block_x][1] + 2048) >> 12;
  *prednum += ((predictor->point[*prednum].x != 0) || (predictor->point[*prednum].y != 0));
  
  if (min_mcost > stopCriterion && ref < 2)
  {
    if (block_available_left)
    {    
      predictor->point[*prednum].x = (mvScale * col_mv[o_block_y][o_block_x - 1][0] + 2048) >> 12;
      predictor->point[*prednum].y = (mvScale * col_mv[o_block_y][o_block_x - 1][1] + 2048) >> 12;
      *prednum += ((predictor->point[*prednum].x != 0) || (predictor->point[*prednum].y != 0));
      
      //Up_Left
      if (block_available_up)
      {
        predictor->point[*prednum].x = (mvScale * col_mv[o_block_y - 1][o_block_x - 1][0] + 2048) >> 12;
        predictor->point[*prednum].y = (mvScale * col_mv[o_block_y - 1][o_block_x - 1][1] + 2048) >> 12;
        *prednum += ((predictor->point[*prednum].x != 0) || (predictor->point[*prednum].y != 0));;
      }
      //Down_Left
      if (block_available_below)
      {
        predictor->point[*prednum].x = (mvScale * col_mv[o_block_y + blockshape_y][o_block_x - 1][0] + 2048) >> 12;
        predictor->point[*prednum].y = (mvScale * col_mv[o_block_y + blockshape_y][o_block_x - 1][1] + 2048) >> 12;
        *prednum += ((predictor->point[*prednum].x != 0) || (predictor->point[*prednum].y != 0));
      }
    }
    // Up
    if (block_available_up)
    {
      predictor->point[*prednum].x = (mvScale * col_mv[o_block_y - 1][o_block_x][0] + 2048) >> 12;
      predictor->point[*prednum].y = (mvScale * col_mv[o_block_y - 1][o_block_x][1] + 2048) >> 12;
      *prednum += ((predictor->point[*prednum].x != 0) || (predictor->point[*prednum].y != 0));
    }
    
    // Up - Right
    if (block_available_right)
    {
      predictor->point[*prednum].x = (mvScale * col_mv[o_block_y][o_block_x + blockshape_x][0] + 2048) >> 12;
      predictor->point[*prednum].y = (mvScale * col_mv[o_block_y][o_block_x + blockshape_x][1] + 2048) >> 12;
      *prednum += ((predictor->point[*prednum].x != 0) || (predictor->point[*prednum].y != 0));
      
      if (block_available_up)
      {
        predictor->point[*prednum].x = (mvScale * col_mv[o_block_y - 1][o_block_x + blockshape_x][0] + 2048) >> 12;

⌨️ 快捷键说明

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