msm: vdec: configure latency mode for decode session
Static - Enable latency hint which indicates that the decode session may go into low latency mode during the session. With this configuration, video driver disables DCVS and decode batching. Dynamic - Enable or disable low latency control during the session. Based on it, video driver would decide the work mode and set the same. Change-Id: If6e85b7adb1bbe4b4bec9e4a8671db64f240cfe8 Signed-off-by: Vikash Garodia <vgarodia@codeaurora.org>
This commit is contained in:
parent
6ec572de63
commit
e55786492d
@ -416,6 +416,15 @@ static struct msm_vidc_ctrl msm_vdec_ctrls[] = {
|
|||||||
.default_value = V4L2_MPEG_MSM_VIDC_DISABLE,
|
.default_value = V4L2_MPEG_MSM_VIDC_DISABLE,
|
||||||
.step = 1,
|
.step = 1,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.id = V4L2_CID_MPEG_VIDC_VIDEO_LOWLATENCY_HINT,
|
||||||
|
.name = "Low Latency Hint",
|
||||||
|
.type = V4L2_CTRL_TYPE_BOOLEAN,
|
||||||
|
.minimum = V4L2_MPEG_MSM_VIDC_DISABLE,
|
||||||
|
.maximum = V4L2_MPEG_MSM_VIDC_ENABLE,
|
||||||
|
.default_value = V4L2_MPEG_MSM_VIDC_DISABLE,
|
||||||
|
.step = 1,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.id = V4L2_CID_MPEG_VIDC_SUPERFRAME,
|
.id = V4L2_CID_MPEG_VIDC_SUPERFRAME,
|
||||||
.name = "Superframe",
|
.name = "Superframe",
|
||||||
@ -937,6 +946,8 @@ int msm_vdec_s_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl)
|
|||||||
inst->clk_data.low_latency_mode = !!ctrl->val;
|
inst->clk_data.low_latency_mode = !!ctrl->val;
|
||||||
inst->batch.enable = is_batching_allowed(inst);
|
inst->batch.enable = is_batching_allowed(inst);
|
||||||
break;
|
break;
|
||||||
|
case V4L2_CID_MPEG_VIDC_VIDEO_LOWLATENCY_HINT:
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
s_vpr_e(inst->sid, "Unknown control %#x\n", ctrl->id);
|
s_vpr_e(inst->sid, "Unknown control %#x\n", ctrl->id);
|
||||||
break;
|
break;
|
||||||
@ -1313,6 +1324,32 @@ int msm_vdec_set_priority(struct msm_vidc_inst *inst)
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int msm_vdec_set_seqchng_at_syncframe(struct msm_vidc_inst *inst)
|
||||||
|
{
|
||||||
|
int rc = 0;
|
||||||
|
struct hfi_device *hdev;
|
||||||
|
struct hfi_enable hfi_property;
|
||||||
|
|
||||||
|
if (!inst || !inst->core) {
|
||||||
|
d_vpr_e("%s: invalid params %pK\n", __func__, inst);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
hdev = inst->core->device;
|
||||||
|
hfi_property.enable = is_low_latency_hint(inst);
|
||||||
|
|
||||||
|
if (!hfi_property.enable)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
s_vpr_h(inst->sid, "%s: %#x\n", __func__, hfi_property.enable);
|
||||||
|
rc = call_hfi_op(hdev, session_set_property, inst->session,
|
||||||
|
HFI_PROPERTY_PARAM_VDEC_SEQCHNG_AT_SYNCFRM, &hfi_property,
|
||||||
|
sizeof(hfi_property));
|
||||||
|
if (rc)
|
||||||
|
s_vpr_e(inst->sid, "%s: set property failed\n", __func__);
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
int msm_vdec_set_conceal_color(struct msm_vidc_inst *inst)
|
int msm_vdec_set_conceal_color(struct msm_vidc_inst *inst)
|
||||||
{
|
{
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
@ -1447,6 +1484,9 @@ int msm_vdec_set_properties(struct msm_vidc_inst *inst)
|
|||||||
rc = msm_vdec_set_conceal_color(inst);
|
rc = msm_vdec_set_conceal_color(inst);
|
||||||
if (rc)
|
if (rc)
|
||||||
goto exit;
|
goto exit;
|
||||||
|
rc = msm_vdec_set_seqchng_at_syncframe(inst);
|
||||||
|
if (rc)
|
||||||
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = msm_vdec_set_color_format(inst);
|
rc = msm_vdec_set_color_format(inst);
|
||||||
|
@ -995,6 +995,7 @@ int msm_dcvs_try_enable(struct msm_vidc_inst *inst)
|
|||||||
!(msm_vidc_clock_voting ||
|
!(msm_vidc_clock_voting ||
|
||||||
!inst->core->resources.dcvs ||
|
!inst->core->resources.dcvs ||
|
||||||
inst->flags & VIDC_THUMBNAIL ||
|
inst->flags & VIDC_THUMBNAIL ||
|
||||||
|
is_low_latency_hint(inst) ||
|
||||||
inst->clk_data.low_latency_mode ||
|
inst->clk_data.low_latency_mode ||
|
||||||
inst->batch.enable ||
|
inst->batch.enable ||
|
||||||
is_turbo_session(inst) ||
|
is_turbo_session(inst) ||
|
||||||
|
@ -1656,6 +1656,15 @@ static void handle_event_change(enum hal_command_response cmd, void *data)
|
|||||||
} else {
|
} else {
|
||||||
inst->entropy_mode = event_notify->entropy_mode;
|
inst->entropy_mode = event_notify->entropy_mode;
|
||||||
|
|
||||||
|
/* configure work mode considering low latency*/
|
||||||
|
if (is_low_latency_hint(inst)) {
|
||||||
|
rc = call_core_op(inst->core, decide_work_mode,
|
||||||
|
inst);
|
||||||
|
if (rc)
|
||||||
|
s_vpr_e(inst->sid,
|
||||||
|
"%s: Failed to decide work mode\n",
|
||||||
|
__func__);
|
||||||
|
}
|
||||||
s_vpr_h(inst->sid,
|
s_vpr_h(inst->sid,
|
||||||
"seq: No parameter change continue session\n");
|
"seq: No parameter change continue session\n");
|
||||||
rc = call_hfi_op(hdev, session_continue,
|
rc = call_hfi_op(hdev, session_continue,
|
||||||
@ -2805,6 +2814,7 @@ bool is_batching_allowed(struct msm_vidc_inst *inst)
|
|||||||
*/
|
*/
|
||||||
return (inst->batch.enable &&
|
return (inst->batch.enable &&
|
||||||
inst->core->resources.decode_batching &&
|
inst->core->resources.decode_batching &&
|
||||||
|
!is_low_latency_hint(inst) &&
|
||||||
is_single_session(inst, ignore_flags) &&
|
is_single_session(inst, ignore_flags) &&
|
||||||
is_decode_session(inst) &&
|
is_decode_session(inst) &&
|
||||||
!is_thumbnail_session(inst) &&
|
!is_thumbnail_session(inst) &&
|
||||||
|
@ -127,6 +127,17 @@ static inline bool is_realtime_session(struct msm_vidc_inst *inst)
|
|||||||
return !!ctrl->val;
|
return !!ctrl->val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool is_low_latency_hint(struct msm_vidc_inst *inst)
|
||||||
|
{
|
||||||
|
struct v4l2_ctrl *ctrl;
|
||||||
|
|
||||||
|
if (inst->session_type != MSM_VIDC_DECODER)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
ctrl = get_ctrl(inst, V4L2_CID_MPEG_VIDC_VIDEO_LOWLATENCY_HINT);
|
||||||
|
return !!ctrl->val;
|
||||||
|
}
|
||||||
|
|
||||||
static inline bool is_secure_session(struct msm_vidc_inst *inst)
|
static inline bool is_secure_session(struct msm_vidc_inst *inst)
|
||||||
{
|
{
|
||||||
return !!(inst->flags & VIDC_SECURE);
|
return !!(inst->flags & VIDC_SECURE);
|
||||||
|
@ -193,6 +193,8 @@ struct hfi_extradata_header {
|
|||||||
(HFI_PROPERTY_PARAM_VDEC_OX_START + 0x0023)
|
(HFI_PROPERTY_PARAM_VDEC_OX_START + 0x0023)
|
||||||
#define HFI_PROPERTY_PARAM_VDEC_VSP_VPP_DELAY \
|
#define HFI_PROPERTY_PARAM_VDEC_VSP_VPP_DELAY \
|
||||||
(HFI_PROPERTY_PARAM_VDEC_OX_START + 0x0024)
|
(HFI_PROPERTY_PARAM_VDEC_OX_START + 0x0024)
|
||||||
|
#define HFI_PROPERTY_PARAM_VDEC_SEQCHNG_AT_SYNCFRM \
|
||||||
|
(HFI_PROPERTY_PARAM_VDEC_OX_START + 0x0025)
|
||||||
|
|
||||||
#define HFI_PROPERTY_CONFIG_VDEC_OX_START \
|
#define HFI_PROPERTY_CONFIG_VDEC_OX_START \
|
||||||
(HFI_DOMAIN_BASE_VDEC + HFI_ARCH_OX_OFFSET + 0x4000)
|
(HFI_DOMAIN_BASE_VDEC + HFI_ARCH_OX_OFFSET + 0x4000)
|
||||||
|
Loading…
Reference in New Issue
Block a user