1233d2500723e5594f3e7c70896ffeeef32b9c950ywan/*
2233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3233d2500723e5594f3e7c70896ffeeef32b9c950ywan *
4233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  Use of this source code is governed by a BSD-style license
5233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  that can be found in the LICENSE file in the root of the source
6233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  tree. An additional intellectual property rights grant can be found
7233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  in the file PATENTS.  All contributing project authors may
8233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  be found in the AUTHORS file in the root of the source tree.
9233d2500723e5594f3e7c70896ffeeef32b9c950ywan */
10233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <assert.h>
12233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/common/vp9_blockd.h"
14233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/common/vp9_loopfilter.h"
15233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/common/vp9_seg_common.h"
16233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/common/vp9_quant_common.h"
17233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic const int seg_feature_data_signed[SEG_LVL_MAX] = { 1, 1, 0, 0 };
19233d2500723e5594f3e7c70896ffeeef32b9c950ywan
20233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic const int seg_feature_data_max[SEG_LVL_MAX] = {
21233d2500723e5594f3e7c70896ffeeef32b9c950ywan  MAXQ, MAX_LOOP_FILTER, 3, 0 };
22233d2500723e5594f3e7c70896ffeeef32b9c950ywan
23233d2500723e5594f3e7c70896ffeeef32b9c950ywan// These functions provide access to new segment level features.
24233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Eventually these function may be "optimized out" but for the moment,
25233d2500723e5594f3e7c70896ffeeef32b9c950ywan// the coding mechanism is still subject to change so these provide a
26233d2500723e5594f3e7c70896ffeeef32b9c950ywan// convenient single point of change.
27233d2500723e5594f3e7c70896ffeeef32b9c950ywan
28233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp9_segfeature_active(const struct segmentation *seg, int segment_id,
29233d2500723e5594f3e7c70896ffeeef32b9c950ywan                          SEG_LVL_FEATURES feature_id) {
30233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return seg->enabled &&
31233d2500723e5594f3e7c70896ffeeef32b9c950ywan         (seg->feature_mask[segment_id] & (1 << feature_id));
32233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
33233d2500723e5594f3e7c70896ffeeef32b9c950ywan
34233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp9_clearall_segfeatures(struct segmentation *seg) {
35233d2500723e5594f3e7c70896ffeeef32b9c950ywan  vp9_zero(seg->feature_data);
36233d2500723e5594f3e7c70896ffeeef32b9c950ywan  vp9_zero(seg->feature_mask);
37233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
38233d2500723e5594f3e7c70896ffeeef32b9c950ywan
39233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp9_enable_segfeature(struct segmentation *seg, int segment_id,
40233d2500723e5594f3e7c70896ffeeef32b9c950ywan                           SEG_LVL_FEATURES feature_id) {
41233d2500723e5594f3e7c70896ffeeef32b9c950ywan  seg->feature_mask[segment_id] |= 1 << feature_id;
42233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
43233d2500723e5594f3e7c70896ffeeef32b9c950ywan
44233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp9_seg_feature_data_max(SEG_LVL_FEATURES feature_id) {
45233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return seg_feature_data_max[feature_id];
46233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
47233d2500723e5594f3e7c70896ffeeef32b9c950ywan
48233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp9_is_segfeature_signed(SEG_LVL_FEATURES feature_id) {
49233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return seg_feature_data_signed[feature_id];
50233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
51233d2500723e5594f3e7c70896ffeeef32b9c950ywan
52233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp9_set_segdata(struct segmentation *seg, int segment_id,
53233d2500723e5594f3e7c70896ffeeef32b9c950ywan                     SEG_LVL_FEATURES feature_id, int seg_data) {
54233d2500723e5594f3e7c70896ffeeef32b9c950ywan  assert(seg_data <= seg_feature_data_max[feature_id]);
55233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (seg_data < 0) {
56233d2500723e5594f3e7c70896ffeeef32b9c950ywan    assert(seg_feature_data_signed[feature_id]);
57233d2500723e5594f3e7c70896ffeeef32b9c950ywan    assert(-seg_data <= seg_feature_data_max[feature_id]);
58233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
59233d2500723e5594f3e7c70896ffeeef32b9c950ywan
60233d2500723e5594f3e7c70896ffeeef32b9c950ywan  seg->feature_data[segment_id][feature_id] = seg_data;
61233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
62233d2500723e5594f3e7c70896ffeeef32b9c950ywan
63233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp9_get_segdata(const struct segmentation *seg, int segment_id,
64233d2500723e5594f3e7c70896ffeeef32b9c950ywan                    SEG_LVL_FEATURES feature_id) {
65233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return seg->feature_data[segment_id][feature_id];
66233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
67233d2500723e5594f3e7c70896ffeeef32b9c950ywan
68233d2500723e5594f3e7c70896ffeeef32b9c950ywan
69233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst vp9_tree_index vp9_segment_tree[TREE_SIZE(MAX_SEGMENTS)] = {
70233d2500723e5594f3e7c70896ffeeef32b9c950ywan  2,  4,  6,  8, 10, 12,
71233d2500723e5594f3e7c70896ffeeef32b9c950ywan  0, -1, -2, -3, -4, -5, -6, -7
72233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
73233d2500723e5594f3e7c70896ffeeef32b9c950ywan
74233d2500723e5594f3e7c70896ffeeef32b9c950ywan
75233d2500723e5594f3e7c70896ffeeef32b9c950ywan// TBD? Functions to read and write segment data with range / validity checking
76