1 /*
2 * Copyright(c) 2019 Intel Corporation
3 * SPDX - License - Identifier: BSD - 2 - Clause - Patent
4 */
5 
6 #ifndef EbNeighborArrays_h
7 #define EbNeighborArrays_h
8 
9 #include "EbDefinitions.h"
10 #include "EbSyntaxElements.h"
11 
12 #ifdef __cplusplus
13 extern "C" {
14 #endif
15 // Neighbor Array Granulairity
16 #define SB_NEIGHBOR_ARRAY_GRANULARITY                  64
17 #define SAMPLE_NEIGHBOR_ARRAY_GRANULARITY               1
18 
19 typedef enum NeighborArrayType
20 {
21     NEIGHBOR_ARRAY_LEFT     = 0,
22     NEIGHBOR_ARRAY_TOP      = 1,
23     NEIGHBOR_ARRAY_TOPLEFT  = 2,
24     NEIGHBOR_ARRAY_INVALID  = ~0
25 } NeighborArrayType;
26 
27 #define NEIGHBOR_ARRAY_UNIT_LEFT_MASK                   (1 << NEIGHBOR_ARRAY_LEFT)
28 #define NEIGHBOR_ARRAY_UNIT_TOP_MASK                    (1 << NEIGHBOR_ARRAY_TOP)
29 #define NEIGHBOR_ARRAY_UNIT_TOPLEFT_MASK                (1 << NEIGHBOR_ARRAY_TOPLEFT)
30 
31 #define NEIGHBOR_ARRAY_UNIT_FULL_MASK                   (NEIGHBOR_ARRAY_UNIT_LEFT_MASK | NEIGHBOR_ARRAY_UNIT_TOP_MASK | NEIGHBOR_ARRAY_UNIT_TOPLEFT_MASK)
32 #define NEIGHBOR_ARRAY_UNIT_TOP_AND_LEFT_ONLY_MASK      (NEIGHBOR_ARRAY_UNIT_LEFT_MASK | NEIGHBOR_ARRAY_UNIT_TOP_MASK)
33 
34 typedef struct NeighborArrayUnit
35 {
36     uint8_t   *left_array;
37     uint8_t   *top_array;
38     uint8_t   *top_left_array;
39     uint16_t   left_array_size;
40     uint16_t   top_array_size;
41     uint16_t   top_left_array_size;
42     uint8_t    unit_size;
43     uint8_t    granularity_normal;
44     uint8_t    granularity_normal_log2;
45     uint8_t    granularity_top_left;
46     uint8_t    granularity_top_left_log2;
47 
48 } NeighborArrayUnit;
49 
50 extern EbErrorType eb_vp9_neighbor_array_unit_ctor(
51     NeighborArrayUnit **na_unit_dbl_ptr,
52     uint32_t            maxpicture_width,
53     uint32_t            maxpicture_height,
54     uint32_t            unit_size,
55     uint32_t            granularity_normal,
56     uint32_t            granularity_top_left,
57     uint32_t            type_mask);
58 
59 extern void eb_vp9_neighbor_array_unit_reset(NeighborArrayUnit *na_unit_ptr);
60 
61 extern uint32_t get_neighbor_array_unit_left_index(
62     NeighborArrayUnit *na_unit_ptr,
63     uint32_t           loc_y);
64 
65 extern uint32_t get_neighbor_array_unit_top_index(
66     NeighborArrayUnit *na_unit_ptr,
67     uint32_t           loc_x);
68 
69 extern uint32_t eb_vp9_get_neighbor_array_unit_top_left_index(
70     NeighborArrayUnit *na_unit_ptr,
71     int32_t            loc_x,
72     int32_t            loc_y);
73 
74 extern void eb_vp9_neighbor_array_unit_sample_write(
75     NeighborArrayUnit *na_unit_ptr,
76     uint8_t           *src_ptr,
77     uint32_t           stride,
78     uint32_t           srcorigin_x,
79     uint32_t           srcorigin_y,
80     uint32_t           picorigin_x,
81     uint32_t           picorigin_y,
82     uint32_t           block_width,
83     uint32_t           block_height,
84     uint32_t           neighbor_array_type_mask);
85 
86 extern void eb_vp9_neighbor_array_unit16bit_sample_write(
87     NeighborArrayUnit *na_unit_ptr,
88     uint16_t          *src_ptr,
89     uint32_t           stride,
90     uint32_t           srcorigin_x,
91     uint32_t           srcorigin_y,
92     uint32_t           picorigin_x,
93     uint32_t           picorigin_y,
94     uint32_t           block_width,
95     uint32_t           block_height,
96     uint32_t           neighbor_array_type_mask);
97 
98 extern void eb_vp9_neighbor_array_unit_mode_write(
99     NeighborArrayUnit *na_unit_ptr,
100     uint8_t           *value,
101     uint32_t           origin_x,
102     uint32_t           origin_y,
103     uint32_t           block_width,
104     uint32_t           block_height,
105     uint32_t           neighbor_array_type_mask);
106 
107 extern void neighbor_array_unit_intra_write(
108     NeighborArrayUnit *na_unit_ptr,
109     uint8_t           *value,
110     uint32_t           origin_x,
111     uint32_t           origin_y,
112     uint32_t           block_size);
113 
114 extern void neighbor_array_unit_mode_type_write(
115     NeighborArrayUnit *na_unit_ptr,
116     uint8_t           *value,
117     uint32_t           origin_x,
118     uint32_t           origin_y,
119     uint32_t           block_size);
120 
121 extern void eb_vp9_neighbor_array_unit_mv_write(
122     NeighborArrayUnit *na_unit_ptr,
123     uint8_t           *value,
124     uint32_t           origin_x,
125     uint32_t           origin_y,
126     uint32_t           block_size);
127 #ifdef __cplusplus
128 }
129 #endif
130 #endif //EbNeighborArrays_h
131