summaryrefslogtreecommitdiff
path: root/vp9
diff options
context:
space:
mode:
authorDmitry Kovalev <dkovalev@google.com>2013-04-25 10:17:34 -0700
committerGerrit Code Review <gerrit@gerrit.golo.chromium.org>2013-04-25 10:17:34 -0700
commit22c6ce03fa9aefc5fb0d4309bd568502b2a264a2 (patch)
tree54ad017f17e9773872588d228bfa331a5962d150 /vp9
parentb42b41c8566f1aa14aa94b63a6d8b6be4ca2bcff (diff)
parent994c79cccfd25e3a8482b9df556510a1a147a88e (diff)
downloadlibvpx-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.h12
-rw-r--r--vp9/decoder/vp9_decodframe.c34
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;