Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5361 | serge | 1 | /* |
2 | * Header file for all AVC intra prediction kernels |
||
3 | * Copyright © <2010>, Intel Corporation. |
||
4 | * |
||
5 | * This program is licensed under the terms and conditions of the |
||
6 | * Eclipse Public License (EPL), version 1.0. The full text of the EPL is at |
||
7 | * http://www.opensource.org/licenses/eclipse-1.0.php. |
||
8 | * |
||
9 | */ |
||
10 | #if !defined(__INTRA_HEADER__) // Make sure this file is only included once |
||
11 | #define __INTRA_HEADER__ |
||
12 | |||
13 | // Module name: intra_header.inc |
||
14 | // |
||
15 | // Header file for all AVC intra prediction kernels |
||
16 | // |
||
17 | // This header file defines everything that's specific to intra macroblock kernels |
||
18 | |||
19 | |||
20 | // ----------- Various data buffers and pointers ------------ |
||
21 | // |
||
22 | // I_PCM data buffer |
||
23 | // |
||
24 | #define I_PCM_BUF_Y 4 |
||
25 | #define I_PCM_BUF_UV 12 |
||
26 | |||
27 | #define REG_I_PCM_BUF_Y r4 |
||
28 | #define REG_I_PCM_BUF_UV r12 |
||
29 | |||
30 | .declare I_PCM_Y Base=REG_I_PCM_BUF_Y ElementSize=1 SrcRegion=REGION(16,1) Type=ub // 8-bit I_PCM Y data |
||
31 | .declare I_PCM_UV Base=REG_I_PCM_BUF_UV ElementSize=1 SrcRegion=REGION(16,1) Type=ub // 8-bit I_PCM U/V data |
||
32 | |||
33 | // Intra macroblock error data blocks |
||
34 | // |
||
35 | #define ERRBUF 4 // Starting GRF index for error data |
||
36 | #define REG_ERRBUF r4 |
||
37 | .declare MBBLOCKW Base=REG_ERRBUF ElementSize=2 SrcRegion=REGION(16,1) Type=w // For 16-bit inter MB |
||
38 | .declare MBBLOCKD Base=REG_ERRBUF ElementSize=2 SrcRegion=REGION(16,1) Type=uw // For use in "send" command |
||
39 | |||
40 | #define PERROR a0.2 // Pointer to macroblock error data |
||
41 | #define PERROR1 a0.3 // Pointer to macroblock error data used by instruction compression |
||
42 | #define PERROR_UD a0.1 // Pointer to macroblock error data in DWORD unit |
||
43 | |||
44 | // Intra macroblock reference data |
||
45 | // |
||
46 | #define REG_INTRA_REF_TOP r49 // Must be an odd numbered GRF register |
||
47 | .declare INTRA_REF_TOP0 Base=REG_INTRA_REF_TOP ElementSize=1 SrcRegion=REGION(16,1) Type=ub |
||
48 | .declare INTRA_REF_TOP Base=REG_INTRA_REF_TOP.4 ElementSize=1 SrcRegion=REGION(16,1) Type=ub |
||
49 | // Actual top row reference data start at offset 4 in BYTE |
||
50 | .declare INTRA_REF_TOP_W Base=REG_INTRA_REF_TOP.2 ElementSize=2 SrcRegion=REGION(16,1) Type=uw |
||
51 | // Actual top row reference data start at offset 2 in WORD |
||
52 | .declare INTRA_REF_TOP_D Base=REG_INTRA_REF_TOP ElementSize=4 DstRegion=<1> Type=ud // Only used in "send" instruction |
||
53 | |||
54 | #define INTRA_REF_LEFT_ID 50 |
||
55 | #define REG_INTRA_REF_LEFT r50 |
||
56 | .declare INTRA_REF_LEFT0 Base=REG_INTRA_REF_LEFT ElementSize=1 SrcRegion=REGION(8,4) Type=ub |
||
57 | .declare INTRA_REF_LEFT Base=REG_INTRA_REF_LEFT.3 ElementSize=1 SrcRegion=REGION(8,4) Type=ub |
||
58 | // Actual left column reference data are located at offset 3 in BYTE |
||
59 | .declare INTRA_REF_LEFT_UV Base=REG_INTRA_REF_LEFT.2 ElementSize=1 SrcRegion=REGION(8,4) Type=ub |
||
60 | // Actual left column U/V reference data are located at offset 2 in BYTE |
||
61 | .declare INTRA_REF_LEFT_W Base=REG_INTRA_REF_LEFT.1 ElementSize=2 SrcRegion=REGION(8,2) Type=uw |
||
62 | // Actual left column reference data are located at offset 1 in WORD |
||
63 | .declare INTRA_REF_LEFT_D Base=REG_INTRA_REF_LEFT ElementSize=4 DstRegion=<1> Type=ud // Only used in "send" instruction |
||
64 | |||
65 | #define PREF_LEFT a0.4 // Pointer to left reference data |
||
66 | #define PREF_LEFT_UD a0.2 // Pointer in DWORD to left reference data |
||
67 | |||
68 | #define INTRA_TEMP_0 52 |
||
69 | #define INTRA_TEMP_1 53 |
||
70 | #define INTRA_TEMP_2 54 |
||
71 | #define INTRA_TEMP_3 55 |
||
72 | #define INTRA_TEMP_4 56 |
||
73 | #define INTRA_TEMP_5 57 |
||
74 | #define INTRA_TEMP_6 58 |
||
75 | |||
76 | #define REG_INTRA_TEMP_0 r52 |
||
77 | #define REG_INTRA_TEMP_1 r53 |
||
78 | #define REG_INTRA_TEMP_2 r54 |
||
79 | #define REG_INTRA_TEMP_3 r55 |
||
80 | #define REG_INTRA_TEMP_4 r56 |
||
81 | #define REG_INTRA_TEMP_5 r57 |
||
82 | #define REG_INTRA_TEMP_6 r58 |
||
83 | #define REG_INTRA_TEMP_7 r59 |
||
84 | #define REG_INTRA_TEMP_8 r60 |
||
85 | |||
86 | // Destination registers for write commit |
||
87 | #define REG_WRITE_COMMIT_Y r60.0 |
||
88 | #define REG_WRITE_COMMIT_UV r61.0 |
||
89 | |||
90 | // ----------- Various data buffers and pointers ------------ |
||
91 | // R32 - R47 for predicted picture buffer (for both Y and U/V blocks) |
||
92 | // |
||
93 | #define PREDBUF 32 // Starting GRF index for predicted buffer |
||
94 | #define REG_PREDBUF r32 |
||
95 | |||
96 | .declare PRED_Y Base=REG_PREDBUF ElementSize=1 SrcRegion=REGION(16,1) Type=ub // Predicted Y picture |
||
97 | .declare PRED_YW Base=REG_PREDBUF ElementSize=2 SrcRegion=REGION(16,1) Type=uw // Predicted Y picture stored in WORD |
||
98 | .declare PRED_Y_FM Base=REG_PREDBUF ElementSize=1 SrcRegion=REGION(16,1) Type=ub // Predicted Y picture frame |
||
99 | .declare PRED_Y_TF Base=REG_PREDBUF ElementSize=1 SrcRegion=REGION(16,1) Type=ub // Predicted Y picture Top field |
||
100 | |||
101 | .declare PRED_UV Base=REG_PREDBUF ElementSize=1 SrcRegion=REGION(16,1) Type=ub // Predicted U/V picture |
||
102 | .declare PRED_UVW Base=REG_PREDBUF ElementSize=2 SrcRegion=REGION(16,1) Type=uw // Predicted U/V picture stored in WORD |
||
103 | .declare PRED_UV_FM Base=REG_PREDBUF ElementSize=1 SrcRegion=REGION(16,1) Type=ub // Predicted U/V picture frame |
||
104 | .declare PRED_UV_TF Base=REG_PREDBUF ElementSize=1 SrcRegion=REGION(16,1) Type=ub // Predicted U/V picture top field |
||
105 | .declare PRED_UV_BF Base=REG_PREDBUF.16 ElementSize=1 SrcRegion=REGION(16,1) Type=ub // Predicted U/V picture bottom field |
||
106 | |||
107 | // The same region will also be used as finally decoded Y blocks shared with U/V blocks |
||
108 | // |
||
109 | #define DECBUF 32 |
||
110 | #define REG_DECBUF r32 |
||
111 | .declare DEC_Y Base=REG_DECBUF ElementSize=1 SrcRegion=REGION(16,1) Type=ub // Decoded Y picture |
||
112 | .declare DEC_UV Base=REG_DECBUF ElementSize=1 SrcRegion=REGION(16,1) Type=ub // Decoded U/V P-/B-picture |
||
113 | .declare DEC_UD Base=REG_DECBUF ElementSize=4 SrcRegion=REGION(8,1) Type=ud // Decoded buffer in UD type |
||
114 | |||
115 | // Reference buffer for intra_NxN prediction |
||
116 | // |
||
117 | #define PRED_MODE REG_INTRA_TEMP_0 |
||
118 | .declare REF_TOP0 Base=REG_INTRA_TEMP_5 ElementSize=1 SrcRegion=REGION(16,1) Type=ub |
||
119 | .declare REF_TOP Base=REG_INTRA_TEMP_5.4 ElementSize=1 SrcRegion=REGION(16,1) Type=ub |
||
120 | // Actual top reference data start from offset 3,i.e. p[-1,-1] |
||
121 | .declare REF_TOP_W Base=REG_INTRA_TEMP_5 ElementSize=2 SrcRegion=REGION(16,1) Type=uw |
||
122 | .declare REF_TOP_D Base=REG_INTRA_TEMP_5 ElementSize=4 SrcRegion=REGION(8,1) Type=ud |
||
123 | .declare REF_LEFT Base=REG_INTRA_TEMP_6 ElementSize=1 SrcRegion=REGION(16,1) Type=ub |
||
124 | .declare REF_LEFT_D Base=REG_INTRA_TEMP_6 ElementSize=4 SrcRegion=REGION(8,1) Type=ud |
||
125 | |||
126 | // For intra prediction plane mode |
||
127 | // |
||
128 | .declare H1 Base=REG_INTRA_TEMP_0 ElementSize=2 SrcRegion=REGION(8,1) Type=w // Make sure it's an even GRF |
||
129 | .declare H2 Base=REG_INTRA_TEMP_0.8 ElementSize=2 SrcRegion=REGION(8,1) Type=w |
||
130 | .declare V1 Base=REG_INTRA_TEMP_1 ElementSize=2 SrcRegion=REGION(8,1) Type=w // Make sure it's the following odd GRF |
||
131 | .declare V2 Base=REG_INTRA_TEMP_1.8 ElementSize=2 SrcRegion=REGION(8,1) Type=w |
||
132 | |||
133 | .declare CP Base=REG_INTRA_TEMP_2 ElementSize=2 SrcRegion=REGION(16,1) Type=w |
||
134 | |||
135 | #define PINTRAPRED_Y a0.7 // Used as luma intra prediction mode pointer |
||
136 | #define PINTRAPRED_UV a0.7 // Used as chroma intra prediction mode pointer |
||
137 | #define PINTRA4X4_Y a0.4 // Used as luma intra_4x4 prediction mode pointer |
||
138 | |||
139 | #define PBWDCOPY_4 a0.4 // a0.4 - a0.7 used in intra_4x4 prediction for moving data backward |
||
140 | #define PBWDCOPY_8 a0.6 // a0.6 - a0.7 used in intra_8x8 prediction for moving data backward |
||
141 | |||
142 | // For Intra_4x4 prediction mode |
||
143 | // |
||
144 | .declare INTRA_4X4_MODE Base=REG_INTRA_TEMP_1 ElementSize=4 SrcRegion=REGION(1,0) DstRegion=<1> Type=d // Actually only need 1 DWORD |
||
145 | |||
146 | // ----------- Intra CURBE constants ------------ |
||
147 | // |
||
148 | #define REG_CURBE1 r1 |
||
149 | #define REG_CURBE2 r2 |
||
150 | #define INTRA_4X4_OFFSET 1*GRFWIB // 9 Bytes |
||
151 | #define INTRA_8X8_OFFSET 1*GRFWIB+12 // 9 Bytes starting sub-register r1.3:ud |
||
152 | #define INTRA_16X16_OFFSET 1*GRFWIB+24 // 4 Bytes starting sub-register r1.6:ud |
||
153 | #define INTRA_CHROMA_OFFSET 1*GRFWIB+28 // 4 Bytes starting sub-register r1.7:ud |
||
154 | |||
155 | #define TOP_REF_OFFSET REG_CURBE1.10 // r1.5:w |
||
156 | |||
157 | // Constants used in plane intra prediction mode |
||
158 | #define XY_3 REG_CURBE2.4 // Stored BYTE constants x-3 for x=0...7, i.e. -3,-2,...3,4 for U/V, need duplicate to every other byte |
||
159 | #define XY_3_1 REG_CURBE2.5 // Stored BYTE constants x-3 for x=0...7, i.e. -3,-2,...3,4 for 2nd instruction in {Comp} |
||
160 | #define XY_7 REG_CURBE2.0 // Stored BYTE constants x-7 for x=0...15, i.e. -7,-6,...7,8 for Y |
||
161 | #define XY_7_1 REG_CURBE2.1 // Stored BYTE constants x-7 for x=0...15, i.e. -7,-6,...7,8 for 2nd instruction in {Comp} |
||
162 | |||
163 | #define INV_SHIFT REG_CURBE2.16 |
||
164 | |||
165 | #define INV_TRANS4 REG_CURBE2.20 // For reverse data transfer for intra_4x4 (0x00020406) |
||
166 | #define INV_TRANS48 REG_CURBE2.22 // For reverse data transfer for intra_4x4 (0x0002) |
||
167 | #define INV_TRANS8 REG_CURBE1.22 // For reverse data transfer for intra_8x8 (0x0001) |
||
168 | |||
169 | #define INTRA_MODE REG_CURBE2.24 // Offset to intra_Pred_4x4_Y from each sub-block |
||
170 | |||
171 | // ----------- In-line parameters ------------ |
||
172 | // |
||
173 | #define REG_INLINE r3 |
||
174 | |||
175 | #define INLINE_DW0 REG_INLINE.0<0;1,0>:ud |
||
176 | #define INLINE_DW1 REG_INLINE.1<0;1,0>:ud |
||
177 | #define INLINE_DW2 REG_INLINE.2<0;1,0>:ud |
||
178 | #define INLINE_DW3 REG_INLINE.3<0;1,0>:ud |
||
179 | #define INLINE_DW4 REG_INLINE.4<0;1,0>:ud |
||
180 | #define INLINE_DW5 REG_INLINE.5<0;1,0>:ud |
||
181 | #define INLINE_DW6 REG_INLINE.6<0;1,0>:ud |
||
182 | #define INLINE_DW7 REG_INLINE.7<0;1,0>:ud |
||
183 | |||
184 | // Intra macroblock in-line data |
||
185 | // |
||
186 | // In-line DWORD 0 |
||
187 | #define REG_MBAFF_FIELD REG_INLINE.1 // :uw, can be added directly to lower-word of MSGDSC |
||
188 | #define MBAFF_FIELD BIT26+BIT25 // Bits 26:25 - MBAFF field macroblock flag |
||
189 | // 00 = Current macroblock is not an MBAFF field macroblock |
||
190 | // 11 = Current macroblock is an MBAFF field macroblock |
||
191 | |||
192 | #define REG_FIELD_PARITY INLINE_DW0 |
||
193 | #define FIELD_PARITY BIT24 // Bit 24 - Macroblock field parity flag |
||
194 | // 0 = Current field is a top field |
||
195 | // 1 = Current field is a bottom field |
||
196 | |||
197 | #define REG_FIELD_MACROBLOCK_FLAG INLINE_DW0 |
||
198 | #define FIELD_MACROBLOCK_FLAG BIT14 // Bit 14 - Field macroblock flag |
||
199 | // 0 = Current macroblock is not a field macroblock |
||
200 | // 1 = Current macroblock is a field macroblock |
||
201 | #define REG_MACROBLOCK_TYPE INLINE_DW0 |
||
202 | #define MACROBLOCK_TYPE BIT12+BIT11+BIT10+BIT9+BIT8 // Bit 12:8 - Intra macroblock flag |
||
203 | |||
204 | #define REG_CHROMA_FORMAT_IDC INLINE_DW0 |
||
205 | #define CHROMA_FORMAT_IDC BIT3+BIT2 // Bit 3:2 - Chroma format |
||
206 | // 00 = Luma only (Monochrome) |
||
207 | // 01 = YUV420 |
||
208 | // 10 = YUV422 |
||
209 | // 11 = YUV444 |
||
210 | #define REG_MBAFF_PIC INLINE_DW0 |
||
211 | #define MBAFF_PIC BIT1 // Bit 1 - MBAFF Frame picture |
||
212 | // 0 = Not an MBAFF frame picture |
||
213 | // 1 = An MBAFF frame picture |
||
214 | #define REG_INTRA_PRED_8X8_BLK2_AVAIL_FLAG INLINE_DW0 |
||
215 | #define INTRA_PRED_8X8_BLK2_AVAIL_FLAG BIT4 // Bit 4: Pixel available for block 2 in an intra_8x8 MB. |
||
216 | |||
217 | // In-line DWORD 1 |
||
218 | #define ORIX REG_INLINE.4 // :ub, H. origin of the macroblock in macroblock unit |
||
219 | #define ORIY REG_INLINE.5 // :ub, V. origin of the macroblock in macroblock unit |
||
220 | |||
221 | // In-line DWORD 2 |
||
222 | #define REG_CBPCYB REG_INLINE.9 // :ub, Coded block pattern |
||
223 | #define REG_CBPCY INLINE_DW2 // Bits 13:8 - Coded block pattern |
||
224 | // reflect Y0, Y1, Y2, Y3, Cb4, Cr5 |
||
225 | // Bit 13 - Y0 |
||
226 | // Bit 12 - Y1 |
||
227 | // Bit 11 - Y2 |
||
228 | // Bit 10 - Y3 |
||
229 | // Bit 9 - U4 |
||
230 | // Bit 8 - V5 |
||
231 | #define CBP_MASK 0x3F00:ud // Bit mask for all CBP bits |
||
232 | #define CBP_Y_MASK 0x3C00:ud // Bit mask for CBP Y bits |
||
233 | #define CBP_UV_MASK 0x0300:ud // Bit mask for CBP U/V bits |
||
234 | |||
235 | #define CBP_Y0_MASK BIT13:ud // Bit mask for CBP Y0 bit |
||
236 | #define CBP_Y1_MASK BIT12:ud // Bit mask for CBP Y1 bit |
||
237 | #define CBP_Y2_MASK BIT11:ud // Bit mask for CBP Y2 bit |
||
238 | #define CBP_Y3_MASK BIT10:ud // Bit mask for CBP Y3 bit |
||
239 | #define CBP_U_MASK BIT9:ud // Bit mask for CBP U bit |
||
240 | #define CBP_V_MASK BIT8:ud // Bit mask for CBP V bit |
||
241 | |||
242 | // In-line DWORD 3 |
||
243 | #define REG_INTRA_CHROMA_PRED_MODE REG_INLINE.12 // :ub - Intra chroma prediction mode |
||
244 | #define INTRA_CHROMA_PRED_MODE BIT7+BIT6 // Bit 7:6 - Intra chroma prediction mode |
||
245 | // 00 = Intra DC prediction |
||
246 | // 01 = Intra horizontal prediction |
||
247 | // 10 = Intra vertical prediction |
||
248 | // 11 = Intra plane prediction |
||
249 | #define INTRA_CHROMA_PRED_MODE_SHIFT 6 // Intra chroma prediction mode shift |
||
250 | |||
251 | #define REG_INTRA_PRED_AVAIL_FLAG INLINE_DW3 |
||
252 | #define INTRA_PRED_AVAIL_FLAG BIT4+BIT3+BIT2+BIT1+BIT0 // Bits 4:0 - Intra prediction available flag |
||
253 | // Bit 0: Macroblock A (the left neighbor) entire or top half |
||
254 | // Bit 1: Macroblock B (the upper neighbor) |
||
255 | // Bit 2: Macroblock C (the above-right neighbor) |
||
256 | // Bit 3: Macroblock D (the above-left neighbor) |
||
257 | // Bit 4: Macroblock A (the left neighbor) bottom half |
||
258 | // Each bit is defined below |
||
259 | // 0 = The macroblock is not available for intra prediction |
||
260 | // 1 = The macroblock is available for intra prediction |
||
261 | #define INTRA_PRED_LEFT_TH_AVAIL_FLAG BIT0 // Bit 0: Macroblock A (the left neighbor) entire or top half |
||
262 | #define INTRA_PRED_UP_AVAIL_FLAG BIT1 // Bit 1: Macroblock B (the upper neighbor) |
||
263 | #define INTRA_PRED_UP_RIGHT_AVAIL_FLAG BIT2 // Bit 2: Macroblock C (the above-right neighbor) |
||
264 | #define INTRA_PRED_UP_LEFT_AVAIL_FLAG BIT3 // Bit 3: Macroblock D (the above-left neighbor) |
||
265 | #define INTRA_PRED_LEFT_BH_AVAIL_FLAG BIT4 // Bit 4: Macroblock A (the left neighbor) bottom half |
||
266 | //#define INTRA_PRED_8X8_BLK2_AVAIL_FLAG BIT5 // Bit 5: Pixel available for block 2 in an intra_8x8 MB. |
||
267 | #define REG_INTRA_PRED_AVAIL_FLAG_BYTE REG_INLINE.12 // Byte location of Intra_Pred_Avail_Flag |
||
268 | #define REG_INTRA_PRED_AVAIL_FLAG_WORD REG_INLINE.6 // Word location of Intra_Pred_Avail_Flag |
||
269 | |||
270 | |||
271 | .declare INTRA_PRED_MODE Base=REG_INLINE.16 ElementSize=1 SrcRegion=REGION(16,1) Type=ub // Intra prediction mode |
||
272 | |||
273 | // End of intra_header.inc |
||
274 | |||
275 | #endif // !defined(__INTRA_HEADER__)0;1,0>0;1,0>0;1,0>0;1,0>0;1,0>0;1,0>0;1,0>0;1,0>1>1>1>2010> |
||
276 |