/src/aom/av1/common/seg_common.c
Line | Count | Source |
1 | | /* |
2 | | * Copyright (c) 2016, Alliance for Open Media. All rights reserved. |
3 | | * |
4 | | * This source code is subject to the terms of the BSD 2 Clause License and |
5 | | * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License |
6 | | * was not distributed with this source code in the LICENSE file, you can |
7 | | * obtain it at www.aomedia.org/license/software. If the Alliance for Open |
8 | | * Media Patent License 1.0 was not distributed with this source code in the |
9 | | * PATENTS file, you can obtain it at www.aomedia.org/license/patent. |
10 | | */ |
11 | | |
12 | | #include <assert.h> |
13 | | |
14 | | #include "av1/common/av1_loopfilter.h" |
15 | | #include "av1/common/blockd.h" |
16 | | #include "av1/common/seg_common.h" |
17 | | #include "av1/common/quant_common.h" |
18 | | |
19 | | static const int seg_feature_data_signed[SEG_LVL_MAX] = { |
20 | | 1, 1, 1, 1, 1, 0, 0, 0 |
21 | | }; |
22 | | |
23 | | static const int seg_feature_data_max[SEG_LVL_MAX] = { MAXQ, |
24 | | MAX_LOOP_FILTER, |
25 | | MAX_LOOP_FILTER, |
26 | | MAX_LOOP_FILTER, |
27 | | MAX_LOOP_FILTER, |
28 | | 7, |
29 | | 0, |
30 | | 0 }; |
31 | | |
32 | | // These functions provide access to new segment level features. |
33 | | // Eventually these function may be "optimized out" but for the moment, |
34 | | // the coding mechanism is still subject to change so these provide a |
35 | | // convenient single point of change. |
36 | | |
37 | 168k | void av1_clearall_segfeatures(struct segmentation *seg) { |
38 | 168k | av1_zero(seg->feature_data); |
39 | 168k | av1_zero(seg->feature_mask); |
40 | 168k | } |
41 | | |
42 | 16.5k | void av1_calculate_segdata(struct segmentation *seg) { |
43 | 16.5k | seg->segid_preskip = 0; |
44 | 16.5k | seg->last_active_segid = 0; |
45 | 148k | for (int i = 0; i < MAX_SEGMENTS; i++) { |
46 | 1.18M | for (int j = 0; j < SEG_LVL_MAX; j++) { |
47 | 1.05M | if (seg->feature_mask[i] & (1 << j)) { |
48 | 263k | seg->segid_preskip |= (j >= SEG_LVL_REF_FRAME); |
49 | 263k | seg->last_active_segid = i; |
50 | 263k | } |
51 | 1.05M | } |
52 | 132k | } |
53 | 16.5k | } |
54 | | |
55 | | void av1_enable_segfeature(struct segmentation *seg, int segment_id, |
56 | 278k | SEG_LVL_FEATURES feature_id) { |
57 | 278k | seg->feature_mask[segment_id] |= 1 << feature_id; |
58 | 278k | } |
59 | | |
60 | 278k | int av1_seg_feature_data_max(SEG_LVL_FEATURES feature_id) { |
61 | 278k | return seg_feature_data_max[feature_id]; |
62 | 278k | } |
63 | | |
64 | 278k | int av1_is_segfeature_signed(SEG_LVL_FEATURES feature_id) { |
65 | 278k | return seg_feature_data_signed[feature_id]; |
66 | 278k | } |
67 | | |
68 | | // The 'seg_data' given for each segment can be either deltas (from the default |
69 | | // value chosen for the frame) or absolute values. |
70 | | // |
71 | | // Valid range for abs values is (0-127 for MB_LVL_ALT_Q), (0-63 for |
72 | | // SEGMENT_ALT_LF) |
73 | | // Valid range for delta values are (+/-127 for MB_LVL_ALT_Q), (+/-63 for |
74 | | // SEGMENT_ALT_LF) |
75 | | // |
76 | | // abs_delta = SEGMENT_DELTADATA (deltas) abs_delta = SEGMENT_ABSDATA (use |
77 | | // the absolute values given). |
78 | | |
79 | | void av1_set_segdata(struct segmentation *seg, int segment_id, |
80 | 1.13M | SEG_LVL_FEATURES feature_id, int seg_data) { |
81 | 1.13M | if (seg_data < 0) { |
82 | 89.8k | assert(seg_feature_data_signed[feature_id]); |
83 | 89.8k | assert(-seg_data <= seg_feature_data_max[feature_id]); |
84 | 1.04M | } else { |
85 | 1.04M | assert(seg_data <= seg_feature_data_max[feature_id]); |
86 | 1.04M | } |
87 | | |
88 | 1.13M | seg->feature_data[segment_id][feature_id] = seg_data; |
89 | 1.13M | } |
90 | | |
91 | | // TBD? Functions to read and write segment data with range / validity checking |