summaryrefslogtreecommitdiff
path: root/vp8/common/seg_common.c
blob: 3ba374a4952c045cb1a9ffc93988b39fdd4c82cd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
/*
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include "vp8/common/seg_common.h"

const int segfeaturedata_signed[SEG_LVL_MAX] = {1, 1, 0, 0, 0, 0};
const int vp8_seg_feature_data_bits[SEG_LVL_MAX] =
              {QINDEX_BITS, 6, 4, 4, 6, 2};

// These functions provide access to new segment level features.
// Eventually these function may be "optimized out" but for the moment,
// the coding mechanism is still subject to change so these provide a
// convenient single point of change.

int segfeature_active( MACROBLOCKD *xd,
                       int segment_id,
                       SEG_LVL_FEATURES feature_id )
{
    // Return true if mask bit set and segmentation enabled.
    return ( xd->segmentation_enabled &&
             ( xd->segment_feature_mask[segment_id] &
               (0x01 << feature_id) ) );
}

void clearall_segfeatures( MACROBLOCKD *xd )
{
     vpx_memset(xd->segment_feature_data, 0, sizeof(xd->segment_feature_data));
     vpx_memset(xd->segment_feature_mask, 0, sizeof(xd->segment_feature_mask));
}

void enable_segfeature( MACROBLOCKD *xd,
                        int segment_id,
                        SEG_LVL_FEATURES feature_id )
{
     xd->segment_feature_mask[segment_id] |= (0x01 << feature_id);
}

void disable_segfeature( MACROBLOCKD *xd,
                         int segment_id,
                         SEG_LVL_FEATURES feature_id )
{
     xd->segment_feature_mask[segment_id] &= ~(1 << feature_id);
}

int seg_feature_data_bits( SEG_LVL_FEATURES feature_id )
{
    return vp8_seg_feature_data_bits[feature_id];
}

int is_segfeature_signed( SEG_LVL_FEATURES feature_id )
{
    return ( segfeaturedata_signed[feature_id] );
}

void clear_segdata( MACROBLOCKD *xd,
                    int segment_id,
                    SEG_LVL_FEATURES feature_id)
{
    xd->segment_feature_data[segment_id][feature_id] = 0;
}

void set_segdata( MACROBLOCKD *xd,
                  int segment_id,
                  SEG_LVL_FEATURES feature_id,
                  int seg_data )
{
    xd->segment_feature_data[segment_id][feature_id] = seg_data;
}

int get_segdata( MACROBLOCKD *xd,
                 int segment_id,
                 SEG_LVL_FEATURES feature_id )
{
    return xd->segment_feature_data[segment_id][feature_id];
}
#if CONFIG_FEATUREUPDATES
int old_segfeature_active( MACROBLOCKD *xd,
                           int segment_id,
                           SEG_LVL_FEATURES feature_id )
{
    // Return true if mask bit set and segmentation enabled.
    return ( xd->segmentation_enabled &&
             ( xd->old_segment_feature_mask[segment_id] &
               (0x01 << feature_id) ) );
}

int get_old_segdata( MACROBLOCKD *xd,
                     int segment_id,
                     SEG_LVL_FEATURES feature_id )
{
    return xd->old_segment_feature_data[segment_id][feature_id];
}

int segfeature_changed( MACROBLOCKD *xd,
                        int segment_id,
                        SEG_LVL_FEATURES feature_id )
{
    // Return true if mask bit or data is different from last time
    return
      ( xd->segmentation_enabled &&
         (
           (xd->old_segment_feature_mask[segment_id] & (1 << feature_id) ) !=
           (xd->segment_feature_mask[segment_id] & (1 << feature_id) )
        ||  xd->old_segment_feature_data[segment_id][feature_id] !=
            xd->segment_feature_data[segment_id][feature_id]
         )
      );
}

void save_segment_info ( MACROBLOCKD *xd )
{
    int i,j;
    for (i = 0; i < MAX_MB_SEGMENTS; i++)
    {
        xd->old_segment_feature_mask[i] = xd->segment_feature_mask[i];

        // For each segmentation codable feature...
        for (j = 0; j < SEG_LVL_MAX; j++)
        {
            xd->old_segment_feature_data[i][j]=xd->segment_feature_data[i][j];

        }
    }
}
#endif
void clear_segref( MACROBLOCKD *xd, int segment_id )
{
    xd->segment_feature_data[segment_id][SEG_LVL_REF_FRAME] = 0;
}

void set_segref( MACROBLOCKD *xd,
                 int segment_id,
                 MV_REFERENCE_FRAME ref_frame )
{
    xd->segment_feature_data[segment_id][SEG_LVL_REF_FRAME] |=
        (1 << ref_frame);
}

int check_segref( MACROBLOCKD *xd,
                  int segment_id,
                  MV_REFERENCE_FRAME ref_frame )
{
    return ( xd->segment_feature_data[segment_id][SEG_LVL_REF_FRAME] &
             (1 << ref_frame) ) ? 1 : 0;
}

int check_segref_inter(MACROBLOCKD *xd, int segment_id)
{
    return ( xd->segment_feature_data[segment_id][SEG_LVL_REF_FRAME] &
             ~(1 << INTRA_FRAME) ) ? 1 : 0;
}

int get_seg_tx_type(MACROBLOCKD *xd, int segment_id)
{
    if ( segfeature_active(xd, segment_id, SEG_LVL_TRANSFORM) )
        return get_segdata(xd, segment_id, SEG_LVL_TRANSFORM);
    else
        return TX_4X4;
}
// TBD? Functions to read and write segment data with range / validity checking