OSDN Git Service

add init kernel, set curbe, send surface for gen8 avc encoder
[android-x86/hardware-intel-common-vaapi.git] / src / i965_avc_encoder_common.c
1
2 /*
3  * Copyright @ 2017 Intel Corporation
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the
7  * "Software"), to deal in the Software without restriction, including
8  * without limitation the rights to use, copy, modify, merge, publish,
9  * distribute, sub license, and/or sell copies of the Software, and to
10  * permit persons to whom the Software is furnished to do so, subject to
11  * the following conditions:
12  *
13  * The above copyright notice and this permission notice (including the
14  * next paragraph) shall be included in all copies or substantial portions
15  * of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
20  * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
21  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23  * SOFTWAR OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24  *
25  * Authors:
26  *     Pengfei Qu <Pengfei.Qu@intel.com>
27  *
28  */
29
30 #include "i965_avc_encoder_common.h"
31 int
32 i965_avc_get_max_mbps(int level_idc)
33 {
34     int max_mbps = 11880;
35
36     switch (level_idc) {
37     case INTEL_AVC_LEVEL_2:
38         max_mbps = 11880;
39         break;
40
41     case INTEL_AVC_LEVEL_21:
42         max_mbps = 19800;
43         break;
44
45     case INTEL_AVC_LEVEL_22:
46         max_mbps = 20250;
47         break;
48
49     case INTEL_AVC_LEVEL_3:
50         max_mbps = 40500;
51         break;
52
53     case INTEL_AVC_LEVEL_31:
54         max_mbps = 108000;
55         break;
56
57     case INTEL_AVC_LEVEL_32:
58         max_mbps = 216000;
59         break;
60
61     case INTEL_AVC_LEVEL_4:
62     case INTEL_AVC_LEVEL_41:
63         max_mbps = 245760;
64         break;
65
66     case INTEL_AVC_LEVEL_42:
67         max_mbps = 522240;
68         break;
69
70     case INTEL_AVC_LEVEL_5:
71         max_mbps = 589824;
72         break;
73
74     case INTEL_AVC_LEVEL_51:
75         max_mbps = 983040;
76         break;
77
78     case INTEL_AVC_LEVEL_52:
79         max_mbps = 2073600;
80         break;
81
82     default:
83         break;
84     }
85
86     return max_mbps;
87 };
88
89 unsigned int
90 i965_avc_get_profile_level_max_frame(struct avc_param * param,
91                                      int level_idc)
92 {
93     double bits_per_mb, tmpf;
94     int max_mbps, num_mb_per_frame;
95     uint64_t max_byte_per_frame0, max_byte_per_frame1;
96     unsigned int ret;
97     unsigned int scale_factor = 4;
98
99
100     if (level_idc >= INTEL_AVC_LEVEL_31 && level_idc <= INTEL_AVC_LEVEL_4)
101         bits_per_mb = 96.0;
102     else {
103         bits_per_mb = 192.0;
104         scale_factor = 2;
105
106     }
107
108     max_mbps = i965_avc_get_max_mbps(level_idc);
109     num_mb_per_frame = param->frame_width_in_mbs * param->frame_height_in_mbs;
110
111     tmpf = (double)num_mb_per_frame;
112
113     if (tmpf < max_mbps / 172.0)
114         tmpf = max_mbps / 172.0;
115
116     max_byte_per_frame0 = (uint64_t)(tmpf * bits_per_mb);
117     max_byte_per_frame1 = (uint64_t)(((double)max_mbps * 100) / param->frames_per_100s * bits_per_mb);
118
119     /* TODO: check VAEncMiscParameterTypeMaxFrameSize */
120     ret = (unsigned int)MIN(max_byte_per_frame0, max_byte_per_frame1);
121     ret = (unsigned int)MIN(ret, param->frame_width_in_pixel * param->frame_height_in_pixel * 3 / (2 * scale_factor));
122
123     return ret;
124 }
125
126 int
127 i965_avc_calculate_initial_qp(struct avc_param * param)
128 {
129     float x0 = 0, y0 = 1.19f, x1 = 1.75f, y1 = 1.75f;
130     unsigned frame_size;
131     int qp, delat_qp;
132
133     frame_size = (param->frame_width_in_pixel * param->frame_height_in_pixel * 3 / 2);
134     qp = (int)(1.0 / 1.2 * pow(10.0,
135                                (log10(frame_size * 2.0 / 3.0 * ((float)param->frames_per_100s) /
136                                       ((float)(param->target_bit_rate * 1000) * 100)) - x0) *
137                                (y1 - y0) / (x1 - x0) + y0) + 0.5);
138     qp += 2;
139     delat_qp = (int)(9 - (param->vbv_buffer_size_in_bit * ((float)param->frames_per_100s) /
140                           ((float)(param->target_bit_rate * 1000) * 100)));
141     if (delat_qp > 0)
142         qp += delat_qp;
143
144     qp = CLAMP(1, 51, qp);
145     qp--;
146
147     if (qp < 0)
148         qp = 1;
149
150     return qp;
151 }
152
153 int
154 i965_avc_get_max_v_mv_r(int level_idc)
155 {
156     int max_v_mv_r = 128 * 4;
157
158     // See JVT Spec Annex A Table A-1 Level limits for below mapping
159     // MaxVmvR is in luma quarter pel unit
160     switch (level_idc) {
161     case INTEL_AVC_LEVEL_1:
162         max_v_mv_r = 64 * 4;
163         break;
164     case INTEL_AVC_LEVEL_11:
165     case INTEL_AVC_LEVEL_12:
166     case INTEL_AVC_LEVEL_13:
167     case INTEL_AVC_LEVEL_2:
168         max_v_mv_r = 128 * 4;
169         break;
170     case INTEL_AVC_LEVEL_21:
171     case INTEL_AVC_LEVEL_22:
172     case INTEL_AVC_LEVEL_3:
173         max_v_mv_r = 256 * 4;
174         break;
175     case INTEL_AVC_LEVEL_31:
176     case INTEL_AVC_LEVEL_32:
177     case INTEL_AVC_LEVEL_4:
178     case INTEL_AVC_LEVEL_41:
179     case INTEL_AVC_LEVEL_42:
180     case INTEL_AVC_LEVEL_5:
181     case INTEL_AVC_LEVEL_51:
182     case INTEL_AVC_LEVEL_52:
183         max_v_mv_r = 512 * 4;
184         break;
185     default:
186         assert(0);
187         break;
188     }
189
190     return max_v_mv_r;
191 }
192
193 int
194 i965_avc_get_max_mv_len(int level_idc)
195 {
196     int max_mv_len = 127;
197
198     // See JVT Spec Annex A Table A-1 Level limits for below mapping
199     // MaxVmvR is in luma quarter pel unit
200     switch (level_idc) {
201     case INTEL_AVC_LEVEL_1:
202         max_mv_len = 63;
203         break;
204     case INTEL_AVC_LEVEL_11:
205     case INTEL_AVC_LEVEL_12:
206     case INTEL_AVC_LEVEL_13:
207     case INTEL_AVC_LEVEL_2:
208         max_mv_len = 127;
209         break;
210     case INTEL_AVC_LEVEL_21:
211     case INTEL_AVC_LEVEL_22:
212     case INTEL_AVC_LEVEL_3:
213         max_mv_len = 255;
214         break;
215     case INTEL_AVC_LEVEL_31:
216     case INTEL_AVC_LEVEL_32:
217     case INTEL_AVC_LEVEL_4:
218     case INTEL_AVC_LEVEL_41:
219     case INTEL_AVC_LEVEL_42:
220     case INTEL_AVC_LEVEL_5:
221     case INTEL_AVC_LEVEL_51:
222     case INTEL_AVC_LEVEL_52:
223         max_mv_len = 511;
224         break;
225     default:
226         assert(0);
227         break;
228     }
229
230     return max_mv_len;
231 }
232
233 int
234 i965_avc_get_max_mv_per_2mb(int level_idc)
235 {
236     unsigned int max_mv_per_2mb = 32;
237
238     // See JVT Spec Annex A Table A-1 Level limits for below mapping
239     switch (level_idc) {
240     case INTEL_AVC_LEVEL_3:
241         max_mv_per_2mb = 32;
242         break;
243     case INTEL_AVC_LEVEL_31:
244     case INTEL_AVC_LEVEL_32:
245     case INTEL_AVC_LEVEL_4:
246     case INTEL_AVC_LEVEL_41:
247     case INTEL_AVC_LEVEL_42:
248     case INTEL_AVC_LEVEL_5:
249     case INTEL_AVC_LEVEL_51:
250     case INTEL_AVC_LEVEL_52:
251         max_mv_per_2mb = 16;
252         break;
253     default:
254         break;
255     }
256
257     return max_mv_per_2mb;
258 }
259
260 unsigned short
261 i965_avc_calc_skip_value(unsigned int enc_block_based_sip_en, unsigned int transform_8x8_flag, unsigned short skip_value)
262 {
263     if (!enc_block_based_sip_en) {
264         skip_value *= 3;
265     } else if (!transform_8x8_flag) {
266         skip_value /= 2;
267     }
268
269     return skip_value;
270 }
271
272 unsigned short i965_avc_get_maxnum_slices_num(int profile_idc, int level_idc, unsigned int frames_per_100s)
273 {
274     unsigned int  slice_num = 0;
275
276     if ((profile_idc == VAProfileH264Main) ||
277         (profile_idc == VAProfileH264High)) {
278         switch (level_idc) {
279         case INTEL_AVC_LEVEL_3:
280             slice_num = (unsigned int)(40500.0 * 100 / 22.0 / frames_per_100s);
281             break;
282         case INTEL_AVC_LEVEL_31:
283             slice_num = (unsigned int)(108000.0 * 100 / 60.0 / frames_per_100s);
284             break;
285         case INTEL_AVC_LEVEL_32:
286             slice_num = (unsigned int)(216000.0 * 100 / 60.0 / frames_per_100s);
287             break;
288         case INTEL_AVC_LEVEL_4:
289         case INTEL_AVC_LEVEL_41:
290             slice_num = (unsigned int)(245760.0 * 100 / 24.0 / frames_per_100s);
291             break;
292         case INTEL_AVC_LEVEL_42:
293             slice_num = (unsigned int)(522240.0 * 100 / 24.0 / frames_per_100s);
294             break;
295         case INTEL_AVC_LEVEL_5:
296             slice_num = (unsigned int)(589824.0 * 100 / 24.0 / frames_per_100s);
297             break;
298         case INTEL_AVC_LEVEL_51:
299             slice_num = (unsigned int)(983040.0 * 100 / 24.0 / frames_per_100s);
300             break;
301         case INTEL_AVC_LEVEL_52:
302             slice_num = (unsigned int)(2073600.0 * 100 / 24.0 / frames_per_100s);
303             break;
304         default:
305             slice_num = 0;
306         }
307     }
308
309     return slice_num;
310 }