diff options
author | Dmitry Kovalev <dkovalev@google.com> | 2013-04-25 10:17:34 -0700 |
---|---|---|
committer | Gerrit Code Review <gerrit@gerrit.golo.chromium.org> | 2013-04-25 10:17:34 -0700 |
commit | 22c6ce03fa9aefc5fb0d4309bd568502b2a264a2 (patch) | |
tree | 54ad017f17e9773872588d228bfa331a5962d150 /vp9 | |
parent | b42b41c8566f1aa14aa94b63a6d8b6be4ca2bcff (diff) | |
parent | 994c79cccfd25e3a8482b9df556510a1a147a88e (diff) | |
download | libvpx-22c6ce03fa9aefc5fb0d4309bd568502b2a264a2.tar libvpx-22c6ce03fa9aefc5fb0d4309bd568502b2a264a2.tar.gz libvpx-22c6ce03fa9aefc5fb0d4309bd568502b2a264a2.tar.bz2 libvpx-22c6ce03fa9aefc5fb0d4309bd568502b2a264a2.zip |
Merge "Handling frame references and scale factors in one for loop." into experimental
Diffstat (limited to 'vp9')
-rw-r--r-- | vp9/common/vp9_onyxc_int.h | 12 | ||||
-rw-r--r-- | vp9/decoder/vp9_decodframe.c | 34 |
2 files changed, 21 insertions, 25 deletions
diff --git a/vp9/common/vp9_onyxc_int.h b/vp9/common/vp9_onyxc_int.h index eea0894c4..839d5a82c 100644 --- a/vp9/common/vp9_onyxc_int.h +++ b/vp9/common/vp9_onyxc_int.h @@ -181,12 +181,14 @@ typedef struct VP9Common { int fb_idx_ref_cnt[NUM_YV12_BUFFERS]; /* reference counts */ int ref_frame_map[NUM_REF_FRAMES]; /* maps fb_idx to reference slot */ - /* TODO(jkoleszar): could expand active_ref_idx to 4, with 0 as intra, and - * roll new_fb_idx into it. - */ - int active_ref_idx[3]; /* each frame can reference 3 buffers */ + // TODO(jkoleszar): could expand active_ref_idx to 4, with 0 as intra, and + // roll new_fb_idx into it. + + // Each frame can reference ALLOWED_REFS_PER_FRAME buffers + int active_ref_idx[ALLOWED_REFS_PER_FRAME]; + struct scale_factors active_ref_scale[ALLOWED_REFS_PER_FRAME]; int new_fb_idx; - struct scale_factors active_ref_scale[3]; + YV12_BUFFER_CONFIG post_proc_buffer; YV12_BUFFER_CONFIG temp_scale_frame; diff --git a/vp9/decoder/vp9_decodframe.c b/vp9/decoder/vp9_decodframe.c index 44872a5d4..c196dd59f 100644 --- a/vp9/decoder/vp9_decodframe.c +++ b/vp9/decoder/vp9_decodframe.c @@ -1479,10 +1479,18 @@ int vp9_decode_frame(VP9D_COMP *pbi, const uint8_t **p_data_end) { // Should the GF or ARF be updated from the current frame pbi->refresh_frame_flags = vp9_read_literal(&header_bc, NUM_REF_FRAMES); - // Select active reference frames + // Select active reference frames and calculate scaling factors for (i = 0; i < ALLOWED_REFS_PER_FRAME; ++i) { - int ref_frame_num = vp9_read_literal(&header_bc, NUM_REF_FRAMES_LG2); - pc->active_ref_idx[i] = pc->ref_frame_map[ref_frame_num]; + const int ref = vp9_read_literal(&header_bc, NUM_REF_FRAMES_LG2); + const int mapped_ref = pc->ref_frame_map[ref]; + YV12_BUFFER_CONFIG *const fb = &pc->yv12_fb[mapped_ref]; + struct scale_factors *const sf = &pc->active_ref_scale[i]; + + pc->active_ref_idx[i] = mapped_ref; + if (mapped_ref >= NUM_YV12_BUFFERS) + memset(sf, 0, sizeof(*sf)); + else + vp9_setup_scale_factors_for_frame(sf, fb, pc->width, pc->height); } pc->ref_frame_sign_bias[GOLDEN_FRAME] = vp9_read_bit(&header_bc); @@ -1494,17 +1502,6 @@ int vp9_decode_frame(VP9D_COMP *pbi, const uint8_t **p_data_end) { pc->use_interintra = vp9_read_bit(&header_bc); #endif - // Calculate scaling factors for each of the 3 available references - for (i = 0; i < ALLOWED_REFS_PER_FRAME; ++i) { - const int idx = pc->active_ref_idx[i]; - struct scale_factors *sf = &pc->active_ref_scale[i]; - if (idx >= NUM_YV12_BUFFERS) - memset(sf, 0, sizeof(*sf)); - else - vp9_setup_scale_factors_for_frame(sf, &pc->yv12_fb[idx], - pc->width, pc->height); - } - // To enable choice of different interpolation filters vp9_setup_interp_filters(xd, pc->mcomp_filter_type, pc); } @@ -1518,8 +1515,7 @@ int vp9_decode_frame(VP9D_COMP *pbi, const uint8_t **p_data_end) { } pc->frame_context_idx = vp9_read_literal(&header_bc, NUM_FRAME_CONTEXTS_LG2); - vpx_memcpy(&pc->fc, &pc->frame_contexts[pc->frame_context_idx], - sizeof(pc->fc)); + pc->fc = pc->frame_contexts[pc->frame_context_idx]; setup_segmentation(pc, xd, &header_bc); @@ -1607,10 +1603,8 @@ int vp9_decode_frame(VP9D_COMP *pbi, const uint8_t **p_data_end) { } #endif - if (pc->refresh_entropy_probs) { - vpx_memcpy(&pc->frame_contexts[pc->frame_context_idx], &pc->fc, - sizeof(pc->fc)); - } + if (pc->refresh_entropy_probs) + pc->frame_contexts[pc->frame_context_idx] = pc->fc; *p_data_end = vp9_reader_find_end(&residual_bc); return 0; |