summaryrefslogtreecommitdiff
path: root/vp10/decoder/decodemv.c
diff options
context:
space:
mode:
authorHui Su <huisu@google.com>2015-10-13 17:34:27 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2015-10-13 17:34:27 +0000
commitb9e31b51639b9a903d311a2892bbecd0e77e80aa (patch)
treee9b651ff296593576737b6141cf0057994d7dc52 /vp10/decoder/decodemv.c
parent00170953b1b9920a92717097b3606281b5fe3f08 (diff)
parent5d011cb2785016de7f1cbf9a284cdd768a8a6229 (diff)
downloadlibvpx-b9e31b51639b9a903d311a2892bbecd0e77e80aa.tar
libvpx-b9e31b51639b9a903d311a2892bbecd0e77e80aa.tar.gz
libvpx-b9e31b51639b9a903d311a2892bbecd0e77e80aa.tar.bz2
libvpx-b9e31b51639b9a903d311a2892bbecd0e77e80aa.zip
Merge "VP10: Add palette mode part 1"
Diffstat (limited to 'vp10/decoder/decodemv.c')
-rw-r--r--vp10/decoder/decodemv.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/vp10/decoder/decodemv.c b/vp10/decoder/decodemv.c
index 2fb8da24b..e82ddd697 100644
--- a/vp10/decoder/decodemv.c
+++ b/vp10/decoder/decodemv.c
@@ -24,6 +24,19 @@
#include "vpx_dsp/vpx_dsp_common.h"
+static INLINE int read_uniform(vpx_reader *r, int n) {
+ int l = get_unsigned_bits(n);
+ int m = (1 << l) - n;
+ int v = vpx_read_literal(r, l-1);
+
+ assert(l != 0);
+
+ if (v < m)
+ return v;
+ else
+ return (v << 1) - m + vpx_read_literal(r, 1);
+}
+
static PREDICTION_MODE read_intra_mode(vpx_reader *r, const vpx_prob *p) {
return (PREDICTION_MODE)vpx_read_tree(r, vp10_intra_mode_tree, p);
}
@@ -196,6 +209,38 @@ static int read_skip(VP10_COMMON *cm, const MACROBLOCKD *xd,
}
}
+static void read_palette_mode_info(VP10_COMMON *const cm,
+ MACROBLOCKD *const xd,
+ vpx_reader *r) {
+ MODE_INFO *const mi = xd->mi[0];
+ MB_MODE_INFO *const mbmi = &mi->mbmi;
+ const MODE_INFO *above_mi = xd->above_mi;
+ const MODE_INFO *left_mi = xd->left_mi;
+ const BLOCK_SIZE bsize = mbmi->sb_type;
+ int i, palette_ctx = 0;
+
+ if (above_mi)
+ palette_ctx += (above_mi->mbmi.palette_mode_info.palette_size[0] > 0);
+ if (left_mi)
+ palette_ctx += (left_mi->mbmi.palette_mode_info.palette_size[0] > 0);
+ if (vpx_read(r, vp10_default_palette_y_mode_prob[bsize - BLOCK_8X8]
+ [palette_ctx])) {
+ int n;
+ PALETTE_MODE_INFO *pmi = &mbmi->palette_mode_info;
+
+ pmi->palette_size[0] =
+ vpx_read_tree(r, vp10_palette_size_tree,
+ vp10_default_palette_y_size_prob[bsize - BLOCK_8X8]) + 2;
+ n = pmi->palette_size[0];
+
+ for (i = 0; i < n; ++i)
+ pmi->palette_colors[i] = vpx_read_literal(r, cm->bit_depth);
+
+ xd->plane[0].color_index_map[0] = read_uniform(r, n);
+ assert(xd->plane[0].color_index_map[0] < n);
+ }
+}
+
static void read_intra_frame_mode_info(VP10_COMMON *const cm,
MACROBLOCKD *const xd,
int mi_row, int mi_col, vpx_reader *r) {
@@ -244,6 +289,12 @@ static void read_intra_frame_mode_info(VP10_COMMON *const cm,
}
mbmi->uv_mode = read_intra_mode(r, vp10_kf_uv_mode_prob[mbmi->mode]);
+
+ mbmi->palette_mode_info.palette_size[0] = 0;
+ mbmi->palette_mode_info.palette_size[1] = 0;
+ if (bsize >= BLOCK_8X8 && cm->allow_screen_content_tools &&
+ mbmi->mode == DC_PRED)
+ read_palette_mode_info(cm, xd, r);
}
static int read_mv_component(vpx_reader *r,
@@ -407,6 +458,9 @@ static void read_intra_block_mode_info(VP10_COMMON *const cm,
}
mbmi->uv_mode = read_intra_mode_uv(cm, xd, r, mbmi->mode);
+
+ mbmi->palette_mode_info.palette_size[0] = 0;
+ mbmi->palette_mode_info.palette_size[1] = 0;
}
static INLINE int is_mv_valid(const MV *mv) {