vp9_encodeframe.c 71.3 KB
Newer Older
  if (mbmi->ref_frame[0] == INTRA_FRAME) {
    vp9_encode_intra_block_y(cm, x, (bsize < BLOCK_SIZE_SB8X8) ?
                                    BLOCK_SIZE_SB8X8 : bsize);
    vp9_encode_intra_block_uv(cm, x, (bsize < BLOCK_SIZE_SB8X8) ?
                                     BLOCK_SIZE_SB8X8 : bsize);
    if (output_enabled)
      sum_intra_stats(cpi, x);
    int idx = cm->ref_frame_map[get_ref_frame_idx(cpi, mbmi->ref_frame[0])];
    YV12_BUFFER_CONFIG *ref_fb = &cm->yv12_fb[idx];
    YV12_BUFFER_CONFIG *second_ref_fb = NULL;
    if (mbmi->ref_frame[1] > 0) {
      idx = cm->ref_frame_map[get_ref_frame_idx(cpi, mbmi->ref_frame[1])];
      second_ref_fb = &cm->yv12_fb[idx];
    }

    assert(cm->frame_type != KEY_FRAME);

    setup_pre_planes(xd, ref_fb, second_ref_fb,
                     mi_row, mi_col, xd->scale_factor, xd->scale_factor_uv);
    vp9_build_inter_predictors_sb(xd, mi_row, mi_col,
                                  bsize < BLOCK_SIZE_SB8X8 ? BLOCK_SIZE_SB8X8
                                                           : bsize);
  if (xd->mode_info_context->mbmi.ref_frame[0] == INTRA_FRAME) {
    vp9_tokenize_sb(cpi, xd, t, !output_enabled,
                    (bsize < BLOCK_SIZE_SB8X8) ? BLOCK_SIZE_SB8X8 : bsize);
  } else if (!x->skip) {
    vp9_encode_sb(cm, x, (bsize < BLOCK_SIZE_SB8X8) ? BLOCK_SIZE_SB8X8 : bsize);
    vp9_tokenize_sb(cpi, xd, t, !output_enabled,
                    (bsize < BLOCK_SIZE_SB8X8) ? BLOCK_SIZE_SB8X8 : bsize);
  } else {
    // FIXME(rbultje): not tile-aware (mi - 1)
    int mb_skip_context =
        (mi - 1)->mbmi.mb_skip_coeff + (mi - mis)->mbmi.mb_skip_coeff;
    mbmi->mb_skip_coeff = 1;
    if (output_enabled)
      cpi->skip_true_count[mb_skip_context]++;
    vp9_reset_sb_tokens_context(xd,
                 (bsize < BLOCK_SIZE_SB8X8) ? BLOCK_SIZE_SB8X8 : bsize);
  // copy skip flag on all mb_mode_info contexts in this SB
  // if this was a skip at this txfm size
  for (n = 1; n < bw * bh; n++) {
    const int x_idx = n & (bw - 1), y_idx = n >> bwl;
    if (mi_col + x_idx < cm->mi_cols && mi_row + y_idx < cm->mi_rows)
      mi[x_idx + y_idx * mis].mbmi.mb_skip_coeff = mi->mbmi.mb_skip_coeff;
  }

  if (output_enabled) {
Yaowu Xu's avatar
Yaowu Xu committed
    if (cm->txfm_mode == TX_MODE_SELECT &&
        mbmi->sb_type >= BLOCK_SIZE_SB8X8 &&
        !(mbmi->ref_frame[0] != INTRA_FRAME && (mbmi->mb_skip_coeff ||
          vp9_segfeature_active(xd, segment_id, SEG_LVL_SKIP)))) {
      if (bsize >= BLOCK_SIZE_SB32X32) {
        cm->fc.tx_count_32x32p[mbmi->txfm_size]++;
      } else if (bsize >= BLOCK_SIZE_MB16X16) {
        cm->fc.tx_count_16x16p[mbmi->txfm_size]++;
        cm->fc.tx_count_8x8p[mbmi->txfm_size]++;
    } else {
      int x, y;
      TX_SIZE sz = (cm->txfm_mode == TX_MODE_SELECT) ? TX_32X32 : cm->txfm_mode;
       // The new intra coding scheme requires no change of transform size
      if (mi->mbmi.ref_frame[0] != INTRA_FRAME) {
        if (sz == TX_32X32 && bsize < BLOCK_SIZE_SB32X32)
          sz = TX_16X16;
        if (sz == TX_16X16 && bsize < BLOCK_SIZE_MB16X16)
          sz = TX_8X8;
        if (sz == TX_8X8 && bsize < BLOCK_SIZE_SB8X8)
          sz = TX_4X4;
      } else if (bsize >= BLOCK_SIZE_SB8X8) {
        sz = mbmi->txfm_size;
      } else {

      for (y = 0; y < bh; y++) {
        for (x = 0; x < bw; x++) {
          if (mi_col + x < cm->mi_cols && mi_row + y < cm->mi_rows) {
            mi[mis * y + x].mbmi.txfm_size = sz;
          }
        }
      }
Ronald S. Bultje's avatar
Ronald S. Bultje committed
}