summaryrefslogtreecommitdiff
path: root/vp9/encoder
diff options
context:
space:
mode:
authorYunqing Wang <yunqingwang@google.com>2019-07-11 15:07:17 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2019-07-11 15:07:17 +0000
commit1c875f11f2efacf13ba4a00cdb98642379feaac8 (patch)
tree70af1c3734a99fa4b720995a8a9cda04ef1124b2 /vp9/encoder
parent2d63dacfa022fc04b2a9c115f215652e6a840b7e (diff)
parentbd775bfda96d8a3675859bda13cb860079b4daf4 (diff)
downloadlibvpx-1c875f11f2efacf13ba4a00cdb98642379feaac8.tar
libvpx-1c875f11f2efacf13ba4a00cdb98642379feaac8.tar.gz
libvpx-1c875f11f2efacf13ba4a00cdb98642379feaac8.tar.bz2
libvpx-1c875f11f2efacf13ba4a00cdb98642379feaac8.zip
Merge "Modify frame context index"
Diffstat (limited to 'vp9/encoder')
-rw-r--r--vp9/encoder/vp9_encoder.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c
index 904492e6e..ec7baf0a7 100644
--- a/vp9/encoder/vp9_encoder.c
+++ b/vp9/encoder/vp9_encoder.c
@@ -822,8 +822,28 @@ static void setup_frame(VP9_COMP *cpi) {
// layer ARF case as well.
if (cpi->multi_layer_arf && !cpi->use_svc) {
GF_GROUP *const gf_group = &cpi->twopass.gf_group;
- cm->frame_context_idx = clamp(gf_group->layer_depth[gf_group->index] - 1, 0,
- FRAME_CONTEXTS - 1);
+ const int gf_group_index = gf_group->index;
+ const int boost_frame =
+ !cpi->rc.is_src_frame_alt_ref &&
+ (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame);
+
+ // frame_context_idx Frame Type
+ // 0 Intra only frame, base layer ARF
+ // 1 ARFs with layer depth = 2,3
+ // 2 ARFs with layer depth > 3
+ // 3 Non-boosted frames
+ if (frame_is_intra_only(cm)) {
+ cm->frame_context_idx = 0;
+ } else if (boost_frame) {
+ if (gf_group->rf_level[gf_group_index] == GF_ARF_STD)
+ cm->frame_context_idx = 0;
+ else if (gf_group->layer_depth[gf_group_index] <= 3)
+ cm->frame_context_idx = 1;
+ else
+ cm->frame_context_idx = 2;
+ } else {
+ cm->frame_context_idx = 3;
+ }
}
if (cm->frame_type == KEY_FRAME) {