video: driver: Add support to blur property

[1] Add support to adjust and set blur type and blur
    resolution.
[2] Modify flip to not allow dynamic flip enablement
    when external blur is enabled.

Change-Id: I730f452c143ba8c8e15402d1c1ec3a0617bd583c
Signed-off-by: Akshata Sahukar <asahukar@codeaurora.org>
This commit is contained in:
Akshata Sahukar
2021-04-27 17:26:17 -07:00
committed by Gerrit - the friendly Code Review server
parent 550a5599b9
commit 1c5f23e13b
3 changed files with 189 additions and 11 deletions

View File

@@ -134,7 +134,8 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
0, 0,
CAP_FLAG_ROOT,
{0},
{PROFILE, MIN_FRAME_QP, MAX_FRAME_QP, I_FRAME_QP, META_ROI_INFO}},
{PROFILE, MIN_FRAME_QP, MAX_FRAME_QP, I_FRAME_QP, META_ROI_INFO,
BLUR_TYPES}},
{PIX_FMTS, DEC, HEVC|HEIC,
MSM_VIDC_FMT_NV12,
@@ -236,7 +237,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT |
CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
{0},
{0},
{BLUR_TYPES},
NULL, msm_vidc_set_flip},
{VFLIP, ENC, CODECS_ALL,
@@ -257,7 +258,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
HFI_PROP_ROTATION,
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT,
{0},
{0},
{BLUR_TYPES},
NULL, msm_vidc_set_rotation},
{SUPER_FRAME, ENC, H264|HEVC,
@@ -350,7 +351,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
{LTR_COUNT, IR_RANDOM, TIME_DELTA_BASED_RC, I_FRAME_QP,
ENH_LAYER_COUNT, BIT_RATE, CONTENT_ADAPTIVE_CODING,
BITRATE_BOOST, MIN_QUALITY, VBV_DELAY, PEAK_BITRATE,
SLICE_MODE, META_ROI_INFO},
SLICE_MODE, META_ROI_INFO, BLUR_TYPES},
msm_vidc_adjust_bitrate_mode, msm_vidc_set_u32_enum},
{BITRATE_MODE, ENC, HEVC,
@@ -368,7 +369,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
CONSTANT_QUALITY, ENH_LAYER_COUNT,
CONTENT_ADAPTIVE_CODING, BIT_RATE,
BITRATE_BOOST, MIN_QUALITY, VBV_DELAY,
PEAK_BITRATE, SLICE_MODE, META_ROI_INFO},
PEAK_BITRATE, SLICE_MODE, META_ROI_INFO, BLUR_TYPES},
msm_vidc_adjust_bitrate_mode, msm_vidc_set_u32_enum},
{LOSSLESS, ENC, HEVC|HEIC,
@@ -427,18 +428,24 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
msm_vidc_adjust_b_frame, msm_vidc_set_u32},
{BLUR_TYPES, ENC, CODECS_ALL,
VIDC_BLUR_NONE, VIDC_BLUR_ADAPTIVE, 1, VIDC_BLUR_NONE,
VIDC_BLUR_NONE, VIDC_BLUR_ADAPTIVE, 1, VIDC_BLUR_ADAPTIVE,
V4L2_CID_MPEG_VIDC_VIDEO_BLUR_TYPES,
HFI_PROP_BLUR_TYPES,
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT,
{0}, {0},
NULL, msm_vidc_set_u32_enum},
CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
{PIX_FMTS, ROTATION, HFLIP, BITRATE_MODE,
CONTENT_ADAPTIVE_CODING},
{BLUR_RESOLUTION},
msm_vidc_adjust_blur_type, msm_vidc_set_blur_type},
{BLUR_RESOLUTION, ENC, CODECS_ALL,
0, S32_MAX, 1, 0,
V4L2_CID_MPEG_VIDC_VIDEO_BLUR_RESOLUTION,
HFI_PROP_BLUR_RESOLUTION,
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
CAP_FLAG_DYNAMIC_ALLOWED,
{BLUR_TYPES},
{0},
msm_vidc_adjust_blur_resolution, msm_vidc_set_blur_resolution},
{CSC, ENC, CODECS_ALL,
V4L2_MPEG_MSM_VIDC_DISABLE,
@@ -530,7 +537,8 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
V4L2_CID_MPEG_VIDC_CONTENT_ADAPTIVE_CODING,
HFI_PROP_CONTENT_ADAPTIVE_CODING,
CAP_FLAG_OUTPUT_PORT,
{BITRATE_MODE}, {0},
{BITRATE_MODE},
{BLUR_TYPES},
NULL, msm_vidc_set_vbr_related_properties},
{BITRATE_BOOST, ENC, H264|HEVC,

View File

@@ -37,6 +37,8 @@ int msm_vidc_adjust_peak_bitrate(void *instance, struct v4l2_ctrl *ctrl);
int msm_vidc_adjust_hevc_min_qp(void *instance, struct v4l2_ctrl *ctrl);
int msm_vidc_adjust_hevc_max_qp(void *instance, struct v4l2_ctrl *ctrl);
int msm_vidc_adjust_hevc_frame_qp(void *instance, struct v4l2_ctrl *ctrl);
int msm_vidc_adjust_blur_type(void *instance, struct v4l2_ctrl *ctrl);
int msm_vidc_adjust_blur_resolution(void *instance, struct v4l2_ctrl *ctrl);
int msm_vidc_adjust_v4l2_properties(struct msm_vidc_inst *inst);
int msm_vidc_adjust_session_priority(void *instance, struct v4l2_ctrl *ctrl);
int msm_vidc_adjust_roi_info(void *instance, struct v4l2_ctrl *ctrl);
@@ -83,6 +85,10 @@ int msm_vidc_set_flip(void *instance,
enum msm_vidc_inst_capability_type cap_id);
int msm_vidc_set_rotation(void *instance,
enum msm_vidc_inst_capability_type cap_id);
int msm_vidc_set_blur_type(void *instance,
enum msm_vidc_inst_capability_type cap_id);
int msm_vidc_set_blur_resolution(void *instance,
enum msm_vidc_inst_capability_type cap_id);
int msm_vidc_set_s32(void *instance,
enum msm_vidc_inst_capability_type cap_id);
int msm_vidc_set_q16(void *instance,

View File

@@ -1603,6 +1603,90 @@ int msm_vidc_adjust_hevc_frame_qp(void *instance, struct v4l2_ctrl *ctrl)
return rc;
}
int msm_vidc_adjust_blur_type(void *instance, struct v4l2_ctrl *ctrl)
{
struct msm_vidc_inst_capability *capability;
s32 adjusted_value;
struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
s32 rc_type = -1, rotation = -1, hflip = -1, vflip = -1, cac = -1;
s32 pix_fmts = -1;
if (!inst || !inst->capabilities) {
d_vpr_e("%s: invalid params\n", __func__);
return -EINVAL;
}
capability = inst->capabilities;
if (inst->vb2q[OUTPUT_PORT].streaming)
return 0;
adjusted_value = ctrl ? ctrl->val :
capability->cap[BLUR_TYPES].value;
if (adjusted_value == VIDC_BLUR_NONE)
return 0;
if (msm_vidc_get_parent_value(inst, BLUR_TYPES, BITRATE_MODE,
&rc_type, __func__) ||
msm_vidc_get_parent_value(inst, BLUR_TYPES, ROTATION,
&rotation, __func__) ||
msm_vidc_get_parent_value(inst, BLUR_TYPES,
CONTENT_ADAPTIVE_CODING, &cac, __func__) ||
msm_vidc_get_parent_value(inst, BLUR_TYPES, HFLIP,
&hflip, __func__) ||
msm_vidc_get_parent_value(inst, BLUR_TYPES, PIX_FMTS,
&pix_fmts, __func__))
return -EINVAL;
vflip = capability->cap[VFLIP].value;
if (adjusted_value == VIDC_BLUR_EXTERNAL) {
if (rotation || hflip || vflip || is_scaling_enabled(inst)) {
adjusted_value = VIDC_BLUR_NONE;
}
} else if (adjusted_value == VIDC_BLUR_ADAPTIVE) {
if (rotation || hflip || vflip || is_scaling_enabled(inst) ||
(rc_type != HFI_RC_VBR_CFR) ||
!cac || is_10bit_colorformat(pix_fmts)) {
adjusted_value = VIDC_BLUR_NONE;
}
}
msm_vidc_update_cap_value(inst, BLUR_TYPES,
adjusted_value, __func__);
return 0;
}
int msm_vidc_adjust_blur_resolution(void *instance, struct v4l2_ctrl *ctrl)
{
struct msm_vidc_inst_capability *capability;
s32 adjusted_value;
struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
s32 blur_type = -1;
if (!inst || !inst->capabilities) {
d_vpr_e("%s: invalid params\n", __func__);
return -EINVAL;
}
capability = inst->capabilities;
adjusted_value = ctrl ? ctrl->val :
capability->cap[BLUR_RESOLUTION].value;
if (msm_vidc_get_parent_value(inst, BLUR_RESOLUTION, BLUR_TYPES,
&blur_type, __func__))
return -EINVAL;
if (blur_type != VIDC_BLUR_EXTERNAL)
return 0;
msm_vidc_update_cap_value(inst, BLUR_RESOLUTION,
adjusted_value, __func__);
return 0;
}
int msm_vidc_adjust_session_priority(void *instance, struct v4l2_ctrl *ctrl)
{
int rc = 0;
@@ -2423,8 +2507,19 @@ int msm_vidc_set_flip(void *instance,
if (vflip)
hfi_value |= HFI_VERTICAL_FLIP;
if (inst->vb2q[OUTPUT_PORT].streaming) {
if (hfi_value != HFI_DISABLE_FLIP) {
rc = msm_vidc_set_req_sync_frame(inst,
REQUEST_I_FRAME);
if (rc)
return rc;
}
}
rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32_ENUM,
&hfi_value, sizeof(u32), __func__);
if (rc)
return rc;
return rc;
}
@@ -2453,6 +2548,75 @@ int msm_vidc_set_rotation(void *instance,
return rc;
}
int msm_vidc_set_blur_type(void *instance,
enum msm_vidc_inst_capability_type cap_id)
{
int rc = 0;
struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
u32 hfi_value;
if (!inst || !inst->capabilities) {
d_vpr_e("%s: invalid params\n", __func__);
return -EINVAL;
}
if (inst->vb2q[OUTPUT_PORT].streaming)
return 0;
rc = msm_vidc_v4l2_to_hfi_enum(inst, cap_id, &hfi_value);
if (rc)
return -EINVAL;
rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32_ENUM,
&hfi_value, sizeof(u32), __func__);
if (rc)
return rc;
return rc;
}
int msm_vidc_set_blur_resolution(void *instance,
enum msm_vidc_inst_capability_type cap_id)
{
int rc = 0;
struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
s32 blur_type = -1;
u32 hfi_value, blur_width, blur_height;
if (!inst || !inst->capabilities) {
d_vpr_e("%s: invalid params\n", __func__);
return -EINVAL;
}
if (msm_vidc_get_parent_value(inst, cap_id,
BLUR_TYPES, &blur_type, __func__))
return -EINVAL;
if (blur_type != VIDC_BLUR_EXTERNAL)
return 0;
hfi_value = inst->capabilities->cap[cap_id].value;
blur_width = (hfi_value & 0xFFFF0000) >> 16;
blur_height = hfi_value & 0xFFFF;
if (blur_width > inst->compose.width ||
blur_height > inst->compose.height) {
i_vpr_e(inst,
"%s: blur wxh: %dx%d exceeds compose wxh: %dx%d\n",
__func__, blur_width, blur_height,
inst->compose.width, inst->compose.height);
hfi_value = (inst->compose.width << 16) | inst->compose.height;
}
rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_32_PACKED,
&hfi_value, sizeof(u32), __func__);
if (rc)
return rc;
return rc;
}
int msm_vidc_set_q16(void *instance,
enum msm_vidc_inst_capability_type cap_id)
{