1 /*
2 * Copyright(c) 2018 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 #include "EbMotionVectorUnit.h"
12 #include "EbObject.h"
13 #ifdef __cplusplus
14 extern "C" {
15 #endif
16 // Neighbor Array Granulairity
17 #define LCU_NEIGHBOR_ARRAY_GRANULARITY                  64
18 #define CU_NEIGHBOR_ARRAY_GRANULARITY                   8
19 #define PU_NEIGHBOR_ARRAY_GRANULARITY                   4
20 #define TU_NEIGHBOR_ARRAY_GRANULARITY                   4
21 #define SAMPLE_NEIGHBOR_ARRAY_GRANULARITY               1
22 
23 typedef enum NEIGHBOR_ARRAY_TYPE
24 {
25     NEIGHBOR_ARRAY_LEFT     = 0,
26     NEIGHBOR_ARRAY_TOP      = 1,
27     NEIGHBOR_ARRAY_TOPLEFT  = 2,
28     NEIGHBOR_ARRAY_INVALID  = ~0
29 } NEIGHBOR_ARRAY_TYPE;
30 
31 #define NEIGHBOR_ARRAY_UNIT_LEFT_MASK                   (1 << NEIGHBOR_ARRAY_LEFT)
32 #define NEIGHBOR_ARRAY_UNIT_TOP_MASK                    (1 << NEIGHBOR_ARRAY_TOP)
33 #define NEIGHBOR_ARRAY_UNIT_TOPLEFT_MASK                (1 << NEIGHBOR_ARRAY_TOPLEFT)
34 
35 #define NEIGHBOR_ARRAY_UNIT_FULL_MASK                   (NEIGHBOR_ARRAY_UNIT_LEFT_MASK | NEIGHBOR_ARRAY_UNIT_TOP_MASK | NEIGHBOR_ARRAY_UNIT_TOPLEFT_MASK)
36 #define NEIGHBOR_ARRAY_UNIT_TOP_AND_LEFT_ONLY_MASK      (NEIGHBOR_ARRAY_UNIT_LEFT_MASK | NEIGHBOR_ARRAY_UNIT_TOP_MASK)
37 
38 typedef struct NeighborArrayUnit_s
39 {
40     EbDctor  dctor;
41     EB_U8   *leftArray;
42     EB_U8   *topArray;
43     EB_U8   *topLeftArray;
44     EB_U16   leftArraySize;
45     EB_U16   topArraySize;
46     EB_U16   topLeftArraySize;
47     EB_U8    unitSize;
48     EB_U8    granularityNormal;
49     EB_U8    granularityNormalLog2;
50     EB_U8    granularityTopLeft;
51     EB_U8    granularityTopLeftLog2;
52 
53 } NeighborArrayUnit_t;
54 
55 extern EB_ERRORTYPE NeighborArrayUnitCtor(
56     NeighborArrayUnit_t *naUnitPtr,
57     EB_U32   maxPictureWidth,
58     EB_U32   maxPictureHeight,
59     EB_U32   unitSize,
60     EB_U32   granularityNormal,
61     EB_U32   granularityTopLeft,
62     EB_U32   typeMask);
63 
64 extern void NeighborArrayUnitReset(NeighborArrayUnit_t *naUnitPtr);
65 
66 extern EB_U32 GetNeighborArrayUnitLeftIndex(
67     NeighborArrayUnit_t *naUnitPtr,
68     EB_U32               locY);
69 
70 extern EB_U32 GetNeighborArrayUnitTopIndex(
71     NeighborArrayUnit_t *naUnitPtr,
72     EB_U32               locX);
73 
74 extern EB_U32 GetNeighborArrayUnitTopLeftIndex(
75     NeighborArrayUnit_t *naUnitPtr,
76     EB_S32               locX,
77     EB_S32               locY);
78 
79 extern void NeighborArrayUnitSampleWrite(
80     NeighborArrayUnit_t *naUnitPtr,
81     EB_U8               *srcPtr,
82     EB_U32               stride,
83     EB_U32               srcOriginX,
84     EB_U32               srcOriginY,
85     EB_U32               picOriginX,
86     EB_U32               picOriginY,
87     EB_U32               blockWidth,
88     EB_U32               blockHeight,
89     EB_U32               neighborArrayTypeMask);
90 
91 extern void NeighborArrayUnit16bitSampleWrite(
92     NeighborArrayUnit_t *naUnitPtr,
93     EB_U16               *srcPtr,
94     EB_U32               stride,
95     EB_U32               srcOriginX,
96     EB_U32               srcOriginY,
97     EB_U32               picOriginX,
98     EB_U32               picOriginY,
99     EB_U32               blockWidth,
100     EB_U32               blockHeight,
101     EB_U32               neighborArrayTypeMask);
102 
103 extern void NeighborArrayUnitModeWrite(
104     NeighborArrayUnit_t *naUnitPtr,
105     EB_U8               *value,
106     EB_U32               originX,
107     EB_U32               originY,
108     EB_U32               blockWidth,
109     EB_U32               blockHeight,
110     EB_U32               neighborArrayTypeMask);
111 
112 extern void NeighborArrayUnitDepthSkipWrite(
113     NeighborArrayUnit_t *naUnitPtr,
114     EB_U8               *value,
115     EB_U32               originX,
116     EB_U32               originY,
117     EB_U32               blockSize);
118 
119 extern void NeighborArrayUnitIntraWrite(
120     NeighborArrayUnit_t *naUnitPtr,
121     EB_U8               *value,
122     EB_U32               originX,
123     EB_U32               originY,
124     EB_U32               blockSize);
125 
126 extern void NeighborArrayUnitModeTypeWrite(
127     NeighborArrayUnit_t *naUnitPtr,
128     EB_U8               *value,
129     EB_U32               originX,
130     EB_U32               originY,
131     EB_U32               blockSize);
132 
133 extern void NeighborArrayUnitMvWrite(
134     NeighborArrayUnit_t *naUnitPtr,
135     EB_U8               *value,
136     EB_U32               originX,
137     EB_U32               originY,
138     EB_U32               blockSize);
139 #ifdef __cplusplus
140 }
141 #endif
142 #endif //EbNeighborArrays_h
143