diff options
Diffstat (limited to 'vp9/decoder/vp9_decodeframe.c')
-rw-r--r-- | vp9/decoder/vp9_decodeframe.c | 41 |
1 files changed, 22 insertions, 19 deletions
diff --git a/vp9/decoder/vp9_decodeframe.c b/vp9/decoder/vp9_decodeframe.c index de6dbdcc0..59faccdf7 100644 --- a/vp9/decoder/vp9_decodeframe.c +++ b/vp9/decoder/vp9_decodeframe.c @@ -378,18 +378,13 @@ static void set_offsets(VP9_COMMON *const cm, MACROBLOCKD *const xd, static void set_ref(VP9_COMMON *const cm, MACROBLOCKD *const xd, int idx, int mi_row, int mi_col) { MB_MODE_INFO *const mbmi = &xd->mi_8x8[0]->mbmi; - const int ref = mbmi->ref_frame[idx] - LAST_FRAME; - const YV12_BUFFER_CONFIG *cfg = get_frame_ref_buffer(cm, ref); - const struct scale_factors *sf = &cm->active_ref_scale[ref]; - - xd->ref_buf[idx] = cfg; - if (!vp9_is_valid_scale(sf)) + RefBuffer *ref_buffer = &cm->frame_refs[mbmi->ref_frame[idx] - LAST_FRAME]; + xd->block_refs[idx] = ref_buffer; + if (!vp9_is_valid_scale(&ref_buffer->sf)) vpx_internal_error(&cm->error, VPX_CODEC_UNSUP_BITSTREAM, "Invalid scale factors"); - - xd->scale_factors[idx] = sf; - setup_pre_planes(xd, idx, cfg, mi_row, mi_col, xd->scale_factors[idx]); - xd->corrupted |= cfg->corrupted; + setup_pre_planes(xd, idx, ref_buffer->buf, mi_row, mi_col, &ref_buffer->sf); + xd->corrupted |= ref_buffer->buf->corrupted; } static void decode_modes_b(VP9_COMMON *const cm, MACROBLOCKD *const xd, @@ -737,9 +732,9 @@ static void setup_frame_size_with_refs(VP9D_COMP *pbi, int found = 0, i; for (i = 0; i < REFS_PER_FRAME; ++i) { if (vp9_rb_read_bit(rb)) { - YV12_BUFFER_CONFIG *const cfg = get_frame_ref_buffer(cm, i); - width = cfg->y_crop_width; - height = cfg->y_crop_height; + YV12_BUFFER_CONFIG *const buf = cm->frame_refs[i].buf; + width = buf->y_crop_width; + height = buf->y_crop_height; found = 1; break; } @@ -1171,8 +1166,10 @@ static size_t read_uncompressed_header(VP9D_COMP *pbi, pbi->refresh_frame_flags = (1 << REF_FRAMES) - 1; - for (i = 0; i < REFS_PER_FRAME; ++i) - cm->active_ref_idx[i] = cm->new_fb_idx; + for (i = 0; i < REFS_PER_FRAME; ++i) { + cm->frame_refs[i].idx = cm->new_fb_idx; + cm->frame_refs[i].buf = get_frame_new_buffer(cm); + } setup_frame_size(pbi, rb); } else { @@ -1191,7 +1188,9 @@ static size_t read_uncompressed_header(VP9D_COMP *pbi, for (i = 0; i < REFS_PER_FRAME; ++i) { const int ref = vp9_rb_read_literal(rb, REF_FRAMES_LOG2); - cm->active_ref_idx[i] = cm->ref_frame_map[ref]; + const int idx = cm->ref_frame_map[ref]; + cm->frame_refs[i].idx = idx; + cm->frame_refs[i].buf = &cm->yv12_fb[idx]; cm->ref_frame_sign_bias[LAST_FRAME + i] = vp9_rb_read_bit(rb); } @@ -1201,9 +1200,13 @@ static size_t read_uncompressed_header(VP9D_COMP *pbi, cm->mcomp_filter_type = read_interp_filter_type(rb); for (i = 0; i < REFS_PER_FRAME; ++i) { - vp9_setup_scale_factors(cm, i); - if (vp9_is_scaled(&cm->active_ref_scale[i])) - vp9_extend_frame_borders(&cm->yv12_fb[cm->active_ref_idx[i]], + RefBuffer *const ref_buf = &cm->frame_refs[i]; + vp9_setup_scale_factors_for_frame(&ref_buf->sf, + ref_buf->buf->y_crop_width, + ref_buf->buf->y_crop_height, + cm->width, cm->height); + if (vp9_is_scaled(&ref_buf->sf)) + vp9_extend_frame_borders(ref_buf->buf, cm->subsampling_x, cm->subsampling_y); } } |