1 /* 2 * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. 3 * Copyright (C) 2017 Linaro Ltd. 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License version 2 and 7 * only version 2 as published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 */ 15 #include <linux/types.h> 16 #include <media/v4l2-ctrls.h> 17 18 #include "core.h" 19 #include "venc.h" 20 21 #define BITRATE_MIN 32000 22 #define BITRATE_MAX 160000000 23 #define BITRATE_DEFAULT 1000000 24 #define BITRATE_DEFAULT_PEAK (BITRATE_DEFAULT * 2) 25 #define BITRATE_STEP 100 26 #define SLICE_BYTE_SIZE_MAX 1024 27 #define SLICE_BYTE_SIZE_MIN 1024 28 #define SLICE_MB_SIZE_MAX 300 29 #define INTRA_REFRESH_MBS_MAX 300 30 #define AT_SLICE_BOUNDARY \ 31 V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED_AT_SLICE_BOUNDARY 32 33 static int venc_calc_bpframes(u32 gop_size, u32 conseq_b, u32 *bf, u32 *pf) 34 { 35 u32 half = (gop_size - 1) >> 1; 36 u32 b, p, ratio; 37 bool found = false; 38 39 if (!gop_size) 40 return -EINVAL; 41 42 *bf = *pf = 0; 43 44 if (!conseq_b) { 45 *pf = gop_size - 1; 46 return 0; 47 } 48 49 b = p = half; 50 51 for (; b <= gop_size - 1; b++, p--) { 52 if (b % p) 53 continue; 54 55 ratio = b / p; 56 57 if (ratio == conseq_b) { 58 found = true; 59 break; 60 } 61 62 if (ratio > conseq_b) 63 break; 64 } 65 66 if (!found) 67 return -EINVAL; 68 69 if (b + p + 1 != gop_size) 70 return -EINVAL; 71 72 *bf = b; 73 *pf = p; 74 75 return 0; 76 } 77 78 static int venc_op_s_ctrl(struct v4l2_ctrl *ctrl) 79 { 80 struct venus_inst *inst = ctrl_to_inst(ctrl); 81 struct venc_controls *ctr = &inst->controls.enc; 82 struct hfi_bitrate brate; 83 u32 bframes; 84 u32 ptype; 85 int ret; 86 87 switch (ctrl->id) { 88 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE: 89 ctr->bitrate_mode = ctrl->val; 90 break; 91 case V4L2_CID_MPEG_VIDEO_BITRATE: 92 ctr->bitrate = ctrl->val; 93 mutex_lock(&inst->lock); 94 if (inst->streamon_out && inst->streamon_cap) { 95 ptype = HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE; 96 brate.bitrate = ctr->bitrate; 97 brate.layer_id = 0; 98 99 ret = hfi_session_set_property(inst, ptype, &brate); 100 if (ret) { 101 mutex_unlock(&inst->lock); 102 return ret; 103 } 104 } 105 mutex_unlock(&inst->lock); 106 break; 107 case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK: 108 ctr->bitrate_peak = ctrl->val; 109 break; 110 case V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE: 111 ctr->h264_entropy_mode = ctrl->val; 112 break; 113 case V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE: 114 ctr->profile.mpeg4 = ctrl->val; 115 break; 116 case V4L2_CID_MPEG_VIDEO_H264_PROFILE: 117 ctr->profile.h264 = ctrl->val; 118 break; 119 case V4L2_CID_MPEG_VIDEO_VP8_PROFILE: 120 ctr->profile.vpx = ctrl->val; 121 break; 122 case V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL: 123 ctr->level.mpeg4 = ctrl->val; 124 break; 125 case V4L2_CID_MPEG_VIDEO_H264_LEVEL: 126 ctr->level.h264 = ctrl->val; 127 break; 128 case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP: 129 ctr->h264_i_qp = ctrl->val; 130 break; 131 case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP: 132 ctr->h264_p_qp = ctrl->val; 133 break; 134 case V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP: 135 ctr->h264_b_qp = ctrl->val; 136 break; 137 case V4L2_CID_MPEG_VIDEO_H264_MIN_QP: 138 ctr->h264_min_qp = ctrl->val; 139 break; 140 case V4L2_CID_MPEG_VIDEO_H264_MAX_QP: 141 ctr->h264_max_qp = ctrl->val; 142 break; 143 case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE: 144 ctr->multi_slice_mode = ctrl->val; 145 break; 146 case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES: 147 ctr->multi_slice_max_bytes = ctrl->val; 148 break; 149 case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB: 150 ctr->multi_slice_max_mb = ctrl->val; 151 break; 152 case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA: 153 ctr->h264_loop_filter_alpha = ctrl->val; 154 break; 155 case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA: 156 ctr->h264_loop_filter_beta = ctrl->val; 157 break; 158 case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE: 159 ctr->h264_loop_filter_mode = ctrl->val; 160 break; 161 case V4L2_CID_MPEG_VIDEO_HEADER_MODE: 162 ctr->header_mode = ctrl->val; 163 break; 164 case V4L2_CID_MPEG_VIDEO_CYCLIC_INTRA_REFRESH_MB: 165 break; 166 case V4L2_CID_MPEG_VIDEO_GOP_SIZE: 167 ret = venc_calc_bpframes(ctrl->val, ctr->num_b_frames, &bframes, 168 &ctr->num_p_frames); 169 if (ret) 170 return ret; 171 172 ctr->gop_size = ctrl->val; 173 break; 174 case V4L2_CID_MPEG_VIDEO_H264_I_PERIOD: 175 ctr->h264_i_period = ctrl->val; 176 break; 177 case V4L2_CID_MPEG_VIDEO_VPX_MIN_QP: 178 ctr->vp8_min_qp = ctrl->val; 179 break; 180 case V4L2_CID_MPEG_VIDEO_VPX_MAX_QP: 181 ctr->vp8_max_qp = ctrl->val; 182 break; 183 case V4L2_CID_MPEG_VIDEO_B_FRAMES: 184 ret = venc_calc_bpframes(ctr->gop_size, ctrl->val, &bframes, 185 &ctr->num_p_frames); 186 if (ret) 187 return ret; 188 189 ctr->num_b_frames = bframes; 190 break; 191 default: 192 return -EINVAL; 193 } 194 195 return 0; 196 } 197 198 static const struct v4l2_ctrl_ops venc_ctrl_ops = { 199 .s_ctrl = venc_op_s_ctrl, 200 }; 201 202 int venc_ctrl_init(struct venus_inst *inst) 203 { 204 int ret; 205 206 ret = v4l2_ctrl_handler_init(&inst->ctrl_handler, 27); 207 if (ret) 208 return ret; 209 210 v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &venc_ctrl_ops, 211 V4L2_CID_MPEG_VIDEO_BITRATE_MODE, 212 V4L2_MPEG_VIDEO_BITRATE_MODE_CBR, 213 ~((1 << V4L2_MPEG_VIDEO_BITRATE_MODE_VBR) | 214 (1 << V4L2_MPEG_VIDEO_BITRATE_MODE_CBR)), 215 V4L2_MPEG_VIDEO_BITRATE_MODE_VBR); 216 217 v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &venc_ctrl_ops, 218 V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE, 219 V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC, 220 0, V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC); 221 222 v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &venc_ctrl_ops, 223 V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE, 224 V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_CODING_EFFICIENCY, 225 ~((1 << V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE) | 226 (1 << V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE)), 227 V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE); 228 229 v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &venc_ctrl_ops, 230 V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL, 231 V4L2_MPEG_VIDEO_MPEG4_LEVEL_5, 232 0, V4L2_MPEG_VIDEO_MPEG4_LEVEL_0); 233 234 v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &venc_ctrl_ops, 235 V4L2_CID_MPEG_VIDEO_H264_PROFILE, 236 V4L2_MPEG_VIDEO_H264_PROFILE_MULTIVIEW_HIGH, 237 ~((1 << V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE) | 238 (1 << V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE) | 239 (1 << V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) | 240 (1 << V4L2_MPEG_VIDEO_H264_PROFILE_HIGH) | 241 (1 << V4L2_MPEG_VIDEO_H264_PROFILE_STEREO_HIGH) | 242 (1 << V4L2_MPEG_VIDEO_H264_PROFILE_MULTIVIEW_HIGH)), 243 V4L2_MPEG_VIDEO_H264_PROFILE_HIGH); 244 245 v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &venc_ctrl_ops, 246 V4L2_CID_MPEG_VIDEO_H264_LEVEL, 247 V4L2_MPEG_VIDEO_H264_LEVEL_5_1, 248 0, V4L2_MPEG_VIDEO_H264_LEVEL_1_0); 249 250 v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &venc_ctrl_ops, 251 V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE, 252 AT_SLICE_BOUNDARY, 253 0, V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED); 254 255 v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &venc_ctrl_ops, 256 V4L2_CID_MPEG_VIDEO_HEADER_MODE, 257 V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME, 258 1 << V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME, 259 V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE); 260 261 v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &venc_ctrl_ops, 262 V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE, 263 V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_BYTES, 264 0, V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE); 265 266 v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &venc_ctrl_ops, 267 V4L2_CID_MPEG_VIDEO_VP8_PROFILE, 268 V4L2_MPEG_VIDEO_VP8_PROFILE_3, 269 0, V4L2_MPEG_VIDEO_VP8_PROFILE_0); 270 271 v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops, 272 V4L2_CID_MPEG_VIDEO_BITRATE, BITRATE_MIN, BITRATE_MAX, 273 BITRATE_STEP, BITRATE_DEFAULT); 274 275 v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops, 276 V4L2_CID_MPEG_VIDEO_BITRATE_PEAK, BITRATE_MIN, BITRATE_MAX, 277 BITRATE_STEP, BITRATE_DEFAULT_PEAK); 278 279 v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops, 280 V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP, 1, 51, 1, 26); 281 282 v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops, 283 V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP, 1, 51, 1, 28); 284 285 v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops, 286 V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP, 1, 51, 1, 30); 287 288 v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops, 289 V4L2_CID_MPEG_VIDEO_H264_MIN_QP, 1, 51, 1, 1); 290 291 v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops, 292 V4L2_CID_MPEG_VIDEO_H264_MAX_QP, 1, 51, 1, 51); 293 294 v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops, 295 V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES, SLICE_BYTE_SIZE_MIN, 296 SLICE_BYTE_SIZE_MAX, 1, SLICE_BYTE_SIZE_MIN); 297 298 v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops, 299 V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB, 1, 300 SLICE_MB_SIZE_MAX, 1, 1); 301 302 v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops, 303 V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA, -6, 6, 1, 0); 304 305 v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops, 306 V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA, -6, 6, 1, 0); 307 308 v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops, 309 V4L2_CID_MPEG_VIDEO_CYCLIC_INTRA_REFRESH_MB, 310 0, INTRA_REFRESH_MBS_MAX, 1, 0); 311 312 v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops, 313 V4L2_CID_MPEG_VIDEO_GOP_SIZE, 0, (1 << 16) - 1, 1, 30); 314 315 v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops, 316 V4L2_CID_MPEG_VIDEO_VPX_MIN_QP, 1, 128, 1, 1); 317 318 v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops, 319 V4L2_CID_MPEG_VIDEO_VPX_MAX_QP, 1, 128, 1, 128); 320 321 v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops, 322 V4L2_CID_MPEG_VIDEO_B_FRAMES, 0, 4, 1, 0); 323 324 v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops, 325 V4L2_CID_MPEG_VIDEO_H264_I_PERIOD, 0, (1 << 16) - 1, 1, 0); 326 327 ret = inst->ctrl_handler.error; 328 if (ret) 329 goto err; 330 331 ret = v4l2_ctrl_handler_setup(&inst->ctrl_handler); 332 if (ret) 333 goto err; 334 335 return 0; 336 err: 337 v4l2_ctrl_handler_free(&inst->ctrl_handler); 338 return ret; 339 } 340 341 void venc_ctrl_deinit(struct venus_inst *inst) 342 { 343 v4l2_ctrl_handler_free(&inst->ctrl_handler); 344 } 345