diff options
author | Hui Su <huisu@google.com> | 2015-10-13 17:34:27 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2015-10-13 17:34:27 +0000 |
commit | b9e31b51639b9a903d311a2892bbecd0e77e80aa (patch) | |
tree | e9b651ff296593576737b6141cf0057994d7dc52 /vp10/decoder/decodemv.c | |
parent | 00170953b1b9920a92717097b3606281b5fe3f08 (diff) | |
parent | 5d011cb2785016de7f1cbf9a284cdd768a8a6229 (diff) | |
download | libvpx-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.c | 54 |
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) { |