1ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/*
2ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
3ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *
4ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  Use of this source code is governed by a BSD-style license
5ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  that can be found in the LICENSE file in the root of the source
6ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  tree. An additional intellectual property rights grant can be found
7ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  in the file PATENTS.  All contributing project authors may
8ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  be found in the AUTHORS file in the root of the source tree.
9ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */
10ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
11ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifndef VP9_COMMON_VP9_SEG_COMMON_H_
12ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define VP9_COMMON_VP9_SEG_COMMON_H_
13ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
147ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#include "vpx_dsp/prob.h"
15b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
16b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifdef __cplusplus
17b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianextern "C" {
18b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif
1991037db265ecdd914a26e056cf69207b4f50924ehkuang
2091037db265ecdd914a26e056cf69207b4f50924ehkuang#define SEGMENT_DELTADATA   0
2191037db265ecdd914a26e056cf69207b4f50924ehkuang#define SEGMENT_ABSDATA     1
2291037db265ecdd914a26e056cf69207b4f50924ehkuang
2391037db265ecdd914a26e056cf69207b4f50924ehkuang#define MAX_SEGMENTS     8
2491037db265ecdd914a26e056cf69207b4f50924ehkuang#define SEG_TREE_PROBS   (MAX_SEGMENTS-1)
2591037db265ecdd914a26e056cf69207b4f50924ehkuang
2691037db265ecdd914a26e056cf69207b4f50924ehkuang#define PREDICTION_PROBS 3
2791037db265ecdd914a26e056cf69207b4f50924ehkuang
2891037db265ecdd914a26e056cf69207b4f50924ehkuang// Segment level features.
2991037db265ecdd914a26e056cf69207b4f50924ehkuangtypedef enum {
3091037db265ecdd914a26e056cf69207b4f50924ehkuang  SEG_LVL_ALT_Q = 0,               // Use alternate Quantizer ....
3191037db265ecdd914a26e056cf69207b4f50924ehkuang  SEG_LVL_ALT_LF = 1,              // Use alternate loop filter value...
3291037db265ecdd914a26e056cf69207b4f50924ehkuang  SEG_LVL_REF_FRAME = 2,           // Optional Segment reference frame
3391037db265ecdd914a26e056cf69207b4f50924ehkuang  SEG_LVL_SKIP = 3,                // Optional Segment (0,0) + skip mode
3491037db265ecdd914a26e056cf69207b4f50924ehkuang  SEG_LVL_MAX = 4                  // Number of features supported
3591037db265ecdd914a26e056cf69207b4f50924ehkuang} SEG_LVL_FEATURES;
3691037db265ecdd914a26e056cf69207b4f50924ehkuang
3791037db265ecdd914a26e056cf69207b4f50924ehkuang
3891037db265ecdd914a26e056cf69207b4f50924ehkuangstruct segmentation {
3991037db265ecdd914a26e056cf69207b4f50924ehkuang  uint8_t enabled;
4091037db265ecdd914a26e056cf69207b4f50924ehkuang  uint8_t update_map;
4191037db265ecdd914a26e056cf69207b4f50924ehkuang  uint8_t update_data;
4291037db265ecdd914a26e056cf69207b4f50924ehkuang  uint8_t abs_delta;
4391037db265ecdd914a26e056cf69207b4f50924ehkuang  uint8_t temporal_update;
4491037db265ecdd914a26e056cf69207b4f50924ehkuang
457ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  vpx_prob tree_probs[SEG_TREE_PROBS];
467ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  vpx_prob pred_probs[PREDICTION_PROBS];
4791037db265ecdd914a26e056cf69207b4f50924ehkuang
4891037db265ecdd914a26e056cf69207b4f50924ehkuang  int16_t feature_data[MAX_SEGMENTS][SEG_LVL_MAX];
4991037db265ecdd914a26e056cf69207b4f50924ehkuang  unsigned int feature_mask[MAX_SEGMENTS];
5091037db265ecdd914a26e056cf69207b4f50924ehkuang};
5191037db265ecdd914a26e056cf69207b4f50924ehkuang
527ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE int segfeature_active(const struct segmentation *seg,
537ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                    int segment_id,
547ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                    SEG_LVL_FEATURES feature_id) {
557ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  return seg->enabled &&
567ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian         (seg->feature_mask[segment_id] & (1 << feature_id));
577ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
58ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
5991037db265ecdd914a26e056cf69207b4f50924ehkuangvoid vp9_clearall_segfeatures(struct segmentation *seg);
60ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
6191037db265ecdd914a26e056cf69207b4f50924ehkuangvoid vp9_enable_segfeature(struct segmentation *seg,
62ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                           int segment_id,
63ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                           SEG_LVL_FEATURES feature_id);
64ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
65ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangint vp9_seg_feature_data_max(SEG_LVL_FEATURES feature_id);
66ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
67ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangint vp9_is_segfeature_signed(SEG_LVL_FEATURES feature_id);
68ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
6991037db265ecdd914a26e056cf69207b4f50924ehkuangvoid vp9_set_segdata(struct segmentation *seg,
70ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                     int segment_id,
71ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                     SEG_LVL_FEATURES feature_id,
72ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                     int seg_data);
73ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
747ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE int get_segdata(const struct segmentation *seg, int segment_id,
757ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                              SEG_LVL_FEATURES feature_id) {
767ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  return seg->feature_data[segment_id][feature_id];
777ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
78ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
797ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianextern const vpx_tree_index vp9_segment_tree[TREE_SIZE(MAX_SEGMENTS)];
80ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
81b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifdef __cplusplus
82b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}  // extern "C"
83b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif
84b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
85ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif  // VP9_COMMON_VP9_SEG_COMMON_H_
86ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
87