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

📄 image.c

📁 此code含H.264解码需要的 lib和 src
💻 C
📖 第 1 页 / 共 5 页
字号:
//
//  if ((p->chroma_format_idc==YUV400) && input->write_uv)
//  {
//    comp_size_x[1] = comp_size_x[2] = (p->size_x >> 1);
//    comp_size_y[1] = comp_size_y[2] = (p->size_y >> 1);
//  }
//  else
//  {
//    // These could be computed once and attached to the StorablePicture structure
//    comp_size_x[1] = comp_size_x[2] = (p->size_x_cr - crop_left - crop_right); 
//    comp_size_y[1] = comp_size_y[2] = (p->size_y_cr - crop_top  - crop_bottom);
//  }
//
//  framesize_in_bytes = (((int64) comp_size_x[0] * comp_size_y[0]) + ((int64) comp_size_x[1] * comp_size_y[1] ) * 2) * symbol_size_in_bytes;
//
//  if (psnrPOC==0)// && img->psnr_number)
//    img->idr_psnr_number = img->number*img->ref_poc_gap/(input->poc_scale);
//
//  img->psnr_number=imax(img->psnr_number,img->idr_psnr_number+psnrPOC);
//
//  frame_no = img->idr_psnr_number + psnrPOC;
//
//  // KS: this buffer should actually be allocated only once, but this is still much faster than the previous version
//  buf = malloc ( comp_size_x[0] * comp_size_y[0] * symbol_size_in_bytes );
//
//  if (NULL == buf)
//  {
//    no_mem_exit("find_snr: buf");
//  }
//
//  status = lseek (p_ref, framesize_in_bytes * frame_no, SEEK_SET);
//  if (status == -1)
//  {
//    fprintf(stderr, "Error in seeking frame number: %d\n", frame_no);
//    free (buf);
//    return;
//  }
//
//  if(rgb_output)
//    lseek (p_ref, framesize_in_bytes/3, SEEK_CUR);
//
//  for (k = 0; k < ((p->chroma_format_idc != YUV400) ? 3 : 1); k++)
//  {
//
//    if(rgb_output && k == 2)
//      lseek (p_ref, -framesize_in_bytes, SEEK_CUR);
//
//    read(p_ref, buf, comp_size_x[k] * comp_size_y[k] * symbol_size_in_bytes);
//    buf2img(cur_ref[k], buf, comp_size_x[k], comp_size_y[k], symbol_size_in_bytes);
//
//    for (j=0; j < comp_size_y[k]; ++j)
//    {
//      for (i=0; i < comp_size_x[k]; ++i)
//      {
//        diff_comp[k] += iabs2(cur_comp[k][j][i] - cur_ref[k][j][i]);
//      }
//    }
//
//#if ZEROSNR
//    diff_comp[k] = max(diff_comp[k], 1);
//#endif
//    // Collecting SNR statistics
//    if (diff_comp[k]  != 0)
//      snr->snr[k]=(float)(10*log10(max_pix_value_sqd[k]*(double)((double)(comp_size_x[k])*(comp_size_y[k]) / diff_comp[k])));   
//    else
//      snr->snr[k]=0.0;
//
//    if (img->number == 0) // first
//    {
//      snr->snra[k]=snr->snr1[k]=snr->snr[k];                                                        // keep luma snr for first frame
//    }
//    else
//    {
//      snr->snra[k]=(float)(snr->snra[k]*(snr->frame_ctr)+snr->snr[k])/(snr->frame_ctr + 1); // average snr chroma for all frames
//    }
//  }
//
//   if(rgb_output)
//     lseek (p_ref, framesize_in_bytes*2/3, SEEK_CUR);
//
//  free (buf);
//
//
//  // picture error concealment
//  if(p->concealed_pic)
//  {
//      fprintf(stdout,"%04d(P)  %8d %5d %5d %7.4f %7.4f %7.4f  %s %5d\n",
//          frame_no, p->frame_poc, p->pic_num, p->qp,
//          snr->snr[0], snr->snr[1], snr->snr[2], yuv_types[p->chroma_format_idc], 0);
//
//  }
//}


/*!
 ************************************************************************
 * \brief
 *    Interpolation of 1/4 subpixel
 ************************************************************************
 */
//void get_block(int ref_frame, StorablePicture **list, int x_pos, int y_pos, struct img_par *img, int block[MB_BLOCK_SIZE][MB_BLOCK_SIZE])
//{
//
//  int dx, dy;
//  int i, j;
//  int maxold_x,maxold_y;
//  int result;
//  int pres_x, pres_y;
//
//  int tmp_res[9][9];
//  static const int COEF[6] = {    1, -5, 20, 20, -5, 1  };
//  StorablePicture *curr_ref = list[ref_frame];
//  static imgpel **cur_imgY, *cur_lineY;
//  static int jpos_m2, jpos_m1, jpos, jpos_p1, jpos_p2, jpos_p3;
//  static int ipos_m2, ipos_m1, ipos, ipos_p1, ipos_p2, ipos_p3;
//
//  if (curr_ref == no_reference_picture && img->framepoc < img->recovery_poc)
//  {
//      printf("list[ref_frame] is equal to 'no reference picture' before RAP\n");
//
//      /* fill the block with sample value 128 */
//      for (j = 0; j < BLOCK_SIZE; j++)
//        for (i = 0; i < BLOCK_SIZE; i++)
//          block[j][i] = 128;
//      return;
//  }
//  cur_imgY = curr_ref->imgY;
//  dx = x_pos&3;
//  dy = y_pos&3;
//  x_pos = (x_pos-dx)>>2;
//  y_pos = (y_pos-dy)>>2;
//
//  maxold_x = dec_picture->size_x_m1;
//  maxold_y = dec_picture->size_y_m1;
//
//  if (dec_picture->mb_field[img->current_mb_nr])
//    maxold_y = (dec_picture->size_y >> 1) - 1;
//
//  if (dx == 0 && dy == 0)
//  {  /* fullpel position */
//    for (j = 0; j < BLOCK_SIZE; j++)
//    {
//      cur_lineY = cur_imgY[iClip3(0,maxold_y,y_pos+j)];
//
//      block[j][0] = cur_lineY[iClip3(0,maxold_x,x_pos  )];
//      block[j][1] = cur_lineY[iClip3(0,maxold_x,x_pos+1)];
//      block[j][2] = cur_lineY[iClip3(0,maxold_x,x_pos+2)];
//      block[j][3] = cur_lineY[iClip3(0,maxold_x,x_pos+3)];
//    }
//  }
//  else
//  { /* other positions */
//
//    if (dy == 0)
//    { /* No vertical interpolation */
//
//      for (i = 0; i < BLOCK_SIZE; i++)
//      {
//        ipos_m2 = iClip3(0, maxold_x, x_pos + i - 2);
//        ipos_m1 = iClip3(0, maxold_x, x_pos + i - 1);
//        ipos    = iClip3(0, maxold_x, x_pos + i    );
//        ipos_p1 = iClip3(0, maxold_x, x_pos + i + 1);
//        ipos_p2 = iClip3(0, maxold_x, x_pos + i + 2);
//        ipos_p3 = iClip3(0, maxold_x, x_pos + i + 3);
//
//        for (j = 0; j < BLOCK_SIZE; j++)
//        {
//          cur_lineY = cur_imgY[iClip3(0,maxold_y,y_pos+j)];
//
//          result  = (cur_lineY[ipos_m2] + cur_lineY[ipos_p3]) * COEF[0];
//          result += (cur_lineY[ipos_m1] + cur_lineY[ipos_p2]) * COEF[1];
//          result += (cur_lineY[ipos   ] + cur_lineY[ipos_p1]) * COEF[2];
//
//          block[j][i] = iClip1(img->max_imgpel_value, ((result+16)>>5));
//        }
//      }
//
//      if ((dx&1) == 1)
//      {
//        for (j = 0; j < BLOCK_SIZE; j++)
//        {
//          cur_lineY = cur_imgY[iClip3(0,maxold_y,y_pos+j)];
//          block[j][0] = (block[j][0] + cur_lineY[iClip3(0,maxold_x,x_pos  +(dx>>1))] + 1 )>>1;
//          block[j][1] = (block[j][1] + cur_lineY[iClip3(0,maxold_x,x_pos+1+(dx>>1))] + 1 )>>1;
//          block[j][2] = (block[j][2] + cur_lineY[iClip3(0,maxold_x,x_pos+2+(dx>>1))] + 1 )>>1;
//          block[j][3] = (block[j][3] + cur_lineY[iClip3(0,maxold_x,x_pos+3+(dx>>1))] + 1 )>>1;
//        }
//      }
//    }
//    else if (dx == 0)
//    {  /* No horizontal interpolation */
//
//      for (j = 0; j < BLOCK_SIZE; j++)
//      {
//        jpos_m2 = iClip3(0, maxold_y, y_pos + j - 2);
//        jpos_m1 = iClip3(0, maxold_y, y_pos + j - 1);
//        jpos    = iClip3(0, maxold_y, y_pos + j    );
//        jpos_p1 = iClip3(0, maxold_y, y_pos + j + 1);
//        jpos_p2 = iClip3(0, maxold_y, y_pos + j + 2);
//        jpos_p3 = iClip3(0, maxold_y, y_pos + j + 3);
//        for (i = 0; i < BLOCK_SIZE; i++)
//        {
//          pres_x = iClip3(0,maxold_x,x_pos+i);
//
//          result  = (cur_imgY[jpos_m2][pres_x] + cur_imgY[jpos_p3][pres_x]) * COEF[0];
//          result += (cur_imgY[jpos_m1][pres_x] + cur_imgY[jpos_p2][pres_x]) * COEF[1];
//          result += (cur_imgY[jpos   ][pres_x] + cur_imgY[jpos_p1][pres_x]) * COEF[2];
//          block[j][i] = iClip1(img->max_imgpel_value, ((result+16)>>5));
//        }
//      }
//
//      if ((dy&1) == 1)
//      {
//        for (j = 0; j < BLOCK_SIZE; j++)
//        {
//          cur_lineY = cur_imgY[iClip3(0,maxold_y,y_pos+j+(dy>>1))];
//          block[j][0] = (block[j][0] + cur_lineY[iClip3(0,maxold_x,x_pos  )] + 1 )>>1;
//          block[j][1] = (block[j][1] + cur_lineY[iClip3(0,maxold_x,x_pos+1)] + 1 )>>1;
//          block[j][2] = (block[j][2] + cur_lineY[iClip3(0,maxold_x,x_pos+2)] + 1 )>>1;
//          block[j][3] = (block[j][3] + cur_lineY[iClip3(0,maxold_x,x_pos+3)] + 1 )>>1;
//        }
//      }
//    }
//    else if (dx == 2)
//    {  /* Vertical & horizontal interpolation */
//
//      for (i = 0; i < BLOCK_SIZE; i++)
//      {
//        ipos_m2 = iClip3(0, maxold_x, x_pos + i - 2);
//        ipos_m1 = iClip3(0, maxold_x, x_pos + i - 1);
//        ipos    = iClip3(0, maxold_x, x_pos + i    );
//        ipos_p1 = iClip3(0, maxold_x, x_pos + i + 1);
//        ipos_p2 = iClip3(0, maxold_x, x_pos + i + 2);
//        ipos_p3 = iClip3(0, maxold_x, x_pos + i + 3);
//
//        for (j = 0; j < BLOCK_SIZE + 5; j++)
//        {
//          cur_lineY = cur_imgY[iClip3(0,maxold_y,y_pos + j - 2)];
//
//          tmp_res[j][i]  = (cur_lineY[ipos_m2] + cur_lineY[ipos_p3]) * COEF[0];
//          tmp_res[j][i] += (cur_lineY[ipos_m1] + cur_lineY[ipos_p2]) * COEF[1];
//          tmp_res[j][i] += (cur_lineY[ipos   ] + cur_lineY[ipos_p1]) * COEF[2];
//        }
//      }
//
//      for (j = 0; j < BLOCK_SIZE; j++)
//      {
//        jpos_m2 = j    ;
//        jpos_m1 = j + 1;
//        jpos    = j + 2;
//        jpos_p1 = j + 3;
//        jpos_p2 = j + 4;
//        jpos_p3 = j + 5;
//
//        for (i = 0; i < BLOCK_SIZE; i++)
//        {
//          result  = (tmp_res[jpos_m2][i] + tmp_res[jpos_p3][i]) * COEF[0];
//          result += (tmp_res[jpos_m1][i] + tmp_res[jpos_p2][i]) * COEF[1];
//          result += (tmp_res[jpos   ][i] + tmp_res[jpos_p1][i]) * COEF[2];
//
//          block[j][i] = iClip1(img->max_imgpel_value, ((result+512)>>10));
//        }
//      }
//
//      if ((dy&1) == 1)
//      {
//        for (j = 0; j < BLOCK_SIZE; j++)
//        {
//          pres_y = j+2+(dy>>1);
//
//          block[j][0] = (block[j][0] + iClip1(img->max_imgpel_value, ((tmp_res[pres_y][0]+16)>>5)) +1 )>>1;
//          block[j][1] = (block[j][1] + iClip1(img->max_imgpel_value, ((tmp_res[pres_y][1]+16)>>5)) +1 )>>1;
//          block[j][2] = (block[j][2] + iClip1(img->max_imgpel_value, ((tmp_res[pres_y][2]+16)>>5)) +1 )>>1;
//          block[j][3] = (block[j][3] + iClip1(img->max_imgpel_value, ((tmp_res[pres_y][3]+16)>>5)) +1 )>>1;
//        }
//      }
//    }
//    else if (dy == 2)
//    {  /* Horizontal & vertical interpolation */
//
//      for (j = 0; j < BLOCK_SIZE; j++)
//      {
//        jpos_m2 = iClip3(0, maxold_y, y_pos + j - 2);
//        jpos_m1 = iClip3(0, maxold_y, y_pos + j - 1);
//        jpos    = iClip3(0, maxold_y, y_pos + j    );
//        jpos_p1 = iClip3(0, maxold_y, y_pos + j + 1);
//        jpos_p2 = iClip3(0, maxold_y, y_pos + j + 2);
//        jpos_p3 = iClip3(0, maxold_y, y_pos + j + 3);
//        for (i = 0; i < BLOCK_SIZE+5; i++)
//        {
//          pres_x = iClip3(0,maxold_x,x_pos+i - 2);
//          tmp_res[j][i]  = (cur_imgY[jpos_m2][pres_x] + cur_imgY[jpos_p3][pres_x])*COEF[0];
//          tmp_res[j][i] += (cur_imgY[jpos_m1][pres_x] + cur_imgY[jpos_p2][pres_x])*COEF[1];
//          tmp_res[j][i] += (cur_imgY[jpos   ][pres_x] + cur_imgY[jpos_p1][pres_x])*COEF[2];
//        }
//      }
//
//      for (j = 0; j < BLOCK_SIZE; j++)
//      {
//        for (i = 0; i < BLOCK_SIZE; i++)
//        {
//          result  = (tmp_res[j][i    ] + tmp_res[j][i + 5]) * COEF[0];
//          result += (tmp_res[j][i + 1] + tmp_res[j][i + 4]) * COEF[1];
//          result += (tmp_res[j][i + 2] + tmp_res[j][i + 3]) * COEF[2];
//          block[j][i] = iClip1(img->max_imgpel_value, ((result+512)>>10));
//        }
//      }
//
//      if ((dx&1) == 1)
//      {
//        for (j = 0; j < BLOCK_SIZE; j++)
//        {
//          block[j][0] = (block[j][0] + iClip1(img->max_imgpel_value, ((tmp_res[j][2+(dx>>1)]+16)>>5))+1)>>1;
//          block[j][1] = (block[j][1] + iClip1(img->max_imgpel_value, ((tmp_res[j][3+(dx>>1)]+16)>>5))+1)>>1;
//          block[j][2] = (block[j][2] + iClip1(img->max_imgpel_value, ((tmp_res[j][4+(dx>>1)]+16)>>5))+1)>>1;
//          block[j][3] = (block[j][3] + iClip1(img->max_imgpel_value, ((tmp_res[j][5+(dx>>1)]+16)>>5))+1)>>1;
//        }
//      }
//    }
//    else
//    {  /* Diagonal interpolation */
//
//      for (i = 0; i < BLOCK_SIZE; i++)
//      {
//        ipos_m2 = iClip3(0, maxold_x, x_pos + i - 2);
//        ipos_m1 = iClip3(0, maxold_x, x_pos + i - 1);
//        ipos    = iClip3(0, maxold_x, x_pos + i    );
//        ipos_p1 = iClip3(0, maxold_x, x_pos + i + 1);
//        ipos_p2 = iClip3(0, maxold_x, x_pos + i + 2);
//        ipos_p3 = iClip3(0, maxold_x, x_pos + i + 3);
//
//        for (j = 0; j < BLOCK_SIZE; j++)
//        {
//          cur_lineY = cur_imgY[iClip3(0,maxold_y,(dy == 1 ? y_pos+j : y_pos+j+1))];
//
//          result  = (cur_lineY[ipos_m2] + cur_lineY[ipos_p3]) * COEF[0];
//          result += (cur_lineY[ipos_m1] + cur_lineY[ipos_p2]) * COEF[1];
//          result += (cur_lineY[ipos   ] + cur_lineY[ipos_p1]) * COEF[2];
//
//          block[j][i] = iClip1(img->max_imgpel_value, ((result+16)>>5));
//        }
//      }
//
//      for (j = 0; j < BLOCK_SIZE; j++)
//      {
//        jpos_m2 = iClip3(0, maxold_y, y_pos + j - 2);
//        jpos_m1 = iClip3(0, maxold_y, y_pos + j - 1);
//        jpos    = iClip3(0, maxold_y, y_pos + j    );
//        jpos_p1 = iClip3(0, maxold_y, y_pos + j + 1);
//        jpos_p2 = iClip3(0, maxold_y, y_pos + j + 2);
//        jpos_p3 = iClip3(0, maxold_y, y_pos + j + 3);
//        for (i = 0; i < BLOCK_SIZE; i++)
//        {
//          pres_x = dx == 1 ? x_pos+i : x_pos+i+1;
//          pres_x = iClip3(0,maxold_x,pres_x);
//
//          result  = (cur_imgY[jpos_m2][pres_x] + cur_imgY[jpos_p3][pres_x]) * COEF[0];
//          result += (cur_imgY[jpos_m1][pres_x] + cur_imgY[jpos_p2][pres_x]) * COEF[1];
//          result += (cur_imgY[jpos   ][pres_x] + cur_imgY[jpos_p1][pres_x]) * COEF[2];
//
//          block[j][i] = (block[j][i] + iClip1(img->max_imgpel_value, ((result+16)>>5)) +1 ) >>1;
//        }
//      }
//    }
//  }
//}


void reorder_lists(int currSliceType, Slice * currSlice)
{

  if ((currSliceType != I_SLICE)&&(currSliceType != SI_SLICE))
  {
    if (currSlice->ref_pic_list_reordering_flag_l0)
    {
      reorder_ref_pic_list(listX[0], &listXsize[0],
                           img->num_ref_idx_l0_active - 1,
                           currSlice->reordering_of_pic_nums_idc_l0,
                           currSlice->abs_diff_pic_num_minus1_l0,
                           currSlice->long_term_pic_idx_l0);
    }
    if (no_reference_picture == listX[0][img->num_ref_idx_l0_active-1])
    {

⌨️ 快捷键说明

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