Loading drivers/media/platform/msm/vidc/msm_vdec.c +18 −24 Original line number Diff line number Diff line // SPDX-License-Identifier: GPL-2.0 // SPDX-License-Identifier: GPL-2.0-only /* * Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. */ Loading Loading @@ -132,9 +132,9 @@ static struct msm_vidc_ctrl msm_vdec_ctrls[] = { .id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA, .name = "Extradata Type", .type = V4L2_CTRL_TYPE_BITMASK, .minimum = 0, .maximum = 0x3, .default_value = 0, .minimum = EXTRADATA_NONE, .maximum = EXTRADATA_DEFAULT | EXTRADATA_ADVANCED, .default_value = EXTRADATA_DEFAULT, .menu_skip_mask = 0, .qmenu = NULL, }, Loading Loading @@ -539,6 +539,7 @@ int msm_vdec_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f) goto err_invalid_fmt; } inst->clk_data.opb_fourcc = f->fmt.pix_mp.pixelformat; if (inst->fmts[fmt->type].fourcc == f->fmt.pix_mp.pixelformat && inst->prop.width[CAPTURE_PORT] == f->fmt.pix_mp.width && inst->prop.height[CAPTURE_PORT] == Loading @@ -558,7 +559,6 @@ int msm_vdec_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f) goto err_invalid_fmt; } inst->clk_data.opb_fourcc = f->fmt.pix_mp.pixelformat; f->fmt.pix_mp.plane_fmt[0].sizeimage = inst->fmts[fmt->type].get_frame_size(0, f->fmt.pix_mp.height, f->fmt.pix_mp.width); Loading Loading @@ -836,6 +836,15 @@ int msm_vdec_s_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) inst->flags |= VIDC_SECURE; break; case V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA: inst->bufq[CAPTURE_PORT].num_planes = 1; inst->bufq[CAPTURE_PORT].plane_sizes[1] = 0; if (ctrl->val != EXTRADATA_NONE) { inst->bufq[CAPTURE_PORT].num_planes = 2; inst->bufq[CAPTURE_PORT].plane_sizes[1] = VENUS_EXTRADATA_SIZE( inst->prop.height[CAPTURE_PORT], inst->prop.width[CAPTURE_PORT]); } break; case V4L2_CID_MPEG_VIDC_VIDEO_BUFFER_SIZE_LIMIT: inst->buffer_size_limit = ctrl->val; Loading Loading @@ -1419,7 +1428,6 @@ int msm_vdec_set_conceal_color(struct msm_vidc_inst *inst) int msm_vdec_set_extradata(struct msm_vidc_inst *inst) { uint32_t enabled = false; uint32_t display_info = HAL_EXTRADATA_VUI_DISPLAY_INFO; struct v4l2_ctrl *ctrl; Loading @@ -1444,14 +1452,14 @@ int msm_vdec_set_extradata(struct msm_vidc_inst *inst) break; } if (!ctrl->val) { if (ctrl->val == EXTRADATA_NONE) { // Disable all Extradata msm_comm_set_extradata(inst, HAL_EXTRADATA_OUTPUT_CROP, 0x0); msm_comm_set_extradata(inst, HAL_EXTRADATA_INTERLACE_VIDEO, 0x0); msm_comm_set_extradata(inst, display_info, 0x0); msm_comm_set_extradata(inst, HAL_EXTRADATA_UBWC_CR_STATS_INFO, 0x1); HAL_EXTRADATA_UBWC_CR_STATS_INFO, 0x0); msm_comm_set_extradata(inst, HAL_EXTRADATA_NUM_CONCEALED_MB, 0x0); if (inst->fmts[CAPTURE_PORT].fourcc == V4L2_PIX_FMT_HEVC) { Loading @@ -1472,9 +1480,8 @@ int msm_vdec_set_extradata(struct msm_vidc_inst *inst) HAL_EXTRADATA_RECOVERY_POINT_SEI, 0x0); msm_comm_set_extradata(inst, HAL_EXTRADATA_ASPECT_RATIO, 0x0); msm_comm_set_extradata(inst, HAL_EXTRADATA_FRAME_QP, 0x0); enabled = false; } if (ctrl->val & 0x1) { if (ctrl->val & EXTRADATA_DEFAULT) { // Enable Default Extradata msm_comm_set_extradata(inst, HAL_EXTRADATA_OUTPUT_CROP, 0x1); msm_comm_set_extradata(inst, Loading @@ -1489,9 +1496,8 @@ int msm_vdec_set_extradata(struct msm_vidc_inst *inst) msm_comm_set_extradata(inst, HAL_EXTRADATA_CONTENT_LIGHT_LEVEL_SEI, 0x1); } enabled = true; } if (ctrl->val & 0x2) { if (ctrl->val & EXTRADATA_ADVANCED) { // Enable Advanced Extradata msm_comm_set_extradata(inst, HAL_EXTRADATA_STREAM_USERDATA, 0x1); Loading @@ -1504,18 +1510,6 @@ int msm_vdec_set_extradata(struct msm_vidc_inst *inst) HAL_EXTRADATA_RECOVERY_POINT_SEI, 0x1); msm_comm_set_extradata(inst, HAL_EXTRADATA_ASPECT_RATIO, 0x1); msm_comm_set_extradata(inst, HAL_EXTRADATA_FRAME_QP, 0x1); enabled = true; } if (enabled) { inst->bufq[CAPTURE_PORT].num_planes = 2; inst->bufq[CAPTURE_PORT].plane_sizes[EXTRADATA_IDX(2)] = VENUS_EXTRADATA_SIZE( inst->prop.height[CAPTURE_PORT], inst->prop.width[CAPTURE_PORT]); } else { inst->bufq[CAPTURE_PORT].num_planes = 1; inst->bufq[CAPTURE_PORT].plane_sizes[EXTRADATA_IDX(2)] = 0; } return 0; Loading drivers/media/platform/msm/vidc/msm_venc.c +66 −52 Original line number Diff line number Diff line // SPDX-License-Identifier: GPL-2.0 // SPDX-License-Identifier: GPL-2.0-only /* * Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. */ Loading Loading @@ -499,9 +499,10 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = { .id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA, .name = "Extradata Type", .type = V4L2_CTRL_TYPE_BITMASK, .minimum = 0, .maximum = 0xF, .default_value = 0, .minimum = EXTRADATA_NONE, .maximum = EXTRADATA_ADVANCED | EXTRADATA_ENC_INPUT_ROI | EXTRADATA_ENC_INPUT_HDR10PLUS, .default_value = EXTRADATA_NONE, .menu_skip_mask = 0, .qmenu = NULL, }, Loading Loading @@ -1296,6 +1297,7 @@ int msm_venc_s_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) int rc = 0; struct msm_vidc_mastering_display_colour_sei_payload *mdisp_sei = NULL; struct msm_vidc_content_light_level_sei_payload *cll_sei = NULL; struct hal_buffer_requirements *buff_req_buffer = NULL; if (!inst || !inst->core || !inst->core->device || !ctrl) { dprintk(VIDC_ERR, "%s invalid parameters\n", __func__); Loading Loading @@ -1491,6 +1493,54 @@ int msm_venc_s_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) info_type); } } break; case V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA: inst->bufq[OUTPUT_PORT].num_planes = 1; inst->bufq[CAPTURE_PORT].num_planes = 1; if (ctrl->val & EXTRADATA_ADVANCED) inst->bufq[CAPTURE_PORT].num_planes = 2; if ((ctrl->val & EXTRADATA_ENC_INPUT_ROI) || (ctrl->val & EXTRADATA_ENC_INPUT_HDR10PLUS)) inst->bufq[OUTPUT_PORT].num_planes = 2; /* Needs internal calculation of extradata */ rc = msm_comm_try_get_bufreqs(inst); if (rc) { dprintk(VIDC_ERR, "Failed to get buffer requirements: %d\n", rc); break; } if (inst->bufq[OUTPUT_PORT].num_planes == 2) { buff_req_buffer = get_buff_req_buffer(inst, HAL_BUFFER_EXTRADATA_INPUT); if (!buff_req_buffer) { dprintk(VIDC_ERR, "Failed to get extradata buff info\n"); rc = -EINVAL; break; } inst->bufq[OUTPUT_PORT].plane_sizes[1] = buff_req_buffer->buffer_size; } if (inst->bufq[CAPTURE_PORT].num_planes == 2) { buff_req_buffer = get_buff_req_buffer(inst, HAL_BUFFER_EXTRADATA_OUTPUT); if (!buff_req_buffer) { dprintk(VIDC_ERR, "Failed to get extradata buff info\n"); rc = -EINVAL; break; } inst->bufq[CAPTURE_PORT].plane_sizes[1] = buff_req_buffer->buffer_size; } break; case V4L2_CID_MPEG_VIDEO_B_FRAMES: case V4L2_CID_ROTATE: Loading Loading @@ -1543,7 +1593,6 @@ int msm_venc_s_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) case V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_HEIGHT: case V4L2_CID_MPEG_VIDC_VIDEO_BLUR_DIMENSIONS: case V4L2_CID_MPEG_VIDC_VIDEO_PRIORITY: case V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA: dprintk(VIDC_DBG, "Control set: ID : %x Val : %d\n", ctrl->id, ctrl->val); break; Loading Loading @@ -1999,12 +2048,12 @@ int msm_venc_set_rate_control(struct msm_vidc_inst *inst) if ((bitrate_mode->val == V4L2_MPEG_VIDEO_BITRATE_MODE_CBR_VFR) && (inst->fmts[CAPTURE_PORT].fourcc == V4L2_PIX_FMT_H264)) { hier_layers = msm_venc_get_ctrl(inst, V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING); V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_LAYER); hier_type = msm_venc_get_ctrl(inst, V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_TYPE); V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_TYPE); if ((hier_layers && hier_layers->val) && (hier_type && hier_type->val == V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_P)){ V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_P)){ dprintk(VIDC_ERR, "%s: CBR_VFR not allowed with Hybrid HP\n", __func__); Loading Loading @@ -2646,7 +2695,7 @@ int msm_venc_set_hierp_layers(struct msm_vidc_inst *inst) return 0; ctrl = msm_venc_get_ctrl(inst, V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING); V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_TYPE); if (!ctrl) { dprintk(VIDC_ERR, "%s: get heirp num layers failed\n", __func__); Loading Loading @@ -3221,8 +3270,6 @@ int msm_venc_set_hdr_info(struct msm_vidc_inst *inst) int msm_venc_set_extradata(struct msm_vidc_inst *inst) { int rc = 0; struct hal_buffer_requirements *buff_req_buffer = NULL; int extra_idx = 0; struct v4l2_ctrl *ctrl = msm_venc_get_ctrl(inst, V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA); Loading @@ -3232,7 +3279,7 @@ int msm_venc_set_extradata(struct msm_vidc_inst *inst) return -EINVAL; } if (!ctrl->val) { if (ctrl->val == EXTRADATA_NONE) { // Disable all Extradata msm_comm_set_extradata(inst, HAL_EXTRADATA_ASPECT_RATIO, 0x0); msm_comm_set_extradata(inst, HAL_EXTRADATA_LTR_INFO, 0x0); Loading @@ -3241,55 +3288,22 @@ int msm_venc_set_extradata(struct msm_vidc_inst *inst) msm_comm_set_extradata(inst, HAL_EXTRADATA_HDR10PLUS_METADATA, 0x0); } inst->bufq[OUTPUT_PORT].num_planes = 1; inst->bufq[CAPTURE_PORT].num_planes = 1; } if (ctrl->val & 0x2) { // Enable Advanced Extradata msm_comm_set_extradata(inst, HAL_EXTRADATA_ASPECT_RATIO, 0x1); inst->bufq[OUTPUT_PORT].num_planes = 2; if (ctrl->val & EXTRADATA_ADVANCED) // Enable Advanced Extradata - LTR Info msm_comm_set_extradata(inst, HAL_EXTRADATA_LTR_INFO, 0x1); inst->bufq[CAPTURE_PORT].num_planes = 2; } if (ctrl->val & 0x4) { if (ctrl->val & EXTRADATA_ENC_INPUT_ROI) // Enable ROIQP Extradata msm_comm_set_extradata(inst, HAL_EXTRADATA_ROI_QP, 0x1); inst->bufq[OUTPUT_PORT].num_planes = 2; } if (ctrl->val & 0x8) { if (ctrl->val & EXTRADATA_ENC_INPUT_HDR10PLUS) { // Enable HDR10+ Extradata if (inst->fmts[CAPTURE_PORT].fourcc == V4L2_PIX_FMT_HEVC) { msm_comm_set_extradata(inst, HAL_EXTRADATA_HDR10PLUS_METADATA, 0x1); } inst->bufq[OUTPUT_PORT].num_planes = 2; } rc = msm_comm_try_get_bufreqs(inst); if (rc) { dprintk(VIDC_ERR, "Failed to get buffer requirements: %d\n", rc); return rc; } extra_idx = EXTRADATA_IDX(inst->bufq[OUTPUT_PORT].num_planes); if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { buff_req_buffer = get_buff_req_buffer(inst, HAL_BUFFER_EXTRADATA_INPUT); inst->bufq[OUTPUT_PORT].plane_sizes[extra_idx] = buff_req_buffer ? buff_req_buffer->buffer_size : 0; } extra_idx = EXTRADATA_IDX(inst->bufq[CAPTURE_PORT].num_planes); if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { buff_req_buffer = get_buff_req_buffer(inst, HAL_BUFFER_EXTRADATA_OUTPUT); inst->bufq[CAPTURE_PORT].plane_sizes[extra_idx] = buff_req_buffer ? buff_req_buffer->buffer_size : 0; } return rc; Loading include/uapi/linux/v4l2-controls.h +3 −0 Original line number Diff line number Diff line Loading @@ -814,6 +814,9 @@ enum v4l2_mpeg_vidc_video_stream_format { #define V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA \ (V4L2_CID_MPEG_MSM_VIDC_BASE + 17) enum v4l2_mpeg_vidc_extradata { #define EXTRADATA_NONE \ EXTRADATA_NONE EXTRADATA_NONE = 0, EXTRADATA_DEFAULT = 1, EXTRADATA_ADVANCED = 2, EXTRADATA_ENC_INPUT_ROI = 4, Loading Loading
drivers/media/platform/msm/vidc/msm_vdec.c +18 −24 Original line number Diff line number Diff line // SPDX-License-Identifier: GPL-2.0 // SPDX-License-Identifier: GPL-2.0-only /* * Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. */ Loading Loading @@ -132,9 +132,9 @@ static struct msm_vidc_ctrl msm_vdec_ctrls[] = { .id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA, .name = "Extradata Type", .type = V4L2_CTRL_TYPE_BITMASK, .minimum = 0, .maximum = 0x3, .default_value = 0, .minimum = EXTRADATA_NONE, .maximum = EXTRADATA_DEFAULT | EXTRADATA_ADVANCED, .default_value = EXTRADATA_DEFAULT, .menu_skip_mask = 0, .qmenu = NULL, }, Loading Loading @@ -539,6 +539,7 @@ int msm_vdec_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f) goto err_invalid_fmt; } inst->clk_data.opb_fourcc = f->fmt.pix_mp.pixelformat; if (inst->fmts[fmt->type].fourcc == f->fmt.pix_mp.pixelformat && inst->prop.width[CAPTURE_PORT] == f->fmt.pix_mp.width && inst->prop.height[CAPTURE_PORT] == Loading @@ -558,7 +559,6 @@ int msm_vdec_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f) goto err_invalid_fmt; } inst->clk_data.opb_fourcc = f->fmt.pix_mp.pixelformat; f->fmt.pix_mp.plane_fmt[0].sizeimage = inst->fmts[fmt->type].get_frame_size(0, f->fmt.pix_mp.height, f->fmt.pix_mp.width); Loading Loading @@ -836,6 +836,15 @@ int msm_vdec_s_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) inst->flags |= VIDC_SECURE; break; case V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA: inst->bufq[CAPTURE_PORT].num_planes = 1; inst->bufq[CAPTURE_PORT].plane_sizes[1] = 0; if (ctrl->val != EXTRADATA_NONE) { inst->bufq[CAPTURE_PORT].num_planes = 2; inst->bufq[CAPTURE_PORT].plane_sizes[1] = VENUS_EXTRADATA_SIZE( inst->prop.height[CAPTURE_PORT], inst->prop.width[CAPTURE_PORT]); } break; case V4L2_CID_MPEG_VIDC_VIDEO_BUFFER_SIZE_LIMIT: inst->buffer_size_limit = ctrl->val; Loading Loading @@ -1419,7 +1428,6 @@ int msm_vdec_set_conceal_color(struct msm_vidc_inst *inst) int msm_vdec_set_extradata(struct msm_vidc_inst *inst) { uint32_t enabled = false; uint32_t display_info = HAL_EXTRADATA_VUI_DISPLAY_INFO; struct v4l2_ctrl *ctrl; Loading @@ -1444,14 +1452,14 @@ int msm_vdec_set_extradata(struct msm_vidc_inst *inst) break; } if (!ctrl->val) { if (ctrl->val == EXTRADATA_NONE) { // Disable all Extradata msm_comm_set_extradata(inst, HAL_EXTRADATA_OUTPUT_CROP, 0x0); msm_comm_set_extradata(inst, HAL_EXTRADATA_INTERLACE_VIDEO, 0x0); msm_comm_set_extradata(inst, display_info, 0x0); msm_comm_set_extradata(inst, HAL_EXTRADATA_UBWC_CR_STATS_INFO, 0x1); HAL_EXTRADATA_UBWC_CR_STATS_INFO, 0x0); msm_comm_set_extradata(inst, HAL_EXTRADATA_NUM_CONCEALED_MB, 0x0); if (inst->fmts[CAPTURE_PORT].fourcc == V4L2_PIX_FMT_HEVC) { Loading @@ -1472,9 +1480,8 @@ int msm_vdec_set_extradata(struct msm_vidc_inst *inst) HAL_EXTRADATA_RECOVERY_POINT_SEI, 0x0); msm_comm_set_extradata(inst, HAL_EXTRADATA_ASPECT_RATIO, 0x0); msm_comm_set_extradata(inst, HAL_EXTRADATA_FRAME_QP, 0x0); enabled = false; } if (ctrl->val & 0x1) { if (ctrl->val & EXTRADATA_DEFAULT) { // Enable Default Extradata msm_comm_set_extradata(inst, HAL_EXTRADATA_OUTPUT_CROP, 0x1); msm_comm_set_extradata(inst, Loading @@ -1489,9 +1496,8 @@ int msm_vdec_set_extradata(struct msm_vidc_inst *inst) msm_comm_set_extradata(inst, HAL_EXTRADATA_CONTENT_LIGHT_LEVEL_SEI, 0x1); } enabled = true; } if (ctrl->val & 0x2) { if (ctrl->val & EXTRADATA_ADVANCED) { // Enable Advanced Extradata msm_comm_set_extradata(inst, HAL_EXTRADATA_STREAM_USERDATA, 0x1); Loading @@ -1504,18 +1510,6 @@ int msm_vdec_set_extradata(struct msm_vidc_inst *inst) HAL_EXTRADATA_RECOVERY_POINT_SEI, 0x1); msm_comm_set_extradata(inst, HAL_EXTRADATA_ASPECT_RATIO, 0x1); msm_comm_set_extradata(inst, HAL_EXTRADATA_FRAME_QP, 0x1); enabled = true; } if (enabled) { inst->bufq[CAPTURE_PORT].num_planes = 2; inst->bufq[CAPTURE_PORT].plane_sizes[EXTRADATA_IDX(2)] = VENUS_EXTRADATA_SIZE( inst->prop.height[CAPTURE_PORT], inst->prop.width[CAPTURE_PORT]); } else { inst->bufq[CAPTURE_PORT].num_planes = 1; inst->bufq[CAPTURE_PORT].plane_sizes[EXTRADATA_IDX(2)] = 0; } return 0; Loading
drivers/media/platform/msm/vidc/msm_venc.c +66 −52 Original line number Diff line number Diff line // SPDX-License-Identifier: GPL-2.0 // SPDX-License-Identifier: GPL-2.0-only /* * Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. */ Loading Loading @@ -499,9 +499,10 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = { .id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA, .name = "Extradata Type", .type = V4L2_CTRL_TYPE_BITMASK, .minimum = 0, .maximum = 0xF, .default_value = 0, .minimum = EXTRADATA_NONE, .maximum = EXTRADATA_ADVANCED | EXTRADATA_ENC_INPUT_ROI | EXTRADATA_ENC_INPUT_HDR10PLUS, .default_value = EXTRADATA_NONE, .menu_skip_mask = 0, .qmenu = NULL, }, Loading Loading @@ -1296,6 +1297,7 @@ int msm_venc_s_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) int rc = 0; struct msm_vidc_mastering_display_colour_sei_payload *mdisp_sei = NULL; struct msm_vidc_content_light_level_sei_payload *cll_sei = NULL; struct hal_buffer_requirements *buff_req_buffer = NULL; if (!inst || !inst->core || !inst->core->device || !ctrl) { dprintk(VIDC_ERR, "%s invalid parameters\n", __func__); Loading Loading @@ -1491,6 +1493,54 @@ int msm_venc_s_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) info_type); } } break; case V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA: inst->bufq[OUTPUT_PORT].num_planes = 1; inst->bufq[CAPTURE_PORT].num_planes = 1; if (ctrl->val & EXTRADATA_ADVANCED) inst->bufq[CAPTURE_PORT].num_planes = 2; if ((ctrl->val & EXTRADATA_ENC_INPUT_ROI) || (ctrl->val & EXTRADATA_ENC_INPUT_HDR10PLUS)) inst->bufq[OUTPUT_PORT].num_planes = 2; /* Needs internal calculation of extradata */ rc = msm_comm_try_get_bufreqs(inst); if (rc) { dprintk(VIDC_ERR, "Failed to get buffer requirements: %d\n", rc); break; } if (inst->bufq[OUTPUT_PORT].num_planes == 2) { buff_req_buffer = get_buff_req_buffer(inst, HAL_BUFFER_EXTRADATA_INPUT); if (!buff_req_buffer) { dprintk(VIDC_ERR, "Failed to get extradata buff info\n"); rc = -EINVAL; break; } inst->bufq[OUTPUT_PORT].plane_sizes[1] = buff_req_buffer->buffer_size; } if (inst->bufq[CAPTURE_PORT].num_planes == 2) { buff_req_buffer = get_buff_req_buffer(inst, HAL_BUFFER_EXTRADATA_OUTPUT); if (!buff_req_buffer) { dprintk(VIDC_ERR, "Failed to get extradata buff info\n"); rc = -EINVAL; break; } inst->bufq[CAPTURE_PORT].plane_sizes[1] = buff_req_buffer->buffer_size; } break; case V4L2_CID_MPEG_VIDEO_B_FRAMES: case V4L2_CID_ROTATE: Loading Loading @@ -1543,7 +1593,6 @@ int msm_venc_s_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) case V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_HEIGHT: case V4L2_CID_MPEG_VIDC_VIDEO_BLUR_DIMENSIONS: case V4L2_CID_MPEG_VIDC_VIDEO_PRIORITY: case V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA: dprintk(VIDC_DBG, "Control set: ID : %x Val : %d\n", ctrl->id, ctrl->val); break; Loading Loading @@ -1999,12 +2048,12 @@ int msm_venc_set_rate_control(struct msm_vidc_inst *inst) if ((bitrate_mode->val == V4L2_MPEG_VIDEO_BITRATE_MODE_CBR_VFR) && (inst->fmts[CAPTURE_PORT].fourcc == V4L2_PIX_FMT_H264)) { hier_layers = msm_venc_get_ctrl(inst, V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING); V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_LAYER); hier_type = msm_venc_get_ctrl(inst, V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_TYPE); V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_TYPE); if ((hier_layers && hier_layers->val) && (hier_type && hier_type->val == V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_P)){ V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_P)){ dprintk(VIDC_ERR, "%s: CBR_VFR not allowed with Hybrid HP\n", __func__); Loading Loading @@ -2646,7 +2695,7 @@ int msm_venc_set_hierp_layers(struct msm_vidc_inst *inst) return 0; ctrl = msm_venc_get_ctrl(inst, V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING); V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_TYPE); if (!ctrl) { dprintk(VIDC_ERR, "%s: get heirp num layers failed\n", __func__); Loading Loading @@ -3221,8 +3270,6 @@ int msm_venc_set_hdr_info(struct msm_vidc_inst *inst) int msm_venc_set_extradata(struct msm_vidc_inst *inst) { int rc = 0; struct hal_buffer_requirements *buff_req_buffer = NULL; int extra_idx = 0; struct v4l2_ctrl *ctrl = msm_venc_get_ctrl(inst, V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA); Loading @@ -3232,7 +3279,7 @@ int msm_venc_set_extradata(struct msm_vidc_inst *inst) return -EINVAL; } if (!ctrl->val) { if (ctrl->val == EXTRADATA_NONE) { // Disable all Extradata msm_comm_set_extradata(inst, HAL_EXTRADATA_ASPECT_RATIO, 0x0); msm_comm_set_extradata(inst, HAL_EXTRADATA_LTR_INFO, 0x0); Loading @@ -3241,55 +3288,22 @@ int msm_venc_set_extradata(struct msm_vidc_inst *inst) msm_comm_set_extradata(inst, HAL_EXTRADATA_HDR10PLUS_METADATA, 0x0); } inst->bufq[OUTPUT_PORT].num_planes = 1; inst->bufq[CAPTURE_PORT].num_planes = 1; } if (ctrl->val & 0x2) { // Enable Advanced Extradata msm_comm_set_extradata(inst, HAL_EXTRADATA_ASPECT_RATIO, 0x1); inst->bufq[OUTPUT_PORT].num_planes = 2; if (ctrl->val & EXTRADATA_ADVANCED) // Enable Advanced Extradata - LTR Info msm_comm_set_extradata(inst, HAL_EXTRADATA_LTR_INFO, 0x1); inst->bufq[CAPTURE_PORT].num_planes = 2; } if (ctrl->val & 0x4) { if (ctrl->val & EXTRADATA_ENC_INPUT_ROI) // Enable ROIQP Extradata msm_comm_set_extradata(inst, HAL_EXTRADATA_ROI_QP, 0x1); inst->bufq[OUTPUT_PORT].num_planes = 2; } if (ctrl->val & 0x8) { if (ctrl->val & EXTRADATA_ENC_INPUT_HDR10PLUS) { // Enable HDR10+ Extradata if (inst->fmts[CAPTURE_PORT].fourcc == V4L2_PIX_FMT_HEVC) { msm_comm_set_extradata(inst, HAL_EXTRADATA_HDR10PLUS_METADATA, 0x1); } inst->bufq[OUTPUT_PORT].num_planes = 2; } rc = msm_comm_try_get_bufreqs(inst); if (rc) { dprintk(VIDC_ERR, "Failed to get buffer requirements: %d\n", rc); return rc; } extra_idx = EXTRADATA_IDX(inst->bufq[OUTPUT_PORT].num_planes); if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { buff_req_buffer = get_buff_req_buffer(inst, HAL_BUFFER_EXTRADATA_INPUT); inst->bufq[OUTPUT_PORT].plane_sizes[extra_idx] = buff_req_buffer ? buff_req_buffer->buffer_size : 0; } extra_idx = EXTRADATA_IDX(inst->bufq[CAPTURE_PORT].num_planes); if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { buff_req_buffer = get_buff_req_buffer(inst, HAL_BUFFER_EXTRADATA_OUTPUT); inst->bufq[CAPTURE_PORT].plane_sizes[extra_idx] = buff_req_buffer ? buff_req_buffer->buffer_size : 0; } return rc; Loading
include/uapi/linux/v4l2-controls.h +3 −0 Original line number Diff line number Diff line Loading @@ -814,6 +814,9 @@ enum v4l2_mpeg_vidc_video_stream_format { #define V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA \ (V4L2_CID_MPEG_MSM_VIDC_BASE + 17) enum v4l2_mpeg_vidc_extradata { #define EXTRADATA_NONE \ EXTRADATA_NONE EXTRADATA_NONE = 0, EXTRADATA_DEFAULT = 1, EXTRADATA_ADVANCED = 2, EXTRADATA_ENC_INPUT_ROI = 4, Loading