diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2019-05-23 05:22:53 -0700 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2019-05-23 05:22:52 -0700 |
commit | 30a7c50b1a26269c93e3ebb2623d040891b8a018 (patch) | |
tree | 0aa165c9b37b1c4b5442e1fe042bc6938c34acfa | |
parent | 8d0edcc26e32a696e12b0f7f69b7edd6b2f95b6f (diff) | |
parent | ad24a330be2f619ac6e980c57b6ee4d18bd4b71a (diff) |
Merge "msm: vidc: Add support for setting dynamic QP range" into kernel.lnx.4.9.r24-relLA.UM.6.8.1.r2-02100-QCS605.0
-rw-r--r-- | drivers/media/platform/msm/vidc/hfi_packetization.c | 31 | ||||
-rw-r--r-- | drivers/media/platform/msm/vidc/msm_venc.c | 61 | ||||
-rw-r--r-- | drivers/media/platform/msm/vidc/vidc_hfi_api.h | 1 | ||||
-rw-r--r-- | drivers/media/platform/msm/vidc/vidc_hfi_helper.h | 4 | ||||
-rw-r--r-- | include/uapi/linux/v4l2-controls.h | 3 |
5 files changed, 97 insertions, 3 deletions
diff --git a/drivers/media/platform/msm/vidc/hfi_packetization.c b/drivers/media/platform/msm/vidc/hfi_packetization.c index 9ef9d05d92f4..8c801d5080c4 100644 --- a/drivers/media/platform/msm/vidc/hfi_packetization.c +++ b/drivers/media/platform/msm/vidc/hfi_packetization.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -1396,6 +1396,35 @@ int create_pkt_cmd_session_set_property( sizeof(struct hfi_quantization_range); break; } + case HAL_CONFIG_VENC_FRAME_QP_RANGE: + { + struct hfi_quantization_range *hfi; + struct hal_quantization_range *hal_range = + (struct hal_quantization_range *) pdata; + + pkt->rg_property_data[0] = + HFI_PROPERTY_CONFIG_VENC_FRAME_QP_RANGE; + hfi = (struct hfi_quantization_range *) + &pkt->rg_property_data[1]; + + /* + * When creating the packet, pack the qp value as + * 0xbbppii, where ii = qp range for I-frames, + * pp = qp range for P-frames, etc. + */ + hfi->min_qp.qp_packed = hal_range->qpi_min | + hal_range->qpp_min << 8 | + hal_range->qpb_min << 16; + hfi->max_qp.qp_packed = hal_range->qpi_max | + hal_range->qpp_max << 8 | + hal_range->qpb_max << 16; + hfi->max_qp.layer_id = hal_range->layer_id; + hfi->min_qp.layer_id = hal_range->layer_id; + + pkt->size += sizeof(u32) + + sizeof(struct hfi_quantization_range); + break; + } case HAL_CONFIG_VENC_INTRA_PERIOD: { struct hfi_intra_period *hfi; diff --git a/drivers/media/platform/msm/vidc/msm_venc.c b/drivers/media/platform/msm/vidc/msm_venc.c index 148df7dc857b..9416ab4e1374 100644 --- a/drivers/media/platform/msm/vidc/msm_venc.c +++ b/drivers/media/platform/msm/vidc/msm_venc.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -904,6 +904,16 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = { .qmenu = NULL, }, { + .id = V4L2_CID_MPEG_VIDC_VIDEO_FRAME_QP, + .name = "Dynamic Frame QP", + .type = V4L2_CTRL_TYPE_INTEGER, + .minimum = 0, + .maximum = MSM_VIDC_ALL_LAYER_ID, + .default_value = 0, + .step = 1, + .qmenu = NULL, + }, + { .id = V4L2_CID_MPEG_VIDC_VENC_PARAM_SAR_WIDTH, .name = "SAR Width", .type = V4L2_CTRL_TYPE_INTEGER, @@ -2301,6 +2311,7 @@ int msm_venc_s_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) case V4L2_CID_MPEG_VIDC_VIDEO_BLUR_WIDTH: case V4L2_CID_MPEG_VIDC_VIDEO_BLUR_HEIGHT: case V4L2_CID_MPEG_VIDC_VIDEO_LAYER_ID: + case V4L2_CID_MPEG_VIDC_VIDEO_FRAME_QP: case V4L2_CID_MPEG_VIDC_VENC_PARAM_LAYER_BITRATE: case V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP_MIN: case V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP_MIN: @@ -2512,6 +2523,54 @@ int msm_venc_s_ext_ctrl(struct msm_vidc_inst *inst, i++; } break; + case V4L2_CID_MPEG_VIDC_VIDEO_FRAME_QP: + qp.layer_id = control[i].value; + /* Enable QP for all frame types by default */ + qp.enable = 7; + qp_range.layer_id = control[i].value; + i++; + while (i < ctrl->count) { + switch (control[i].id) { + case V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP_MIN: + qp_range.qpi_min = control[i].value; + property_id = + HAL_CONFIG_VENC_FRAME_QP_RANGE; + pdata = &qp_range; + break; + case V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP_MIN: + qp_range.qpp_min = control[i].value; + property_id = + HAL_CONFIG_VENC_FRAME_QP_RANGE; + pdata = &qp_range; + break; + case V4L2_CID_MPEG_VIDC_VIDEO_B_FRAME_QP_MIN: + qp_range.qpb_min = control[i].value; + property_id = + HAL_CONFIG_VENC_FRAME_QP_RANGE; + pdata = &qp_range; + break; + case V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP_MAX: + qp_range.qpi_max = control[i].value; + property_id = + HAL_CONFIG_VENC_FRAME_QP_RANGE; + pdata = &qp_range; + break; + case V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP_MAX: + qp_range.qpp_max = control[i].value; + property_id = + HAL_CONFIG_VENC_FRAME_QP_RANGE; + pdata = &qp_range; + break; + case V4L2_CID_MPEG_VIDC_VIDEO_B_FRAME_QP_MAX: + qp_range.qpb_max = control[i].value; + property_id = + HAL_CONFIG_VENC_FRAME_QP_RANGE; + pdata = &qp_range; + break; + } + i++; + } + break; case V4L2_CID_MPEG_VIDC_VENC_HDR_INFO: if (control[i].value == V4L2_MPEG_VIDC_VENC_HDR_INFO_DISABLED || diff --git a/drivers/media/platform/msm/vidc/vidc_hfi_api.h b/drivers/media/platform/msm/vidc/vidc_hfi_api.h index 7da7d5206987..ec843d065887 100644 --- a/drivers/media/platform/msm/vidc/vidc_hfi_api.h +++ b/drivers/media/platform/msm/vidc/vidc_hfi_api.h @@ -235,6 +235,7 @@ enum hal_property { HAL_CONFIG_HEIC_FRAME_CROP_INFO, HAL_CONFIG_HEIC_FRAME_QUALITY, HAL_CONFIG_HEIC_GRID_ENABLE, + HAL_CONFIG_VENC_FRAME_QP_RANGE, }; enum hal_domain { diff --git a/drivers/media/platform/msm/vidc/vidc_hfi_helper.h b/drivers/media/platform/msm/vidc/vidc_hfi_helper.h index dd94a888deff..b86f7d58f0e9 100644 --- a/drivers/media/platform/msm/vidc/vidc_hfi_helper.h +++ b/drivers/media/platform/msm/vidc/vidc_hfi_helper.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -362,6 +362,8 @@ struct hfi_buffer_info { (HFI_PROPERTY_CONFIG_VENC_COMMON_START + 0x014) #define HFI_PROPERTY_CONFIG_HEIC_GRID_ENABLE \ (HFI_PROPERTY_CONFIG_VENC_COMMON_START + 0x015) +#define HFI_PROPERTY_CONFIG_VENC_FRAME_QP_RANGE \ + (HFI_PROPERTY_CONFIG_VENC_COMMON_START + 0x016) #define HFI_PROPERTY_PARAM_VPE_COMMON_START \ (HFI_DOMAIN_BASE_VPE + HFI_ARCH_COMMON_OFFSET + 0x7000) diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h index d14cd8fabee1..97f1057b3c9d 100644 --- a/include/uapi/linux/v4l2-controls.h +++ b/include/uapi/linux/v4l2-controls.h @@ -1350,6 +1350,9 @@ enum v4l2_mpeg_vidc_video_divx_format_type { #define V4L2_CID_MPEG_VIDC_IMG_GRID_DIMENSION \ (V4L2_CID_MPEG_MSM_VIDC_BASE+161) +#define V4L2_CID_MPEG_VIDC_VIDEO_FRAME_QP \ + (V4L2_CID_MPEG_MSM_VIDC_BASE+162) + enum v4l2_mpeg_vidc_video_mbi_statistics_mode { V4L2_CID_MPEG_VIDC_VIDEO_MBI_MODE_DEFAULT = 0, V4L2_CID_MPEG_VIDC_VIDEO_MBI_MODE_1 = 1, |