xref: /aosp_15_r20/external/libdav1d/src/intra_edge.h (revision c09093415860a1c2373dacd84c4fde00c507cdfd)
1 /*
2  * Copyright © 2018-2023, VideoLAN and dav1d authors
3  * Copyright © 2018-2023, Two Orioles, LLC
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright notice, this
10  *    list of conditions and the following disclaimer.
11  *
12  * 2. Redistributions in binary form must reproduce the above copyright notice,
13  *    this list of conditions and the following disclaimer in the documentation
14  *    and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
20  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 #ifndef DAV1D_SRC_INTRA_EDGE_H
29 #define DAV1D_SRC_INTRA_EDGE_H
30 
31 #include <stdint.h>
32 
33 enum EdgeFlags {
34     EDGE_I444_TOP_HAS_RIGHT   = 1 << 0,
35     EDGE_I422_TOP_HAS_RIGHT   = 1 << 1,
36     EDGE_I420_TOP_HAS_RIGHT   = 1 << 2,
37     EDGE_I444_LEFT_HAS_BOTTOM = 1 << 3,
38     EDGE_I422_LEFT_HAS_BOTTOM = 1 << 4,
39     EDGE_I420_LEFT_HAS_BOTTOM = 1 << 5,
40     EDGE_ALL_TOP_HAS_RIGHT    = EDGE_I444_TOP_HAS_RIGHT |
41                                 EDGE_I422_TOP_HAS_RIGHT |
42                                 EDGE_I420_TOP_HAS_RIGHT,
43     EDGE_ALL_LEFT_HAS_BOTTOM  = EDGE_I444_LEFT_HAS_BOTTOM |
44                                 EDGE_I422_LEFT_HAS_BOTTOM |
45                                 EDGE_I420_LEFT_HAS_BOTTOM,
46     EDGE_ALL_TR_AND_BL        = EDGE_ALL_TOP_HAS_RIGHT |
47                                 EDGE_ALL_LEFT_HAS_BOTTOM,
48 };
49 
50 #define INTRA_EDGE_SPLIT(n, i) \
51     ((const EdgeNode*)((uintptr_t)(n) + ((const EdgeBranch*)(n))->split_offset[i]))
52 
53 typedef struct EdgeNode {
54     uint8_t /* enum EdgeFlags */ o, h[2], v[2];
55 } EdgeNode;
56 
57 typedef struct EdgeTip {
58     EdgeNode node;
59     uint8_t /* enum EdgeFlags */ split[3];
60 } EdgeTip;
61 
62 typedef struct EdgeBranch {
63     EdgeNode node;
64     uint8_t /* enum EdgeFlags */ h4, v4;
65     uint16_t split_offset[4]; /* relative to the address of this node */
66 } EdgeBranch;
67 
68 /* Tree to keep track of which edges are available. */
69 EXTERN const EdgeNode *dav1d_intra_edge_tree[2 /* BL_128X128, BL_64X64 */];
70 
71 void dav1d_init_intra_edge_tree(void);
72 
73 #endif /* DAV1D_SRC_INTRA_EDGE_H */
74