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:

committed by
Gerrit - the friendly Code Review server

parent
550a5599b9
commit
1c5f23e13b
@@ -134,7 +134,8 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
|
|||||||
0, 0,
|
0, 0,
|
||||||
CAP_FLAG_ROOT,
|
CAP_FLAG_ROOT,
|
||||||
{0},
|
{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,
|
{PIX_FMTS, DEC, HEVC|HEIC,
|
||||||
MSM_VIDC_FMT_NV12,
|
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_ROOT | CAP_FLAG_OUTPUT_PORT |
|
||||||
CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
|
CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
|
||||||
{0},
|
{0},
|
||||||
{0},
|
{BLUR_TYPES},
|
||||||
NULL, msm_vidc_set_flip},
|
NULL, msm_vidc_set_flip},
|
||||||
|
|
||||||
{VFLIP, ENC, CODECS_ALL,
|
{VFLIP, ENC, CODECS_ALL,
|
||||||
@@ -257,7 +258,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
|
|||||||
HFI_PROP_ROTATION,
|
HFI_PROP_ROTATION,
|
||||||
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT,
|
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT,
|
||||||
{0},
|
{0},
|
||||||
{0},
|
{BLUR_TYPES},
|
||||||
NULL, msm_vidc_set_rotation},
|
NULL, msm_vidc_set_rotation},
|
||||||
|
|
||||||
{SUPER_FRAME, ENC, H264|HEVC,
|
{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,
|
{LTR_COUNT, IR_RANDOM, TIME_DELTA_BASED_RC, I_FRAME_QP,
|
||||||
ENH_LAYER_COUNT, BIT_RATE, CONTENT_ADAPTIVE_CODING,
|
ENH_LAYER_COUNT, BIT_RATE, CONTENT_ADAPTIVE_CODING,
|
||||||
BITRATE_BOOST, MIN_QUALITY, VBV_DELAY, PEAK_BITRATE,
|
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},
|
msm_vidc_adjust_bitrate_mode, msm_vidc_set_u32_enum},
|
||||||
|
|
||||||
{BITRATE_MODE, ENC, HEVC,
|
{BITRATE_MODE, ENC, HEVC,
|
||||||
@@ -368,7 +369,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
|
|||||||
CONSTANT_QUALITY, ENH_LAYER_COUNT,
|
CONSTANT_QUALITY, ENH_LAYER_COUNT,
|
||||||
CONTENT_ADAPTIVE_CODING, BIT_RATE,
|
CONTENT_ADAPTIVE_CODING, BIT_RATE,
|
||||||
BITRATE_BOOST, MIN_QUALITY, VBV_DELAY,
|
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},
|
msm_vidc_adjust_bitrate_mode, msm_vidc_set_u32_enum},
|
||||||
|
|
||||||
{LOSSLESS, ENC, HEVC|HEIC,
|
{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},
|
msm_vidc_adjust_b_frame, msm_vidc_set_u32},
|
||||||
|
|
||||||
{BLUR_TYPES, ENC, CODECS_ALL,
|
{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,
|
V4L2_CID_MPEG_VIDC_VIDEO_BLUR_TYPES,
|
||||||
HFI_PROP_BLUR_TYPES,
|
HFI_PROP_BLUR_TYPES,
|
||||||
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT,
|
CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
|
||||||
{0}, {0},
|
{PIX_FMTS, ROTATION, HFLIP, BITRATE_MODE,
|
||||||
NULL, msm_vidc_set_u32_enum},
|
CONTENT_ADAPTIVE_CODING},
|
||||||
|
{BLUR_RESOLUTION},
|
||||||
|
msm_vidc_adjust_blur_type, msm_vidc_set_blur_type},
|
||||||
|
|
||||||
{BLUR_RESOLUTION, ENC, CODECS_ALL,
|
{BLUR_RESOLUTION, ENC, CODECS_ALL,
|
||||||
0, S32_MAX, 1, 0,
|
0, S32_MAX, 1, 0,
|
||||||
V4L2_CID_MPEG_VIDC_VIDEO_BLUR_RESOLUTION,
|
V4L2_CID_MPEG_VIDC_VIDEO_BLUR_RESOLUTION,
|
||||||
HFI_PROP_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,
|
{CSC, ENC, CODECS_ALL,
|
||||||
V4L2_MPEG_MSM_VIDC_DISABLE,
|
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,
|
V4L2_CID_MPEG_VIDC_CONTENT_ADAPTIVE_CODING,
|
||||||
HFI_PROP_CONTENT_ADAPTIVE_CODING,
|
HFI_PROP_CONTENT_ADAPTIVE_CODING,
|
||||||
CAP_FLAG_OUTPUT_PORT,
|
CAP_FLAG_OUTPUT_PORT,
|
||||||
{BITRATE_MODE}, {0},
|
{BITRATE_MODE},
|
||||||
|
{BLUR_TYPES},
|
||||||
NULL, msm_vidc_set_vbr_related_properties},
|
NULL, msm_vidc_set_vbr_related_properties},
|
||||||
|
|
||||||
{BITRATE_BOOST, ENC, H264|HEVC,
|
{BITRATE_BOOST, ENC, H264|HEVC,
|
||||||
|
@@ -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_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_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_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_v4l2_properties(struct msm_vidc_inst *inst);
|
||||||
int msm_vidc_adjust_session_priority(void *instance, struct v4l2_ctrl *ctrl);
|
int msm_vidc_adjust_session_priority(void *instance, struct v4l2_ctrl *ctrl);
|
||||||
int msm_vidc_adjust_roi_info(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);
|
enum msm_vidc_inst_capability_type cap_id);
|
||||||
int msm_vidc_set_rotation(void *instance,
|
int msm_vidc_set_rotation(void *instance,
|
||||||
enum msm_vidc_inst_capability_type cap_id);
|
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,
|
int msm_vidc_set_s32(void *instance,
|
||||||
enum msm_vidc_inst_capability_type cap_id);
|
enum msm_vidc_inst_capability_type cap_id);
|
||||||
int msm_vidc_set_q16(void *instance,
|
int msm_vidc_set_q16(void *instance,
|
||||||
|
@@ -1603,6 +1603,90 @@ int msm_vidc_adjust_hevc_frame_qp(void *instance, struct v4l2_ctrl *ctrl)
|
|||||||
return rc;
|
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 msm_vidc_adjust_session_priority(void *instance, struct v4l2_ctrl *ctrl)
|
||||||
{
|
{
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
@@ -2423,8 +2507,19 @@ int msm_vidc_set_flip(void *instance,
|
|||||||
if (vflip)
|
if (vflip)
|
||||||
hfi_value |= HFI_VERTICAL_FLIP;
|
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,
|
rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32_ENUM,
|
||||||
&hfi_value, sizeof(u32), __func__);
|
&hfi_value, sizeof(u32), __func__);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@@ -2453,6 +2548,75 @@ int msm_vidc_set_rotation(void *instance,
|
|||||||
return rc;
|
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,
|
int msm_vidc_set_q16(void *instance,
|
||||||
enum msm_vidc_inst_capability_type cap_id)
|
enum msm_vidc_inst_capability_type cap_id)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user