blob: 76f0d187e4e5f66be0ee35c54ab9d449517db818 [file] [log] [blame]
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 */
13#include <linux/slab.h>
14#include "msm_vidc_internal.h"
15#include "msm_vidc_common.h"
16#include "vidc_hfi_api.h"
17#include "msm_vidc_debug.h"
18#include "msm_vidc_clocks.h"
19
20#define MSM_VENC_DVC_NAME "msm_venc_8974"
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -080021#define MIN_BIT_RATE 32000
22#define MAX_BIT_RATE 300000000
23#define DEFAULT_BIT_RATE 64000
24#define BIT_RATE_STEP 100
25#define DEFAULT_FRAME_RATE 15
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -080026#define OPERATING_FRAME_RATE_STEP (1 << 16)
27#define MAX_SLICE_BYTE_SIZE ((MAX_BIT_RATE)>>3)
28#define MIN_SLICE_BYTE_SIZE 512
29#define MAX_SLICE_MB_SIZE ((4096 * 2304) >> 8)
Praneeth Paladugu7fbd2792017-01-27 13:39:03 -080030#define I_FRAME_QP 127
31#define P_FRAME_QP 127
32#define B_FRAME_QP 127
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -080033#define MAX_INTRA_REFRESH_MBS ((4096 * 2304) >> 8)
34#define MAX_NUM_B_FRAMES 4
35#define MAX_LTR_FRAME_COUNT 10
36#define MAX_HYBRID_HIER_P_LAYERS 6
37
38#define L_MODE V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED_AT_SLICE_BOUNDARY
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -080039#define MIN_TIME_RESOLUTION 1
40#define MAX_TIME_RESOLUTION 0xFFFFFF
41#define DEFAULT_TIME_RESOLUTION 0x7530
Praneeth Paladugu6e637472017-05-16 16:06:46 -070042#define MIN_NUM_ENC_OUTPUT_BUFFERS 4
43#define MIN_NUM_ENC_CAPTURE_BUFFERS 5
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -080044
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -080045static const char *const mpeg_video_rate_control[] = {
46 "No Rate Control",
47 "VBR VFR",
48 "VBR CFR",
49 "CBR VFR",
50 "CBR CFR",
51 "MBR CFR",
52 "MBR VFR",
53 NULL
54};
55
56static const char *const mpeg_video_rotation[] = {
57 "No Rotation",
58 "90 Degree Rotation",
59 "180 Degree Rotation",
60 "270 Degree Rotation",
61 NULL
62};
63
64static const char *const h264_video_entropy_cabac_model[] = {
65 "Model 0",
66 "Model 1",
67 "Model 2",
68 NULL
69};
70
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -080071static const char *const hevc_tier_level[] = {
72 "Main Tier Level 1",
73 "Main Tier Level 2",
74 "Main Tier Level 2.1",
75 "Main Tier Level 3",
76 "Main Tier Level 3.1",
77 "Main Tier Level 4",
78 "Main Tier Level 4.1",
79 "Main Tier Level 5",
80 "Main Tier Level 5.1",
81 "Main Tier Level 5.2",
82 "Main Tier Level 6",
83 "Main Tier Level 6.1",
84 "Main Tier Level 6.2",
85 "High Tier Level 1",
86 "High Tier Level 2",
87 "High Tier Level 2.1",
88 "High Tier Level 3",
89 "High Tier Level 3.1",
90 "High Tier Level 4",
91 "High Tier Level 4.1",
92 "High Tier Level 5",
93 "High Tier Level 5.1",
94 "High Tier Level 5.2",
95 "High Tier Level 6",
96 "High Tier Level 6.1",
97 "High Tier Level 6.2",
Vaibhav Deshu Venkateshce585582017-05-18 13:45:33 -070098 "Level unknown",
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -080099};
100
Surajit Poddere502daa2017-05-30 19:17:45 +0530101static const char *const tme_profile[] = {
102 "0",
103 "1",
104 "2",
105 "3",
106};
107
108static const char *const tme_level[] = {
109 "Integer",
110};
111
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800112static const char *const hevc_profile[] = {
113 "Main",
114 "Main10",
115 "Main Still Pic",
116};
117
118static const char *const vp8_profile_level[] = {
119 "Unused",
120 "0.0",
121 "1.0",
122 "2.0",
123 "3.0",
124};
125
126static const char *const perf_level[] = {
127 "Nominal",
128 "Performance",
129 "Turbo"
130};
131
132static const char *const mbi_statistics[] = {
133 "Camcorder Default",
134 "Mode 1",
135 "Mode 2",
136 "Mode 3"
137};
138
139static const char *const intra_refresh_modes[] = {
140 "None",
141 "Cyclic",
142 "Adaptive",
143 "Cyclic Adaptive",
144 "Random"
145};
146
147static const char *const timestamp_mode[] = {
148 "Honor",
149 "Ignore",
150};
151
152static const char *const iframe_sizes[] = {
153 "Default",
154 "Medium",
155 "Huge",
156 "Unlimited"
157};
158
159static struct msm_vidc_ctrl msm_venc_ctrls[] = {
160 {
161 .id = V4L2_CID_MPEG_VIDC_VIDEO_IDR_PERIOD,
162 .name = "IDR Period",
163 .type = V4L2_CTRL_TYPE_INTEGER,
164 .minimum = 1,
165 .maximum = INT_MAX,
166 .default_value = DEFAULT_FRAME_RATE,
167 .step = 1,
168 .menu_skip_mask = 0,
169 .qmenu = NULL,
170 },
171 {
172 .id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_P_FRAMES,
173 .name = "Intra Period for P frames",
174 .type = V4L2_CTRL_TYPE_INTEGER,
175 .minimum = 0,
176 .maximum = INT_MAX,
177 .default_value = 2*DEFAULT_FRAME_RATE-1,
178 .step = 1,
179 .menu_skip_mask = 0,
180 .qmenu = NULL,
181 },
182 {
Praneeth Paladugu7fbd2792017-01-27 13:39:03 -0800183 .id = V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP,
184 .name = "I Frame Quantization",
185 .type = V4L2_CTRL_TYPE_INTEGER,
186 .minimum = 1,
187 .maximum = 127,
188 .default_value = I_FRAME_QP,
189 .step = 1,
190 .menu_skip_mask = 0,
191 .qmenu = NULL,
192 },
193 {
194 .id = V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP,
195 .name = "P Frame Quantization",
196 .type = V4L2_CTRL_TYPE_INTEGER,
197 .minimum = 1,
198 .maximum = 127,
199 .default_value = P_FRAME_QP,
200 .step = 1,
201 .menu_skip_mask = 0,
202 .qmenu = NULL,
203 },
204 {
205 .id = V4L2_CID_MPEG_VIDC_VIDEO_B_FRAME_QP,
206 .name = "B Frame Quantization",
207 .type = V4L2_CTRL_TYPE_INTEGER,
208 .minimum = 1,
209 .maximum = 127,
210 .default_value = B_FRAME_QP,
211 .step = 1,
212 .menu_skip_mask = 0,
213 .qmenu = NULL,
214 },
215 {
216 .id = V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP_MIN,
217 .name = "I Frame Quantization Range Minimum",
218 .type = V4L2_CTRL_TYPE_INTEGER,
219 .minimum = 1,
220 .maximum = 127,
221 .default_value = I_FRAME_QP,
222 .step = 1,
223 .menu_skip_mask = 0,
224 .qmenu = NULL,
225 },
226 {
227 .id = V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP_MIN,
228 .name = "P Frame Quantization Range Minimum",
229 .type = V4L2_CTRL_TYPE_INTEGER,
230 .minimum = 1,
231 .maximum = 127,
232 .default_value = P_FRAME_QP,
233 .step = 1,
234 .menu_skip_mask = 0,
235 .qmenu = NULL,
236 },
237 {
238 .id = V4L2_CID_MPEG_VIDC_VIDEO_B_FRAME_QP_MIN,
239 .name = "B Frame Quantization Range Minimum",
240 .type = V4L2_CTRL_TYPE_INTEGER,
241 .minimum = 1,
242 .maximum = 127,
243 .default_value = B_FRAME_QP,
244 .step = 1,
245 .menu_skip_mask = 0,
246 .qmenu = NULL,
247 },
248 {
249 .id = V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP_MAX,
250 .name = "I Frame Quantization Range Maximum",
251 .type = V4L2_CTRL_TYPE_INTEGER,
252 .minimum = 1,
253 .maximum = 127,
254 .default_value = I_FRAME_QP,
255 .step = 1,
256 .menu_skip_mask = 0,
257 .qmenu = NULL,
258 },
259 {
260 .id = V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP_MAX,
261 .name = "P Frame Quantization Range Maximum",
262 .type = V4L2_CTRL_TYPE_INTEGER,
263 .minimum = 1,
264 .maximum = 127,
265 .default_value = P_FRAME_QP,
266 .step = 1,
267 .menu_skip_mask = 0,
268 .qmenu = NULL,
269 },
270 {
271 .id = V4L2_CID_MPEG_VIDC_VIDEO_B_FRAME_QP_MAX,
272 .name = "B Frame Quantization Range Maximum",
273 .type = V4L2_CTRL_TYPE_INTEGER,
274 .minimum = 1,
275 .maximum = 127,
276 .default_value = B_FRAME_QP,
277 .step = 1,
278 .menu_skip_mask = 0,
279 .qmenu = NULL,
280 },
281 {
Vaibhav Deshu Venkatesh3a147162017-04-27 16:21:12 -0700282 .id = V4L2_CID_MPEG_VIDC_VIDEO_QP_MASK,
283 .name = "QP mask for diff frame types",
284 .type = V4L2_CTRL_TYPE_INTEGER,
285 .minimum = 1,
286 .maximum = 7,
287 .default_value = 7,
288 .step = 1,
289 .menu_skip_mask = 0,
290 .qmenu = NULL,
291 },
292 {
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800293 .id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_B_FRAMES,
294 .name = "Intra Period for B frames",
295 .type = V4L2_CTRL_TYPE_INTEGER,
296 .minimum = 0,
297 .maximum = INT_MAX,
298 .default_value = 0,
299 .step = 1,
300 .menu_skip_mask = 0,
301 .qmenu = NULL,
302 },
303 {
Praneeth Paladugudefea4e2017-02-09 23:44:08 -0800304 .id = V4L2_CID_MIN_BUFFERS_FOR_CAPTURE,
305 .name = "CAPTURE Count",
306 .type = V4L2_CTRL_TYPE_INTEGER,
307 .minimum = MIN_NUM_CAPTURE_BUFFERS,
308 .maximum = MAX_NUM_CAPTURE_BUFFERS,
309 .default_value = MIN_NUM_CAPTURE_BUFFERS,
310 .step = 1,
311 .menu_skip_mask = 0,
312 .qmenu = NULL,
313 .flags = V4L2_CTRL_FLAG_VOLATILE,
314 },
315 {
316 .id = V4L2_CID_MIN_BUFFERS_FOR_OUTPUT,
317 .name = "OUTPUT Count",
318 .type = V4L2_CTRL_TYPE_INTEGER,
319 .minimum = MIN_NUM_OUTPUT_BUFFERS,
320 .maximum = MAX_NUM_OUTPUT_BUFFERS,
321 .default_value = MIN_NUM_OUTPUT_BUFFERS,
322 .step = 1,
323 .menu_skip_mask = 0,
324 .qmenu = NULL,
325 .flags = V4L2_CTRL_FLAG_VOLATILE,
326 },
327
328 {
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800329 .id = V4L2_CID_MPEG_VIDC_VIDEO_REQUEST_IFRAME,
330 .name = "Request I Frame",
331 .type = V4L2_CTRL_TYPE_BUTTON,
332 .minimum = 0,
333 .maximum = 0,
334 .default_value = 0,
335 .step = 0,
336 .menu_skip_mask = 0,
337 .qmenu = NULL,
338 },
339 {
340 .id = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL,
341 .name = "Video Framerate and Bitrate Control",
342 .type = V4L2_CTRL_TYPE_MENU,
343 .minimum = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_OFF,
344 .maximum = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_MBR_VFR,
345 .default_value = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_OFF,
346 .step = 0,
347 .menu_skip_mask = ~(
348 (1 << V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_OFF) |
349 (1 << V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_VBR_VFR) |
350 (1 << V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_VBR_CFR) |
351 (1 << V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_CBR_VFR) |
352 (1 << V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_CBR_CFR) |
353 (1 << V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_MBR_CFR) |
354 (1 << V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_MBR_VFR)
355 ),
356 .qmenu = mpeg_video_rate_control,
357 },
358 {
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800359 .id = V4L2_CID_MPEG_VIDEO_BITRATE,
360 .name = "Bit Rate",
361 .type = V4L2_CTRL_TYPE_INTEGER,
362 .minimum = MIN_BIT_RATE,
363 .maximum = MAX_BIT_RATE,
364 .default_value = DEFAULT_BIT_RATE,
365 .step = BIT_RATE_STEP,
366 .menu_skip_mask = 0,
367 .qmenu = NULL,
368 },
369 {
370 .id = V4L2_CID_MPEG_VIDEO_BITRATE_PEAK,
371 .name = "Peak Bit Rate",
372 .type = V4L2_CTRL_TYPE_INTEGER,
373 .minimum = MIN_BIT_RATE,
374 .maximum = MAX_BIT_RATE,
375 .default_value = DEFAULT_BIT_RATE,
376 .step = BIT_RATE_STEP,
377 .menu_skip_mask = 0,
378 .qmenu = NULL,
379 },
380 {
381 .id = V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE,
382 .name = "Entropy Mode",
383 .type = V4L2_CTRL_TYPE_MENU,
384 .minimum = V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC,
385 .maximum = V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC,
386 .default_value = V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC,
387 .menu_skip_mask = ~(
388 (1 << V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC) |
389 (1 << V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC)
390 ),
391 },
392 {
393 .id = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL,
394 .name = "CABAC Model",
395 .type = V4L2_CTRL_TYPE_MENU,
396 .minimum = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_0,
397 .maximum = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_1,
398 .default_value = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_0,
399 .menu_skip_mask = ~(
400 (1 << V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_0) |
401 (1 << V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_1) |
402 (1 << V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_2)
403 ),
404 .qmenu = h264_video_entropy_cabac_model,
405 },
406 {
407 .id = V4L2_CID_MPEG_VIDEO_H264_PROFILE,
408 .name = "H264 Profile",
409 .type = V4L2_CTRL_TYPE_MENU,
410 .minimum = V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE,
411 .maximum = V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_HIGH,
412 .default_value = V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE,
413 .menu_skip_mask = 0,
414 },
415 {
416 .id = V4L2_CID_MPEG_VIDEO_H264_LEVEL,
417 .name = "H264 Level",
418 .type = V4L2_CTRL_TYPE_MENU,
419 .minimum = V4L2_MPEG_VIDEO_H264_LEVEL_1_0,
Vaibhav Deshu Venkatesh234b4dc2017-03-21 16:54:28 -0700420 .maximum = V4L2_MPEG_VIDEO_H264_LEVEL_UNKNOWN,
421 .default_value = V4L2_MPEG_VIDEO_H264_LEVEL_UNKNOWN,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800422 .menu_skip_mask = 0,
423 },
424 {
425 .id = V4L2_CID_MPEG_VIDC_VIDEO_VP8_PROFILE_LEVEL,
426 .name = "VP8 Profile Level",
427 .type = V4L2_CTRL_TYPE_MENU,
428 .minimum = V4L2_MPEG_VIDC_VIDEO_VP8_UNUSED,
Chinmay Sawarkar7f1cc152017-05-05 18:16:36 -0700429 .maximum = V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_3,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800430 .default_value = V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_0,
Chinmay Sawarkar7f1cc152017-05-05 18:16:36 -0700431 .menu_skip_mask = 0,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800432 .qmenu = vp8_profile_level,
433 },
434 {
435 .id = V4L2_CID_MPEG_VIDC_VIDEO_HEVC_PROFILE,
436 .name = "HEVC Profile",
437 .type = V4L2_CTRL_TYPE_MENU,
438 .minimum = V4L2_MPEG_VIDC_VIDEO_HEVC_PROFILE_MAIN,
439 .maximum = V4L2_MPEG_VIDC_VIDEO_HEVC_PROFILE_MAIN_STILL_PIC,
440 .default_value = V4L2_MPEG_VIDC_VIDEO_HEVC_PROFILE_MAIN,
441 .menu_skip_mask = ~(
442 (1 << V4L2_MPEG_VIDC_VIDEO_HEVC_PROFILE_MAIN) |
443 (1 << V4L2_MPEG_VIDC_VIDEO_HEVC_PROFILE_MAIN10) |
444 (1 << V4L2_MPEG_VIDC_VIDEO_HEVC_PROFILE_MAIN_STILL_PIC)
445 ),
446 .qmenu = hevc_profile,
447 },
448 {
449 .id = V4L2_CID_MPEG_VIDC_VIDEO_HEVC_TIER_LEVEL,
450 .name = "HEVC Tier and Level",
451 .type = V4L2_CTRL_TYPE_MENU,
452 .minimum = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_1,
Vaibhav Deshu Venkatesh234b4dc2017-03-21 16:54:28 -0700453 .maximum = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_UNKNOWN,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800454 .default_value =
Vaibhav Deshu Venkatesh234b4dc2017-03-21 16:54:28 -0700455 V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_UNKNOWN,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800456 .menu_skip_mask = ~(
457 (1 << V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_1) |
458 (1 << V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_2) |
459 (1 << V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_2_1) |
460 (1 << V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_3) |
461 (1 << V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_3_1) |
462 (1 << V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_4) |
463 (1 << V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_4_1) |
464 (1 << V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_5) |
465 (1 << V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_5_1) |
466 (1 << V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_5_2) |
467 (1 << V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_1) |
468 (1 << V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_2) |
469 (1 << V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_2_1) |
470 (1 << V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_3) |
471 (1 << V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_3_1) |
472 (1 << V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_4) |
473 (1 << V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_4_1) |
474 (1 << V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_5) |
Vaibhav Deshu Venkatesh234b4dc2017-03-21 16:54:28 -0700475 (1 << V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_5_1) |
476 (1 << V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_UNKNOWN)
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800477 ),
478 .qmenu = hevc_tier_level,
479 },
480 {
Surajit Poddere502daa2017-05-30 19:17:45 +0530481 .id = V4L2_CID_MPEG_VIDC_VIDEO_TME_PROFILE,
482 .name = "TME Profile",
483 .type = V4L2_CTRL_TYPE_MENU,
484 .minimum = V4L2_MPEG_VIDC_VIDEO_TME_PROFILE_0,
485 .maximum = V4L2_MPEG_VIDC_VIDEO_TME_PROFILE_3,
486 .default_value =
487 V4L2_MPEG_VIDC_VIDEO_TME_PROFILE_0,
488 .menu_skip_mask = ~(
489 (1 << V4L2_MPEG_VIDC_VIDEO_TME_PROFILE_0) |
490 (1 << V4L2_MPEG_VIDC_VIDEO_TME_PROFILE_1) |
491 (1 << V4L2_MPEG_VIDC_VIDEO_TME_PROFILE_2) |
492 (1 << V4L2_MPEG_VIDC_VIDEO_TME_PROFILE_3)
493 ),
494 .qmenu = tme_profile,
495 },
496 {
497 .id = V4L2_CID_MPEG_VIDC_VIDEO_TME_LEVEL,
498 .name = "TME Level",
499 .type = V4L2_CTRL_TYPE_MENU,
500 .minimum = V4L2_MPEG_VIDC_VIDEO_TME_LEVEL_INTEGER,
501 .maximum = V4L2_MPEG_VIDC_VIDEO_TME_LEVEL_INTEGER,
502 .default_value = V4L2_MPEG_VIDC_VIDEO_TME_LEVEL_INTEGER,
503 .menu_skip_mask = ~(
504 (1 << V4L2_MPEG_VIDC_VIDEO_TME_LEVEL_INTEGER)
505 ),
506 .qmenu = tme_level,
507 },
508 {
509 .id = V4L2_CID_MPEG_VIDC_VIDEO_TME_PAYLOAD_VERSION,
510 .name = "TME Payload Version",
511 .type = V4L2_CTRL_TYPE_INTEGER,
512 .minimum = 0,
513 .maximum = 0xFFFFFFF,
514 .default_value = 0,
515 .step = 1,
516 .menu_skip_mask = 0,
517 .flags = V4L2_CTRL_FLAG_READ_ONLY,
518 .qmenu = NULL,
519 },
520 {
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800521 .id = V4L2_CID_MPEG_VIDC_VIDEO_ROTATION,
522 .name = "Rotation",
523 .type = V4L2_CTRL_TYPE_MENU,
524 .minimum = V4L2_CID_MPEG_VIDC_VIDEO_ROTATION_NONE,
525 .maximum = V4L2_CID_MPEG_VIDC_VIDEO_ROTATION_270,
526 .default_value = V4L2_CID_MPEG_VIDC_VIDEO_ROTATION_NONE,
527 .menu_skip_mask = ~(
528 (1 << V4L2_CID_MPEG_VIDC_VIDEO_ROTATION_NONE) |
529 (1 << V4L2_CID_MPEG_VIDC_VIDEO_ROTATION_90) |
530 (1 << V4L2_CID_MPEG_VIDC_VIDEO_ROTATION_180) |
531 (1 << V4L2_CID_MPEG_VIDC_VIDEO_ROTATION_270)
532 ),
533 .qmenu = mpeg_video_rotation,
534 },
535 {
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800536 .id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE,
537 .name = "Slice Mode",
538 .type = V4L2_CTRL_TYPE_MENU,
539 .minimum = V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE,
540 .maximum = V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_BYTES,
541 .default_value = V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE,
542 .menu_skip_mask = ~(
543 (1 << V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE) |
544 (1 << V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_MB) |
545 (1 << V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_BYTES)
546 ),
547 },
548 {
549 .id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES,
550 .name = "Slice Byte Size",
551 .type = V4L2_CTRL_TYPE_INTEGER,
552 .minimum = MIN_SLICE_BYTE_SIZE,
553 .maximum = MAX_SLICE_BYTE_SIZE,
554 .default_value = MIN_SLICE_BYTE_SIZE,
555 .step = 1,
556 .menu_skip_mask = 0,
557 .qmenu = NULL,
558 },
559 {
560 .id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB,
561 .name = "Slice MB Size",
562 .type = V4L2_CTRL_TYPE_INTEGER,
563 .minimum = 1,
564 .maximum = MAX_SLICE_MB_SIZE,
565 .default_value = 1,
566 .step = 1,
567 .menu_skip_mask = 0,
568 .qmenu = NULL,
569 },
570 {
571 .id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_DELIVERY_MODE,
572 .name = "Slice delivery mode",
573 .type = V4L2_CTRL_TYPE_BUTTON,
574 .minimum = 0,
575 .maximum = 1,
576 .default_value = 0,
577 .step = 1,
578 .menu_skip_mask = 0,
579 .qmenu = NULL,
580 },
581 {
582 .id = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_MODE,
583 .name = "Intra Refresh Mode",
584 .type = V4L2_CTRL_TYPE_MENU,
585 .minimum = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_NONE,
586 .maximum = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_RANDOM,
587 .default_value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_NONE,
588 .menu_skip_mask = ~(
589 (1 << V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_NONE) |
590 (1 << V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_CYCLIC) |
591 (1 << V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_RANDOM)
592 ),
593 .qmenu = intra_refresh_modes,
594 },
595 {
596 .id = V4L2_CID_MPEG_VIDC_VIDEO_IR_MBS,
597 .name = "Intra Refresh AIR MBS",
598 .type = V4L2_CTRL_TYPE_INTEGER,
599 .minimum = 0,
600 .maximum = MAX_INTRA_REFRESH_MBS,
601 .default_value = 0,
602 .step = 1,
603 .menu_skip_mask = 0,
604 .qmenu = NULL,
605 },
606 {
607 .id = V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA,
608 .name = "H.264 Loop Filter Alpha Offset",
609 .type = V4L2_CTRL_TYPE_INTEGER,
610 .minimum = -6,
611 .maximum = 6,
612 .default_value = 0,
613 .step = 1,
614 .menu_skip_mask = 0,
615 .qmenu = NULL,
616 },
617 {
618 .id = V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA,
619 .name = "H.264 Loop Filter Beta Offset",
620 .type = V4L2_CTRL_TYPE_INTEGER,
621 .minimum = -6,
622 .maximum = 6,
623 .default_value = 0,
624 .step = 1,
625 .menu_skip_mask = 0,
626 .qmenu = NULL,
627 },
628 {
629 .id = V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE,
630 .name = "H.264 Loop Filter Mode",
631 .type = V4L2_CTRL_TYPE_MENU,
632 .minimum = V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_ENABLED,
633 .maximum = L_MODE,
634 .default_value = V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED,
635 .menu_skip_mask = ~(
636 (1 << V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_ENABLED) |
637 (1 << V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED) |
638 (1 << L_MODE)
639 ),
640 },
641 {
642 .id = V4L2_CID_MPEG_VIDEO_HEADER_MODE,
643 .name = "Sequence Header Mode",
644 .type = V4L2_CTRL_TYPE_MENU,
645 .minimum = V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE,
646 .maximum = V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME,
647 .default_value =
648 V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME,
649 .menu_skip_mask = ~(
650 (1 << V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE) |
651 (1 << V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME)
652 ),
653 },
654 {
655 .id = V4L2_CID_MPEG_VIDC_VIDEO_SECURE,
656 .name = "Secure mode",
657 .type = V4L2_CTRL_TYPE_BUTTON,
658 .minimum = 0,
659 .maximum = 0,
660 .default_value = 0,
661 .step = 0,
662 .menu_skip_mask = 0,
663 .qmenu = NULL,
664 },
665 {
666 .id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA,
667 .name = "Extradata Type",
668 .type = V4L2_CTRL_TYPE_MENU,
669 .minimum = V4L2_MPEG_VIDC_EXTRADATA_NONE,
670 .maximum = V4L2_MPEG_VIDC_EXTRADATA_PQ_INFO,
671 .default_value = V4L2_MPEG_VIDC_EXTRADATA_NONE,
672 .menu_skip_mask = ~(
673 (1 << V4L2_MPEG_VIDC_EXTRADATA_NONE) |
674 (1 << V4L2_MPEG_VIDC_EXTRADATA_MB_QUANTIZATION) |
675 (1 << V4L2_MPEG_VIDC_EXTRADATA_INTERLACE_VIDEO) |
676 (1 << V4L2_MPEG_VIDC_EXTRADATA_TIMESTAMP) |
677 (1 << V4L2_MPEG_VIDC_EXTRADATA_S3D_FRAME_PACKING) |
678 (1 << V4L2_MPEG_VIDC_EXTRADATA_FRAME_RATE) |
679 (1 << V4L2_MPEG_VIDC_EXTRADATA_PANSCAN_WINDOW) |
680 (1 << V4L2_MPEG_VIDC_EXTRADATA_RECOVERY_POINT_SEI) |
681 (1 << V4L2_MPEG_VIDC_EXTRADATA_MULTISLICE_INFO) |
682 (1 << V4L2_MPEG_VIDC_EXTRADATA_NUM_CONCEALED_MB) |
683 (1 << V4L2_MPEG_VIDC_EXTRADATA_METADATA_FILLER) |
684 (1 << V4L2_MPEG_VIDC_EXTRADATA_INPUT_CROP) |
685 (1 << V4L2_MPEG_VIDC_EXTRADATA_DIGITAL_ZOOM) |
686 (1 << V4L2_MPEG_VIDC_EXTRADATA_ASPECT_RATIO) |
687 (1 << V4L2_MPEG_VIDC_EXTRADATA_LTR) |
688 (1 << V4L2_MPEG_VIDC_EXTRADATA_METADATA_MBI) |
689 (1 << V4L2_MPEG_VIDC_EXTRADATA_YUV_STATS)|
690 (1 << V4L2_MPEG_VIDC_EXTRADATA_ROI_QP) |
691 (1 << V4L2_MPEG_VIDC_EXTRADATA_PQ_INFO)
692 ),
693 .qmenu = mpeg_video_vidc_extradata,
694 },
695 {
696 .id = V4L2_CID_MPEG_VIDC_VIDEO_VUI_TIMING_INFO,
697 .name = "H264 VUI Timing Info",
698 .type = V4L2_CTRL_TYPE_BOOLEAN,
699 .minimum = V4L2_MPEG_VIDC_VIDEO_VUI_TIMING_INFO_DISABLED,
700 .maximum = V4L2_MPEG_VIDC_VIDEO_VUI_TIMING_INFO_ENABLED,
701 .default_value =
702 V4L2_MPEG_VIDC_VIDEO_VUI_TIMING_INFO_DISABLED,
703 .step = 1,
704 },
705 {
706 .id = V4L2_CID_MPEG_VIDC_VIDEO_AU_DELIMITER,
Umesh Pandey7fce7ee2017-03-13 17:59:48 -0700707 .name = "AU Delimiter",
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800708 .type = V4L2_CTRL_TYPE_BOOLEAN,
709 .minimum = V4L2_MPEG_VIDC_VIDEO_AU_DELIMITER_DISABLED,
710 .maximum = V4L2_MPEG_VIDC_VIDEO_AU_DELIMITER_ENABLED,
711 .step = 1,
712 .default_value =
713 V4L2_MPEG_VIDC_VIDEO_AU_DELIMITER_DISABLED,
714 },
715 {
716 .id = V4L2_CID_MPEG_VIDEO_CYCLIC_INTRA_REFRESH_MB,
717 .name = "Intra Refresh CIR MBS",
718 .type = V4L2_CTRL_TYPE_INTEGER,
719 .minimum = 0,
720 .maximum = MAX_INTRA_REFRESH_MBS,
721 .default_value = 0,
722 .step = 1,
723 .menu_skip_mask = 0,
724 .qmenu = NULL,
725 },
726 {
727 .id = V4L2_CID_MPEG_VIDC_VIDEO_PRESERVE_TEXT_QUALITY,
728 .name = "Preserve Text Qualty",
729 .type = V4L2_CTRL_TYPE_BOOLEAN,
730 .minimum = V4L2_MPEG_VIDC_VIDEO_PRESERVE_TEXT_QUALITY_DISABLED,
731 .maximum = V4L2_MPEG_VIDC_VIDEO_PRESERVE_TEXT_QUALITY_ENABLED,
732 .default_value =
733 V4L2_MPEG_VIDC_VIDEO_PRESERVE_TEXT_QUALITY_DISABLED,
734 .step = 1,
735 },
736 {
737 .id = V4L2_CID_MPEG_VIDC_VIDEO_USELTRFRAME,
738 .name = "H264 Use LTR",
739 .type = V4L2_CTRL_TYPE_INTEGER,
740 .minimum = 0,
741 .maximum = (MAX_LTR_FRAME_COUNT - 1),
742 .default_value = 0,
743 .step = 1,
744 .qmenu = NULL,
745 },
746 {
747 .id = V4L2_CID_MPEG_VIDC_VIDEO_LTRCOUNT,
748 .name = "Ltr Count",
749 .type = V4L2_CTRL_TYPE_INTEGER,
750 .minimum = 0,
751 .maximum = MAX_LTR_FRAME_COUNT,
752 .default_value = 0,
753 .step = 1,
754 .qmenu = NULL,
755 },
756 {
757 .id = V4L2_CID_MPEG_VIDC_VIDEO_LTRMODE,
758 .name = "Ltr Mode",
759 .type = V4L2_CTRL_TYPE_INTEGER,
760 .minimum = V4L2_MPEG_VIDC_VIDEO_LTR_MODE_DISABLE,
761 .maximum = V4L2_MPEG_VIDC_VIDEO_LTR_MODE_MANUAL,
762 .default_value = V4L2_MPEG_VIDC_VIDEO_LTR_MODE_DISABLE,
763 .step = 1,
764 .qmenu = NULL,
765 },
766 {
767 .id = V4L2_CID_MPEG_VIDC_VIDEO_MARKLTRFRAME,
768 .name = "H264 Mark LTR",
769 .type = V4L2_CTRL_TYPE_INTEGER,
770 .minimum = 0,
771 .maximum = (MAX_LTR_FRAME_COUNT - 1),
772 .default_value = 0,
773 .step = 1,
774 .qmenu = NULL,
775 },
776 {
777 .id = V4L2_CID_MPEG_VIDC_VIDEO_HIER_P_NUM_LAYERS,
778 .name = "Set Hier P num layers",
779 .type = V4L2_CTRL_TYPE_INTEGER,
780 .minimum = 0,
781 .maximum = 6,
782 .default_value = 0,
783 .step = 1,
784 .qmenu = NULL,
785 },
786 {
787 .id = V4L2_CID_MPEG_VIDC_VIDEO_VPX_ERROR_RESILIENCE,
788 .name = "VP8 Error Resilience mode",
789 .type = V4L2_CTRL_TYPE_BOOLEAN,
790 .minimum = V4L2_MPEG_VIDC_VIDEO_VPX_ERROR_RESILIENCE_DISABLED,
791 .maximum = V4L2_MPEG_VIDC_VIDEO_VPX_ERROR_RESILIENCE_ENABLED,
792 .default_value =
793 V4L2_MPEG_VIDC_VIDEO_VPX_ERROR_RESILIENCE_DISABLED,
794 .step = 1,
795 .qmenu = NULL,
796 },
797 {
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800798 .id = V4L2_CID_MPEG_VIDC_VIDEO_HIER_B_NUM_LAYERS,
799 .name = "Set Hier B num layers",
800 .type = V4L2_CTRL_TYPE_INTEGER,
801 .minimum = 0,
802 .maximum = 3,
803 .default_value = 0,
804 .step = 1,
805 .qmenu = NULL,
806 },
807 {
808 .id = V4L2_CID_MPEG_VIDC_VIDEO_HYBRID_HIERP_MODE,
809 .name = "Set Hybrid Hier P mode",
810 .type = V4L2_CTRL_TYPE_INTEGER,
811 .minimum = 0,
812 .maximum = 5,
813 .default_value = 0,
814 .step = 1,
815 .qmenu = NULL,
816 },
817 {
818 .id = V4L2_CID_VIDC_QBUF_MODE,
819 .name = "Allows batching of buffers for power savings",
820 .type = V4L2_CTRL_TYPE_BOOLEAN,
821 .minimum = V4L2_VIDC_QBUF_STANDARD,
822 .maximum = V4L2_VIDC_QBUF_BATCHED,
823 .default_value = V4L2_VIDC_QBUF_STANDARD,
824 .step = 1,
825 },
826 {
827 .id = V4L2_CID_MPEG_VIDC_VIDEO_MAX_HIERP_LAYERS,
828 .name = "Set Max Hier P num layers sessions",
829 .type = V4L2_CTRL_TYPE_INTEGER,
830 .minimum = 0,
831 .maximum = 6,
832 .default_value = 0,
833 .step = 1,
834 .qmenu = NULL,
835 },
836 {
837 .id = V4L2_CID_MPEG_VIDC_VIDEO_BASELAYER_ID,
838 .name = "Set Base Layer ID for Hier-P",
839 .type = V4L2_CTRL_TYPE_INTEGER,
840 .minimum = 0,
841 .maximum = 6,
842 .default_value = 0,
843 .step = 1,
844 .qmenu = NULL,
845 },
846 {
Vaibhav Deshu Venkateshd0792bc2017-03-16 14:55:51 -0700847 .id = V4L2_CID_MPEG_VIDC_VIDEO_LAYER_ID,
848 .name = "Layer ID for different settings",
849 .type = V4L2_CTRL_TYPE_INTEGER,
850 .minimum = 0,
Vaibhav Deshu Venkateshea0a6a62017-04-20 13:16:44 -0700851 .maximum = MSM_VIDC_ALL_LAYER_ID,
Vaibhav Deshu Venkateshd0792bc2017-03-16 14:55:51 -0700852 .default_value = 0,
853 .step = 1,
854 .qmenu = NULL,
855 },
856 {
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800857 .id = V4L2_CID_MPEG_VIDC_VENC_PARAM_SAR_WIDTH,
858 .name = "SAR Width",
859 .type = V4L2_CTRL_TYPE_INTEGER,
860 .minimum = 1,
861 .maximum = 4096,
862 .default_value = 1,
863 .step = 1,
864 .qmenu = NULL,
865 },
866 {
867 .id = V4L2_CID_MPEG_VIDC_VENC_PARAM_SAR_HEIGHT,
868 .name = "SAR Height",
869 .type = V4L2_CTRL_TYPE_INTEGER,
870 .minimum = 1,
871 .maximum = 2160,
872 .default_value = 1,
873 .step = 1,
874 .qmenu = NULL,
875 },
876 {
877 .id = V4L2_CID_MPEG_VIDC_VIDEO_PRIORITY,
878 .name = "Session Priority",
879 .type = V4L2_CTRL_TYPE_BOOLEAN,
880 .minimum = V4L2_MPEG_VIDC_VIDEO_PRIORITY_REALTIME_ENABLE,
881 .maximum = V4L2_MPEG_VIDC_VIDEO_PRIORITY_REALTIME_DISABLE,
882 .default_value = V4L2_MPEG_VIDC_VIDEO_PRIORITY_REALTIME_DISABLE,
883 .step = 1,
884 },
885 {
886 .id = V4L2_CID_MPEG_VIDC_VIDEO_VQZIP_SEI,
887 .name = "VQZIP SEI",
888 .type = V4L2_CTRL_TYPE_BOOLEAN,
889 .minimum = V4L2_CID_MPEG_VIDC_VIDEO_VQZIP_SEI_DISABLE,
890 .maximum = V4L2_CID_MPEG_VIDC_VIDEO_VQZIP_SEI_ENABLE,
891 .default_value = V4L2_CID_MPEG_VIDC_VIDEO_VQZIP_SEI_DISABLE,
892 .step = 1,
893 },
894 {
895 .id = V4L2_CID_MPEG_VIDC_VENC_PARAM_LAYER_BITRATE,
896 .name = "Layer wise bitrate for H264/H265 Hybrid HP",
897 .type = V4L2_CTRL_TYPE_INTEGER,
898 .minimum = MIN_BIT_RATE,
899 .maximum = MAX_BIT_RATE,
900 .default_value = DEFAULT_BIT_RATE,
901 .step = BIT_RATE_STEP,
902 .menu_skip_mask = 0,
903 .qmenu = NULL,
904 },
905 {
906 .id = V4L2_CID_MPEG_VIDC_VIDEO_OPERATING_RATE,
907 .name = "Set Encoder Operating rate",
908 .type = V4L2_CTRL_TYPE_INTEGER,
909 .minimum = 0,
Praneeth Paladugue5fd0872017-04-19 11:24:28 -0700910 .maximum = INT_MAX,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800911 .default_value = 0,
912 .step = OPERATING_FRAME_RATE_STEP,
913 },
914 {
915 .id = V4L2_CID_MPEG_VIDC_VIDEO_VENC_BITRATE_TYPE,
916 .name = "BITRATE TYPE",
917 .type = V4L2_CTRL_TYPE_BOOLEAN,
918 .minimum = V4L2_CID_MPEG_VIDC_VIDEO_VENC_BITRATE_DISABLE,
919 .maximum = V4L2_CID_MPEG_VIDC_VIDEO_VENC_BITRATE_ENABLE,
920 .default_value = V4L2_CID_MPEG_VIDC_VIDEO_VENC_BITRATE_ENABLE,
921 .step = 1,
922 },
923 {
924 .id = V4L2_CID_MPEG_VIDC_VIDEO_VPE_CSC,
925 .name = "Set VPE Color space conversion coefficients",
926 .type = V4L2_CTRL_TYPE_INTEGER,
927 .minimum = V4L2_CID_MPEG_VIDC_VIDEO_VPE_CSC_DISABLE,
928 .maximum = V4L2_CID_MPEG_VIDC_VIDEO_VPE_CSC_ENABLE,
929 .default_value = V4L2_CID_MPEG_VIDC_VIDEO_VPE_CSC_DISABLE,
930 .step = 1,
931 },
932 {
933 .id = V4L2_CID_MPEG_VIDC_VIDEO_LOWLATENCY_MODE,
934 .name = "Low Latency Mode",
935 .type = V4L2_CTRL_TYPE_BOOLEAN,
936 .minimum = V4L2_CID_MPEG_VIDC_VIDEO_LOWLATENCY_DISABLE,
937 .maximum = V4L2_CID_MPEG_VIDC_VIDEO_LOWLATENCY_ENABLE,
938 .default_value = V4L2_CID_MPEG_VIDC_VIDEO_LOWLATENCY_DISABLE,
939 .step = 1,
940 },
941 {
942 .id = V4L2_CID_MPEG_VIDC_VIDEO_BLUR_WIDTH,
943 .name = "Set Blur width",
944 .type = V4L2_CTRL_TYPE_INTEGER,
945 .minimum = 0,
946 .maximum = 2048,
947 .default_value = 0,
948 .step = 1,
949 },
950 {
951 .id = V4L2_CID_MPEG_VIDC_VIDEO_BLUR_HEIGHT,
952 .name = "Set Blur height",
953 .type = V4L2_CTRL_TYPE_INTEGER,
954 .minimum = 0,
955 .maximum = 2048,
956 .default_value = 0,
957 .step = 1,
958 },
959 {
960 .id = V4L2_CID_MPEG_VIDC_VIDEO_H264_TRANSFORM_8x8,
961 .name = "Transform 8x8",
962 .type = V4L2_CTRL_TYPE_BOOLEAN,
963 .minimum = V4L2_MPEG_VIDC_VIDEO_H264_TRANSFORM_8x8_DISABLE,
964 .maximum = V4L2_MPEG_VIDC_VIDEO_H264_TRANSFORM_8x8_ENABLE,
965 .default_value = V4L2_MPEG_VIDC_VIDEO_H264_TRANSFORM_8x8_ENABLE,
966 .step = 1,
967 },
968 {
969 .id = V4L2_CID_MPEG_VIDC_VIDEO_COLOR_SPACE,
970 .name = "Set Color space",
971 .type = V4L2_CTRL_TYPE_INTEGER,
972 .minimum = MSM_VIDC_BT709_5,
973 .maximum = MSM_VIDC_BT2020,
974 .default_value = MSM_VIDC_BT601_6_625,
975 .step = 1,
976 .qmenu = NULL,
977 },
978 {
979 .id = V4L2_CID_MPEG_VIDC_VIDEO_FULL_RANGE,
980 .name = "Set Color space range",
981 .type = V4L2_CTRL_TYPE_BOOLEAN,
982 .minimum = V4L2_CID_MPEG_VIDC_VIDEO_FULL_RANGE_DISABLE,
983 .maximum = V4L2_CID_MPEG_VIDC_VIDEO_FULL_RANGE_ENABLE,
984 .default_value = V4L2_CID_MPEG_VIDC_VIDEO_FULL_RANGE_DISABLE,
985 .step = 1,
986 },
987 {
988 .id = V4L2_CID_MPEG_VIDC_VIDEO_TRANSFER_CHARS,
989 .name = "Set Color space transfer characterstics",
990 .type = V4L2_CTRL_TYPE_INTEGER,
991 .minimum = MSM_VIDC_TRANSFER_BT709_5,
Umesh Pandeyf797f452017-06-15 16:52:38 -0700992 .maximum = MSM_VIDC_TRANSFER_HLG,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800993 .default_value = MSM_VIDC_TRANSFER_601_6_625,
994 .step = 1,
995 .qmenu = NULL,
996 },
997 {
998 .id = V4L2_CID_MPEG_VIDC_VIDEO_MATRIX_COEFFS,
999 .name = "Set Color space matrix coefficients",
1000 .type = V4L2_CTRL_TYPE_INTEGER,
1001 .minimum = MSM_VIDC_MATRIX_BT_709_5,
1002 .maximum = MSM_VIDC_MATRIX_BT_2020_CONST,
1003 .default_value = MSM_VIDC_MATRIX_601_6_625,
1004 .step = 1,
1005 .qmenu = NULL,
1006 },
1007 {
1008 .id = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_TYPE,
1009 .name = "Bounds of I-frame size",
1010 .type = V4L2_CTRL_TYPE_MENU,
1011 .minimum = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_DEFAULT,
1012 .maximum = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_UNLIMITED,
1013 .default_value = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_DEFAULT,
1014 .menu_skip_mask = ~(
1015 (1 << V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_DEFAULT) |
1016 (1 << V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_MEDIUM) |
1017 (1 << V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_HUGE) |
1018 (1 << V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_UNLIMITED)),
1019 .qmenu = iframe_sizes,
1020 },
Chinmay Sawarkar0f7cf2e2017-05-04 11:35:56 -07001021 {
1022 .id = V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE,
1023 .name = "Frame Rate based Rate Control",
1024 .type = V4L2_CTRL_TYPE_BOOLEAN,
1025 .minimum = 0,
1026 .maximum = 1,
1027 .default_value = 0,
1028 .step = 1,
1029 },
Chinmay Sawarkarddd1d972017-08-15 10:10:06 -07001030 {
1031 .id = V4L2_CID_MPEG_VIDC_VIDEO_VPE_CSC_CUSTOM_MATRIX,
1032 .name = "Enable/Disable CSC Custom Matrix",
1033 .type = V4L2_CTRL_TYPE_BOOLEAN,
1034 .minimum = 0,
1035 .maximum = 1,
1036 .default_value = 0,
1037 .step = 1,
1038 },
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001039
1040};
1041
1042#define NUM_CTRLS ARRAY_SIZE(msm_venc_ctrls)
1043
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001044static u32 get_frame_size_compressed(int plane, u32 height, u32 width)
1045{
1046 int sz = ALIGN(height, 32) * ALIGN(width, 32) * 3 / 2;
1047
1048 return ALIGN(sz, SZ_4K);
1049}
1050
1051static struct msm_vidc_format venc_formats[] = {
1052 {
1053 .name = "YCbCr Semiplanar 4:2:0",
1054 .description = "Y/CbCr 4:2:0",
1055 .fourcc = V4L2_PIX_FMT_NV12,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001056 .get_frame_size = get_frame_size_nv12,
1057 .type = OUTPUT_PORT,
1058 },
1059 {
1060 .name = "UBWC YCbCr Semiplanar 4:2:0",
1061 .description = "UBWC Y/CbCr 4:2:0",
1062 .fourcc = V4L2_PIX_FMT_NV12_UBWC,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001063 .get_frame_size = get_frame_size_nv12_ubwc,
1064 .type = OUTPUT_PORT,
1065 },
1066 {
1067 .name = "RGBA 8:8:8:8",
1068 .description = "RGBA 8:8:8:8",
1069 .fourcc = V4L2_PIX_FMT_RGB32,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001070 .get_frame_size = get_frame_size_rgba,
1071 .type = OUTPUT_PORT,
1072 },
1073 {
1074 .name = "H264",
1075 .description = "H264 compressed format",
1076 .fourcc = V4L2_PIX_FMT_H264,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001077 .get_frame_size = get_frame_size_compressed,
1078 .type = CAPTURE_PORT,
1079 },
1080 {
1081 .name = "VP8",
1082 .description = "VP8 compressed format",
1083 .fourcc = V4L2_PIX_FMT_VP8,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001084 .get_frame_size = get_frame_size_compressed,
1085 .type = CAPTURE_PORT,
1086 },
1087 {
1088 .name = "HEVC",
1089 .description = "HEVC compressed format",
1090 .fourcc = V4L2_PIX_FMT_HEVC,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001091 .get_frame_size = get_frame_size_compressed,
1092 .type = CAPTURE_PORT,
1093 },
1094 {
1095 .name = "YCrCb Semiplanar 4:2:0",
1096 .description = "Y/CrCb 4:2:0",
1097 .fourcc = V4L2_PIX_FMT_NV21,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001098 .get_frame_size = get_frame_size_nv21,
1099 .type = OUTPUT_PORT,
1100 },
Umesh Pandeyf2995f82017-05-01 16:44:45 -07001101 {
1102 .name = "TP10 UBWC 4:2:0",
1103 .description = "TP10 UBWC 4:2:0",
1104 .fourcc = V4L2_PIX_FMT_NV12_TP10_UBWC,
1105 .get_frame_size = get_frame_size_tp10_ubwc,
1106 .type = OUTPUT_PORT,
1107 },
Surajit Poddere502daa2017-05-30 19:17:45 +05301108 {
1109 .name = "TME",
1110 .description = "TME MBI format",
1111 .fourcc = V4L2_PIX_FMT_TME,
1112 .get_frame_size = get_frame_size_compressed,
1113 .type = CAPTURE_PORT,
1114 },
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001115};
1116
Chinmay Sawarkarddd1d972017-08-15 10:10:06 -07001117static int msm_venc_set_csc(struct msm_vidc_inst *inst,
1118 u32 color_primaries, u32 custom_matrix);
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001119
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001120static int msm_venc_toggle_hier_p(struct msm_vidc_inst *inst, int layers)
1121{
1122 int num_enh_layers = 0;
1123 u32 property_id = 0;
1124 struct hfi_device *hdev = NULL;
1125 int rc = 0;
1126
1127 if (!inst || !inst->core || !inst->core->device) {
1128 dprintk(VIDC_ERR, "%s invalid parameters\n", __func__);
1129 return -EINVAL;
1130 }
1131
1132 if (inst->fmts[CAPTURE_PORT].fourcc != V4L2_PIX_FMT_VP8)
1133 return 0;
1134
Chinmay Sawarkarcbd3f592017-04-10 15:42:30 -07001135 num_enh_layers = layers ? layers : 0;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001136 dprintk(VIDC_DBG, "%s Hier-P in firmware\n",
1137 num_enh_layers ? "Enable" : "Disable");
1138
1139 hdev = inst->core->device;
1140 property_id = HAL_PARAM_VENC_HIER_P_MAX_ENH_LAYERS;
1141 rc = call_hfi_op(hdev, session_set_property,
1142 (void *)inst->session, property_id,
1143 (void *)&num_enh_layers);
1144 if (rc) {
1145 dprintk(VIDC_ERR,
1146 "%s: failed with error = %d\n", __func__, rc);
1147 }
1148 return rc;
1149}
1150
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001151static struct v4l2_ctrl *get_ctrl_from_cluster(int id,
1152 struct v4l2_ctrl **cluster, int ncontrols)
1153{
1154 int c;
1155
1156 for (c = 0; c < ncontrols; ++c)
1157 if (cluster[c]->id == id)
1158 return cluster[c];
1159 return NULL;
1160}
1161
Praneeth Paladugube42cb22016-04-12 22:34:39 -07001162int msm_venc_s_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl)
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001163{
1164 int rc = 0;
1165 struct hal_request_iframe request_iframe;
1166 struct hal_bitrate bitrate;
1167 struct hal_profile_level profile_level;
1168 struct hal_h264_entropy_control h264_entropy_control;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001169 struct hal_intra_period intra_period;
1170 struct hal_idr_period idr_period;
Chinmay Sawarkar582c72a2017-05-24 14:29:12 -07001171 struct hal_vpe_rotation vpe_rotation;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001172 struct hal_intra_refresh intra_refresh;
1173 struct hal_multi_slice_control multi_slice_control;
1174 struct hal_h264_db_control h264_db_control;
1175 struct hal_enable enable;
Praneeth Paladugu7fbd2792017-01-27 13:39:03 -08001176 struct hal_quantization quant;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001177 struct hal_preserve_text_quality preserve_text_quality;
1178 u32 property_id = 0, property_val = 0;
1179 void *pdata = NULL;
1180 struct v4l2_ctrl *temp_ctrl = NULL;
1181 struct hfi_device *hdev;
1182 struct hal_extradata_enable extra;
1183 struct hal_ltr_use use_ltr;
1184 struct hal_ltr_mark mark_ltr;
1185 struct hal_hybrid_hierp hyb_hierp;
Vaibhav Deshu Venkatesha2cf1b32017-03-30 17:40:48 -07001186 u32 hier_p_layers = 0;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001187 int max_hierp_layers;
1188 int baselayerid = 0;
1189 struct hal_video_signal_info signal_info = {0};
Chinmay Sawarkard0054622017-05-04 13:50:59 -07001190 struct hal_vui_timing_info vui_timing_info = {0};
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001191 enum hal_iframesize_type iframesize_type = HAL_IFRAMESIZE_TYPE_DEFAULT;
Chinmay Sawarkarddd1d972017-08-15 10:10:06 -07001192 u32 color_primaries, custom_matrix;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001193
1194 if (!inst || !inst->core || !inst->core->device) {
1195 dprintk(VIDC_ERR, "%s invalid parameters\n", __func__);
1196 return -EINVAL;
1197 }
1198 hdev = inst->core->device;
1199
1200 /* Small helper macro for quickly getting a control and err checking */
1201#define TRY_GET_CTRL(__ctrl_id) ({ \
1202 struct v4l2_ctrl *__temp; \
1203 __temp = get_ctrl_from_cluster( \
1204 __ctrl_id, \
1205 ctrl->cluster, ctrl->ncontrols); \
1206 if (!__temp) { \
1207 dprintk(VIDC_ERR, "Can't find %s (%x) in cluster\n", \
1208 #__ctrl_id, __ctrl_id); \
1209 /* Clusters are hardcoded, if we can't find */ \
1210 /* something then things are massively screwed up */ \
1211 MSM_VIDC_ERROR(1); \
1212 } \
1213 __temp; \
1214 })
1215
1216 /*
1217 * Unlock the control prior to setting to the hardware. Otherwise
1218 * lower level code that attempts to do a get_ctrl() will end up
1219 * deadlocking.
1220 */
1221 v4l2_ctrl_unlock(ctrl);
1222
1223 switch (ctrl->id) {
1224 case V4L2_CID_MPEG_VIDC_VIDEO_IDR_PERIOD:
1225 if (inst->fmts[CAPTURE_PORT].fourcc != V4L2_PIX_FMT_H264 &&
1226 inst->fmts[CAPTURE_PORT].fourcc !=
1227 V4L2_PIX_FMT_H264_NO_SC &&
1228 inst->fmts[CAPTURE_PORT].fourcc !=
1229 V4L2_PIX_FMT_HEVC) {
1230 dprintk(VIDC_ERR,
1231 "Control %#x only valid for H264 and HEVC\n",
1232 ctrl->id);
1233 rc = -ENOTSUPP;
1234 break;
1235 }
1236
1237 property_id = HAL_CONFIG_VENC_IDR_PERIOD;
1238 idr_period.idr_period = ctrl->val;
1239 pdata = &idr_period;
1240 break;
1241 case V4L2_CID_MPEG_VIDC_VIDEO_NUM_B_FRAMES:
1242 case V4L2_CID_MPEG_VIDC_VIDEO_NUM_P_FRAMES:
1243 {
1244 int num_p, num_b;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001245
1246 temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_NUM_B_FRAMES);
1247 num_b = temp_ctrl->val;
1248
1249 temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_NUM_P_FRAMES);
1250 num_p = temp_ctrl->val;
1251
1252 if (ctrl->id == V4L2_CID_MPEG_VIDC_VIDEO_NUM_P_FRAMES)
1253 num_p = ctrl->val;
1254 else if (ctrl->id == V4L2_CID_MPEG_VIDC_VIDEO_NUM_B_FRAMES)
1255 num_b = ctrl->val;
1256
Saurabh Kothawadeb11d81c2017-05-18 19:07:17 -07001257 if ((num_b < inst->capability.bframe.min) ||
1258 (num_b > inst->capability.bframe.max)) {
1259 dprintk(VIDC_ERR,
1260 "Error setting num b frames %d min, max supported is %d, %d\n",
1261 num_b, inst->capability.bframe.min,
1262 inst->capability.bframe.max);
1263 rc = -ENOTSUPP;
1264 break;
1265 }
1266
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001267 property_id = HAL_CONFIG_VENC_INTRA_PERIOD;
1268 intra_period.pframes = num_p;
1269 intra_period.bframes = num_b;
1270
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001271 pdata = &intra_period;
1272 break;
1273 }
1274 case V4L2_CID_MPEG_VIDC_VIDEO_REQUEST_IFRAME:
1275 property_id = HAL_CONFIG_VENC_REQUEST_IFRAME;
1276 request_iframe.enable = true;
1277 pdata = &request_iframe;
1278 break;
1279 case V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL:
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001280 {
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001281 property_id = HAL_PARAM_VENC_RATE_CONTROL;
Chinmay Sawarkar0a9cca32017-04-11 12:52:59 -07001282 property_val = ctrl->val;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001283 pdata = &property_val;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001284 break;
1285 }
1286 case V4L2_CID_MPEG_VIDEO_BITRATE:
1287 {
1288 property_id = HAL_CONFIG_VENC_TARGET_BITRATE;
1289 bitrate.bit_rate = ctrl->val;
Vaibhav Deshu Venkatesh5115b462017-05-05 17:48:50 -07001290 bitrate.layer_id = MSM_VIDC_ALL_LAYER_ID;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001291 pdata = &bitrate;
Praneeth Paladugue5fd0872017-04-19 11:24:28 -07001292 inst->clk_data.bitrate = ctrl->val;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001293 break;
1294 }
1295 case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK:
1296 {
1297 struct v4l2_ctrl *avg_bitrate = TRY_GET_CTRL(
1298 V4L2_CID_MPEG_VIDEO_BITRATE);
1299
1300 if (ctrl->val < avg_bitrate->val) {
1301 dprintk(VIDC_ERR,
1302 "Peak bitrate (%d) is lower than average bitrate (%d)\n",
1303 ctrl->val, avg_bitrate->val);
1304 rc = -EINVAL;
1305 break;
1306 } else if (ctrl->val < avg_bitrate->val * 2) {
1307 dprintk(VIDC_WARN,
1308 "Peak bitrate (%d) ideally should be twice the average bitrate (%d)\n",
1309 ctrl->val, avg_bitrate->val);
1310 }
1311
1312 property_id = HAL_CONFIG_VENC_MAX_BITRATE;
1313 bitrate.bit_rate = ctrl->val;
Vaibhav Deshu Venkatesh5115b462017-05-05 17:48:50 -07001314 bitrate.layer_id = MSM_VIDC_ALL_LAYER_ID;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001315 pdata = &bitrate;
1316 break;
1317 }
1318 case V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE:
1319 temp_ctrl = TRY_GET_CTRL(
1320 V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL);
1321
1322 property_id = HAL_PARAM_VENC_H264_ENTROPY_CONTROL;
Chinmay Sawarkarb3c6ccb2017-02-23 18:01:32 -08001323 h264_entropy_control.entropy_mode = msm_comm_v4l2_to_hal(
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001324 V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE, ctrl->val);
Chinmay Sawarkarb3c6ccb2017-02-23 18:01:32 -08001325 h264_entropy_control.cabac_model = msm_comm_v4l2_to_hal(
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001326 V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL,
1327 temp_ctrl->val);
1328 pdata = &h264_entropy_control;
1329 break;
1330 case V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL:
1331 temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE);
1332
1333 property_id = HAL_PARAM_VENC_H264_ENTROPY_CONTROL;
Chinmay Sawarkarb3c6ccb2017-02-23 18:01:32 -08001334 h264_entropy_control.cabac_model = msm_comm_v4l2_to_hal(
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001335 V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE, ctrl->val);
Chinmay Sawarkarb3c6ccb2017-02-23 18:01:32 -08001336 h264_entropy_control.entropy_mode = msm_comm_v4l2_to_hal(
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001337 V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL,
1338 temp_ctrl->val);
1339 pdata = &h264_entropy_control;
1340 break;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001341 case V4L2_CID_MPEG_VIDEO_H264_PROFILE:
1342 temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDEO_H264_LEVEL);
1343
1344 property_id = HAL_PARAM_PROFILE_LEVEL_CURRENT;
Chinmay Sawarkarb3c6ccb2017-02-23 18:01:32 -08001345 profile_level.profile = msm_comm_v4l2_to_hal(ctrl->id,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001346 ctrl->val);
Chinmay Sawarkarb3c6ccb2017-02-23 18:01:32 -08001347 profile_level.level = msm_comm_v4l2_to_hal(
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001348 V4L2_CID_MPEG_VIDEO_H264_LEVEL,
1349 temp_ctrl->val);
1350 pdata = &profile_level;
1351 dprintk(VIDC_DBG, "\nprofile: %d\n",
1352 profile_level.profile);
1353 break;
1354 case V4L2_CID_MPEG_VIDEO_H264_LEVEL:
1355 temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDEO_H264_PROFILE);
1356
1357 property_id = HAL_PARAM_PROFILE_LEVEL_CURRENT;
Chinmay Sawarkarb3c6ccb2017-02-23 18:01:32 -08001358 profile_level.level = msm_comm_v4l2_to_hal(ctrl->id,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001359 ctrl->val);
Chinmay Sawarkarb3c6ccb2017-02-23 18:01:32 -08001360 profile_level.profile = msm_comm_v4l2_to_hal(
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001361 V4L2_CID_MPEG_VIDEO_H264_PROFILE,
1362 temp_ctrl->val);
1363 pdata = &profile_level;
1364 dprintk(VIDC_DBG, "\nLevel: %d\n",
1365 profile_level.level);
1366 break;
1367 case V4L2_CID_MPEG_VIDC_VIDEO_VP8_PROFILE_LEVEL:
1368 property_id = HAL_PARAM_PROFILE_LEVEL_CURRENT;
Vaibhav Deshu Venkatesh0ad53f02017-08-07 13:21:47 -07001369 profile_level.profile = HAL_VP8_PROFILE_MAIN;
Chinmay Sawarkar7f1cc152017-05-05 18:16:36 -07001370 profile_level.level = msm_comm_v4l2_to_hal(
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001371 V4L2_CID_MPEG_VIDC_VIDEO_VP8_PROFILE_LEVEL,
1372 ctrl->val);
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001373 pdata = &profile_level;
1374 break;
1375 case V4L2_CID_MPEG_VIDC_VIDEO_HEVC_PROFILE:
1376 temp_ctrl =
1377 TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_HEVC_TIER_LEVEL);
1378
1379 property_id = HAL_PARAM_PROFILE_LEVEL_CURRENT;
Chinmay Sawarkarb3c6ccb2017-02-23 18:01:32 -08001380 profile_level.profile = msm_comm_v4l2_to_hal(ctrl->id,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001381 ctrl->val);
Chinmay Sawarkarb3c6ccb2017-02-23 18:01:32 -08001382 profile_level.level = msm_comm_v4l2_to_hal(
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001383 V4L2_CID_MPEG_VIDC_VIDEO_HEVC_TIER_LEVEL,
1384 temp_ctrl->val);
1385 pdata = &profile_level;
1386 break;
1387 case V4L2_CID_MPEG_VIDC_VIDEO_HEVC_TIER_LEVEL:
1388 temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_HEVC_PROFILE);
1389
1390 property_id = HAL_PARAM_PROFILE_LEVEL_CURRENT;
Chinmay Sawarkarb3c6ccb2017-02-23 18:01:32 -08001391 profile_level.level = msm_comm_v4l2_to_hal(ctrl->id,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001392 ctrl->val);
Chinmay Sawarkarb3c6ccb2017-02-23 18:01:32 -08001393 profile_level.profile = msm_comm_v4l2_to_hal(
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001394 V4L2_CID_MPEG_VIDC_VIDEO_HEVC_PROFILE,
1395 temp_ctrl->val);
1396 pdata = &profile_level;
1397 break;
Surajit Poddere502daa2017-05-30 19:17:45 +05301398 case V4L2_CID_MPEG_VIDC_VIDEO_TME_PROFILE:
1399 temp_ctrl =
1400 TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_TME_LEVEL);
1401
1402 property_id = HAL_PARAM_PROFILE_LEVEL_CURRENT;
1403 profile_level.profile = msm_comm_v4l2_to_hal(ctrl->id,
1404 ctrl->val);
1405 profile_level.level = msm_comm_v4l2_to_hal(
1406 V4L2_CID_MPEG_VIDC_VIDEO_TME_LEVEL,
1407 temp_ctrl->val);
1408 pdata = &profile_level;
1409 break;
1410 case V4L2_CID_MPEG_VIDC_VIDEO_TME_LEVEL:
1411 temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_TME_PROFILE);
1412
1413 property_id = HAL_PARAM_PROFILE_LEVEL_CURRENT;
1414 profile_level.level = msm_comm_v4l2_to_hal(ctrl->id,
1415 ctrl->val);
1416 profile_level.profile = msm_comm_v4l2_to_hal(
1417 V4L2_CID_MPEG_VIDC_VIDEO_TME_PROFILE,
1418 temp_ctrl->val);
1419 pdata = &profile_level;
1420 break;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001421 case V4L2_CID_MPEG_VIDC_VIDEO_ROTATION:
1422 {
Chinmay Sawarkar582c72a2017-05-24 14:29:12 -07001423 property_id = HAL_PARAM_VPE_ROTATION;
1424 vpe_rotation.rotate = msm_comm_v4l2_to_hal(
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001425 V4L2_CID_MPEG_VIDC_VIDEO_ROTATION,
1426 ctrl->val);
Chinmay Sawarkar582c72a2017-05-24 14:29:12 -07001427 vpe_rotation.flip = HAL_FLIP_NONE;
1428 pdata = &vpe_rotation;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001429 break;
1430 }
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001431 case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE: {
1432 int temp = 0;
1433
1434 switch (ctrl->val) {
1435 case V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_MB:
1436 temp = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB;
1437 break;
1438 case V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_BYTES:
1439 temp = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES;
1440 break;
1441 case V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE:
1442 default:
1443 temp = 0;
1444 break;
1445 }
1446
1447 if (temp)
1448 temp_ctrl = TRY_GET_CTRL(temp);
1449
1450 property_id = HAL_PARAM_VENC_MULTI_SLICE_CONTROL;
1451 multi_slice_control.multi_slice = ctrl->val;
1452 multi_slice_control.slice_size = temp ? temp_ctrl->val : 0;
1453
1454 pdata = &multi_slice_control;
1455 break;
1456 }
1457 case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES:
1458 case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB:
1459 temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE);
1460
1461 property_id = HAL_PARAM_VENC_MULTI_SLICE_CONTROL;
1462 multi_slice_control.multi_slice = temp_ctrl->val;
1463 multi_slice_control.slice_size = ctrl->val;
1464 pdata = &multi_slice_control;
1465 break;
1466 case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_DELIVERY_MODE: {
Qiwei Liue4e50ca2017-07-24 15:47:25 +08001467 bool codecs_supported =
1468 inst->fmts[CAPTURE_PORT].fourcc == V4L2_PIX_FMT_HEVC ||
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001469 inst->fmts[CAPTURE_PORT].fourcc == V4L2_PIX_FMT_H264 ||
1470 inst->fmts[CAPTURE_PORT].fourcc ==
1471 V4L2_PIX_FMT_H264_NO_SC;
1472
1473 temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE);
Qiwei Liue4e50ca2017-07-24 15:47:25 +08001474 if (codecs_supported && temp_ctrl->val ==
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001475 V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_MB) {
1476 property_id = HAL_PARAM_VENC_SLICE_DELIVERY_MODE;
1477 enable.enable = true;
1478 } else {
1479 dprintk(VIDC_WARN,
1480 "Failed : slice delivery mode is not valid\n");
1481 enable.enable = false;
1482 }
1483 pdata = &enable;
1484 break;
1485 }
Saurabh Kothawadeabed16c2017-03-22 17:06:40 -07001486 case V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_MODE:
1487 {
1488 struct v4l2_ctrl *ir_mbs;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001489
Saurabh Kothawadeabed16c2017-03-22 17:06:40 -07001490 ir_mbs = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_IR_MBS);
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001491
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001492 property_id = HAL_PARAM_VENC_INTRA_REFRESH;
1493
Saurabh Kothawadeabed16c2017-03-22 17:06:40 -07001494 intra_refresh.mode = ctrl->val;
1495 intra_refresh.ir_mbs = ir_mbs->val;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001496
1497 pdata = &intra_refresh;
1498 break;
1499 }
Saurabh Kothawadeabed16c2017-03-22 17:06:40 -07001500 case V4L2_CID_MPEG_VIDC_VIDEO_IR_MBS:
1501 {
1502 struct v4l2_ctrl *ir_mode;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001503
1504 ir_mode = TRY_GET_CTRL(
1505 V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_MODE);
1506
1507 property_id = HAL_PARAM_VENC_INTRA_REFRESH;
1508
Saurabh Kothawadeabed16c2017-03-22 17:06:40 -07001509 intra_refresh.mode = ir_mode->val;
1510 intra_refresh.ir_mbs = ctrl->val;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001511
1512 pdata = &intra_refresh;
1513 break;
1514 }
1515 case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE:
1516 {
1517 struct v4l2_ctrl *alpha, *beta;
1518
1519 alpha = TRY_GET_CTRL(
1520 V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA);
1521 beta = TRY_GET_CTRL(
1522 V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA);
1523
1524 property_id = HAL_PARAM_VENC_H264_DEBLOCK_CONTROL;
1525 h264_db_control.slice_alpha_offset = alpha->val;
1526 h264_db_control.slice_beta_offset = beta->val;
Chinmay Sawarkarb3c6ccb2017-02-23 18:01:32 -08001527 h264_db_control.mode = msm_comm_v4l2_to_hal(
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001528 V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE,
1529 ctrl->val);
1530 pdata = &h264_db_control;
1531 break;
1532 }
1533 case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA:
1534 {
1535 struct v4l2_ctrl *mode, *beta;
1536
1537 mode = TRY_GET_CTRL(
1538 V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE);
1539 beta = TRY_GET_CTRL(
1540 V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA);
1541
1542 property_id = HAL_PARAM_VENC_H264_DEBLOCK_CONTROL;
1543 h264_db_control.slice_alpha_offset = ctrl->val;
1544 h264_db_control.slice_beta_offset = beta->val;
Chinmay Sawarkarb3c6ccb2017-02-23 18:01:32 -08001545 h264_db_control.mode = msm_comm_v4l2_to_hal(
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001546 V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE,
1547 mode->val);
1548 pdata = &h264_db_control;
1549 break;
1550 }
1551 case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA:
1552 {
1553 struct v4l2_ctrl *mode, *alpha;
1554
1555 mode = TRY_GET_CTRL(
1556 V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE);
1557 alpha = TRY_GET_CTRL(
1558 V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA);
1559 property_id = HAL_PARAM_VENC_H264_DEBLOCK_CONTROL;
1560 h264_db_control.slice_alpha_offset = alpha->val;
1561 h264_db_control.slice_beta_offset = ctrl->val;
Chinmay Sawarkarb3c6ccb2017-02-23 18:01:32 -08001562 h264_db_control.mode = msm_comm_v4l2_to_hal(
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001563 V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE,
1564 mode->val);
1565 pdata = &h264_db_control;
1566 break;
1567 }
1568 case V4L2_CID_MPEG_VIDEO_HEADER_MODE:
1569 property_id = HAL_PARAM_VENC_SYNC_FRAME_SEQUENCE_HEADER;
1570
1571 switch (ctrl->val) {
1572 case V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE:
1573 enable.enable = 0;
1574 break;
1575 case V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME:
Saurabh Kothawade846b7532017-03-29 17:17:19 -07001576 enable.enable = 1;
Saurabh Kothawadef4b7ff02017-04-04 17:24:04 -07001577 break;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001578 default:
1579 rc = -ENOTSUPP;
1580 break;
1581 }
1582 pdata = &enable;
1583 break;
1584 case V4L2_CID_MPEG_VIDC_VIDEO_SECURE:
1585 inst->flags |= VIDC_SECURE;
Karthikeyan Periasamya0e4bad2017-04-26 12:51:10 -07001586 property_id = HAL_PARAM_SECURE;
1587 property_val = !!(inst->flags & VIDC_SECURE);
1588 pdata = &property_val;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001589 dprintk(VIDC_INFO, "Setting secure mode to: %d\n",
1590 !!(inst->flags & VIDC_SECURE));
1591 break;
Praneeth Paladugudefea4e2017-02-09 23:44:08 -08001592 case V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA: {
1593 struct hal_buffer_requirements *buff_req_buffer = NULL;
1594 int extra_idx = 0;
1595
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001596 property_id = HAL_PARAM_INDEX_EXTRADATA;
1597 extra.index = msm_comm_get_hal_extradata_index(ctrl->val);
1598 extra.enable = 1;
Praneeth Paladugudefea4e2017-02-09 23:44:08 -08001599
1600 switch (ctrl->val) {
1601 case V4L2_MPEG_VIDC_EXTRADATA_INPUT_CROP:
1602 case V4L2_MPEG_VIDC_EXTRADATA_DIGITAL_ZOOM:
1603 case V4L2_MPEG_VIDC_EXTRADATA_ASPECT_RATIO:
1604 case V4L2_MPEG_VIDC_EXTRADATA_YUV_STATS:
1605 case V4L2_MPEG_VIDC_EXTRADATA_ROI_QP:
1606 case V4L2_MPEG_VIDC_EXTRADATA_PQ_INFO:
1607 inst->bufq[OUTPUT_PORT].num_planes = 2;
1608 break;
1609 case V4L2_MPEG_VIDC_EXTRADATA_MULTISLICE_INFO:
1610 case V4L2_MPEG_VIDC_EXTRADATA_LTR:
1611 case V4L2_MPEG_VIDC_EXTRADATA_METADATA_MBI:
1612 inst->bufq[CAPTURE_PORT].num_planes = 2;
1613 break;
1614 default:
1615 rc = -ENOTSUPP;
1616 break;
1617 }
1618
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001619 pdata = &extra;
Praneeth Paladugudefea4e2017-02-09 23:44:08 -08001620 rc = call_hfi_op(hdev, session_set_property,
1621 (void *)inst->session, property_id, pdata);
1622
1623 rc = msm_comm_try_get_bufreqs(inst);
1624 if (rc) {
1625 dprintk(VIDC_ERR,
1626 "Failed to get buffer requirements: %d\n", rc);
1627 break;
1628 }
1629
Praneeth Paladugudefea4e2017-02-09 23:44:08 -08001630 extra_idx = EXTRADATA_IDX(inst->bufq[OUTPUT_PORT].num_planes);
Vikash Garodiacd22b232017-07-26 20:41:40 +05301631 if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
1632 buff_req_buffer = get_buff_req_buffer(inst,
1633 HAL_BUFFER_EXTRADATA_INPUT);
Praneeth Paladugudefea4e2017-02-09 23:44:08 -08001634
Vikash Garodiacd22b232017-07-26 20:41:40 +05301635 inst->bufq[OUTPUT_PORT].plane_sizes[extra_idx] =
1636 buff_req_buffer ?
1637 buff_req_buffer->buffer_size : 0;
1638 }
Praneeth Paladugudefea4e2017-02-09 23:44:08 -08001639
1640 extra_idx = EXTRADATA_IDX(inst->bufq[CAPTURE_PORT].num_planes);
Vikash Garodiacd22b232017-07-26 20:41:40 +05301641 if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
1642 buff_req_buffer = get_buff_req_buffer(inst,
1643 HAL_BUFFER_EXTRADATA_OUTPUT);
Praneeth Paladugudefea4e2017-02-09 23:44:08 -08001644
Vikash Garodiacd22b232017-07-26 20:41:40 +05301645 inst->bufq[CAPTURE_PORT].plane_sizes[extra_idx] =
1646 buff_req_buffer ?
1647 buff_req_buffer->buffer_size : 0;
1648 }
Praneeth Paladugudefea4e2017-02-09 23:44:08 -08001649 property_id = 0;
1650 }
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001651 break;
1652 case V4L2_CID_MPEG_VIDC_VIDEO_AU_DELIMITER:
Umesh Pandey7fce7ee2017-03-13 17:59:48 -07001653 property_id = HAL_PARAM_VENC_GENERATE_AUDNAL;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001654
1655 switch (ctrl->val) {
1656 case V4L2_MPEG_VIDC_VIDEO_AU_DELIMITER_DISABLED:
1657 enable.enable = 0;
1658 break;
1659 case V4L2_MPEG_VIDC_VIDEO_AU_DELIMITER_ENABLED:
1660 enable.enable = 1;
1661 break;
1662 default:
1663 rc = -ENOTSUPP;
1664 break;
1665 }
1666
1667 pdata = &enable;
1668 break;
1669 case V4L2_CID_MPEG_VIDC_VIDEO_PRESERVE_TEXT_QUALITY:
1670 property_id = HAL_PARAM_VENC_PRESERVE_TEXT_QUALITY;
1671 preserve_text_quality.enable = ctrl->val;
1672 pdata = &preserve_text_quality;
1673 break;
1674 case V4L2_CID_MPEG_VIDC_VIDEO_USELTRFRAME:
1675 property_id = HAL_CONFIG_VENC_USELTRFRAME;
Chinmay Sawarkar73d6fbb2017-08-03 19:07:52 -07001676 use_ltr.ref_ltr = 0x1 << ctrl->val;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001677 use_ltr.use_constraint = false;
1678 use_ltr.frames = 0;
1679 pdata = &use_ltr;
1680 break;
1681 case V4L2_CID_MPEG_VIDC_VIDEO_MARKLTRFRAME:
1682 property_id = HAL_CONFIG_VENC_MARKLTRFRAME;
1683 mark_ltr.mark_frame = ctrl->val;
1684 pdata = &mark_ltr;
1685 break;
1686 case V4L2_CID_MPEG_VIDC_VIDEO_HIER_P_NUM_LAYERS:
1687 property_id = HAL_CONFIG_VENC_HIER_P_NUM_FRAMES;
1688 hier_p_layers = ctrl->val;
1689 if (hier_p_layers > inst->capability.hier_p.max) {
1690 dprintk(VIDC_ERR,
1691 "Error setting hier p num layers %d max supported is %d\n",
1692 hier_p_layers, inst->capability.hier_p.max);
1693 rc = -ENOTSUPP;
1694 break;
1695 }
1696 pdata = &hier_p_layers;
1697 break;
1698 case V4L2_CID_MPEG_VIDC_VIDEO_VPX_ERROR_RESILIENCE:
1699 property_id = HAL_PARAM_VENC_VPX_ERROR_RESILIENCE_MODE;
1700 enable.enable = ctrl->val;
1701 pdata = &enable;
1702 break;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001703 case V4L2_CID_MPEG_VIDC_VIDEO_HYBRID_HIERP_MODE:
1704 property_id = HAL_PARAM_VENC_HIER_P_HYBRID_MODE;
1705 hyb_hierp.layers = ctrl->val;
1706 pdata = &hyb_hierp;
1707 break;
1708 case V4L2_CID_VIDC_QBUF_MODE:
1709 property_id = HAL_PARAM_SYNC_BASED_INTERRUPT;
1710 enable.enable = ctrl->val == V4L2_VIDC_QBUF_BATCHED;
1711 pdata = &enable;
1712 break;
1713 case V4L2_CID_MPEG_VIDC_VIDEO_MAX_HIERP_LAYERS:
1714 property_id = HAL_PARAM_VENC_HIER_P_MAX_ENH_LAYERS;
1715 max_hierp_layers = ctrl->val;
1716 if (max_hierp_layers > inst->capability.hier_p.max) {
1717 dprintk(VIDC_ERR,
1718 "Error max HP layers(%d)>max supported(%d)\n",
1719 max_hierp_layers, inst->capability.hier_p.max);
1720 rc = -ENOTSUPP;
1721 break;
1722 }
1723 pdata = &max_hierp_layers;
1724 break;
1725 case V4L2_CID_MPEG_VIDC_VIDEO_BASELAYER_ID:
1726 property_id = HAL_CONFIG_VENC_BASELAYER_PRIORITYID;
1727 baselayerid = ctrl->val;
1728 pdata = &baselayerid;
1729 break;
Praneeth Paladugu7fbd2792017-01-27 13:39:03 -08001730 case V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP: {
Vaibhav Deshu Venkatesh3a147162017-04-27 16:21:12 -07001731 struct v4l2_ctrl *qpp, *qpb, *mask;
Praneeth Paladugu7fbd2792017-01-27 13:39:03 -08001732
1733 property_id = HAL_CONFIG_VENC_FRAME_QP;
1734 qpp = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP);
1735 qpb = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_B_FRAME_QP);
Vaibhav Deshu Venkatesh3a147162017-04-27 16:21:12 -07001736 mask = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_QP_MASK);
Praneeth Paladugu7fbd2792017-01-27 13:39:03 -08001737
1738 quant.qpi = ctrl->val;
1739 quant.qpp = qpp->val;
1740 quant.qpb = qpb->val;
Vaibhav Deshu Venkatesh3a147162017-04-27 16:21:12 -07001741 quant.enable = mask->val;
Praneeth Paladugu7fbd2792017-01-27 13:39:03 -08001742 quant.layer_id = MSM_VIDC_ALL_LAYER_ID;
1743 pdata = &quant;
1744 break;
1745 }
1746 case V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP: {
Vaibhav Deshu Venkatesh3a147162017-04-27 16:21:12 -07001747 struct v4l2_ctrl *qpi, *qpb, *mask;
Praneeth Paladugu7fbd2792017-01-27 13:39:03 -08001748
1749 property_id = HAL_CONFIG_VENC_FRAME_QP;
1750 qpi = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP);
1751 qpb = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_B_FRAME_QP);
Vaibhav Deshu Venkatesh3a147162017-04-27 16:21:12 -07001752 mask = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_QP_MASK);
Praneeth Paladugu7fbd2792017-01-27 13:39:03 -08001753
1754 quant.qpp = ctrl->val;
1755 quant.qpi = qpi->val;
1756 quant.qpb = qpb->val;
Vaibhav Deshu Venkatesh3a147162017-04-27 16:21:12 -07001757 quant.enable = mask->val;
Praneeth Paladugu7fbd2792017-01-27 13:39:03 -08001758 quant.layer_id = MSM_VIDC_ALL_LAYER_ID;
1759 pdata = &quant;
1760 break;
1761 }
1762 case V4L2_CID_MPEG_VIDC_VIDEO_B_FRAME_QP: {
Vaibhav Deshu Venkatesh3a147162017-04-27 16:21:12 -07001763 struct v4l2_ctrl *qpp, *qpi, *mask;
Praneeth Paladugu7fbd2792017-01-27 13:39:03 -08001764
1765 property_id = HAL_CONFIG_VENC_FRAME_QP;
1766 qpp = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP);
1767 qpi = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP);
Vaibhav Deshu Venkatesh3a147162017-04-27 16:21:12 -07001768 mask = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_QP_MASK);
Praneeth Paladugu7fbd2792017-01-27 13:39:03 -08001769
1770 quant.qpb = ctrl->val;
1771 quant.qpp = qpp->val;
1772 quant.qpi = qpi->val;
Vaibhav Deshu Venkatesh3a147162017-04-27 16:21:12 -07001773 quant.enable = mask->val;
1774 quant.layer_id = MSM_VIDC_ALL_LAYER_ID;
1775 pdata = &quant;
1776 break;
1777 }
1778 case V4L2_CID_MPEG_VIDC_VIDEO_QP_MASK: {
1779 struct v4l2_ctrl *qpi, *qpp, *qpb;
1780
1781 property_id = HAL_CONFIG_VENC_FRAME_QP;
1782 qpi = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP);
1783 qpp = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP);
1784 qpb = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_B_FRAME_QP);
1785
1786 quant.qpi = qpi->val;
1787 quant.qpp = qpp->val;
1788 quant.qpb = qpb->val;
1789 quant.enable = ctrl->val;
Praneeth Paladugu7fbd2792017-01-27 13:39:03 -08001790 quant.layer_id = MSM_VIDC_ALL_LAYER_ID;
1791 pdata = &quant;
1792 break;
1793 }
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001794 case V4L2_CID_MPEG_VIDC_VIDEO_VQZIP_SEI:
1795 property_id = HAL_PARAM_VENC_VQZIP_SEI;
1796 enable.enable = ctrl->val;
1797 pdata = &enable;
1798 break;
1799 case V4L2_CID_MPEG_VIDC_VIDEO_PRIORITY:
1800 property_id = HAL_CONFIG_REALTIME;
1801 /* firmware has inverted values for realtime and
1802 * non-realtime priority
1803 */
1804 enable.enable = !(ctrl->val);
1805 pdata = &enable;
1806 switch (ctrl->val) {
1807 case V4L2_MPEG_VIDC_VIDEO_PRIORITY_REALTIME_DISABLE:
1808 inst->flags &= ~VIDC_REALTIME;
1809 break;
1810 case V4L2_MPEG_VIDC_VIDEO_PRIORITY_REALTIME_ENABLE:
1811 inst->flags |= VIDC_REALTIME;
1812 break;
1813 default:
1814 dprintk(VIDC_WARN,
1815 "inst(%pK) invalid priority ctrl value %#x\n",
1816 inst, ctrl->val);
1817 break;
1818 }
1819 break;
1820 case V4L2_CID_MPEG_VIDC_VIDEO_OPERATING_RATE:
1821 dprintk(VIDC_DBG,
1822 "inst(%pK) operating rate changed from %d to %d\n",
Praneeth Paladugue5fd0872017-04-19 11:24:28 -07001823 inst, inst->clk_data.operating_rate >> 16,
1824 ctrl->val >> 16);
1825 inst->clk_data.operating_rate = ctrl->val;
1826
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001827 break;
1828 case V4L2_CID_MPEG_VIDC_VIDEO_VENC_BITRATE_TYPE:
1829 {
1830 property_id = HAL_PARAM_VENC_BITRATE_TYPE;
1831 enable.enable = ctrl->val;
1832 pdata = &enable;
1833 break;
1834 }
1835 case V4L2_CID_MPEG_VIDC_VIDEO_COLOR_SPACE:
1836 {
1837 signal_info.color_space = ctrl->val;
1838 temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_FULL_RANGE);
1839 signal_info.full_range = temp_ctrl ? temp_ctrl->val : 0;
1840 temp_ctrl =
1841 TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_TRANSFER_CHARS);
1842 signal_info.transfer_chars = temp_ctrl ? temp_ctrl->val : 0;
1843 temp_ctrl =
1844 TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_MATRIX_COEFFS);
1845 signal_info.matrix_coeffs = temp_ctrl ? temp_ctrl->val : 0;
1846 property_id = HAL_PARAM_VENC_VIDEO_SIGNAL_INFO;
1847 pdata = &signal_info;
1848 break;
1849 }
1850 case V4L2_CID_MPEG_VIDC_VIDEO_FULL_RANGE:
1851 {
1852 signal_info.full_range = ctrl->val;
1853 temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_COLOR_SPACE);
1854 signal_info.color_space = temp_ctrl ? temp_ctrl->val : 0;
1855 temp_ctrl =
1856 TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_TRANSFER_CHARS);
1857 signal_info.transfer_chars = temp_ctrl ? temp_ctrl->val : 0;
1858 temp_ctrl =
1859 TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_MATRIX_COEFFS);
1860 signal_info.matrix_coeffs = temp_ctrl ? temp_ctrl->val : 0;
1861 property_id = HAL_PARAM_VENC_VIDEO_SIGNAL_INFO;
1862 pdata = &signal_info;
1863 break;
1864 }
1865 case V4L2_CID_MPEG_VIDC_VIDEO_TRANSFER_CHARS:
1866 {
1867 signal_info.transfer_chars = ctrl->val;
1868 temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_FULL_RANGE);
1869 signal_info.full_range = temp_ctrl ? temp_ctrl->val : 0;
1870 temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_COLOR_SPACE);
1871 signal_info.color_space = temp_ctrl ? temp_ctrl->val : 0;
1872 temp_ctrl =
1873 TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_MATRIX_COEFFS);
1874 signal_info.matrix_coeffs = temp_ctrl ? temp_ctrl->val : 0;
1875 property_id = HAL_PARAM_VENC_VIDEO_SIGNAL_INFO;
1876 pdata = &signal_info;
1877 break;
1878 }
1879 case V4L2_CID_MPEG_VIDC_VIDEO_MATRIX_COEFFS:
1880 {
1881 signal_info.matrix_coeffs = ctrl->val;
1882 temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_FULL_RANGE);
1883 signal_info.full_range = temp_ctrl ? temp_ctrl->val : 0;
1884 temp_ctrl =
1885 TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_TRANSFER_CHARS);
1886 signal_info.transfer_chars = temp_ctrl ? temp_ctrl->val : 0;
1887 temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_COLOR_SPACE);
1888 signal_info.color_space = temp_ctrl ? temp_ctrl->val : 0;
1889 property_id = HAL_PARAM_VENC_VIDEO_SIGNAL_INFO;
1890 pdata = &signal_info;
1891 break;
1892 }
1893 case V4L2_CID_MPEG_VIDC_VIDEO_VPE_CSC:
Chinmay Sawarkarddd1d972017-08-15 10:10:06 -07001894 if (ctrl->val != V4L2_CID_MPEG_VIDC_VIDEO_VPE_CSC_ENABLE)
1895 break;
1896 temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_COLOR_SPACE);
1897 color_primaries = temp_ctrl->val;
1898 temp_ctrl =
1899 TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_VPE_CSC_CUSTOM_MATRIX);
1900 custom_matrix = temp_ctrl->val;
1901 rc = msm_venc_set_csc(inst, color_primaries, custom_matrix);
1902 if (rc)
1903 dprintk(VIDC_ERR, "fail to set csc: %d\n", rc);
1904 break;
1905 case V4L2_CID_MPEG_VIDC_VIDEO_VPE_CSC_CUSTOM_MATRIX:
1906 temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_COLOR_SPACE);
1907 color_primaries = temp_ctrl->val;
1908 rc = msm_venc_set_csc(inst, color_primaries, ctrl->val);
1909 if (rc)
1910 dprintk(VIDC_ERR, "fail to set csc: %d\n", rc);
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001911 break;
1912 case V4L2_CID_MPEG_VIDC_VIDEO_LOWLATENCY_MODE:
1913 {
1914 property_id = HAL_PARAM_VENC_LOW_LATENCY;
1915 if (ctrl->val ==
1916 V4L2_CID_MPEG_VIDC_VIDEO_LOWLATENCY_ENABLE)
1917 enable.enable = 1;
1918 else
1919 enable.enable = 0;
1920 pdata = &enable;
Praneeth Paladugue5fd0872017-04-19 11:24:28 -07001921 inst->clk_data.low_latency_mode = (bool) enable.enable;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001922 break;
1923 }
1924 case V4L2_CID_MPEG_VIDC_VIDEO_H264_TRANSFORM_8x8:
1925 property_id = HAL_PARAM_VENC_H264_TRANSFORM_8x8;
1926 switch (ctrl->val) {
1927 case V4L2_MPEG_VIDC_VIDEO_H264_TRANSFORM_8x8_ENABLE:
1928 enable.enable = 1;
1929 break;
1930 case V4L2_MPEG_VIDC_VIDEO_H264_TRANSFORM_8x8_DISABLE:
1931 enable.enable = 0;
1932 break;
1933 default:
1934 dprintk(VIDC_ERR,
1935 "Invalid H264 8x8 transform control value %d\n",
1936 ctrl->val);
1937 rc = -ENOTSUPP;
1938 break;
1939 }
1940 pdata = &enable;
1941 break;
1942 case V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_TYPE:
1943 property_id = HAL_PARAM_VENC_IFRAMESIZE_TYPE;
Chinmay Sawarkarb3c6ccb2017-02-23 18:01:32 -08001944 iframesize_type = msm_comm_v4l2_to_hal(
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001945 V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_TYPE,
1946 ctrl->val);
1947 pdata = &iframesize_type;
1948 break;
Chinmay Sawarkar0f7cf2e2017-05-04 11:35:56 -07001949 case V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE:
1950 {
1951 property_id = HAL_PARAM_VENC_DISABLE_RC_TIMESTAMP;
1952 enable.enable = ctrl->val;
1953 pdata = &enable;
1954 break;
1955 }
Chinmay Sawarkard0054622017-05-04 13:50:59 -07001956 case V4L2_CID_MPEG_VIDC_VIDEO_VUI_TIMING_INFO:
1957 {
1958 struct v4l2_ctrl *rc_mode;
1959 bool cfr = false;
1960
1961 property_id = HAL_PARAM_VENC_VUI_TIMING_INFO;
1962 pdata = &vui_timing_info;
1963
1964 if (ctrl->val != V4L2_MPEG_VIDC_VIDEO_VUI_TIMING_INFO_ENABLED) {
1965 vui_timing_info.enable = 0;
1966 break;
1967 }
1968
1969 rc_mode = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL);
1970
1971 switch (rc_mode->val) {
1972 case V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_VBR_CFR:
1973 case V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_CBR_CFR:
1974 case V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_MBR_CFR:
1975 cfr = true;
1976 break;
1977 default:
1978 cfr = false;
1979 }
1980
1981 vui_timing_info.enable = 1;
1982 vui_timing_info.fixed_frame_rate = cfr;
1983 vui_timing_info.time_scale = NSEC_PER_SEC;
1984 break;
1985 }
Maheshwar Ajja850be3c2017-07-06 17:47:40 -07001986 case V4L2_CID_MPEG_VIDC_VIDEO_LTRMODE:
1987 case V4L2_CID_MPEG_VIDC_VIDEO_LTRCOUNT:
1988 case V4L2_CID_MPEG_VIDC_VENC_PARAM_SAR_WIDTH:
1989 case V4L2_CID_MPEG_VIDC_VENC_PARAM_SAR_HEIGHT:
1990 case V4L2_CID_MPEG_VIDC_VIDEO_BLUR_WIDTH:
1991 case V4L2_CID_MPEG_VIDC_VIDEO_BLUR_HEIGHT:
1992 case V4L2_CID_MPEG_VIDC_VIDEO_LAYER_ID:
1993 case V4L2_CID_MPEG_VIDC_VENC_PARAM_LAYER_BITRATE:
1994 case V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP_MIN:
1995 case V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP_MIN:
1996 case V4L2_CID_MPEG_VIDC_VIDEO_B_FRAME_QP_MIN:
1997 case V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP_MAX:
1998 case V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP_MAX:
1999 case V4L2_CID_MPEG_VIDC_VIDEO_B_FRAME_QP_MAX:
2000 dprintk(VIDC_DBG, "Set the control : %#x using ext ctrl\n",
2001 ctrl->id);
2002 break;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002003 default:
2004 dprintk(VIDC_ERR, "Unsupported index: %x\n", ctrl->id);
2005 rc = -ENOTSUPP;
2006 break;
2007 }
2008
2009 v4l2_ctrl_lock(ctrl);
2010#undef TRY_GET_CTRL
2011
2012 if (!rc && property_id) {
Praneeth Paladugu92fc3b02017-05-02 15:35:17 -07002013 dprintk(VIDC_DBG,
2014 "Control: Name = %s, ID = 0x%x Value = %d\n",
2015 ctrl->name, ctrl->id, ctrl->val);
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002016 rc = call_hfi_op(hdev, session_set_property,
2017 (void *)inst->session, property_id, pdata);
2018 }
2019
2020 return rc;
2021}
2022
Praneeth Paladugube42cb22016-04-12 22:34:39 -07002023int msm_venc_s_ext_ctrl(struct msm_vidc_inst *inst,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002024 struct v4l2_ext_controls *ctrl)
2025{
Vaibhav Deshu Venkatesh2c072532017-04-07 17:50:18 -07002026 int rc = 0, i;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002027 struct v4l2_ext_control *control;
2028 struct hfi_device *hdev;
2029 struct hal_ltr_mode ltr_mode;
Vaibhav Deshu Venkatesh3a147162017-04-27 16:21:12 -07002030 u32 property_id = 0;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002031 void *pdata = NULL;
2032 struct msm_vidc_capability *cap = NULL;
2033 struct hal_aspect_ratio sar;
2034 struct hal_bitrate bitrate;
2035 struct hal_frame_size blur_res;
Praneeth Paladugu7fbd2792017-01-27 13:39:03 -08002036 struct hal_quantization_range qp_range;
2037 struct hal_quantization qp;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002038
2039 if (!inst || !inst->core || !inst->core->device || !ctrl) {
2040 dprintk(VIDC_ERR, "%s invalid parameters\n", __func__);
2041 return -EINVAL;
2042 }
2043
Vaibhav Deshu Venkateshd0792bc2017-03-16 14:55:51 -07002044 /* This will check the range for contols and clip if necessary */
2045 v4l2_try_ext_ctrls(&inst->ctrl_handler, ctrl);
2046
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002047 hdev = inst->core->device;
2048 cap = &inst->capability;
2049
2050 control = ctrl->controls;
Praneeth Paladugu7fbd2792017-01-27 13:39:03 -08002051
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002052 for (i = 0; i < ctrl->count; i++) {
2053 switch (control[i].id) {
2054 case V4L2_CID_MPEG_VIDC_VIDEO_LTRMODE:
2055 if (control[i].value !=
2056 V4L2_MPEG_VIDC_VIDEO_LTR_MODE_DISABLE) {
2057 rc = msm_venc_toggle_hier_p(inst, false);
2058 if (rc)
2059 break;
2060 }
2061 ltr_mode.mode = control[i].value;
2062 ltr_mode.trust_mode = 1;
2063 property_id = HAL_PARAM_VENC_LTRMODE;
2064 pdata = &ltr_mode;
2065 break;
2066 case V4L2_CID_MPEG_VIDC_VIDEO_LTRCOUNT:
2067 ltr_mode.count = control[i].value;
2068 if (ltr_mode.count > cap->ltr_count.max) {
2069 dprintk(VIDC_ERR,
2070 "Invalid LTR count %d. Supported max: %d\n",
2071 ltr_mode.count,
2072 cap->ltr_count.max);
2073 /*
2074 * FIXME: Return an error (-EINVALID)
2075 * here once VP8 supports LTR count
2076 * capability
2077 */
2078 ltr_mode.count = 1;
2079 }
2080 ltr_mode.trust_mode = 1;
2081 property_id = HAL_PARAM_VENC_LTRMODE;
2082 pdata = &ltr_mode;
2083 break;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002084 case V4L2_CID_MPEG_VIDC_VENC_PARAM_SAR_WIDTH:
2085 sar.aspect_width = control[i].value;
2086 property_id = HAL_PROPERTY_PARAM_VENC_ASPECT_RATIO;
2087 pdata = &sar;
2088 break;
2089 case V4L2_CID_MPEG_VIDC_VENC_PARAM_SAR_HEIGHT:
2090 sar.aspect_height = control[i].value;
2091 property_id = HAL_PROPERTY_PARAM_VENC_ASPECT_RATIO;
2092 pdata = &sar;
2093 break;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002094 case V4L2_CID_MPEG_VIDC_VIDEO_BLUR_WIDTH:
2095 property_id = HAL_CONFIG_VENC_BLUR_RESOLUTION;
2096 blur_res.width = control[i].value;
2097 blur_res.buffer_type = HAL_BUFFER_INPUT;
2098 property_id = HAL_CONFIG_VENC_BLUR_RESOLUTION;
2099 pdata = &blur_res;
2100 break;
2101 case V4L2_CID_MPEG_VIDC_VIDEO_BLUR_HEIGHT:
2102 blur_res.height = control[i].value;
2103 blur_res.buffer_type = HAL_BUFFER_INPUT;
2104 property_id = HAL_CONFIG_VENC_BLUR_RESOLUTION;
2105 pdata = &blur_res;
2106 break;
Praneeth Paladugu7fbd2792017-01-27 13:39:03 -08002107 case V4L2_CID_MPEG_VIDC_VIDEO_LAYER_ID:
Vaibhav Deshu Venkatesh3a147162017-04-27 16:21:12 -07002108 qp.layer_id = control[i].value;
2109 /* Enable QP for all frame types by default */
2110 qp.enable = 7;
2111 qp_range.layer_id = control[i].value;
Vaibhav Deshu Venkateshb494b812017-05-03 16:32:25 -07002112 bitrate.layer_id = control[i].value;
Vaibhav Deshu Venkatesh2c072532017-04-07 17:50:18 -07002113 i++;
2114 while (i < ctrl->count) {
2115 switch (control[i].id) {
2116 case V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP:
2117 qp.qpi = control[i].value;
Vaibhav Deshu Venkatesh2c072532017-04-07 17:50:18 -07002118 property_id =
2119 HAL_CONFIG_VENC_FRAME_QP;
2120 pdata = &qp;
2121 break;
2122 case V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP:
2123 qp.qpp = control[i].value;
Vaibhav Deshu Venkatesh2c072532017-04-07 17:50:18 -07002124 property_id =
2125 HAL_CONFIG_VENC_FRAME_QP;
2126 pdata = &qp;
2127 break;
2128 case V4L2_CID_MPEG_VIDC_VIDEO_B_FRAME_QP:
2129 qp.qpb = control[i].value;
Vaibhav Deshu Venkatesh3a147162017-04-27 16:21:12 -07002130 property_id =
2131 HAL_CONFIG_VENC_FRAME_QP;
2132 pdata = &qp;
2133 break;
2134 case V4L2_CID_MPEG_VIDC_VIDEO_QP_MASK:
2135 qp.enable = control[i].value;
Vaibhav Deshu Venkatesh2c072532017-04-07 17:50:18 -07002136 property_id =
2137 HAL_CONFIG_VENC_FRAME_QP;
2138 pdata = &qp;
2139 break;
2140 case V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP_MIN:
2141 qp_range.qpi_min = control[i].value;
Vaibhav Deshu Venkatesh2c072532017-04-07 17:50:18 -07002142 property_id =
2143 HAL_PARAM_VENC_SESSION_QP_RANGE;
2144 pdata = &qp_range;
2145 break;
2146 case V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP_MIN:
2147 qp_range.qpp_min = control[i].value;
Vaibhav Deshu Venkatesh2c072532017-04-07 17:50:18 -07002148 property_id =
Vaibhav Deshu Venkatesh3a147162017-04-27 16:21:12 -07002149 HAL_PARAM_VENC_SESSION_QP_RANGE;
Vaibhav Deshu Venkatesh2c072532017-04-07 17:50:18 -07002150 pdata = &qp_range;
2151 break;
2152 case V4L2_CID_MPEG_VIDC_VIDEO_B_FRAME_QP_MIN:
2153 qp_range.qpb_min = control[i].value;
Vaibhav Deshu Venkatesh2c072532017-04-07 17:50:18 -07002154 property_id =
2155 HAL_PARAM_VENC_SESSION_QP_RANGE;
2156 pdata = &qp_range;
2157 break;
2158 case V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP_MAX:
2159 qp_range.qpi_max = control[i].value;
Vaibhav Deshu Venkatesh2c072532017-04-07 17:50:18 -07002160 property_id =
2161 HAL_PARAM_VENC_SESSION_QP_RANGE;
2162 pdata = &qp_range;
2163 break;
2164 case V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP_MAX:
2165 qp_range.qpp_max = control[i].value;
Vaibhav Deshu Venkatesh2c072532017-04-07 17:50:18 -07002166 property_id =
2167 HAL_PARAM_VENC_SESSION_QP_RANGE;
2168 pdata = &qp_range;
2169 break;
2170 case V4L2_CID_MPEG_VIDC_VIDEO_B_FRAME_QP_MAX:
2171 qp_range.qpb_max = control[i].value;
Vaibhav Deshu Venkatesh2c072532017-04-07 17:50:18 -07002172 property_id =
2173 HAL_PARAM_VENC_SESSION_QP_RANGE;
2174 pdata = &qp_range;
2175 break;
2176 case V4L2_CID_MPEG_VIDC_VENC_PARAM_LAYER_BITRATE:
2177 bitrate.bit_rate = control[i].value;
Vaibhav Deshu Venkatesh2c072532017-04-07 17:50:18 -07002178 property_id =
2179 HAL_CONFIG_VENC_TARGET_BITRATE;
2180 pdata = &bitrate;
2181 break;
Praneeth Paladugu7fbd2792017-01-27 13:39:03 -08002182 }
Vaibhav Deshu Venkatesh2c072532017-04-07 17:50:18 -07002183 i++;
2184 }
Praneeth Paladugu7fbd2792017-01-27 13:39:03 -08002185 break;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002186 default:
2187 dprintk(VIDC_ERR, "Invalid id set: %d\n",
2188 control[i].id);
2189 rc = -ENOTSUPP;
2190 break;
2191 }
2192 if (rc)
2193 break;
2194 }
2195
2196 if (!rc && property_id) {
2197 dprintk(VIDC_DBG, "Control: HAL property=%x\n", property_id);
2198 rc = call_hfi_op(hdev, session_set_property,
2199 (void *)inst->session, property_id, pdata);
2200 }
2201 return rc;
2202}
2203
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002204int msm_venc_inst_init(struct msm_vidc_inst *inst)
2205{
2206 int rc = 0;
Praneeth Paladugua6b6aa42017-05-16 13:33:01 -07002207 struct msm_vidc_format *fmt = NULL;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002208
2209 if (!inst) {
2210 dprintk(VIDC_ERR, "Invalid input = %pK\n", inst);
2211 return -EINVAL;
2212 }
2213 inst->prop.height[CAPTURE_PORT] = DEFAULT_HEIGHT;
2214 inst->prop.width[CAPTURE_PORT] = DEFAULT_WIDTH;
2215 inst->prop.height[OUTPUT_PORT] = DEFAULT_HEIGHT;
2216 inst->prop.width[OUTPUT_PORT] = DEFAULT_WIDTH;
2217 inst->capability.height.min = MIN_SUPPORTED_HEIGHT;
2218 inst->capability.height.max = DEFAULT_HEIGHT;
2219 inst->capability.width.min = MIN_SUPPORTED_WIDTH;
2220 inst->capability.width.max = DEFAULT_WIDTH;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002221 inst->capability.secure_output2_threshold.min = 0;
2222 inst->capability.secure_output2_threshold.max = 0;
Chinmay Sawarkar2de3f772017-02-07 12:03:44 -08002223 inst->buffer_mode_set[OUTPUT_PORT] = HAL_BUFFER_MODE_DYNAMIC;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002224 inst->buffer_mode_set[CAPTURE_PORT] = HAL_BUFFER_MODE_STATIC;
2225 inst->prop.fps = DEFAULT_FPS;
2226 inst->capability.pixelprocess_capabilities = 0;
Praneeth Paladugudefea4e2017-02-09 23:44:08 -08002227 /* To start with, both ports are 1 plane each */
2228 inst->bufq[OUTPUT_PORT].num_planes = 1;
2229 inst->bufq[CAPTURE_PORT].num_planes = 1;
Praneeth Paladugue5fd0872017-04-19 11:24:28 -07002230 inst->clk_data.operating_rate = 0;
Praneeth Paladugube42cb22016-04-12 22:34:39 -07002231
Praneeth Paladugu6e637472017-05-16 16:06:46 -07002232 inst->buff_req.buffer[1].buffer_type = HAL_BUFFER_INPUT;
2233 inst->buff_req.buffer[1].buffer_count_min_host =
2234 inst->buff_req.buffer[1].buffer_count_actual =
2235 MIN_NUM_ENC_OUTPUT_BUFFERS;
2236 inst->buff_req.buffer[2].buffer_type = HAL_BUFFER_OUTPUT;
2237 inst->buff_req.buffer[2].buffer_count_min_host =
2238 inst->buff_req.buffer[2].buffer_count_actual =
2239 MIN_NUM_ENC_CAPTURE_BUFFERS;
2240
Praneeth Paladugua6b6aa42017-05-16 13:33:01 -07002241 /* By default, initialize OUTPUT port to UBWC YUV format */
2242 fmt = msm_comm_get_pixel_fmt_fourcc(venc_formats,
2243 ARRAY_SIZE(venc_formats), V4L2_PIX_FMT_NV12_UBWC,
2244 OUTPUT_PORT);
2245 if (!fmt || fmt->type != OUTPUT_PORT) {
2246 dprintk(VIDC_ERR,
2247 "venc_formats corrupted\n");
2248 return -EINVAL;
2249 }
2250 memcpy(&inst->fmts[fmt->type], fmt,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002251 sizeof(struct msm_vidc_format));
Praneeth Paladugua6b6aa42017-05-16 13:33:01 -07002252
2253 /* By default, initialize CAPTURE port to H264 encoder */
2254 fmt = msm_comm_get_pixel_fmt_fourcc(venc_formats,
2255 ARRAY_SIZE(venc_formats), V4L2_PIX_FMT_H264,
2256 CAPTURE_PORT);
2257 if (!fmt || fmt->type != CAPTURE_PORT) {
2258 dprintk(VIDC_ERR,
2259 "venc_formats corrupted\n");
2260 return -EINVAL;
2261 }
2262 memcpy(&inst->fmts[fmt->type], fmt,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002263 sizeof(struct msm_vidc_format));
Praneeth Paladugua6b6aa42017-05-16 13:33:01 -07002264
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002265 return rc;
2266}
2267
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002268int msm_venc_enum_fmt(struct msm_vidc_inst *inst, struct v4l2_fmtdesc *f)
2269{
2270 const struct msm_vidc_format *fmt = NULL;
2271 int rc = 0;
2272
2273 if (!inst || !f) {
2274 dprintk(VIDC_ERR,
2275 "Invalid input, inst = %pK, f = %pK\n", inst, f);
2276 return -EINVAL;
2277 }
2278 if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
2279 fmt = msm_comm_get_pixel_fmt_index(venc_formats,
2280 ARRAY_SIZE(venc_formats), f->index, CAPTURE_PORT);
2281 } else if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
2282 fmt = msm_comm_get_pixel_fmt_index(venc_formats,
2283 ARRAY_SIZE(venc_formats), f->index, OUTPUT_PORT);
2284 f->flags = V4L2_FMT_FLAG_COMPRESSED;
2285 }
2286
2287 memset(f->reserved, 0, sizeof(f->reserved));
2288 if (fmt) {
2289 strlcpy(f->description, fmt->description,
2290 sizeof(f->description));
2291 f->pixelformat = fmt->fourcc;
2292 } else {
2293 dprintk(VIDC_DBG, "No more formats found\n");
2294 rc = -EINVAL;
2295 }
2296 return rc;
2297}
2298
Chinmay Sawarkarddd1d972017-08-15 10:10:06 -07002299static int msm_venc_set_csc(struct msm_vidc_inst *inst,
2300 u32 color_primaries, u32 custom_matrix)
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002301{
2302 int rc = 0;
2303 int count = 0;
2304 struct hal_vpe_color_space_conversion vpe_csc;
Chinmay Sawarkarddd1d972017-08-15 10:10:06 -07002305 struct msm_vidc_platform_resources *resources;
2306 u32 *bias_coeff = NULL;
2307 u32 *csc_limit = NULL;
2308 u32 *csc_matrix = NULL;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002309
Chinmay Sawarkarddd1d972017-08-15 10:10:06 -07002310 resources = &(inst->core->resources);
2311 bias_coeff =
2312 resources->csc_coeff_data->vpe_csc_custom_bias_coeff;
2313 csc_limit =
2314 resources->csc_coeff_data->vpe_csc_custom_limit_coeff;
2315 csc_matrix =
2316 resources->csc_coeff_data->vpe_csc_custom_matrix_coeff;
2317
2318 vpe_csc.input_color_primaries = color_primaries;
2319 /* Custom bias, matrix & limit */
2320 vpe_csc.custom_matrix_enabled = custom_matrix;
2321
2322 if (vpe_csc.custom_matrix_enabled && bias_coeff != NULL
2323 && csc_limit != NULL && csc_matrix != NULL) {
2324 while (count < HAL_MAX_MATRIX_COEFFS) {
2325 if (count < HAL_MAX_BIAS_COEFFS)
2326 vpe_csc.csc_bias[count] =
2327 bias_coeff[count];
2328 if (count < HAL_MAX_LIMIT_COEFFS)
2329 vpe_csc.csc_limit[count] =
2330 csc_limit[count];
2331 vpe_csc.csc_matrix[count] =
2332 csc_matrix[count];
2333 count = count + 1;
2334 }
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002335 }
2336 rc = msm_comm_try_set_prop(inst,
2337 HAL_PARAM_VPE_COLOR_SPACE_CONVERSION, &vpe_csc);
2338 if (rc)
2339 dprintk(VIDC_ERR, "Setting VPE coefficients failed\n");
2340
2341 return rc;
2342}
2343
2344int msm_venc_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f)
2345{
2346 struct msm_vidc_format *fmt = NULL;
2347 int rc = 0;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002348 struct hfi_device *hdev;
Praneeth Paladugudefea4e2017-02-09 23:44:08 -08002349 int extra_idx = 0, i = 0;
2350 struct hal_buffer_requirements *buff_req_buffer;
Praneeth Paladugu1f9d1d92017-04-11 10:36:16 -07002351 struct hal_frame_size frame_sz;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002352
2353 if (!inst || !f) {
2354 dprintk(VIDC_ERR,
2355 "Invalid input, inst = %pK, format = %pK\n", inst, f);
2356 return -EINVAL;
2357 }
2358
2359 if (!inst->core || !inst->core->device) {
2360 dprintk(VIDC_ERR, "%s invalid parameters\n", __func__);
2361 return -EINVAL;
2362 }
2363 hdev = inst->core->device;
2364
2365 if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
Praneeth Paladugudefea4e2017-02-09 23:44:08 -08002366
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002367 fmt = msm_comm_get_pixel_fmt_fourcc(venc_formats,
2368 ARRAY_SIZE(venc_formats), f->fmt.pix_mp.pixelformat,
2369 CAPTURE_PORT);
2370 if (!fmt || fmt->type != CAPTURE_PORT) {
2371 dprintk(VIDC_ERR,
2372 "Format: %d not supported on CAPTURE port\n",
2373 f->fmt.pix_mp.pixelformat);
2374 rc = -EINVAL;
2375 goto exit;
2376 }
2377
2378 memcpy(&inst->fmts[fmt->type], fmt,
2379 sizeof(struct msm_vidc_format));
2380
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002381 rc = msm_comm_try_state(inst, MSM_VIDC_OPEN_DONE);
2382 if (rc) {
2383 dprintk(VIDC_ERR, "Failed to open instance\n");
2384 goto exit;
2385 }
2386
2387 inst->prop.width[CAPTURE_PORT] = f->fmt.pix_mp.width;
2388 inst->prop.height[CAPTURE_PORT] = f->fmt.pix_mp.height;
Praneeth Paladugudefea4e2017-02-09 23:44:08 -08002389
Praneeth Paladugu1f9d1d92017-04-11 10:36:16 -07002390 frame_sz.buffer_type = HAL_BUFFER_OUTPUT;
2391 frame_sz.width = inst->prop.width[CAPTURE_PORT];
2392 frame_sz.height = inst->prop.height[CAPTURE_PORT];
2393 dprintk(VIDC_DBG, "CAPTURE port width = %d, height = %d\n",
2394 frame_sz.width, frame_sz.height);
2395 rc = call_hfi_op(hdev, session_set_property, (void *)
2396 inst->session, HAL_PARAM_FRAME_SIZE, &frame_sz);
2397 if (rc) {
2398 dprintk(VIDC_ERR,
2399 "Failed to set framesize for CAPTURE port\n");
2400 goto exit;
2401 }
2402
Praneeth Paladugudefea4e2017-02-09 23:44:08 -08002403 rc = msm_comm_try_get_bufreqs(inst);
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002404 if (rc) {
2405 dprintk(VIDC_ERR,
Praneeth Paladugudefea4e2017-02-09 23:44:08 -08002406 "Failed to get buffer requirements: %d\n", rc);
2407 return rc;
2408 }
2409
2410 /*
2411 * Get CAPTURE plane size from HW. This may change based on
2412 * settings like Slice delivery mode. HW should decide howmuch
2413 * it needs.
2414 */
2415
2416 buff_req_buffer = get_buff_req_buffer(inst,
2417 HAL_BUFFER_OUTPUT);
2418
2419 f->fmt.pix_mp.plane_fmt[0].sizeimage = buff_req_buffer ?
2420 buff_req_buffer->buffer_size : 0;
2421
2422 /*
2423 * Get CAPTURE plane Extradata size from HW. This may change
2424 * with no of Extradata's enabled. HW should decide howmuch
2425 * it needs.
2426 */
2427
2428 extra_idx = EXTRADATA_IDX(inst->bufq[fmt->type].num_planes);
2429 if (extra_idx && extra_idx < VIDEO_MAX_PLANES) {
2430 buff_req_buffer = get_buff_req_buffer(inst,
2431 HAL_BUFFER_EXTRADATA_OUTPUT);
2432 f->fmt.pix_mp.plane_fmt[extra_idx].sizeimage =
2433 buff_req_buffer ?
2434 buff_req_buffer->buffer_size : 0;
2435 }
2436
2437 f->fmt.pix_mp.num_planes = inst->bufq[fmt->type].num_planes;
2438 for (i = 0; i < inst->bufq[fmt->type].num_planes; i++) {
2439 inst->bufq[fmt->type].plane_sizes[i] =
2440 f->fmt.pix_mp.plane_fmt[i].sizeimage;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002441 }
2442 } else if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
2443 struct hal_frame_size frame_sz;
2444
2445 inst->prop.width[OUTPUT_PORT] = f->fmt.pix_mp.width;
2446 inst->prop.height[OUTPUT_PORT] = f->fmt.pix_mp.height;
2447
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002448 frame_sz.buffer_type = HAL_BUFFER_INPUT;
2449 frame_sz.width = inst->prop.width[OUTPUT_PORT];
2450 frame_sz.height = inst->prop.height[OUTPUT_PORT];
Praneeth Paladugu1f9d1d92017-04-11 10:36:16 -07002451 dprintk(VIDC_DBG, "OUTPUT port width = %d, height = %d\n",
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002452 frame_sz.width, frame_sz.height);
2453 rc = call_hfi_op(hdev, session_set_property, (void *)
2454 inst->session, HAL_PARAM_FRAME_SIZE, &frame_sz);
2455 if (rc) {
2456 dprintk(VIDC_ERR,
2457 "Failed to set framesize for Output port\n");
2458 goto exit;
2459 }
2460
2461 fmt = msm_comm_get_pixel_fmt_fourcc(venc_formats,
2462 ARRAY_SIZE(venc_formats), f->fmt.pix_mp.pixelformat,
2463 OUTPUT_PORT);
2464 if (!fmt || fmt->type != OUTPUT_PORT) {
2465 dprintk(VIDC_ERR,
2466 "Format: %d not supported on OUTPUT port\n",
2467 f->fmt.pix_mp.pixelformat);
2468 rc = -EINVAL;
2469 goto exit;
2470 }
Praneeth Paladugu7722b4e2017-07-07 11:01:56 -07002471 inst->clk_data.opb_fourcc = f->fmt.pix_mp.pixelformat;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002472 memcpy(&inst->fmts[fmt->type], fmt,
2473 sizeof(struct msm_vidc_format));
2474
Praneeth Paladugudefea4e2017-02-09 23:44:08 -08002475 f->fmt.pix_mp.plane_fmt[0].sizeimage =
2476 inst->fmts[fmt->type].get_frame_size(0,
2477 f->fmt.pix_mp.height, f->fmt.pix_mp.width);
2478
2479 rc = msm_comm_try_get_bufreqs(inst);
2480 if (rc) {
2481 dprintk(VIDC_ERR,
2482 "Failed to get buffer requirements: %d\n", rc);
2483 return rc;
2484 }
2485
2486 /*
2487 * Get OUTPUT plane Extradata size from HW. This may change
2488 * with no of Extradata's enabled. HW should decide howmuch
2489 * it needs.
2490 */
2491
2492 extra_idx = EXTRADATA_IDX(inst->bufq[fmt->type].num_planes);
2493 if (extra_idx && extra_idx < VIDEO_MAX_PLANES) {
2494 buff_req_buffer = get_buff_req_buffer(inst,
2495 HAL_BUFFER_EXTRADATA_INPUT);
2496 f->fmt.pix_mp.plane_fmt[extra_idx].sizeimage =
2497 buff_req_buffer ?
2498 buff_req_buffer->buffer_size : 0;
2499 }
2500
2501 f->fmt.pix_mp.num_planes = inst->bufq[fmt->type].num_planes;
2502
2503 for (i = 0; i < inst->bufq[fmt->type].num_planes; i++) {
2504 inst->bufq[fmt->type].plane_sizes[i] =
2505 f->fmt.pix_mp.plane_fmt[i].sizeimage;
2506 }
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002507
2508 msm_comm_set_color_format(inst, HAL_BUFFER_INPUT, fmt->fourcc);
2509 } else {
2510 dprintk(VIDC_ERR, "%s - Unsupported buf type: %d\n",
2511 __func__, f->type);
2512 rc = -EINVAL;
2513 goto exit;
2514 }
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002515exit:
2516 return rc;
2517}
2518
Praneeth Paladugube42cb22016-04-12 22:34:39 -07002519int msm_venc_ctrl_init(struct msm_vidc_inst *inst,
2520 const struct v4l2_ctrl_ops *ctrl_ops)
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002521{
2522 return msm_comm_ctrl_init(inst, msm_venc_ctrls,
Praneeth Paladugube42cb22016-04-12 22:34:39 -07002523 ARRAY_SIZE(msm_venc_ctrls), ctrl_ops);
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002524}