blob: dccfe74fb8e30a10cb641a717c747d21aabc0fe2 [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
26#define MAX_OPERATING_FRAME_RATE (300 << 16)
27#define OPERATING_FRAME_RATE_STEP (1 << 16)
28#define MAX_SLICE_BYTE_SIZE ((MAX_BIT_RATE)>>3)
29#define MIN_SLICE_BYTE_SIZE 512
30#define MAX_SLICE_MB_SIZE ((4096 * 2304) >> 8)
Praneeth Paladugu7fbd2792017-01-27 13:39:03 -080031#define I_FRAME_QP 127
32#define P_FRAME_QP 127
33#define B_FRAME_QP 127
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -080034#define MAX_INTRA_REFRESH_MBS ((4096 * 2304) >> 8)
35#define MAX_NUM_B_FRAMES 4
36#define MAX_LTR_FRAME_COUNT 10
37#define MAX_HYBRID_HIER_P_LAYERS 6
38
39#define L_MODE V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED_AT_SLICE_BOUNDARY
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -080040#define MIN_TIME_RESOLUTION 1
41#define MAX_TIME_RESOLUTION 0xFFFFFF
42#define DEFAULT_TIME_RESOLUTION 0x7530
43
44/*
45 * Default 601 to 709 conversion coefficients for resolution: 176x144 negative
46 * coeffs are converted to s4.9 format (e.g. -22 converted to ((1 << 13) - 22)
47 * 3x3 transformation matrix coefficients in s4.9 fixed point format
48 */
49static u32 vpe_csc_601_to_709_matrix_coeff[HAL_MAX_MATRIX_COEFFS] = {
50 470, 8170, 8148, 0, 490, 50, 0, 34, 483
51};
52
53/* offset coefficients in s9 fixed point format */
54static u32 vpe_csc_601_to_709_bias_coeff[HAL_MAX_BIAS_COEFFS] = {
55 34, 0, 4
56};
57
58/* clamping value for Y/U/V([min,max] for Y/U/V) */
59static u32 vpe_csc_601_to_709_limit_coeff[HAL_MAX_LIMIT_COEFFS] = {
60 16, 235, 16, 240, 16, 240
61};
62
63static const char *const mpeg_video_rate_control[] = {
64 "No Rate Control",
65 "VBR VFR",
66 "VBR CFR",
67 "CBR VFR",
68 "CBR CFR",
69 "MBR CFR",
70 "MBR VFR",
71 NULL
72};
73
74static const char *const mpeg_video_rotation[] = {
75 "No Rotation",
76 "90 Degree Rotation",
77 "180 Degree Rotation",
78 "270 Degree Rotation",
79 NULL
80};
81
82static const char *const h264_video_entropy_cabac_model[] = {
83 "Model 0",
84 "Model 1",
85 "Model 2",
86 NULL
87};
88
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -080089static const char *const hevc_tier_level[] = {
Vaibhav Deshu Venkatesh234b4dc2017-03-21 16:54:28 -070090 "Level unknown"
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -080091 "Main Tier Level 1",
92 "Main Tier Level 2",
93 "Main Tier Level 2.1",
94 "Main Tier Level 3",
95 "Main Tier Level 3.1",
96 "Main Tier Level 4",
97 "Main Tier Level 4.1",
98 "Main Tier Level 5",
99 "Main Tier Level 5.1",
100 "Main Tier Level 5.2",
101 "Main Tier Level 6",
102 "Main Tier Level 6.1",
103 "Main Tier Level 6.2",
104 "High Tier Level 1",
105 "High Tier Level 2",
106 "High Tier Level 2.1",
107 "High Tier Level 3",
108 "High Tier Level 3.1",
109 "High Tier Level 4",
110 "High Tier Level 4.1",
111 "High Tier Level 5",
112 "High Tier Level 5.1",
113 "High Tier Level 5.2",
114 "High Tier Level 6",
115 "High Tier Level 6.1",
116 "High Tier Level 6.2",
117};
118
119static const char *const hevc_profile[] = {
120 "Main",
121 "Main10",
122 "Main Still Pic",
123};
124
125static const char *const vp8_profile_level[] = {
126 "Unused",
127 "0.0",
128 "1.0",
129 "2.0",
130 "3.0",
131};
132
133static const char *const perf_level[] = {
134 "Nominal",
135 "Performance",
136 "Turbo"
137};
138
139static const char *const mbi_statistics[] = {
140 "Camcorder Default",
141 "Mode 1",
142 "Mode 2",
143 "Mode 3"
144};
145
146static const char *const intra_refresh_modes[] = {
147 "None",
148 "Cyclic",
149 "Adaptive",
150 "Cyclic Adaptive",
151 "Random"
152};
153
154static const char *const timestamp_mode[] = {
155 "Honor",
156 "Ignore",
157};
158
159static const char *const iframe_sizes[] = {
160 "Default",
161 "Medium",
162 "Huge",
163 "Unlimited"
164};
165
166static struct msm_vidc_ctrl msm_venc_ctrls[] = {
167 {
168 .id = V4L2_CID_MPEG_VIDC_VIDEO_IDR_PERIOD,
169 .name = "IDR Period",
170 .type = V4L2_CTRL_TYPE_INTEGER,
171 .minimum = 1,
172 .maximum = INT_MAX,
173 .default_value = DEFAULT_FRAME_RATE,
174 .step = 1,
175 .menu_skip_mask = 0,
176 .qmenu = NULL,
177 },
178 {
179 .id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_P_FRAMES,
180 .name = "Intra Period for P frames",
181 .type = V4L2_CTRL_TYPE_INTEGER,
182 .minimum = 0,
183 .maximum = INT_MAX,
184 .default_value = 2*DEFAULT_FRAME_RATE-1,
185 .step = 1,
186 .menu_skip_mask = 0,
187 .qmenu = NULL,
188 },
189 {
Praneeth Paladugu7fbd2792017-01-27 13:39:03 -0800190 .id = V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP,
191 .name = "I Frame Quantization",
192 .type = V4L2_CTRL_TYPE_INTEGER,
193 .minimum = 1,
194 .maximum = 127,
195 .default_value = I_FRAME_QP,
196 .step = 1,
197 .menu_skip_mask = 0,
198 .qmenu = NULL,
199 },
200 {
201 .id = V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP,
202 .name = "P Frame Quantization",
203 .type = V4L2_CTRL_TYPE_INTEGER,
204 .minimum = 1,
205 .maximum = 127,
206 .default_value = P_FRAME_QP,
207 .step = 1,
208 .menu_skip_mask = 0,
209 .qmenu = NULL,
210 },
211 {
212 .id = V4L2_CID_MPEG_VIDC_VIDEO_B_FRAME_QP,
213 .name = "B Frame Quantization",
214 .type = V4L2_CTRL_TYPE_INTEGER,
215 .minimum = 1,
216 .maximum = 127,
217 .default_value = B_FRAME_QP,
218 .step = 1,
219 .menu_skip_mask = 0,
220 .qmenu = NULL,
221 },
222 {
223 .id = V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP_MIN,
224 .name = "I Frame Quantization Range Minimum",
225 .type = V4L2_CTRL_TYPE_INTEGER,
226 .minimum = 1,
227 .maximum = 127,
228 .default_value = I_FRAME_QP,
229 .step = 1,
230 .menu_skip_mask = 0,
231 .qmenu = NULL,
232 },
233 {
234 .id = V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP_MIN,
235 .name = "P Frame Quantization Range Minimum",
236 .type = V4L2_CTRL_TYPE_INTEGER,
237 .minimum = 1,
238 .maximum = 127,
239 .default_value = P_FRAME_QP,
240 .step = 1,
241 .menu_skip_mask = 0,
242 .qmenu = NULL,
243 },
244 {
245 .id = V4L2_CID_MPEG_VIDC_VIDEO_B_FRAME_QP_MIN,
246 .name = "B Frame Quantization Range Minimum",
247 .type = V4L2_CTRL_TYPE_INTEGER,
248 .minimum = 1,
249 .maximum = 127,
250 .default_value = B_FRAME_QP,
251 .step = 1,
252 .menu_skip_mask = 0,
253 .qmenu = NULL,
254 },
255 {
256 .id = V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP_MAX,
257 .name = "I Frame Quantization Range Maximum",
258 .type = V4L2_CTRL_TYPE_INTEGER,
259 .minimum = 1,
260 .maximum = 127,
261 .default_value = I_FRAME_QP,
262 .step = 1,
263 .menu_skip_mask = 0,
264 .qmenu = NULL,
265 },
266 {
267 .id = V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP_MAX,
268 .name = "P Frame Quantization Range Maximum",
269 .type = V4L2_CTRL_TYPE_INTEGER,
270 .minimum = 1,
271 .maximum = 127,
272 .default_value = P_FRAME_QP,
273 .step = 1,
274 .menu_skip_mask = 0,
275 .qmenu = NULL,
276 },
277 {
278 .id = V4L2_CID_MPEG_VIDC_VIDEO_B_FRAME_QP_MAX,
279 .name = "B Frame Quantization Range Maximum",
280 .type = V4L2_CTRL_TYPE_INTEGER,
281 .minimum = 1,
282 .maximum = 127,
283 .default_value = B_FRAME_QP,
284 .step = 1,
285 .menu_skip_mask = 0,
286 .qmenu = NULL,
287 },
288 {
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800289 .id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_B_FRAMES,
290 .name = "Intra Period for B frames",
291 .type = V4L2_CTRL_TYPE_INTEGER,
292 .minimum = 0,
293 .maximum = INT_MAX,
294 .default_value = 0,
295 .step = 1,
296 .menu_skip_mask = 0,
297 .qmenu = NULL,
298 },
299 {
Praneeth Paladugudefea4e2017-02-09 23:44:08 -0800300 .id = V4L2_CID_MIN_BUFFERS_FOR_CAPTURE,
301 .name = "CAPTURE Count",
302 .type = V4L2_CTRL_TYPE_INTEGER,
303 .minimum = MIN_NUM_CAPTURE_BUFFERS,
304 .maximum = MAX_NUM_CAPTURE_BUFFERS,
305 .default_value = MIN_NUM_CAPTURE_BUFFERS,
306 .step = 1,
307 .menu_skip_mask = 0,
308 .qmenu = NULL,
309 .flags = V4L2_CTRL_FLAG_VOLATILE,
310 },
311 {
312 .id = V4L2_CID_MIN_BUFFERS_FOR_OUTPUT,
313 .name = "OUTPUT Count",
314 .type = V4L2_CTRL_TYPE_INTEGER,
315 .minimum = MIN_NUM_OUTPUT_BUFFERS,
316 .maximum = MAX_NUM_OUTPUT_BUFFERS,
317 .default_value = MIN_NUM_OUTPUT_BUFFERS,
318 .step = 1,
319 .menu_skip_mask = 0,
320 .qmenu = NULL,
321 .flags = V4L2_CTRL_FLAG_VOLATILE,
322 },
323
324 {
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800325 .id = V4L2_CID_MPEG_VIDC_VIDEO_REQUEST_IFRAME,
326 .name = "Request I Frame",
327 .type = V4L2_CTRL_TYPE_BUTTON,
328 .minimum = 0,
329 .maximum = 0,
330 .default_value = 0,
331 .step = 0,
332 .menu_skip_mask = 0,
333 .qmenu = NULL,
334 },
335 {
336 .id = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL,
337 .name = "Video Framerate and Bitrate Control",
338 .type = V4L2_CTRL_TYPE_MENU,
339 .minimum = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_OFF,
340 .maximum = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_MBR_VFR,
341 .default_value = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_OFF,
342 .step = 0,
343 .menu_skip_mask = ~(
344 (1 << V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_OFF) |
345 (1 << V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_VBR_VFR) |
346 (1 << V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_VBR_CFR) |
347 (1 << V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_CBR_VFR) |
348 (1 << V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_CBR_CFR) |
349 (1 << V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_MBR_CFR) |
350 (1 << V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_MBR_VFR)
351 ),
352 .qmenu = mpeg_video_rate_control,
353 },
354 {
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800355 .id = V4L2_CID_MPEG_VIDEO_BITRATE,
356 .name = "Bit Rate",
357 .type = V4L2_CTRL_TYPE_INTEGER,
358 .minimum = MIN_BIT_RATE,
359 .maximum = MAX_BIT_RATE,
360 .default_value = DEFAULT_BIT_RATE,
361 .step = BIT_RATE_STEP,
362 .menu_skip_mask = 0,
363 .qmenu = NULL,
364 },
365 {
366 .id = V4L2_CID_MPEG_VIDEO_BITRATE_PEAK,
367 .name = "Peak Bit Rate",
368 .type = V4L2_CTRL_TYPE_INTEGER,
369 .minimum = MIN_BIT_RATE,
370 .maximum = MAX_BIT_RATE,
371 .default_value = DEFAULT_BIT_RATE,
372 .step = BIT_RATE_STEP,
373 .menu_skip_mask = 0,
374 .qmenu = NULL,
375 },
376 {
377 .id = V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE,
378 .name = "Entropy Mode",
379 .type = V4L2_CTRL_TYPE_MENU,
380 .minimum = V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC,
381 .maximum = V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC,
382 .default_value = V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC,
383 .menu_skip_mask = ~(
384 (1 << V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC) |
385 (1 << V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC)
386 ),
387 },
388 {
389 .id = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL,
390 .name = "CABAC Model",
391 .type = V4L2_CTRL_TYPE_MENU,
392 .minimum = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_0,
393 .maximum = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_1,
394 .default_value = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_0,
395 .menu_skip_mask = ~(
396 (1 << V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_0) |
397 (1 << V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_1) |
398 (1 << V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_2)
399 ),
400 .qmenu = h264_video_entropy_cabac_model,
401 },
402 {
403 .id = V4L2_CID_MPEG_VIDEO_H264_PROFILE,
404 .name = "H264 Profile",
405 .type = V4L2_CTRL_TYPE_MENU,
406 .minimum = V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE,
407 .maximum = V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_HIGH,
408 .default_value = V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE,
409 .menu_skip_mask = 0,
410 },
411 {
412 .id = V4L2_CID_MPEG_VIDEO_H264_LEVEL,
413 .name = "H264 Level",
414 .type = V4L2_CTRL_TYPE_MENU,
415 .minimum = V4L2_MPEG_VIDEO_H264_LEVEL_1_0,
Vaibhav Deshu Venkatesh234b4dc2017-03-21 16:54:28 -0700416 .maximum = V4L2_MPEG_VIDEO_H264_LEVEL_UNKNOWN,
417 .default_value = V4L2_MPEG_VIDEO_H264_LEVEL_UNKNOWN,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800418 .menu_skip_mask = 0,
419 },
420 {
421 .id = V4L2_CID_MPEG_VIDC_VIDEO_VP8_PROFILE_LEVEL,
422 .name = "VP8 Profile Level",
423 .type = V4L2_CTRL_TYPE_MENU,
424 .minimum = V4L2_MPEG_VIDC_VIDEO_VP8_UNUSED,
425 .maximum = V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_1,
426 .default_value = V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_0,
427 .menu_skip_mask = ~(
428 (1 << V4L2_MPEG_VIDC_VIDEO_VP8_UNUSED) |
429 (1 << V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_0) |
430 (1 << V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_1)
431 ),
432 .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 {
481 .id = V4L2_CID_MPEG_VIDC_VIDEO_ROTATION,
482 .name = "Rotation",
483 .type = V4L2_CTRL_TYPE_MENU,
484 .minimum = V4L2_CID_MPEG_VIDC_VIDEO_ROTATION_NONE,
485 .maximum = V4L2_CID_MPEG_VIDC_VIDEO_ROTATION_270,
486 .default_value = V4L2_CID_MPEG_VIDC_VIDEO_ROTATION_NONE,
487 .menu_skip_mask = ~(
488 (1 << V4L2_CID_MPEG_VIDC_VIDEO_ROTATION_NONE) |
489 (1 << V4L2_CID_MPEG_VIDC_VIDEO_ROTATION_90) |
490 (1 << V4L2_CID_MPEG_VIDC_VIDEO_ROTATION_180) |
491 (1 << V4L2_CID_MPEG_VIDC_VIDEO_ROTATION_270)
492 ),
493 .qmenu = mpeg_video_rotation,
494 },
495 {
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800496 .id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE,
497 .name = "Slice Mode",
498 .type = V4L2_CTRL_TYPE_MENU,
499 .minimum = V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE,
500 .maximum = V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_BYTES,
501 .default_value = V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE,
502 .menu_skip_mask = ~(
503 (1 << V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE) |
504 (1 << V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_MB) |
505 (1 << V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_BYTES)
506 ),
507 },
508 {
509 .id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES,
510 .name = "Slice Byte Size",
511 .type = V4L2_CTRL_TYPE_INTEGER,
512 .minimum = MIN_SLICE_BYTE_SIZE,
513 .maximum = MAX_SLICE_BYTE_SIZE,
514 .default_value = MIN_SLICE_BYTE_SIZE,
515 .step = 1,
516 .menu_skip_mask = 0,
517 .qmenu = NULL,
518 },
519 {
520 .id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB,
521 .name = "Slice MB Size",
522 .type = V4L2_CTRL_TYPE_INTEGER,
523 .minimum = 1,
524 .maximum = MAX_SLICE_MB_SIZE,
525 .default_value = 1,
526 .step = 1,
527 .menu_skip_mask = 0,
528 .qmenu = NULL,
529 },
530 {
531 .id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_DELIVERY_MODE,
532 .name = "Slice delivery mode",
533 .type = V4L2_CTRL_TYPE_BUTTON,
534 .minimum = 0,
535 .maximum = 1,
536 .default_value = 0,
537 .step = 1,
538 .menu_skip_mask = 0,
539 .qmenu = NULL,
540 },
541 {
542 .id = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_MODE,
543 .name = "Intra Refresh Mode",
544 .type = V4L2_CTRL_TYPE_MENU,
545 .minimum = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_NONE,
546 .maximum = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_RANDOM,
547 .default_value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_NONE,
548 .menu_skip_mask = ~(
549 (1 << V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_NONE) |
550 (1 << V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_CYCLIC) |
551 (1 << V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_RANDOM)
552 ),
553 .qmenu = intra_refresh_modes,
554 },
555 {
556 .id = V4L2_CID_MPEG_VIDC_VIDEO_IR_MBS,
557 .name = "Intra Refresh AIR MBS",
558 .type = V4L2_CTRL_TYPE_INTEGER,
559 .minimum = 0,
560 .maximum = MAX_INTRA_REFRESH_MBS,
561 .default_value = 0,
562 .step = 1,
563 .menu_skip_mask = 0,
564 .qmenu = NULL,
565 },
566 {
567 .id = V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA,
568 .name = "H.264 Loop Filter Alpha Offset",
569 .type = V4L2_CTRL_TYPE_INTEGER,
570 .minimum = -6,
571 .maximum = 6,
572 .default_value = 0,
573 .step = 1,
574 .menu_skip_mask = 0,
575 .qmenu = NULL,
576 },
577 {
578 .id = V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA,
579 .name = "H.264 Loop Filter Beta Offset",
580 .type = V4L2_CTRL_TYPE_INTEGER,
581 .minimum = -6,
582 .maximum = 6,
583 .default_value = 0,
584 .step = 1,
585 .menu_skip_mask = 0,
586 .qmenu = NULL,
587 },
588 {
589 .id = V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE,
590 .name = "H.264 Loop Filter Mode",
591 .type = V4L2_CTRL_TYPE_MENU,
592 .minimum = V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_ENABLED,
593 .maximum = L_MODE,
594 .default_value = V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED,
595 .menu_skip_mask = ~(
596 (1 << V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_ENABLED) |
597 (1 << V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED) |
598 (1 << L_MODE)
599 ),
600 },
601 {
602 .id = V4L2_CID_MPEG_VIDEO_HEADER_MODE,
603 .name = "Sequence Header Mode",
604 .type = V4L2_CTRL_TYPE_MENU,
605 .minimum = V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE,
606 .maximum = V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME,
607 .default_value =
608 V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME,
609 .menu_skip_mask = ~(
610 (1 << V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE) |
611 (1 << V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME)
612 ),
613 },
614 {
615 .id = V4L2_CID_MPEG_VIDC_VIDEO_SECURE,
616 .name = "Secure mode",
617 .type = V4L2_CTRL_TYPE_BUTTON,
618 .minimum = 0,
619 .maximum = 0,
620 .default_value = 0,
621 .step = 0,
622 .menu_skip_mask = 0,
623 .qmenu = NULL,
624 },
625 {
626 .id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA,
627 .name = "Extradata Type",
628 .type = V4L2_CTRL_TYPE_MENU,
629 .minimum = V4L2_MPEG_VIDC_EXTRADATA_NONE,
630 .maximum = V4L2_MPEG_VIDC_EXTRADATA_PQ_INFO,
631 .default_value = V4L2_MPEG_VIDC_EXTRADATA_NONE,
632 .menu_skip_mask = ~(
633 (1 << V4L2_MPEG_VIDC_EXTRADATA_NONE) |
634 (1 << V4L2_MPEG_VIDC_EXTRADATA_MB_QUANTIZATION) |
635 (1 << V4L2_MPEG_VIDC_EXTRADATA_INTERLACE_VIDEO) |
636 (1 << V4L2_MPEG_VIDC_EXTRADATA_TIMESTAMP) |
637 (1 << V4L2_MPEG_VIDC_EXTRADATA_S3D_FRAME_PACKING) |
638 (1 << V4L2_MPEG_VIDC_EXTRADATA_FRAME_RATE) |
639 (1 << V4L2_MPEG_VIDC_EXTRADATA_PANSCAN_WINDOW) |
640 (1 << V4L2_MPEG_VIDC_EXTRADATA_RECOVERY_POINT_SEI) |
641 (1 << V4L2_MPEG_VIDC_EXTRADATA_MULTISLICE_INFO) |
642 (1 << V4L2_MPEG_VIDC_EXTRADATA_NUM_CONCEALED_MB) |
643 (1 << V4L2_MPEG_VIDC_EXTRADATA_METADATA_FILLER) |
644 (1 << V4L2_MPEG_VIDC_EXTRADATA_INPUT_CROP) |
645 (1 << V4L2_MPEG_VIDC_EXTRADATA_DIGITAL_ZOOM) |
646 (1 << V4L2_MPEG_VIDC_EXTRADATA_ASPECT_RATIO) |
647 (1 << V4L2_MPEG_VIDC_EXTRADATA_LTR) |
648 (1 << V4L2_MPEG_VIDC_EXTRADATA_METADATA_MBI) |
649 (1 << V4L2_MPEG_VIDC_EXTRADATA_YUV_STATS)|
650 (1 << V4L2_MPEG_VIDC_EXTRADATA_ROI_QP) |
651 (1 << V4L2_MPEG_VIDC_EXTRADATA_PQ_INFO)
652 ),
653 .qmenu = mpeg_video_vidc_extradata,
654 },
655 {
656 .id = V4L2_CID_MPEG_VIDC_VIDEO_VUI_TIMING_INFO,
657 .name = "H264 VUI Timing Info",
658 .type = V4L2_CTRL_TYPE_BOOLEAN,
659 .minimum = V4L2_MPEG_VIDC_VIDEO_VUI_TIMING_INFO_DISABLED,
660 .maximum = V4L2_MPEG_VIDC_VIDEO_VUI_TIMING_INFO_ENABLED,
661 .default_value =
662 V4L2_MPEG_VIDC_VIDEO_VUI_TIMING_INFO_DISABLED,
663 .step = 1,
664 },
665 {
666 .id = V4L2_CID_MPEG_VIDC_VIDEO_AU_DELIMITER,
Umesh Pandey7fce7ee2017-03-13 17:59:48 -0700667 .name = "AU Delimiter",
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800668 .type = V4L2_CTRL_TYPE_BOOLEAN,
669 .minimum = V4L2_MPEG_VIDC_VIDEO_AU_DELIMITER_DISABLED,
670 .maximum = V4L2_MPEG_VIDC_VIDEO_AU_DELIMITER_ENABLED,
671 .step = 1,
672 .default_value =
673 V4L2_MPEG_VIDC_VIDEO_AU_DELIMITER_DISABLED,
674 },
675 {
676 .id = V4L2_CID_MPEG_VIDEO_CYCLIC_INTRA_REFRESH_MB,
677 .name = "Intra Refresh CIR MBS",
678 .type = V4L2_CTRL_TYPE_INTEGER,
679 .minimum = 0,
680 .maximum = MAX_INTRA_REFRESH_MBS,
681 .default_value = 0,
682 .step = 1,
683 .menu_skip_mask = 0,
684 .qmenu = NULL,
685 },
686 {
687 .id = V4L2_CID_MPEG_VIDC_VIDEO_PRESERVE_TEXT_QUALITY,
688 .name = "Preserve Text Qualty",
689 .type = V4L2_CTRL_TYPE_BOOLEAN,
690 .minimum = V4L2_MPEG_VIDC_VIDEO_PRESERVE_TEXT_QUALITY_DISABLED,
691 .maximum = V4L2_MPEG_VIDC_VIDEO_PRESERVE_TEXT_QUALITY_ENABLED,
692 .default_value =
693 V4L2_MPEG_VIDC_VIDEO_PRESERVE_TEXT_QUALITY_DISABLED,
694 .step = 1,
695 },
696 {
697 .id = V4L2_CID_MPEG_VIDC_VIDEO_USELTRFRAME,
698 .name = "H264 Use LTR",
699 .type = V4L2_CTRL_TYPE_INTEGER,
700 .minimum = 0,
701 .maximum = (MAX_LTR_FRAME_COUNT - 1),
702 .default_value = 0,
703 .step = 1,
704 .qmenu = NULL,
705 },
706 {
707 .id = V4L2_CID_MPEG_VIDC_VIDEO_LTRCOUNT,
708 .name = "Ltr Count",
709 .type = V4L2_CTRL_TYPE_INTEGER,
710 .minimum = 0,
711 .maximum = MAX_LTR_FRAME_COUNT,
712 .default_value = 0,
713 .step = 1,
714 .qmenu = NULL,
715 },
716 {
717 .id = V4L2_CID_MPEG_VIDC_VIDEO_LTRMODE,
718 .name = "Ltr Mode",
719 .type = V4L2_CTRL_TYPE_INTEGER,
720 .minimum = V4L2_MPEG_VIDC_VIDEO_LTR_MODE_DISABLE,
721 .maximum = V4L2_MPEG_VIDC_VIDEO_LTR_MODE_MANUAL,
722 .default_value = V4L2_MPEG_VIDC_VIDEO_LTR_MODE_DISABLE,
723 .step = 1,
724 .qmenu = NULL,
725 },
726 {
727 .id = V4L2_CID_MPEG_VIDC_VIDEO_MARKLTRFRAME,
728 .name = "H264 Mark LTR",
729 .type = V4L2_CTRL_TYPE_INTEGER,
730 .minimum = 0,
731 .maximum = (MAX_LTR_FRAME_COUNT - 1),
732 .default_value = 0,
733 .step = 1,
734 .qmenu = NULL,
735 },
736 {
737 .id = V4L2_CID_MPEG_VIDC_VIDEO_HIER_P_NUM_LAYERS,
738 .name = "Set Hier P num layers",
739 .type = V4L2_CTRL_TYPE_INTEGER,
740 .minimum = 0,
741 .maximum = 6,
742 .default_value = 0,
743 .step = 1,
744 .qmenu = NULL,
745 },
746 {
747 .id = V4L2_CID_MPEG_VIDC_VIDEO_VPX_ERROR_RESILIENCE,
748 .name = "VP8 Error Resilience mode",
749 .type = V4L2_CTRL_TYPE_BOOLEAN,
750 .minimum = V4L2_MPEG_VIDC_VIDEO_VPX_ERROR_RESILIENCE_DISABLED,
751 .maximum = V4L2_MPEG_VIDC_VIDEO_VPX_ERROR_RESILIENCE_ENABLED,
752 .default_value =
753 V4L2_MPEG_VIDC_VIDEO_VPX_ERROR_RESILIENCE_DISABLED,
754 .step = 1,
755 .qmenu = NULL,
756 },
757 {
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800758 .id = V4L2_CID_MPEG_VIDC_VIDEO_HIER_B_NUM_LAYERS,
759 .name = "Set Hier B num layers",
760 .type = V4L2_CTRL_TYPE_INTEGER,
761 .minimum = 0,
762 .maximum = 3,
763 .default_value = 0,
764 .step = 1,
765 .qmenu = NULL,
766 },
767 {
768 .id = V4L2_CID_MPEG_VIDC_VIDEO_HYBRID_HIERP_MODE,
769 .name = "Set Hybrid Hier P mode",
770 .type = V4L2_CTRL_TYPE_INTEGER,
771 .minimum = 0,
772 .maximum = 5,
773 .default_value = 0,
774 .step = 1,
775 .qmenu = NULL,
776 },
777 {
778 .id = V4L2_CID_VIDC_QBUF_MODE,
779 .name = "Allows batching of buffers for power savings",
780 .type = V4L2_CTRL_TYPE_BOOLEAN,
781 .minimum = V4L2_VIDC_QBUF_STANDARD,
782 .maximum = V4L2_VIDC_QBUF_BATCHED,
783 .default_value = V4L2_VIDC_QBUF_STANDARD,
784 .step = 1,
785 },
786 {
787 .id = V4L2_CID_MPEG_VIDC_VIDEO_MAX_HIERP_LAYERS,
788 .name = "Set Max Hier P num layers sessions",
789 .type = V4L2_CTRL_TYPE_INTEGER,
790 .minimum = 0,
791 .maximum = 6,
792 .default_value = 0,
793 .step = 1,
794 .qmenu = NULL,
795 },
796 {
797 .id = V4L2_CID_MPEG_VIDC_VIDEO_BASELAYER_ID,
798 .name = "Set Base Layer ID for Hier-P",
799 .type = V4L2_CTRL_TYPE_INTEGER,
800 .minimum = 0,
801 .maximum = 6,
802 .default_value = 0,
803 .step = 1,
804 .qmenu = NULL,
805 },
806 {
Vaibhav Deshu Venkateshd0792bc2017-03-16 14:55:51 -0700807 .id = V4L2_CID_MPEG_VIDC_VIDEO_LAYER_ID,
808 .name = "Layer ID for different settings",
809 .type = V4L2_CTRL_TYPE_INTEGER,
810 .minimum = 0,
811 .maximum = 6,
812 .default_value = 0,
813 .step = 1,
814 .qmenu = NULL,
815 },
816 {
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -0800817 .id = V4L2_CID_MPEG_VIDC_VENC_PARAM_SAR_WIDTH,
818 .name = "SAR Width",
819 .type = V4L2_CTRL_TYPE_INTEGER,
820 .minimum = 1,
821 .maximum = 4096,
822 .default_value = 1,
823 .step = 1,
824 .qmenu = NULL,
825 },
826 {
827 .id = V4L2_CID_MPEG_VIDC_VENC_PARAM_SAR_HEIGHT,
828 .name = "SAR Height",
829 .type = V4L2_CTRL_TYPE_INTEGER,
830 .minimum = 1,
831 .maximum = 2160,
832 .default_value = 1,
833 .step = 1,
834 .qmenu = NULL,
835 },
836 {
837 .id = V4L2_CID_MPEG_VIDC_VIDEO_PRIORITY,
838 .name = "Session Priority",
839 .type = V4L2_CTRL_TYPE_BOOLEAN,
840 .minimum = V4L2_MPEG_VIDC_VIDEO_PRIORITY_REALTIME_ENABLE,
841 .maximum = V4L2_MPEG_VIDC_VIDEO_PRIORITY_REALTIME_DISABLE,
842 .default_value = V4L2_MPEG_VIDC_VIDEO_PRIORITY_REALTIME_DISABLE,
843 .step = 1,
844 },
845 {
846 .id = V4L2_CID_MPEG_VIDC_VIDEO_VQZIP_SEI,
847 .name = "VQZIP SEI",
848 .type = V4L2_CTRL_TYPE_BOOLEAN,
849 .minimum = V4L2_CID_MPEG_VIDC_VIDEO_VQZIP_SEI_DISABLE,
850 .maximum = V4L2_CID_MPEG_VIDC_VIDEO_VQZIP_SEI_ENABLE,
851 .default_value = V4L2_CID_MPEG_VIDC_VIDEO_VQZIP_SEI_DISABLE,
852 .step = 1,
853 },
854 {
855 .id = V4L2_CID_MPEG_VIDC_VENC_PARAM_LAYER_BITRATE,
856 .name = "Layer wise bitrate for H264/H265 Hybrid HP",
857 .type = V4L2_CTRL_TYPE_INTEGER,
858 .minimum = MIN_BIT_RATE,
859 .maximum = MAX_BIT_RATE,
860 .default_value = DEFAULT_BIT_RATE,
861 .step = BIT_RATE_STEP,
862 .menu_skip_mask = 0,
863 .qmenu = NULL,
864 },
865 {
866 .id = V4L2_CID_MPEG_VIDC_VIDEO_OPERATING_RATE,
867 .name = "Set Encoder Operating rate",
868 .type = V4L2_CTRL_TYPE_INTEGER,
869 .minimum = 0,
870 .maximum = MAX_OPERATING_FRAME_RATE,
871 .default_value = 0,
872 .step = OPERATING_FRAME_RATE_STEP,
873 },
874 {
875 .id = V4L2_CID_MPEG_VIDC_VIDEO_VENC_BITRATE_TYPE,
876 .name = "BITRATE TYPE",
877 .type = V4L2_CTRL_TYPE_BOOLEAN,
878 .minimum = V4L2_CID_MPEG_VIDC_VIDEO_VENC_BITRATE_DISABLE,
879 .maximum = V4L2_CID_MPEG_VIDC_VIDEO_VENC_BITRATE_ENABLE,
880 .default_value = V4L2_CID_MPEG_VIDC_VIDEO_VENC_BITRATE_ENABLE,
881 .step = 1,
882 },
883 {
884 .id = V4L2_CID_MPEG_VIDC_VIDEO_VPE_CSC,
885 .name = "Set VPE Color space conversion coefficients",
886 .type = V4L2_CTRL_TYPE_INTEGER,
887 .minimum = V4L2_CID_MPEG_VIDC_VIDEO_VPE_CSC_DISABLE,
888 .maximum = V4L2_CID_MPEG_VIDC_VIDEO_VPE_CSC_ENABLE,
889 .default_value = V4L2_CID_MPEG_VIDC_VIDEO_VPE_CSC_DISABLE,
890 .step = 1,
891 },
892 {
893 .id = V4L2_CID_MPEG_VIDC_VIDEO_LOWLATENCY_MODE,
894 .name = "Low Latency Mode",
895 .type = V4L2_CTRL_TYPE_BOOLEAN,
896 .minimum = V4L2_CID_MPEG_VIDC_VIDEO_LOWLATENCY_DISABLE,
897 .maximum = V4L2_CID_MPEG_VIDC_VIDEO_LOWLATENCY_ENABLE,
898 .default_value = V4L2_CID_MPEG_VIDC_VIDEO_LOWLATENCY_DISABLE,
899 .step = 1,
900 },
901 {
902 .id = V4L2_CID_MPEG_VIDC_VIDEO_BLUR_WIDTH,
903 .name = "Set Blur width",
904 .type = V4L2_CTRL_TYPE_INTEGER,
905 .minimum = 0,
906 .maximum = 2048,
907 .default_value = 0,
908 .step = 1,
909 },
910 {
911 .id = V4L2_CID_MPEG_VIDC_VIDEO_BLUR_HEIGHT,
912 .name = "Set Blur height",
913 .type = V4L2_CTRL_TYPE_INTEGER,
914 .minimum = 0,
915 .maximum = 2048,
916 .default_value = 0,
917 .step = 1,
918 },
919 {
920 .id = V4L2_CID_MPEG_VIDC_VIDEO_H264_TRANSFORM_8x8,
921 .name = "Transform 8x8",
922 .type = V4L2_CTRL_TYPE_BOOLEAN,
923 .minimum = V4L2_MPEG_VIDC_VIDEO_H264_TRANSFORM_8x8_DISABLE,
924 .maximum = V4L2_MPEG_VIDC_VIDEO_H264_TRANSFORM_8x8_ENABLE,
925 .default_value = V4L2_MPEG_VIDC_VIDEO_H264_TRANSFORM_8x8_ENABLE,
926 .step = 1,
927 },
928 {
929 .id = V4L2_CID_MPEG_VIDC_VIDEO_COLOR_SPACE,
930 .name = "Set Color space",
931 .type = V4L2_CTRL_TYPE_INTEGER,
932 .minimum = MSM_VIDC_BT709_5,
933 .maximum = MSM_VIDC_BT2020,
934 .default_value = MSM_VIDC_BT601_6_625,
935 .step = 1,
936 .qmenu = NULL,
937 },
938 {
939 .id = V4L2_CID_MPEG_VIDC_VIDEO_FULL_RANGE,
940 .name = "Set Color space range",
941 .type = V4L2_CTRL_TYPE_BOOLEAN,
942 .minimum = V4L2_CID_MPEG_VIDC_VIDEO_FULL_RANGE_DISABLE,
943 .maximum = V4L2_CID_MPEG_VIDC_VIDEO_FULL_RANGE_ENABLE,
944 .default_value = V4L2_CID_MPEG_VIDC_VIDEO_FULL_RANGE_DISABLE,
945 .step = 1,
946 },
947 {
948 .id = V4L2_CID_MPEG_VIDC_VIDEO_TRANSFER_CHARS,
949 .name = "Set Color space transfer characterstics",
950 .type = V4L2_CTRL_TYPE_INTEGER,
951 .minimum = MSM_VIDC_TRANSFER_BT709_5,
952 .maximum = MSM_VIDC_TRANSFER_BT_2020_12,
953 .default_value = MSM_VIDC_TRANSFER_601_6_625,
954 .step = 1,
955 .qmenu = NULL,
956 },
957 {
958 .id = V4L2_CID_MPEG_VIDC_VIDEO_MATRIX_COEFFS,
959 .name = "Set Color space matrix coefficients",
960 .type = V4L2_CTRL_TYPE_INTEGER,
961 .minimum = MSM_VIDC_MATRIX_BT_709_5,
962 .maximum = MSM_VIDC_MATRIX_BT_2020_CONST,
963 .default_value = MSM_VIDC_MATRIX_601_6_625,
964 .step = 1,
965 .qmenu = NULL,
966 },
967 {
968 .id = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_TYPE,
969 .name = "Bounds of I-frame size",
970 .type = V4L2_CTRL_TYPE_MENU,
971 .minimum = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_DEFAULT,
972 .maximum = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_UNLIMITED,
973 .default_value = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_DEFAULT,
974 .menu_skip_mask = ~(
975 (1 << V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_DEFAULT) |
976 (1 << V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_MEDIUM) |
977 (1 << V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_HUGE) |
978 (1 << V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_UNLIMITED)),
979 .qmenu = iframe_sizes,
980 },
981
982};
983
984#define NUM_CTRLS ARRAY_SIZE(msm_venc_ctrls)
985
986static u32 get_frame_size_nv12(int plane, u32 height, u32 width)
987{
988 return VENUS_BUFFER_SIZE(COLOR_FMT_NV12, width, height);
989}
990
991static u32 get_frame_size_nv12_ubwc(int plane, u32 height, u32 width)
992{
993 return VENUS_BUFFER_SIZE(COLOR_FMT_NV12_UBWC, width, height);
994}
995
996static u32 get_frame_size_rgba(int plane, u32 height, u32 width)
997{
998 return VENUS_BUFFER_SIZE(COLOR_FMT_RGBA8888, width, height);
999}
1000
1001static u32 get_frame_size_nv21(int plane, u32 height, u32 width)
1002{
1003 return VENUS_BUFFER_SIZE(COLOR_FMT_NV21, width, height);
1004}
1005
1006static u32 get_frame_size_compressed(int plane, u32 height, u32 width)
1007{
1008 int sz = ALIGN(height, 32) * ALIGN(width, 32) * 3 / 2;
1009
1010 return ALIGN(sz, SZ_4K);
1011}
1012
1013static struct msm_vidc_format venc_formats[] = {
1014 {
1015 .name = "YCbCr Semiplanar 4:2:0",
1016 .description = "Y/CbCr 4:2:0",
1017 .fourcc = V4L2_PIX_FMT_NV12,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001018 .get_frame_size = get_frame_size_nv12,
1019 .type = OUTPUT_PORT,
1020 },
1021 {
1022 .name = "UBWC YCbCr Semiplanar 4:2:0",
1023 .description = "UBWC Y/CbCr 4:2:0",
1024 .fourcc = V4L2_PIX_FMT_NV12_UBWC,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001025 .get_frame_size = get_frame_size_nv12_ubwc,
1026 .type = OUTPUT_PORT,
1027 },
1028 {
1029 .name = "RGBA 8:8:8:8",
1030 .description = "RGBA 8:8:8:8",
1031 .fourcc = V4L2_PIX_FMT_RGB32,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001032 .get_frame_size = get_frame_size_rgba,
1033 .type = OUTPUT_PORT,
1034 },
1035 {
1036 .name = "H264",
1037 .description = "H264 compressed format",
1038 .fourcc = V4L2_PIX_FMT_H264,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001039 .get_frame_size = get_frame_size_compressed,
1040 .type = CAPTURE_PORT,
1041 },
1042 {
1043 .name = "VP8",
1044 .description = "VP8 compressed format",
1045 .fourcc = V4L2_PIX_FMT_VP8,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001046 .get_frame_size = get_frame_size_compressed,
1047 .type = CAPTURE_PORT,
1048 },
1049 {
1050 .name = "HEVC",
1051 .description = "HEVC compressed format",
1052 .fourcc = V4L2_PIX_FMT_HEVC,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001053 .get_frame_size = get_frame_size_compressed,
1054 .type = CAPTURE_PORT,
1055 },
1056 {
1057 .name = "YCrCb Semiplanar 4:2:0",
1058 .description = "Y/CrCb 4:2:0",
1059 .fourcc = V4L2_PIX_FMT_NV21,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001060 .get_frame_size = get_frame_size_nv21,
1061 .type = OUTPUT_PORT,
1062 },
1063};
1064
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001065static int msm_venc_set_csc(struct msm_vidc_inst *inst);
1066
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001067static int msm_venc_toggle_hier_p(struct msm_vidc_inst *inst, int layers)
1068{
1069 int num_enh_layers = 0;
1070 u32 property_id = 0;
1071 struct hfi_device *hdev = NULL;
1072 int rc = 0;
1073
1074 if (!inst || !inst->core || !inst->core->device) {
1075 dprintk(VIDC_ERR, "%s invalid parameters\n", __func__);
1076 return -EINVAL;
1077 }
1078
1079 if (inst->fmts[CAPTURE_PORT].fourcc != V4L2_PIX_FMT_VP8)
1080 return 0;
1081
Chinmay Sawarkarcbd3f592017-04-10 15:42:30 -07001082 num_enh_layers = layers ? layers : 0;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001083 dprintk(VIDC_DBG, "%s Hier-P in firmware\n",
1084 num_enh_layers ? "Enable" : "Disable");
1085
1086 hdev = inst->core->device;
1087 property_id = HAL_PARAM_VENC_HIER_P_MAX_ENH_LAYERS;
1088 rc = call_hfi_op(hdev, session_set_property,
1089 (void *)inst->session, property_id,
1090 (void *)&num_enh_layers);
1091 if (rc) {
1092 dprintk(VIDC_ERR,
1093 "%s: failed with error = %d\n", __func__, rc);
1094 }
1095 return rc;
1096}
1097
1098static inline int msm_venc_power_save_mode_enable(struct msm_vidc_inst *inst)
1099{
1100 u32 rc = 0;
1101 u32 prop_id = 0, power_save_min = 0, power_save_max = 0, inst_load = 0;
1102 void *pdata = NULL;
1103 struct hfi_device *hdev = NULL;
1104 enum hal_perf_mode venc_mode;
1105 enum load_calc_quirks quirks = LOAD_CALC_IGNORE_TURBO_LOAD |
1106 LOAD_CALC_IGNORE_THUMBNAIL_LOAD;
1107
1108 if (!inst || !inst->core || !inst->core->device) {
1109 dprintk(VIDC_ERR, "%s invalid parameters\n", __func__);
1110 return -EINVAL;
1111 }
1112
1113 inst_load = msm_comm_get_inst_load(inst, quirks);
1114 power_save_min = inst->capability.mbs_per_sec_power_save.min;
1115 power_save_max = inst->capability.mbs_per_sec_power_save.max;
1116
1117 if (!power_save_min || !power_save_max)
1118 return rc;
1119
1120 hdev = inst->core->device;
1121 if (inst_load >= power_save_min && inst_load <= power_save_max) {
1122 prop_id = HAL_CONFIG_VENC_PERF_MODE;
1123 venc_mode = HAL_PERF_MODE_POWER_SAVE;
1124 pdata = &venc_mode;
1125 rc = call_hfi_op(hdev, session_set_property,
1126 (void *)inst->session, prop_id, pdata);
1127 if (rc) {
1128 dprintk(VIDC_ERR,
1129 "%s: Failed to set power save mode for inst: %pK\n",
1130 __func__, inst);
1131 goto fail_power_mode_set;
1132 }
1133 inst->flags |= VIDC_LOW_POWER;
1134 dprintk(VIDC_INFO, "Power Save Mode set for inst: %pK\n", inst);
1135 }
1136
1137fail_power_mode_set:
1138 return rc;
1139}
1140
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001141static struct v4l2_ctrl *get_ctrl_from_cluster(int id,
1142 struct v4l2_ctrl **cluster, int ncontrols)
1143{
1144 int c;
1145
1146 for (c = 0; c < ncontrols; ++c)
1147 if (cluster[c]->id == id)
1148 return cluster[c];
1149 return NULL;
1150}
1151
Praneeth Paladugube42cb22016-04-12 22:34:39 -07001152int msm_venc_s_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl)
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001153{
1154 int rc = 0;
1155 struct hal_request_iframe request_iframe;
1156 struct hal_bitrate bitrate;
1157 struct hal_profile_level profile_level;
1158 struct hal_h264_entropy_control h264_entropy_control;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001159 struct hal_intra_period intra_period;
1160 struct hal_idr_period idr_period;
1161 struct hal_operations operations;
1162 struct hal_intra_refresh intra_refresh;
1163 struct hal_multi_slice_control multi_slice_control;
1164 struct hal_h264_db_control h264_db_control;
1165 struct hal_enable enable;
Praneeth Paladugu7fbd2792017-01-27 13:39:03 -08001166 struct hal_quantization quant;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001167 struct hal_preserve_text_quality preserve_text_quality;
1168 u32 property_id = 0, property_val = 0;
1169 void *pdata = NULL;
1170 struct v4l2_ctrl *temp_ctrl = NULL;
1171 struct hfi_device *hdev;
1172 struct hal_extradata_enable extra;
1173 struct hal_ltr_use use_ltr;
1174 struct hal_ltr_mark mark_ltr;
1175 struct hal_hybrid_hierp hyb_hierp;
Vaibhav Deshu Venkatesha2cf1b32017-03-30 17:40:48 -07001176 u32 hier_p_layers = 0;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001177 int max_hierp_layers;
1178 int baselayerid = 0;
1179 struct hal_video_signal_info signal_info = {0};
1180 enum hal_iframesize_type iframesize_type = HAL_IFRAMESIZE_TYPE_DEFAULT;
1181
1182 if (!inst || !inst->core || !inst->core->device) {
1183 dprintk(VIDC_ERR, "%s invalid parameters\n", __func__);
1184 return -EINVAL;
1185 }
1186 hdev = inst->core->device;
1187
1188 /* Small helper macro for quickly getting a control and err checking */
1189#define TRY_GET_CTRL(__ctrl_id) ({ \
1190 struct v4l2_ctrl *__temp; \
1191 __temp = get_ctrl_from_cluster( \
1192 __ctrl_id, \
1193 ctrl->cluster, ctrl->ncontrols); \
1194 if (!__temp) { \
1195 dprintk(VIDC_ERR, "Can't find %s (%x) in cluster\n", \
1196 #__ctrl_id, __ctrl_id); \
1197 /* Clusters are hardcoded, if we can't find */ \
1198 /* something then things are massively screwed up */ \
1199 MSM_VIDC_ERROR(1); \
1200 } \
1201 __temp; \
1202 })
1203
1204 /*
1205 * Unlock the control prior to setting to the hardware. Otherwise
1206 * lower level code that attempts to do a get_ctrl() will end up
1207 * deadlocking.
1208 */
1209 v4l2_ctrl_unlock(ctrl);
1210
1211 switch (ctrl->id) {
1212 case V4L2_CID_MPEG_VIDC_VIDEO_IDR_PERIOD:
1213 if (inst->fmts[CAPTURE_PORT].fourcc != V4L2_PIX_FMT_H264 &&
1214 inst->fmts[CAPTURE_PORT].fourcc !=
1215 V4L2_PIX_FMT_H264_NO_SC &&
1216 inst->fmts[CAPTURE_PORT].fourcc !=
1217 V4L2_PIX_FMT_HEVC) {
1218 dprintk(VIDC_ERR,
1219 "Control %#x only valid for H264 and HEVC\n",
1220 ctrl->id);
1221 rc = -ENOTSUPP;
1222 break;
1223 }
1224
1225 property_id = HAL_CONFIG_VENC_IDR_PERIOD;
1226 idr_period.idr_period = ctrl->val;
1227 pdata = &idr_period;
1228 break;
1229 case V4L2_CID_MPEG_VIDC_VIDEO_NUM_B_FRAMES:
1230 case V4L2_CID_MPEG_VIDC_VIDEO_NUM_P_FRAMES:
1231 {
1232 int num_p, num_b;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001233
1234 temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_NUM_B_FRAMES);
1235 num_b = temp_ctrl->val;
1236
1237 temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_NUM_P_FRAMES);
1238 num_p = temp_ctrl->val;
1239
1240 if (ctrl->id == V4L2_CID_MPEG_VIDC_VIDEO_NUM_P_FRAMES)
1241 num_p = ctrl->val;
1242 else if (ctrl->id == V4L2_CID_MPEG_VIDC_VIDEO_NUM_B_FRAMES)
1243 num_b = ctrl->val;
1244
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001245 property_id = HAL_CONFIG_VENC_INTRA_PERIOD;
1246 intra_period.pframes = num_p;
1247 intra_period.bframes = num_b;
1248
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001249 pdata = &intra_period;
1250 break;
1251 }
1252 case V4L2_CID_MPEG_VIDC_VIDEO_REQUEST_IFRAME:
1253 property_id = HAL_CONFIG_VENC_REQUEST_IFRAME;
1254 request_iframe.enable = true;
1255 pdata = &request_iframe;
1256 break;
1257 case V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL:
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001258 {
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001259 property_id = HAL_PARAM_VENC_RATE_CONTROL;
Chinmay Sawarkar0a9cca32017-04-11 12:52:59 -07001260 property_val = ctrl->val;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001261 pdata = &property_val;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001262 break;
1263 }
1264 case V4L2_CID_MPEG_VIDEO_BITRATE:
1265 {
1266 property_id = HAL_CONFIG_VENC_TARGET_BITRATE;
1267 bitrate.bit_rate = ctrl->val;
Vaibhav Deshu Venkatesh2c072532017-04-07 17:50:18 -07001268 bitrate.layer_id = MSM_VIDC_ALL_LAYER_ID;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001269 pdata = &bitrate;
Praneeth Paladugub71968b2015-08-19 20:47:57 -07001270 inst->bitrate = ctrl->val;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001271 break;
1272 }
1273 case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK:
1274 {
1275 struct v4l2_ctrl *avg_bitrate = TRY_GET_CTRL(
1276 V4L2_CID_MPEG_VIDEO_BITRATE);
1277
1278 if (ctrl->val < avg_bitrate->val) {
1279 dprintk(VIDC_ERR,
1280 "Peak bitrate (%d) is lower than average bitrate (%d)\n",
1281 ctrl->val, avg_bitrate->val);
1282 rc = -EINVAL;
1283 break;
1284 } else if (ctrl->val < avg_bitrate->val * 2) {
1285 dprintk(VIDC_WARN,
1286 "Peak bitrate (%d) ideally should be twice the average bitrate (%d)\n",
1287 ctrl->val, avg_bitrate->val);
1288 }
1289
1290 property_id = HAL_CONFIG_VENC_MAX_BITRATE;
1291 bitrate.bit_rate = ctrl->val;
1292 bitrate.layer_id = 0;
1293 pdata = &bitrate;
1294 break;
1295 }
1296 case V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE:
1297 temp_ctrl = TRY_GET_CTRL(
1298 V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL);
1299
1300 property_id = HAL_PARAM_VENC_H264_ENTROPY_CONTROL;
Chinmay Sawarkarb3c6ccb2017-02-23 18:01:32 -08001301 h264_entropy_control.entropy_mode = msm_comm_v4l2_to_hal(
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001302 V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE, ctrl->val);
Chinmay Sawarkarb3c6ccb2017-02-23 18:01:32 -08001303 h264_entropy_control.cabac_model = msm_comm_v4l2_to_hal(
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001304 V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL,
1305 temp_ctrl->val);
1306 pdata = &h264_entropy_control;
1307 break;
1308 case V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL:
1309 temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE);
1310
1311 property_id = HAL_PARAM_VENC_H264_ENTROPY_CONTROL;
Chinmay Sawarkarb3c6ccb2017-02-23 18:01:32 -08001312 h264_entropy_control.cabac_model = msm_comm_v4l2_to_hal(
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001313 V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE, ctrl->val);
Chinmay Sawarkarb3c6ccb2017-02-23 18:01:32 -08001314 h264_entropy_control.entropy_mode = msm_comm_v4l2_to_hal(
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001315 V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL,
1316 temp_ctrl->val);
1317 pdata = &h264_entropy_control;
1318 break;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001319 case V4L2_CID_MPEG_VIDEO_H264_PROFILE:
1320 temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDEO_H264_LEVEL);
1321
1322 property_id = HAL_PARAM_PROFILE_LEVEL_CURRENT;
Chinmay Sawarkarb3c6ccb2017-02-23 18:01:32 -08001323 profile_level.profile = msm_comm_v4l2_to_hal(ctrl->id,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001324 ctrl->val);
Chinmay Sawarkarb3c6ccb2017-02-23 18:01:32 -08001325 profile_level.level = msm_comm_v4l2_to_hal(
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001326 V4L2_CID_MPEG_VIDEO_H264_LEVEL,
1327 temp_ctrl->val);
1328 pdata = &profile_level;
1329 dprintk(VIDC_DBG, "\nprofile: %d\n",
1330 profile_level.profile);
1331 break;
1332 case V4L2_CID_MPEG_VIDEO_H264_LEVEL:
1333 temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDEO_H264_PROFILE);
1334
1335 property_id = HAL_PARAM_PROFILE_LEVEL_CURRENT;
Chinmay Sawarkarb3c6ccb2017-02-23 18:01:32 -08001336 profile_level.level = msm_comm_v4l2_to_hal(ctrl->id,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001337 ctrl->val);
Chinmay Sawarkarb3c6ccb2017-02-23 18:01:32 -08001338 profile_level.profile = msm_comm_v4l2_to_hal(
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001339 V4L2_CID_MPEG_VIDEO_H264_PROFILE,
1340 temp_ctrl->val);
1341 pdata = &profile_level;
1342 dprintk(VIDC_DBG, "\nLevel: %d\n",
1343 profile_level.level);
1344 break;
1345 case V4L2_CID_MPEG_VIDC_VIDEO_VP8_PROFILE_LEVEL:
1346 property_id = HAL_PARAM_PROFILE_LEVEL_CURRENT;
Chinmay Sawarkarb3c6ccb2017-02-23 18:01:32 -08001347 profile_level.profile = msm_comm_v4l2_to_hal(
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001348 V4L2_CID_MPEG_VIDC_VIDEO_VP8_PROFILE_LEVEL,
1349 ctrl->val);
1350 profile_level.level = HAL_VPX_PROFILE_UNUSED;
1351 pdata = &profile_level;
1352 break;
1353 case V4L2_CID_MPEG_VIDC_VIDEO_HEVC_PROFILE:
1354 temp_ctrl =
1355 TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_HEVC_TIER_LEVEL);
1356
1357 property_id = HAL_PARAM_PROFILE_LEVEL_CURRENT;
Chinmay Sawarkarb3c6ccb2017-02-23 18:01:32 -08001358 profile_level.profile = 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.level = msm_comm_v4l2_to_hal(
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001361 V4L2_CID_MPEG_VIDC_VIDEO_HEVC_TIER_LEVEL,
1362 temp_ctrl->val);
1363 pdata = &profile_level;
1364 break;
1365 case V4L2_CID_MPEG_VIDC_VIDEO_HEVC_TIER_LEVEL:
1366 temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_HEVC_PROFILE);
1367
1368 property_id = HAL_PARAM_PROFILE_LEVEL_CURRENT;
Chinmay Sawarkarb3c6ccb2017-02-23 18:01:32 -08001369 profile_level.level = msm_comm_v4l2_to_hal(ctrl->id,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001370 ctrl->val);
Chinmay Sawarkarb3c6ccb2017-02-23 18:01:32 -08001371 profile_level.profile = msm_comm_v4l2_to_hal(
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001372 V4L2_CID_MPEG_VIDC_VIDEO_HEVC_PROFILE,
1373 temp_ctrl->val);
1374 pdata = &profile_level;
1375 break;
1376 case V4L2_CID_MPEG_VIDC_VIDEO_ROTATION:
1377 {
1378 if (!(inst->capability.pixelprocess_capabilities &
1379 HAL_VIDEO_ENCODER_ROTATION_CAPABILITY)) {
1380 dprintk(VIDC_ERR, "Rotation not supported: %#x\n",
1381 ctrl->id);
1382 rc = -ENOTSUPP;
1383 break;
1384 }
1385 property_id = HAL_CONFIG_VPE_OPERATIONS;
Chinmay Sawarkarb3c6ccb2017-02-23 18:01:32 -08001386 operations.rotate = msm_comm_v4l2_to_hal(
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001387 V4L2_CID_MPEG_VIDC_VIDEO_ROTATION,
1388 ctrl->val);
1389 operations.flip = HAL_FLIP_NONE;
1390 pdata = &operations;
1391 break;
1392 }
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001393 case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE: {
1394 int temp = 0;
1395
1396 switch (ctrl->val) {
1397 case V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_MB:
1398 temp = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB;
1399 break;
1400 case V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_BYTES:
1401 temp = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES;
1402 break;
1403 case V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE:
1404 default:
1405 temp = 0;
1406 break;
1407 }
1408
1409 if (temp)
1410 temp_ctrl = TRY_GET_CTRL(temp);
1411
1412 property_id = HAL_PARAM_VENC_MULTI_SLICE_CONTROL;
1413 multi_slice_control.multi_slice = ctrl->val;
1414 multi_slice_control.slice_size = temp ? temp_ctrl->val : 0;
1415
1416 pdata = &multi_slice_control;
1417 break;
1418 }
1419 case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES:
1420 case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB:
1421 temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE);
1422
1423 property_id = HAL_PARAM_VENC_MULTI_SLICE_CONTROL;
1424 multi_slice_control.multi_slice = temp_ctrl->val;
1425 multi_slice_control.slice_size = ctrl->val;
1426 pdata = &multi_slice_control;
1427 break;
1428 case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_DELIVERY_MODE: {
1429 bool codec_avc =
1430 inst->fmts[CAPTURE_PORT].fourcc == V4L2_PIX_FMT_H264 ||
1431 inst->fmts[CAPTURE_PORT].fourcc ==
1432 V4L2_PIX_FMT_H264_NO_SC;
1433
1434 temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE);
1435 if (codec_avc && temp_ctrl->val ==
1436 V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_MB) {
1437 property_id = HAL_PARAM_VENC_SLICE_DELIVERY_MODE;
1438 enable.enable = true;
1439 } else {
1440 dprintk(VIDC_WARN,
1441 "Failed : slice delivery mode is not valid\n");
1442 enable.enable = false;
1443 }
1444 pdata = &enable;
1445 break;
1446 }
Saurabh Kothawadeabed16c2017-03-22 17:06:40 -07001447 case V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_MODE:
1448 {
1449 struct v4l2_ctrl *ir_mbs;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001450
Saurabh Kothawadeabed16c2017-03-22 17:06:40 -07001451 ir_mbs = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_IR_MBS);
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001452
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001453 property_id = HAL_PARAM_VENC_INTRA_REFRESH;
1454
Saurabh Kothawadeabed16c2017-03-22 17:06:40 -07001455 intra_refresh.mode = ctrl->val;
1456 intra_refresh.ir_mbs = ir_mbs->val;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001457
1458 pdata = &intra_refresh;
1459 break;
1460 }
Saurabh Kothawadeabed16c2017-03-22 17:06:40 -07001461 case V4L2_CID_MPEG_VIDC_VIDEO_IR_MBS:
1462 {
1463 struct v4l2_ctrl *ir_mode;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001464
1465 ir_mode = TRY_GET_CTRL(
1466 V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_MODE);
1467
1468 property_id = HAL_PARAM_VENC_INTRA_REFRESH;
1469
Saurabh Kothawadeabed16c2017-03-22 17:06:40 -07001470 intra_refresh.mode = ir_mode->val;
1471 intra_refresh.ir_mbs = ctrl->val;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001472
1473 pdata = &intra_refresh;
1474 break;
1475 }
1476 case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE:
1477 {
1478 struct v4l2_ctrl *alpha, *beta;
1479
1480 alpha = TRY_GET_CTRL(
1481 V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA);
1482 beta = TRY_GET_CTRL(
1483 V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA);
1484
1485 property_id = HAL_PARAM_VENC_H264_DEBLOCK_CONTROL;
1486 h264_db_control.slice_alpha_offset = alpha->val;
1487 h264_db_control.slice_beta_offset = beta->val;
Chinmay Sawarkarb3c6ccb2017-02-23 18:01:32 -08001488 h264_db_control.mode = msm_comm_v4l2_to_hal(
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001489 V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE,
1490 ctrl->val);
1491 pdata = &h264_db_control;
1492 break;
1493 }
1494 case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA:
1495 {
1496 struct v4l2_ctrl *mode, *beta;
1497
1498 mode = TRY_GET_CTRL(
1499 V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE);
1500 beta = TRY_GET_CTRL(
1501 V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA);
1502
1503 property_id = HAL_PARAM_VENC_H264_DEBLOCK_CONTROL;
1504 h264_db_control.slice_alpha_offset = ctrl->val;
1505 h264_db_control.slice_beta_offset = beta->val;
Chinmay Sawarkarb3c6ccb2017-02-23 18:01:32 -08001506 h264_db_control.mode = msm_comm_v4l2_to_hal(
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001507 V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE,
1508 mode->val);
1509 pdata = &h264_db_control;
1510 break;
1511 }
1512 case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA:
1513 {
1514 struct v4l2_ctrl *mode, *alpha;
1515
1516 mode = TRY_GET_CTRL(
1517 V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE);
1518 alpha = TRY_GET_CTRL(
1519 V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA);
1520 property_id = HAL_PARAM_VENC_H264_DEBLOCK_CONTROL;
1521 h264_db_control.slice_alpha_offset = alpha->val;
1522 h264_db_control.slice_beta_offset = ctrl->val;
Chinmay Sawarkarb3c6ccb2017-02-23 18:01:32 -08001523 h264_db_control.mode = msm_comm_v4l2_to_hal(
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001524 V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE,
1525 mode->val);
1526 pdata = &h264_db_control;
1527 break;
1528 }
1529 case V4L2_CID_MPEG_VIDEO_HEADER_MODE:
1530 property_id = HAL_PARAM_VENC_SYNC_FRAME_SEQUENCE_HEADER;
1531
1532 switch (ctrl->val) {
1533 case V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE:
1534 enable.enable = 0;
1535 break;
1536 case V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME:
Saurabh Kothawade846b7532017-03-29 17:17:19 -07001537 enable.enable = 1;
Saurabh Kothawadef4b7ff02017-04-04 17:24:04 -07001538 break;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001539 default:
1540 rc = -ENOTSUPP;
1541 break;
1542 }
1543 pdata = &enable;
1544 break;
1545 case V4L2_CID_MPEG_VIDC_VIDEO_SECURE:
1546 inst->flags |= VIDC_SECURE;
1547 dprintk(VIDC_INFO, "Setting secure mode to: %d\n",
1548 !!(inst->flags & VIDC_SECURE));
1549 break;
Praneeth Paladugudefea4e2017-02-09 23:44:08 -08001550 case V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA: {
1551 struct hal_buffer_requirements *buff_req_buffer = NULL;
1552 int extra_idx = 0;
1553
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001554 property_id = HAL_PARAM_INDEX_EXTRADATA;
1555 extra.index = msm_comm_get_hal_extradata_index(ctrl->val);
1556 extra.enable = 1;
Praneeth Paladugudefea4e2017-02-09 23:44:08 -08001557
1558 switch (ctrl->val) {
1559 case V4L2_MPEG_VIDC_EXTRADATA_INPUT_CROP:
1560 case V4L2_MPEG_VIDC_EXTRADATA_DIGITAL_ZOOM:
1561 case V4L2_MPEG_VIDC_EXTRADATA_ASPECT_RATIO:
1562 case V4L2_MPEG_VIDC_EXTRADATA_YUV_STATS:
1563 case V4L2_MPEG_VIDC_EXTRADATA_ROI_QP:
1564 case V4L2_MPEG_VIDC_EXTRADATA_PQ_INFO:
1565 inst->bufq[OUTPUT_PORT].num_planes = 2;
1566 break;
1567 case V4L2_MPEG_VIDC_EXTRADATA_MULTISLICE_INFO:
1568 case V4L2_MPEG_VIDC_EXTRADATA_LTR:
1569 case V4L2_MPEG_VIDC_EXTRADATA_METADATA_MBI:
1570 inst->bufq[CAPTURE_PORT].num_planes = 2;
1571 break;
1572 default:
1573 rc = -ENOTSUPP;
1574 break;
1575 }
1576
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001577 pdata = &extra;
Praneeth Paladugudefea4e2017-02-09 23:44:08 -08001578 rc = call_hfi_op(hdev, session_set_property,
1579 (void *)inst->session, property_id, pdata);
1580
1581 rc = msm_comm_try_get_bufreqs(inst);
1582 if (rc) {
1583 dprintk(VIDC_ERR,
1584 "Failed to get buffer requirements: %d\n", rc);
1585 break;
1586 }
1587
1588 buff_req_buffer = get_buff_req_buffer(inst,
1589 HAL_BUFFER_EXTRADATA_INPUT);
1590
1591 extra_idx = EXTRADATA_IDX(inst->bufq[OUTPUT_PORT].num_planes);
1592
1593 inst->bufq[OUTPUT_PORT].plane_sizes[extra_idx] =
1594 buff_req_buffer ?
1595 buff_req_buffer->buffer_size : 0;
1596
1597 buff_req_buffer = get_buff_req_buffer(inst,
1598 HAL_BUFFER_EXTRADATA_OUTPUT);
1599
1600 extra_idx = EXTRADATA_IDX(inst->bufq[CAPTURE_PORT].num_planes);
1601 inst->bufq[CAPTURE_PORT].plane_sizes[extra_idx] =
1602 buff_req_buffer ?
1603 buff_req_buffer->buffer_size : 0;
1604
1605 property_id = 0;
1606 }
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001607 break;
1608 case V4L2_CID_MPEG_VIDC_VIDEO_AU_DELIMITER:
Umesh Pandey7fce7ee2017-03-13 17:59:48 -07001609 property_id = HAL_PARAM_VENC_GENERATE_AUDNAL;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001610
1611 switch (ctrl->val) {
1612 case V4L2_MPEG_VIDC_VIDEO_AU_DELIMITER_DISABLED:
1613 enable.enable = 0;
1614 break;
1615 case V4L2_MPEG_VIDC_VIDEO_AU_DELIMITER_ENABLED:
1616 enable.enable = 1;
1617 break;
1618 default:
1619 rc = -ENOTSUPP;
1620 break;
1621 }
1622
1623 pdata = &enable;
1624 break;
1625 case V4L2_CID_MPEG_VIDC_VIDEO_PRESERVE_TEXT_QUALITY:
1626 property_id = HAL_PARAM_VENC_PRESERVE_TEXT_QUALITY;
1627 preserve_text_quality.enable = ctrl->val;
1628 pdata = &preserve_text_quality;
1629 break;
1630 case V4L2_CID_MPEG_VIDC_VIDEO_USELTRFRAME:
1631 property_id = HAL_CONFIG_VENC_USELTRFRAME;
1632 use_ltr.ref_ltr = ctrl->val;
1633 use_ltr.use_constraint = false;
1634 use_ltr.frames = 0;
1635 pdata = &use_ltr;
1636 break;
1637 case V4L2_CID_MPEG_VIDC_VIDEO_MARKLTRFRAME:
1638 property_id = HAL_CONFIG_VENC_MARKLTRFRAME;
1639 mark_ltr.mark_frame = ctrl->val;
1640 pdata = &mark_ltr;
1641 break;
1642 case V4L2_CID_MPEG_VIDC_VIDEO_HIER_P_NUM_LAYERS:
1643 property_id = HAL_CONFIG_VENC_HIER_P_NUM_FRAMES;
1644 hier_p_layers = ctrl->val;
1645 if (hier_p_layers > inst->capability.hier_p.max) {
1646 dprintk(VIDC_ERR,
1647 "Error setting hier p num layers %d max supported is %d\n",
1648 hier_p_layers, inst->capability.hier_p.max);
1649 rc = -ENOTSUPP;
1650 break;
1651 }
1652 pdata = &hier_p_layers;
1653 break;
1654 case V4L2_CID_MPEG_VIDC_VIDEO_VPX_ERROR_RESILIENCE:
1655 property_id = HAL_PARAM_VENC_VPX_ERROR_RESILIENCE_MODE;
1656 enable.enable = ctrl->val;
1657 pdata = &enable;
1658 break;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001659 case V4L2_CID_MPEG_VIDC_VIDEO_HYBRID_HIERP_MODE:
1660 property_id = HAL_PARAM_VENC_HIER_P_HYBRID_MODE;
1661 hyb_hierp.layers = ctrl->val;
1662 pdata = &hyb_hierp;
1663 break;
1664 case V4L2_CID_VIDC_QBUF_MODE:
1665 property_id = HAL_PARAM_SYNC_BASED_INTERRUPT;
1666 enable.enable = ctrl->val == V4L2_VIDC_QBUF_BATCHED;
1667 pdata = &enable;
1668 break;
1669 case V4L2_CID_MPEG_VIDC_VIDEO_MAX_HIERP_LAYERS:
1670 property_id = HAL_PARAM_VENC_HIER_P_MAX_ENH_LAYERS;
1671 max_hierp_layers = ctrl->val;
1672 if (max_hierp_layers > inst->capability.hier_p.max) {
1673 dprintk(VIDC_ERR,
1674 "Error max HP layers(%d)>max supported(%d)\n",
1675 max_hierp_layers, inst->capability.hier_p.max);
1676 rc = -ENOTSUPP;
1677 break;
1678 }
1679 pdata = &max_hierp_layers;
1680 break;
1681 case V4L2_CID_MPEG_VIDC_VIDEO_BASELAYER_ID:
1682 property_id = HAL_CONFIG_VENC_BASELAYER_PRIORITYID;
1683 baselayerid = ctrl->val;
1684 pdata = &baselayerid;
1685 break;
Praneeth Paladugu7fbd2792017-01-27 13:39:03 -08001686 case V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP: {
1687 struct v4l2_ctrl *qpp, *qpb;
1688
1689 property_id = HAL_CONFIG_VENC_FRAME_QP;
1690 qpp = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP);
1691 qpb = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_B_FRAME_QP);
1692
1693 quant.qpi = ctrl->val;
1694 quant.qpp = qpp->val;
1695 quant.qpb = qpb->val;
1696 quant.layer_id = MSM_VIDC_ALL_LAYER_ID;
1697 pdata = &quant;
1698 break;
1699 }
1700 case V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP: {
1701 struct v4l2_ctrl *qpi, *qpb;
1702
1703 property_id = HAL_CONFIG_VENC_FRAME_QP;
1704 qpi = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP);
1705 qpb = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_B_FRAME_QP);
1706
1707 quant.qpp = ctrl->val;
1708 quant.qpi = qpi->val;
1709 quant.qpb = qpb->val;
1710 quant.layer_id = MSM_VIDC_ALL_LAYER_ID;
1711 pdata = &quant;
1712 break;
1713 }
1714 case V4L2_CID_MPEG_VIDC_VIDEO_B_FRAME_QP: {
1715 struct v4l2_ctrl *qpp, *qpi;
1716
1717 property_id = HAL_CONFIG_VENC_FRAME_QP;
1718 qpp = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP);
1719 qpi = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP);
1720
1721 quant.qpb = ctrl->val;
1722 quant.qpp = qpp->val;
1723 quant.qpi = qpi->val;
1724 quant.layer_id = MSM_VIDC_ALL_LAYER_ID;
1725 pdata = &quant;
1726 break;
1727 }
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001728 case V4L2_CID_MPEG_VIDC_VIDEO_VQZIP_SEI:
1729 property_id = HAL_PARAM_VENC_VQZIP_SEI;
1730 enable.enable = ctrl->val;
1731 pdata = &enable;
1732 break;
1733 case V4L2_CID_MPEG_VIDC_VIDEO_PRIORITY:
1734 property_id = HAL_CONFIG_REALTIME;
1735 /* firmware has inverted values for realtime and
1736 * non-realtime priority
1737 */
1738 enable.enable = !(ctrl->val);
1739 pdata = &enable;
1740 switch (ctrl->val) {
1741 case V4L2_MPEG_VIDC_VIDEO_PRIORITY_REALTIME_DISABLE:
1742 inst->flags &= ~VIDC_REALTIME;
1743 break;
1744 case V4L2_MPEG_VIDC_VIDEO_PRIORITY_REALTIME_ENABLE:
1745 inst->flags |= VIDC_REALTIME;
1746 break;
1747 default:
1748 dprintk(VIDC_WARN,
1749 "inst(%pK) invalid priority ctrl value %#x\n",
1750 inst, ctrl->val);
1751 break;
1752 }
1753 break;
1754 case V4L2_CID_MPEG_VIDC_VIDEO_OPERATING_RATE:
1755 dprintk(VIDC_DBG,
1756 "inst(%pK) operating rate changed from %d to %d\n",
1757 inst, inst->operating_rate >> 16, ctrl->val >> 16);
1758 inst->operating_rate = ctrl->val;
1759 break;
1760 case V4L2_CID_MPEG_VIDC_VIDEO_VENC_BITRATE_TYPE:
1761 {
1762 property_id = HAL_PARAM_VENC_BITRATE_TYPE;
1763 enable.enable = ctrl->val;
1764 pdata = &enable;
1765 break;
1766 }
1767 case V4L2_CID_MPEG_VIDC_VIDEO_COLOR_SPACE:
1768 {
1769 signal_info.color_space = ctrl->val;
1770 temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_FULL_RANGE);
1771 signal_info.full_range = temp_ctrl ? temp_ctrl->val : 0;
1772 temp_ctrl =
1773 TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_TRANSFER_CHARS);
1774 signal_info.transfer_chars = temp_ctrl ? temp_ctrl->val : 0;
1775 temp_ctrl =
1776 TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_MATRIX_COEFFS);
1777 signal_info.matrix_coeffs = temp_ctrl ? temp_ctrl->val : 0;
1778 property_id = HAL_PARAM_VENC_VIDEO_SIGNAL_INFO;
1779 pdata = &signal_info;
1780 break;
1781 }
1782 case V4L2_CID_MPEG_VIDC_VIDEO_FULL_RANGE:
1783 {
1784 signal_info.full_range = ctrl->val;
1785 temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_COLOR_SPACE);
1786 signal_info.color_space = temp_ctrl ? temp_ctrl->val : 0;
1787 temp_ctrl =
1788 TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_TRANSFER_CHARS);
1789 signal_info.transfer_chars = temp_ctrl ? temp_ctrl->val : 0;
1790 temp_ctrl =
1791 TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_MATRIX_COEFFS);
1792 signal_info.matrix_coeffs = temp_ctrl ? temp_ctrl->val : 0;
1793 property_id = HAL_PARAM_VENC_VIDEO_SIGNAL_INFO;
1794 pdata = &signal_info;
1795 break;
1796 }
1797 case V4L2_CID_MPEG_VIDC_VIDEO_TRANSFER_CHARS:
1798 {
1799 signal_info.transfer_chars = ctrl->val;
1800 temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_FULL_RANGE);
1801 signal_info.full_range = temp_ctrl ? temp_ctrl->val : 0;
1802 temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_COLOR_SPACE);
1803 signal_info.color_space = temp_ctrl ? temp_ctrl->val : 0;
1804 temp_ctrl =
1805 TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_MATRIX_COEFFS);
1806 signal_info.matrix_coeffs = temp_ctrl ? temp_ctrl->val : 0;
1807 property_id = HAL_PARAM_VENC_VIDEO_SIGNAL_INFO;
1808 pdata = &signal_info;
1809 break;
1810 }
1811 case V4L2_CID_MPEG_VIDC_VIDEO_MATRIX_COEFFS:
1812 {
1813 signal_info.matrix_coeffs = ctrl->val;
1814 temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_FULL_RANGE);
1815 signal_info.full_range = temp_ctrl ? temp_ctrl->val : 0;
1816 temp_ctrl =
1817 TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_TRANSFER_CHARS);
1818 signal_info.transfer_chars = temp_ctrl ? temp_ctrl->val : 0;
1819 temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_COLOR_SPACE);
1820 signal_info.color_space = temp_ctrl ? temp_ctrl->val : 0;
1821 property_id = HAL_PARAM_VENC_VIDEO_SIGNAL_INFO;
1822 pdata = &signal_info;
1823 break;
1824 }
1825 case V4L2_CID_MPEG_VIDC_VIDEO_VPE_CSC:
1826 if (ctrl->val == V4L2_CID_MPEG_VIDC_VIDEO_VPE_CSC_ENABLE) {
1827 rc = msm_venc_set_csc(inst);
1828 if (rc)
1829 dprintk(VIDC_ERR, "fail to set csc: %d\n", rc);
1830 }
1831 break;
1832 case V4L2_CID_MPEG_VIDC_VIDEO_LOWLATENCY_MODE:
1833 {
1834 property_id = HAL_PARAM_VENC_LOW_LATENCY;
1835 if (ctrl->val ==
1836 V4L2_CID_MPEG_VIDC_VIDEO_LOWLATENCY_ENABLE)
1837 enable.enable = 1;
1838 else
1839 enable.enable = 0;
1840 pdata = &enable;
1841 break;
1842 }
1843 case V4L2_CID_MPEG_VIDC_VIDEO_H264_TRANSFORM_8x8:
1844 property_id = HAL_PARAM_VENC_H264_TRANSFORM_8x8;
1845 switch (ctrl->val) {
1846 case V4L2_MPEG_VIDC_VIDEO_H264_TRANSFORM_8x8_ENABLE:
1847 enable.enable = 1;
1848 break;
1849 case V4L2_MPEG_VIDC_VIDEO_H264_TRANSFORM_8x8_DISABLE:
1850 enable.enable = 0;
1851 break;
1852 default:
1853 dprintk(VIDC_ERR,
1854 "Invalid H264 8x8 transform control value %d\n",
1855 ctrl->val);
1856 rc = -ENOTSUPP;
1857 break;
1858 }
1859 pdata = &enable;
1860 break;
1861 case V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_TYPE:
1862 property_id = HAL_PARAM_VENC_IFRAMESIZE_TYPE;
Chinmay Sawarkarb3c6ccb2017-02-23 18:01:32 -08001863 iframesize_type = msm_comm_v4l2_to_hal(
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001864 V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_TYPE,
1865 ctrl->val);
1866 pdata = &iframesize_type;
1867 break;
1868 default:
1869 dprintk(VIDC_ERR, "Unsupported index: %x\n", ctrl->id);
1870 rc = -ENOTSUPP;
1871 break;
1872 }
1873
1874 v4l2_ctrl_lock(ctrl);
1875#undef TRY_GET_CTRL
1876
1877 if (!rc && property_id) {
1878 dprintk(VIDC_DBG, "Control: HAL property=%x,ctrl_value=%d\n",
1879 property_id,
1880 ctrl->val);
1881 rc = call_hfi_op(hdev, session_set_property,
1882 (void *)inst->session, property_id, pdata);
1883 }
1884
1885 return rc;
1886}
1887
Praneeth Paladugube42cb22016-04-12 22:34:39 -07001888int msm_venc_s_ext_ctrl(struct msm_vidc_inst *inst,
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001889 struct v4l2_ext_controls *ctrl)
1890{
Vaibhav Deshu Venkatesh2c072532017-04-07 17:50:18 -07001891 int rc = 0, i;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001892 struct v4l2_ext_control *control;
1893 struct hfi_device *hdev;
1894 struct hal_ltr_mode ltr_mode;
Praneeth Paladugu7fbd2792017-01-27 13:39:03 -08001895 u32 property_id = 0, layer_id = MSM_VIDC_ALL_LAYER_ID;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001896 void *pdata = NULL;
1897 struct msm_vidc_capability *cap = NULL;
1898 struct hal_aspect_ratio sar;
1899 struct hal_bitrate bitrate;
1900 struct hal_frame_size blur_res;
Praneeth Paladugu7fbd2792017-01-27 13:39:03 -08001901 struct hal_quantization_range qp_range;
1902 struct hal_quantization qp;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001903
1904 if (!inst || !inst->core || !inst->core->device || !ctrl) {
1905 dprintk(VIDC_ERR, "%s invalid parameters\n", __func__);
1906 return -EINVAL;
1907 }
1908
Vaibhav Deshu Venkateshd0792bc2017-03-16 14:55:51 -07001909 /* This will check the range for contols and clip if necessary */
1910 v4l2_try_ext_ctrls(&inst->ctrl_handler, ctrl);
1911
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001912 hdev = inst->core->device;
1913 cap = &inst->capability;
1914
1915 control = ctrl->controls;
Praneeth Paladugu7fbd2792017-01-27 13:39:03 -08001916
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001917 for (i = 0; i < ctrl->count; i++) {
1918 switch (control[i].id) {
1919 case V4L2_CID_MPEG_VIDC_VIDEO_LTRMODE:
1920 if (control[i].value !=
1921 V4L2_MPEG_VIDC_VIDEO_LTR_MODE_DISABLE) {
1922 rc = msm_venc_toggle_hier_p(inst, false);
1923 if (rc)
1924 break;
1925 }
1926 ltr_mode.mode = control[i].value;
1927 ltr_mode.trust_mode = 1;
1928 property_id = HAL_PARAM_VENC_LTRMODE;
1929 pdata = &ltr_mode;
1930 break;
1931 case V4L2_CID_MPEG_VIDC_VIDEO_LTRCOUNT:
1932 ltr_mode.count = control[i].value;
1933 if (ltr_mode.count > cap->ltr_count.max) {
1934 dprintk(VIDC_ERR,
1935 "Invalid LTR count %d. Supported max: %d\n",
1936 ltr_mode.count,
1937 cap->ltr_count.max);
1938 /*
1939 * FIXME: Return an error (-EINVALID)
1940 * here once VP8 supports LTR count
1941 * capability
1942 */
1943 ltr_mode.count = 1;
1944 }
1945 ltr_mode.trust_mode = 1;
1946 property_id = HAL_PARAM_VENC_LTRMODE;
1947 pdata = &ltr_mode;
1948 break;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001949 case V4L2_CID_MPEG_VIDC_VENC_PARAM_SAR_WIDTH:
1950 sar.aspect_width = control[i].value;
1951 property_id = HAL_PROPERTY_PARAM_VENC_ASPECT_RATIO;
1952 pdata = &sar;
1953 break;
1954 case V4L2_CID_MPEG_VIDC_VENC_PARAM_SAR_HEIGHT:
1955 sar.aspect_height = control[i].value;
1956 property_id = HAL_PROPERTY_PARAM_VENC_ASPECT_RATIO;
1957 pdata = &sar;
1958 break;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08001959 case V4L2_CID_MPEG_VIDC_VIDEO_BLUR_WIDTH:
1960 property_id = HAL_CONFIG_VENC_BLUR_RESOLUTION;
1961 blur_res.width = control[i].value;
1962 blur_res.buffer_type = HAL_BUFFER_INPUT;
1963 property_id = HAL_CONFIG_VENC_BLUR_RESOLUTION;
1964 pdata = &blur_res;
1965 break;
1966 case V4L2_CID_MPEG_VIDC_VIDEO_BLUR_HEIGHT:
1967 blur_res.height = control[i].value;
1968 blur_res.buffer_type = HAL_BUFFER_INPUT;
1969 property_id = HAL_CONFIG_VENC_BLUR_RESOLUTION;
1970 pdata = &blur_res;
1971 break;
Praneeth Paladugu7fbd2792017-01-27 13:39:03 -08001972 case V4L2_CID_MPEG_VIDC_VIDEO_LAYER_ID:
Vaibhav Deshu Venkatesh2c072532017-04-07 17:50:18 -07001973 layer_id = control[i].value;
1974 i++;
1975 while (i < ctrl->count) {
1976 switch (control[i].id) {
1977 case V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP:
1978 qp.qpi = control[i].value;
1979 qp.layer_id = layer_id;
1980 property_id =
1981 HAL_CONFIG_VENC_FRAME_QP;
1982 pdata = &qp;
1983 break;
1984 case V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP:
1985 qp.qpp = control[i].value;
1986 qp.layer_id = layer_id;
1987 property_id =
1988 HAL_CONFIG_VENC_FRAME_QP;
1989 pdata = &qp;
1990 break;
1991 case V4L2_CID_MPEG_VIDC_VIDEO_B_FRAME_QP:
1992 qp.qpb = control[i].value;
1993 qp.layer_id = layer_id;
1994 property_id =
1995 HAL_CONFIG_VENC_FRAME_QP;
1996 pdata = &qp;
1997 break;
1998 case V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP_MIN:
1999 qp_range.qpi_min = control[i].value;
2000 qp_range.layer_id = layer_id;
2001 property_id =
2002 HAL_PARAM_VENC_SESSION_QP_RANGE;
2003 pdata = &qp_range;
2004 break;
2005 case V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP_MIN:
2006 qp_range.qpp_min = control[i].value;
2007 qp_range.layer_id = layer_id;
2008 property_id =
2009 HAL_PARAM_VENC_SESSION_QP_RANGE;
2010 pdata = &qp_range;
2011 break;
2012 case V4L2_CID_MPEG_VIDC_VIDEO_B_FRAME_QP_MIN:
2013 qp_range.qpb_min = control[i].value;
2014 qp_range.layer_id = layer_id;
2015 property_id =
2016 HAL_PARAM_VENC_SESSION_QP_RANGE;
2017 pdata = &qp_range;
2018 break;
2019 case V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP_MAX:
2020 qp_range.qpi_max = control[i].value;
2021 qp_range.layer_id = layer_id;
2022 property_id =
2023 HAL_PARAM_VENC_SESSION_QP_RANGE;
2024 pdata = &qp_range;
2025 break;
2026 case V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP_MAX:
2027 qp_range.qpp_max = control[i].value;
2028 qp_range.layer_id = layer_id;
2029 property_id =
2030 HAL_PARAM_VENC_SESSION_QP_RANGE;
2031 pdata = &qp_range;
2032 break;
2033 case V4L2_CID_MPEG_VIDC_VIDEO_B_FRAME_QP_MAX:
2034 qp_range.qpb_max = control[i].value;
2035 qp_range.layer_id = layer_id;
2036 property_id =
2037 HAL_PARAM_VENC_SESSION_QP_RANGE;
2038 pdata = &qp_range;
2039 break;
2040 case V4L2_CID_MPEG_VIDC_VENC_PARAM_LAYER_BITRATE:
2041 bitrate.bit_rate = control[i].value;
2042 bitrate.layer_id = layer_id;
2043 property_id =
2044 HAL_CONFIG_VENC_TARGET_BITRATE;
2045 pdata = &bitrate;
2046 break;
Praneeth Paladugu7fbd2792017-01-27 13:39:03 -08002047 }
Vaibhav Deshu Venkatesh2c072532017-04-07 17:50:18 -07002048 i++;
2049 }
Praneeth Paladugu7fbd2792017-01-27 13:39:03 -08002050 break;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002051 default:
2052 dprintk(VIDC_ERR, "Invalid id set: %d\n",
2053 control[i].id);
2054 rc = -ENOTSUPP;
2055 break;
2056 }
2057 if (rc)
2058 break;
2059 }
2060
2061 if (!rc && property_id) {
2062 dprintk(VIDC_DBG, "Control: HAL property=%x\n", property_id);
2063 rc = call_hfi_op(hdev, session_set_property,
2064 (void *)inst->session, property_id, pdata);
2065 }
2066 return rc;
2067}
2068
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002069int msm_venc_inst_init(struct msm_vidc_inst *inst)
2070{
2071 int rc = 0;
2072
2073 if (!inst) {
2074 dprintk(VIDC_ERR, "Invalid input = %pK\n", inst);
2075 return -EINVAL;
2076 }
2077 inst->prop.height[CAPTURE_PORT] = DEFAULT_HEIGHT;
2078 inst->prop.width[CAPTURE_PORT] = DEFAULT_WIDTH;
2079 inst->prop.height[OUTPUT_PORT] = DEFAULT_HEIGHT;
2080 inst->prop.width[OUTPUT_PORT] = DEFAULT_WIDTH;
2081 inst->capability.height.min = MIN_SUPPORTED_HEIGHT;
2082 inst->capability.height.max = DEFAULT_HEIGHT;
2083 inst->capability.width.min = MIN_SUPPORTED_WIDTH;
2084 inst->capability.width.max = DEFAULT_WIDTH;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002085 inst->capability.secure_output2_threshold.min = 0;
2086 inst->capability.secure_output2_threshold.max = 0;
Chinmay Sawarkar2de3f772017-02-07 12:03:44 -08002087 inst->buffer_mode_set[OUTPUT_PORT] = HAL_BUFFER_MODE_DYNAMIC;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002088 inst->buffer_mode_set[CAPTURE_PORT] = HAL_BUFFER_MODE_STATIC;
2089 inst->prop.fps = DEFAULT_FPS;
2090 inst->capability.pixelprocess_capabilities = 0;
Praneeth Paladugudefea4e2017-02-09 23:44:08 -08002091 /* To start with, both ports are 1 plane each */
2092 inst->bufq[OUTPUT_PORT].num_planes = 1;
2093 inst->bufq[CAPTURE_PORT].num_planes = 1;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002094 inst->operating_rate = 0;
Praneeth Paladugube42cb22016-04-12 22:34:39 -07002095
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002096 memcpy(&inst->fmts[CAPTURE_PORT], &venc_formats[4],
2097 sizeof(struct msm_vidc_format));
2098 memcpy(&inst->fmts[OUTPUT_PORT], &venc_formats[0],
2099 sizeof(struct msm_vidc_format));
2100 return rc;
2101}
2102
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002103int msm_venc_enum_fmt(struct msm_vidc_inst *inst, struct v4l2_fmtdesc *f)
2104{
2105 const struct msm_vidc_format *fmt = NULL;
2106 int rc = 0;
2107
2108 if (!inst || !f) {
2109 dprintk(VIDC_ERR,
2110 "Invalid input, inst = %pK, f = %pK\n", inst, f);
2111 return -EINVAL;
2112 }
2113 if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
2114 fmt = msm_comm_get_pixel_fmt_index(venc_formats,
2115 ARRAY_SIZE(venc_formats), f->index, CAPTURE_PORT);
2116 } else if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
2117 fmt = msm_comm_get_pixel_fmt_index(venc_formats,
2118 ARRAY_SIZE(venc_formats), f->index, OUTPUT_PORT);
2119 f->flags = V4L2_FMT_FLAG_COMPRESSED;
2120 }
2121
2122 memset(f->reserved, 0, sizeof(f->reserved));
2123 if (fmt) {
2124 strlcpy(f->description, fmt->description,
2125 sizeof(f->description));
2126 f->pixelformat = fmt->fourcc;
2127 } else {
2128 dprintk(VIDC_DBG, "No more formats found\n");
2129 rc = -EINVAL;
2130 }
2131 return rc;
2132}
2133
2134static int msm_venc_set_csc(struct msm_vidc_inst *inst)
2135{
2136 int rc = 0;
2137 int count = 0;
2138 struct hal_vpe_color_space_conversion vpe_csc;
2139
2140 while (count < HAL_MAX_MATRIX_COEFFS) {
2141 if (count < HAL_MAX_BIAS_COEFFS)
2142 vpe_csc.csc_bias[count] =
2143 vpe_csc_601_to_709_bias_coeff[count];
2144 if (count < HAL_MAX_LIMIT_COEFFS)
2145 vpe_csc.csc_limit[count] =
2146 vpe_csc_601_to_709_limit_coeff[count];
2147 vpe_csc.csc_matrix[count] =
2148 vpe_csc_601_to_709_matrix_coeff[count];
2149 count = count + 1;
2150 }
2151 rc = msm_comm_try_set_prop(inst,
2152 HAL_PARAM_VPE_COLOR_SPACE_CONVERSION, &vpe_csc);
2153 if (rc)
2154 dprintk(VIDC_ERR, "Setting VPE coefficients failed\n");
2155
2156 return rc;
2157}
2158
2159int msm_venc_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f)
2160{
2161 struct msm_vidc_format *fmt = NULL;
2162 int rc = 0;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002163 struct hfi_device *hdev;
Praneeth Paladugudefea4e2017-02-09 23:44:08 -08002164 int extra_idx = 0, i = 0;
2165 struct hal_buffer_requirements *buff_req_buffer;
Praneeth Paladugu1f9d1d92017-04-11 10:36:16 -07002166 struct hal_frame_size frame_sz;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002167
2168 if (!inst || !f) {
2169 dprintk(VIDC_ERR,
2170 "Invalid input, inst = %pK, format = %pK\n", inst, f);
2171 return -EINVAL;
2172 }
2173
2174 if (!inst->core || !inst->core->device) {
2175 dprintk(VIDC_ERR, "%s invalid parameters\n", __func__);
2176 return -EINVAL;
2177 }
2178 hdev = inst->core->device;
2179
2180 if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
Praneeth Paladugudefea4e2017-02-09 23:44:08 -08002181
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002182 fmt = msm_comm_get_pixel_fmt_fourcc(venc_formats,
2183 ARRAY_SIZE(venc_formats), f->fmt.pix_mp.pixelformat,
2184 CAPTURE_PORT);
2185 if (!fmt || fmt->type != CAPTURE_PORT) {
2186 dprintk(VIDC_ERR,
2187 "Format: %d not supported on CAPTURE port\n",
2188 f->fmt.pix_mp.pixelformat);
2189 rc = -EINVAL;
2190 goto exit;
2191 }
2192
2193 memcpy(&inst->fmts[fmt->type], fmt,
2194 sizeof(struct msm_vidc_format));
2195
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002196 rc = msm_comm_try_state(inst, MSM_VIDC_OPEN_DONE);
2197 if (rc) {
2198 dprintk(VIDC_ERR, "Failed to open instance\n");
2199 goto exit;
2200 }
2201
2202 inst->prop.width[CAPTURE_PORT] = f->fmt.pix_mp.width;
2203 inst->prop.height[CAPTURE_PORT] = f->fmt.pix_mp.height;
Praneeth Paladugudefea4e2017-02-09 23:44:08 -08002204
Praneeth Paladugu1f9d1d92017-04-11 10:36:16 -07002205 frame_sz.buffer_type = HAL_BUFFER_OUTPUT;
2206 frame_sz.width = inst->prop.width[CAPTURE_PORT];
2207 frame_sz.height = inst->prop.height[CAPTURE_PORT];
2208 dprintk(VIDC_DBG, "CAPTURE port width = %d, height = %d\n",
2209 frame_sz.width, frame_sz.height);
2210 rc = call_hfi_op(hdev, session_set_property, (void *)
2211 inst->session, HAL_PARAM_FRAME_SIZE, &frame_sz);
2212 if (rc) {
2213 dprintk(VIDC_ERR,
2214 "Failed to set framesize for CAPTURE port\n");
2215 goto exit;
2216 }
2217
Praneeth Paladugudefea4e2017-02-09 23:44:08 -08002218 rc = msm_comm_try_get_bufreqs(inst);
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002219 if (rc) {
2220 dprintk(VIDC_ERR,
Praneeth Paladugudefea4e2017-02-09 23:44:08 -08002221 "Failed to get buffer requirements: %d\n", rc);
2222 return rc;
2223 }
2224
2225 /*
2226 * Get CAPTURE plane size from HW. This may change based on
2227 * settings like Slice delivery mode. HW should decide howmuch
2228 * it needs.
2229 */
2230
2231 buff_req_buffer = get_buff_req_buffer(inst,
2232 HAL_BUFFER_OUTPUT);
2233
2234 f->fmt.pix_mp.plane_fmt[0].sizeimage = buff_req_buffer ?
2235 buff_req_buffer->buffer_size : 0;
2236
2237 /*
2238 * Get CAPTURE plane Extradata size from HW. This may change
2239 * with no of Extradata's enabled. HW should decide howmuch
2240 * it needs.
2241 */
2242
2243 extra_idx = EXTRADATA_IDX(inst->bufq[fmt->type].num_planes);
2244 if (extra_idx && extra_idx < VIDEO_MAX_PLANES) {
2245 buff_req_buffer = get_buff_req_buffer(inst,
2246 HAL_BUFFER_EXTRADATA_OUTPUT);
2247 f->fmt.pix_mp.plane_fmt[extra_idx].sizeimage =
2248 buff_req_buffer ?
2249 buff_req_buffer->buffer_size : 0;
2250 }
2251
2252 f->fmt.pix_mp.num_planes = inst->bufq[fmt->type].num_planes;
2253 for (i = 0; i < inst->bufq[fmt->type].num_planes; i++) {
2254 inst->bufq[fmt->type].plane_sizes[i] =
2255 f->fmt.pix_mp.plane_fmt[i].sizeimage;
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002256 }
2257 } else if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
2258 struct hal_frame_size frame_sz;
2259
2260 inst->prop.width[OUTPUT_PORT] = f->fmt.pix_mp.width;
2261 inst->prop.height[OUTPUT_PORT] = f->fmt.pix_mp.height;
2262
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002263 frame_sz.buffer_type = HAL_BUFFER_INPUT;
2264 frame_sz.width = inst->prop.width[OUTPUT_PORT];
2265 frame_sz.height = inst->prop.height[OUTPUT_PORT];
Praneeth Paladugu1f9d1d92017-04-11 10:36:16 -07002266 dprintk(VIDC_DBG, "OUTPUT port width = %d, height = %d\n",
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002267 frame_sz.width, frame_sz.height);
2268 rc = call_hfi_op(hdev, session_set_property, (void *)
2269 inst->session, HAL_PARAM_FRAME_SIZE, &frame_sz);
2270 if (rc) {
2271 dprintk(VIDC_ERR,
2272 "Failed to set framesize for Output port\n");
2273 goto exit;
2274 }
2275
2276 fmt = msm_comm_get_pixel_fmt_fourcc(venc_formats,
2277 ARRAY_SIZE(venc_formats), f->fmt.pix_mp.pixelformat,
2278 OUTPUT_PORT);
2279 if (!fmt || fmt->type != OUTPUT_PORT) {
2280 dprintk(VIDC_ERR,
2281 "Format: %d not supported on OUTPUT port\n",
2282 f->fmt.pix_mp.pixelformat);
2283 rc = -EINVAL;
2284 goto exit;
2285 }
2286 memcpy(&inst->fmts[fmt->type], fmt,
2287 sizeof(struct msm_vidc_format));
2288
Praneeth Paladugudefea4e2017-02-09 23:44:08 -08002289 f->fmt.pix_mp.plane_fmt[0].sizeimage =
2290 inst->fmts[fmt->type].get_frame_size(0,
2291 f->fmt.pix_mp.height, f->fmt.pix_mp.width);
2292
2293 rc = msm_comm_try_get_bufreqs(inst);
2294 if (rc) {
2295 dprintk(VIDC_ERR,
2296 "Failed to get buffer requirements: %d\n", rc);
2297 return rc;
2298 }
2299
2300 /*
2301 * Get OUTPUT plane Extradata size from HW. This may change
2302 * with no of Extradata's enabled. HW should decide howmuch
2303 * it needs.
2304 */
2305
2306 extra_idx = EXTRADATA_IDX(inst->bufq[fmt->type].num_planes);
2307 if (extra_idx && extra_idx < VIDEO_MAX_PLANES) {
2308 buff_req_buffer = get_buff_req_buffer(inst,
2309 HAL_BUFFER_EXTRADATA_INPUT);
2310 f->fmt.pix_mp.plane_fmt[extra_idx].sizeimage =
2311 buff_req_buffer ?
2312 buff_req_buffer->buffer_size : 0;
2313 }
2314
2315 f->fmt.pix_mp.num_planes = inst->bufq[fmt->type].num_planes;
2316
2317 for (i = 0; i < inst->bufq[fmt->type].num_planes; i++) {
2318 inst->bufq[fmt->type].plane_sizes[i] =
2319 f->fmt.pix_mp.plane_fmt[i].sizeimage;
2320 }
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002321
2322 msm_comm_set_color_format(inst, HAL_BUFFER_INPUT, fmt->fourcc);
2323 } else {
2324 dprintk(VIDC_ERR, "%s - Unsupported buf type: %d\n",
2325 __func__, f->type);
2326 rc = -EINVAL;
2327 goto exit;
2328 }
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002329exit:
2330 return rc;
2331}
2332
Praneeth Paladugube42cb22016-04-12 22:34:39 -07002333int msm_venc_ctrl_init(struct msm_vidc_inst *inst,
2334 const struct v4l2_ctrl_ops *ctrl_ops)
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002335{
2336 return msm_comm_ctrl_init(inst, msm_venc_ctrls,
Praneeth Paladugube42cb22016-04-12 22:34:39 -07002337 ARRAY_SIZE(msm_venc_ctrls), ctrl_ops);
Praneeth Paladugu6e6fbdb2017-01-16 15:43:01 -08002338}