summaryrefslogtreecommitdiff
path: root/vp9
diff options
context:
space:
mode:
authorTero Rintaluoma <teror@google.com>2013-12-05 11:42:47 +0200
committerTero Rintaluoma <teror@google.com>2013-12-05 12:10:10 +0200
commit047b0b01bbe8668c02438532520ea3c92b87f2f3 (patch)
tree9e00f1c10d34b34c0bb2ccdab6b4bf77759be63e /vp9
parentecc0a1ece8b803cb83c12ae3028d33feaf030b9a (diff)
downloadlibvpx-047b0b01bbe8668c02438532520ea3c92b87f2f3.tar
libvpx-047b0b01bbe8668c02438532520ea3c92b87f2f3.tar.gz
libvpx-047b0b01bbe8668c02438532520ea3c92b87f2f3.tar.bz2
libvpx-047b0b01bbe8668c02438532520ea3c92b87f2f3.zip
Fix show existing frame
- Disable mode info update in case where current frame is coded as "show existing frame". - Should fix issue 676. Change-Id: Ibee681850eb307f982da6528d3e31cb94f881c08
Diffstat (limited to 'vp9')
-rw-r--r--vp9/common/vp9_onyxc_int.h1
-rw-r--r--vp9/decoder/vp9_decodeframe.c3
-rw-r--r--vp9/decoder/vp9_onyxd_if.c36
3 files changed, 22 insertions, 18 deletions
diff --git a/vp9/common/vp9_onyxc_int.h b/vp9/common/vp9_onyxc_int.h
index 751accf02..b28d45699 100644
--- a/vp9/common/vp9_onyxc_int.h
+++ b/vp9/common/vp9_onyxc_int.h
@@ -133,6 +133,7 @@ typedef struct VP9Common {
int show_frame;
int last_show_frame;
+ int show_existing_frame;
// Flag signaling that the frame is encoded using only INTRA modes.
int intra_only;
diff --git a/vp9/decoder/vp9_decodeframe.c b/vp9/decoder/vp9_decodeframe.c
index 9b6740eea..9d82cacd7 100644
--- a/vp9/decoder/vp9_decodeframe.c
+++ b/vp9/decoder/vp9_decodeframe.c
@@ -1067,7 +1067,8 @@ static size_t read_uncompressed_header(VP9D_COMP *pbi,
cm->version = vp9_rb_read_bit(rb);
RESERVED;
- if (vp9_rb_read_bit(rb)) {
+ cm->show_existing_frame = vp9_rb_read_bit(rb);
+ if (cm->show_existing_frame) {
// show an existing frame directly
int frame_to_show = cm->ref_frame_map[vp9_rb_read_literal(rb, 3)];
ref_cnt_fb(cm->fb_idx_ref_cnt, &cm->new_fb_idx, frame_to_show);
diff --git a/vp9/decoder/vp9_onyxd_if.c b/vp9/decoder/vp9_onyxd_if.c
index 740ad72cb..b06a50f9c 100644
--- a/vp9/decoder/vp9_onyxd_if.c
+++ b/vp9/decoder/vp9_onyxd_if.c
@@ -392,23 +392,25 @@ int vp9_receive_compressed_data(VP9D_PTR ptr,
cm->last_show_frame = cm->show_frame;
if (cm->show_frame) {
- // current mip will be the prev_mip for the next frame
- MODE_INFO *temp = cm->prev_mip;
- MODE_INFO **temp2 = cm->prev_mi_grid_base;
- cm->prev_mip = cm->mip;
- cm->mip = temp;
- cm->prev_mi_grid_base = cm->mi_grid_base;
- cm->mi_grid_base = temp2;
-
- // update the upper left visible macroblock ptrs
- cm->mi = cm->mip + cm->mode_info_stride + 1;
- cm->prev_mi = cm->prev_mip + cm->mode_info_stride + 1;
- cm->mi_grid_visible = cm->mi_grid_base + cm->mode_info_stride + 1;
- cm->prev_mi_grid_visible = cm->prev_mi_grid_base + cm->mode_info_stride + 1;
-
- pbi->mb.mi_8x8 = cm->mi_grid_visible;
- pbi->mb.mi_8x8[0] = cm->mi;
-
+ if (!cm->show_existing_frame) {
+ // current mip will be the prev_mip for the next frame
+ MODE_INFO *temp = cm->prev_mip;
+ MODE_INFO **temp2 = cm->prev_mi_grid_base;
+ cm->prev_mip = cm->mip;
+ cm->mip = temp;
+ cm->prev_mi_grid_base = cm->mi_grid_base;
+ cm->mi_grid_base = temp2;
+
+ // update the upper left visible macroblock ptrs
+ cm->mi = cm->mip + cm->mode_info_stride + 1;
+ cm->prev_mi = cm->prev_mip + cm->mode_info_stride + 1;
+ cm->mi_grid_visible = cm->mi_grid_base + cm->mode_info_stride + 1;
+ cm->prev_mi_grid_visible = cm->prev_mi_grid_base +
+ cm->mode_info_stride + 1;
+
+ pbi->mb.mi_8x8 = cm->mi_grid_visible;
+ pbi->mb.mi_8x8[0] = cm->mi;
+ }
cm->current_video_frame++;
}