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

📄 h264.c

📁 This the source release kit for the following system configuration(s): - AMD Alchemy(TM) DBAu1200(
💻 C
📖 第 1 页 / 共 5 页
字号:
                *(uint32_t*)h->mvd_cache [list][30]= 0;

                if (h->slice_type == B_TYPE){
                    fill_rectangle(&h->direct_cache[12], 4, 4, 8, 0, 1);

                    if (IS_DIRECT(top_type)){
                        *(uint32_t*)&h->direct_cache[12 - 1*8]= 0x01010101;
                    }else if (IS_8X8(top_type)){
                        int b8_xy = h->mb2b8_xy[top_xy] + h->b8_stride;
                        h->direct_cache[12 + 0 - 1*8]= h->direct_table[b8_xy];
                        h->direct_cache[12 + 2 - 1*8]= h->direct_table[b8_xy + 1];
                    }else{
                        *(uint32_t*)&h->direct_cache[12 - 1*8]= 0;
                    }

                    if (IS_DIRECT(left_type[0]))
                        h->direct_cache[12 - 1 + 0*8]= 1;
                    else if (IS_8X8(left_type[0]))
                        h->direct_cache[12 - 1 + 0*8]= h->direct_table[h->mb2b8_xy[left_xy[0]] + 1 + h->b8_stride*(left_block[0]>>1)];
                    else
                        h->direct_cache[12 - 1 + 0*8]= 0;

                    if (IS_DIRECT(left_type[1]))
                        h->direct_cache[12 - 1 + 2*8]= 1;
                    else if (IS_8X8(left_type[1]))
                        h->direct_cache[12 - 1 + 2*8]= h->direct_table[h->mb2b8_xy[left_xy[1]] + 1 + h->b8_stride*(left_block[2]>>1)];
                    else
                        h->direct_cache[12 - 1 + 2*8]= 0;
                }
            }

            if (FRAME_MBAFF){
#define MAP_MVS\
                    MAP_F2F(12 - 1 - 1*8, topleft_type)\
                    MAP_F2F(12 + 0 - 1*8, top_type)\
                    MAP_F2F(12 + 1 - 1*8, top_type)\
                    MAP_F2F(12 + 2 - 1*8, top_type)\
                    MAP_F2F(12 + 3 - 1*8, top_type)\
                    MAP_F2F(12 + 4 - 1*8, topright_type)\
                    MAP_F2F(12 - 1 + 0*8, left_type[0])\
                    MAP_F2F(12 - 1 + 1*8, left_type[0])\
                    MAP_F2F(12 - 1 + 2*8, left_type[1])\
                    MAP_F2F(12 - 1 + 3*8, left_type[1])
                if (MB_FIELD){
#define MAP_F2F(idx, mb_type)\
                    if (!IS_INTERLACED(mb_type) && h->ref_cache[list][idx] >= 0){\
                        h->ref_cache[list][idx] <<= 1;\
                        h->mv_cache[list][idx][1] >>= 1;\
                        h->mvd_cache[list][idx][1] >>= 1;\
                    }
                    MAP_MVS
#undef MAP_F2F
                }else{
#define MAP_F2F(idx, mb_type)\
                    if (IS_INTERLACED(mb_type) && h->ref_cache[list][idx] >= 0){\
                        h->ref_cache[list][idx] >>= 1;\
                        h->mv_cache[list][idx][1] <<= 1;\
                        h->mvd_cache[list][idx][1] <<= 1;\
                    }
                    MAP_MVS
#undef MAP_F2F
                }
            }
        }
    }
#endif

    h->neighbor_transform_size= !!IS_8x8DCT(top_type) + !!IS_8x8DCT(left_type[0]);
}

#ifdef USE_ASM_VERSION
  extern void fill_caches(H264Context *h, int mb_type, int for_deblock);
#else
void fill_caches(H264Context *h, int mb_type, int for_deblock)
{
  MpegEncContext * const s = &h->s;
  const int mb_xy= s->mb_x + s->mb_y*s->mb_stride;
  int topleft_xy, top_xy, topright_xy, left_xy[2];
  int topleft_type, top_type, topright_type, left_type[2];
  int left_block[8];
  int i;

  if (FRAME_MBAFF)
  {
    fill_caches_interlaced(h, mb_type, for_deblock);
    return;
  }

  //FIXME deblocking could skip the intra and nnz parts.
  if (for_deblock && (h->slice_num == 1 || h->slice_table[mb_xy] == h->slice_table[mb_xy-s->mb_stride]))
    return;

  //wow what a mess, why didn't they simplify the interlacing&intra stuff, i can't imagine that these complex rules are worth it
  top_xy   = mb_xy  - s->mb_stride;
  topleft_xy = top_xy - 1;
  topright_xy= top_xy + 1;
  left_xy[1] = left_xy[0] = mb_xy-1;
  left_block[0]= 0;
  left_block[1]= 1;
  left_block[2]= 2;
  left_block[3]= 3;
  left_block[4]= 7;
  left_block[5]= 10;
  left_block[6]= 8;
  left_block[7]= 11;

  h->top_mb_xy = top_xy;
  h->left_mb_xy[0] = left_xy[0];
  h->left_mb_xy[1] = left_xy[1];
  if (for_deblock)
  {
    topleft_type = 0;
    topright_type = 0;
    top_type   = h->slice_table[top_xy   ] < 255 ? s->current_picture.mb_type[top_xy]   : 0;
    left_type[0] = h->slice_table[left_xy[0] ] < 255 ? s->current_picture.mb_type[left_xy[0]] : 0;
    left_type[1] = h->slice_table[left_xy[1] ] < 255 ? s->current_picture.mb_type[left_xy[1]] : 0;
  } 
  else
  {
    topleft_type = h->slice_table[topleft_xy ] == h->slice_num ? s->current_picture.mb_type[topleft_xy] : 0;
    top_type   = h->slice_table[top_xy   ] == h->slice_num ? s->current_picture.mb_type[top_xy]   : 0;
    topright_type= h->slice_table[topright_xy] == h->slice_num ? s->current_picture.mb_type[topright_xy]: 0;
    left_type[0] = h->slice_table[left_xy[0] ] == h->slice_num ? s->current_picture.mb_type[left_xy[0]] : 0;
    left_type[1] = h->slice_table[left_xy[1] ] == h->slice_num ? s->current_picture.mb_type[left_xy[1]] : 0;
  }

  if (IS_INTRA(mb_type))
  {
    h->topleft_samples_available=
    h->top_samples_available=
    h->left_samples_available= 0xFFFF;
    h->topright_samples_available= 0xEEEA;

    if (!IS_INTRA(top_type) && (top_type==0 || h->pps.constrained_intra_pred))
    {
      h->topleft_samples_available= 0xB3FF;
      h->top_samples_available= 0x33FF;
      h->topright_samples_available= 0x26EA;
    }
    for (i=0; i<2; i++)
    {
      if (!IS_INTRA(left_type[i]) && (left_type[i]==0 || h->pps.constrained_intra_pred))
      {
        h->topleft_samples_available&= 0xDF5F;
        h->left_samples_available&= 0x5F5F;
      }
    }

    if (!IS_INTRA(topleft_type) && (topleft_type==0 || h->pps.constrained_intra_pred))
      h->topleft_samples_available&= 0x7FFF;

    if (!IS_INTRA(topright_type) && (topright_type==0 || h->pps.constrained_intra_pred))
      h->topright_samples_available&= 0xFBFF;

    if (IS_INTRA4x4(mb_type))
    {
      if (IS_INTRA4x4(top_type))
      {
        h->intra4x4_pred_mode_cache[4]= h->intra4x4_pred_mode[top_xy][4];
        h->intra4x4_pred_mode_cache[5]= h->intra4x4_pred_mode[top_xy][5];
        h->intra4x4_pred_mode_cache[6]= h->intra4x4_pred_mode[top_xy][6];
        h->intra4x4_pred_mode_cache[7]= h->intra4x4_pred_mode[top_xy][3];
      }
      else
      {
        int pred;
        if (!top_type || (IS_INTER(top_type) && h->pps.constrained_intra_pred))
          pred= -1;
        else
        {
          pred= 2;
        }
        h->intra4x4_pred_mode_cache[4]=
        h->intra4x4_pred_mode_cache[5]=
        h->intra4x4_pred_mode_cache[6]=
        h->intra4x4_pred_mode_cache[7]= pred;
      }
      for (i=0; i<2; i++)
      {
        if (IS_INTRA4x4(left_type[i]))
        {
          h->intra4x4_pred_mode_cache[3+8*1 + (i<<4)]= h->intra4x4_pred_mode[left_xy[i]][left_block[0+(i<<1)]];
          h->intra4x4_pred_mode_cache[3+8*2 + (i<<4)]= h->intra4x4_pred_mode[left_xy[i]][left_block[1+(i<<1)]];
        }
        else
        {
          int pred;
          if (!left_type[i] || (IS_INTER(left_type[i]) && h->pps.constrained_intra_pred))
            pred= -1;
          else{
            pred= 2;
          }
          h->intra4x4_pred_mode_cache[3+8*1 + (i<<4)]=
          h->intra4x4_pred_mode_cache[3+8*2 + (i<<4)]= pred;
        }
      }
    }
  }


/*
0 . T T. T T T T
1 L . .L . . . .
2 L . .L . . . .
3 . T TL . . . .
4 L . .L . . . .
5 L . .. . . . .
*/
//FIXME constraint_intra_pred & partitioning & nnz (lets hope this is just a typo in the spec)
  if (top_type)
  {
    h->non_zero_count_cache[4]= h->non_zero_count[top_xy][4];
    h->non_zero_count_cache[5]= h->non_zero_count[top_xy][5];
    h->non_zero_count_cache[6]= h->non_zero_count[top_xy][6];
    h->non_zero_count_cache[7]= h->non_zero_count[top_xy][3];

    h->non_zero_count_cache[1]= h->non_zero_count[top_xy][9];
    h->non_zero_count_cache[2]= h->non_zero_count[top_xy][8];

    h->non_zero_count_cache[1+8*3]= h->non_zero_count[top_xy][12];
    h->non_zero_count_cache[2+8*3]= h->non_zero_count[top_xy][11];

  }
  else
  {
    h->non_zero_count_cache[4]=
    h->non_zero_count_cache[5]=
    h->non_zero_count_cache[6]=
    h->non_zero_count_cache[7]=

    h->non_zero_count_cache[1]=
    h->non_zero_count_cache[2]=

    h->non_zero_count_cache[1+8*3]=
    h->non_zero_count_cache[2+8*3]= h->pps.cabac && !IS_INTRA(mb_type) ? 0 : 64;

  }

  for (i=0; i<2; i++) 
  {
    if (left_type[i])
    {
      h->non_zero_count_cache[3+8*1 + (i<<4)]= h->non_zero_count[left_xy[i]][left_block[0+(i<<1)]];
      h->non_zero_count_cache[3+8*2 + (i<<4)]= h->non_zero_count[left_xy[i]][left_block[1+(i<<1)]];
      h->non_zero_count_cache[0+8*1 + (i<<3)]= h->non_zero_count[left_xy[i]][left_block[4+(i<<1)]];
      h->non_zero_count_cache[0+8*4 + (i<<3)]= h->non_zero_count[left_xy[i]][left_block[5+(i<<1)]];
    }
    else
    {
      h->non_zero_count_cache[3+8*1 + (i<<4)]=
      h->non_zero_count_cache[3+8*2 + (i<<4)]=
      h->non_zero_count_cache[0+8*1 + (i<<3)]=
      h->non_zero_count_cache[0+8*4 + (i<<3)]= h->pps.cabac && !IS_INTRA(mb_type) ? 0 : 64;
    }
  }

  if ( h->pps.cabac ) 
  {
    // top_cbp
    if (top_type) 
    {
      h->top_cbp = h->cbp_table[top_xy];
    } 
    else if (IS_INTRA(mb_type)) 
    {
      h->top_cbp = 0x1C0;
    } 
    else 
    {
      h->top_cbp = 0;
    }
    // left_cbp
    if (left_type[0]) 
    {
      h->left_cbp = h->cbp_table[left_xy[0]] & 0x1f0;
    } 
    else if (IS_INTRA(mb_type)) 
    {
      h->left_cbp = 0x1C0;
    } 
    else 
    {
      h->left_cbp = 0;
    }
    if (left_type[0]) 
    {
      h->left_cbp |= ((h->cbp_table[left_xy[0]]>>((left_block[0]&(~1))+1))&0x1) << 1;
    }
    if (left_type[1]) 
    {
      h->left_cbp |= ((h->cbp_table[left_xy[1]]>>((left_block[2]&(~1))+1))&0x1) << 3;
    }
  }

  if (IS_INTER(mb_type) || IS_DIRECT(mb_type))
  {
    int list;
    for (list=0; list<1+(h->slice_type==B_TYPE); list++)
    {
      if (!USES_LIST(mb_type, list) && !IS_DIRECT(mb_type) && !h->deblocking_filter)
      {
        /*if (!h->mv_cache_clean[list])
        {
          memset(h->mv_cache [list],  0, 8*5*2*sizeof(int16_t)); //FIXME clean only input? clean at all?
          memset(h->ref_cache[list], PART_NOT_AVAILABLE, 8*5*sizeof(int8_t));
          h->mv_cache_clean[list]= 1;
        }*/
        continue;
      }
      h->mv_cache_clean[list]= 0;

      if (USES_LIST(top_type, list))
      {
        const int b_xy= h->mb2b_xy[top_xy] + 3*h->b_stride;
        const int b8_xy= h->mb2b8_xy[top_xy] + h->b8_stride;
        *(uint32_t*)h->mv_cache[list][12 + 0 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 0];
        *(uint32_t*)h->mv_cache[list][12 + 1 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 1];
        *(uint32_t*)h->mv_cache[list][12 + 2 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 2];
        *(uint32_t*)h->mv_cache[list][12 + 3 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 3];
        h->ref_cache[list][12 + 0 - 1*8]=
        h->ref_cache[list][12 + 1 - 1*8]= s->current_picture.ref_index[list][b8_xy + 0];
        h->ref_cache[list][12 + 2 - 1*8]=
        h->ref_cache[list][12 + 3 - 1*8]= s->current_picture.ref_index[list][b8_xy + 1];
      }
      else
      {
        *(uint32_t*)h->mv_cache [list][12 + 0 - 1*8]=
        *(uint32_t*)h->mv_cache [list][12 + 1 - 1*8]=
        *(uint32_t*)h->mv_cache [list][12 + 2 - 1*8]=
        *(uint32_t*)h->mv_cach

⌨️ 快捷键说明

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