video: driver: use custom v4l2 ctrls in place of S/G_PARM on decoder
Introduce new v4l2 controls to set frame rate and operating rate on decoder as VIDIOC_S/G_PARM is not allowed on decoder. fix: v4l2-compliance:S/G_PARM Change-Id: I6c090c0ae541a086c73bb79564dd29ed4aa755b3 Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com> Signed-off-by: Maheshwar Ajja <quic_majja@quicinc.com>
This commit is contained in:

committed by
Maheshwar Ajja

vanhempi
accb365696
commit
f60ff0d92c
@@ -251,19 +251,47 @@ static struct msm_platform_inst_capability instance_data_kalama[] = {
|
||||
|
||||
{FRAME_RATE, DEC, CODECS_ALL,
|
||||
(MINIMUM_FPS << 16), (MAXIMUM_FPS << 16),
|
||||
1, (DEFAULT_FPS << 16)},
|
||||
1, (DEFAULT_FPS << 16),
|
||||
V4L2_CID_MPEG_VIDC_FRAME_RATE,
|
||||
0,
|
||||
CAP_FLAG_OUTPUT_PORT |
|
||||
CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
|
||||
{0}, {0},
|
||||
msm_vidc_adjust_frame_rate},
|
||||
|
||||
{FRAME_RATE, DEC, VP9,
|
||||
(MINIMUM_FPS << 16), (MAXIMUM_OVERRIDE_VP9_FPS << 16),
|
||||
1, (DEFAULT_FPS << 16)},
|
||||
1, (DEFAULT_FPS << 16),
|
||||
V4L2_CID_MPEG_VIDC_FRAME_RATE,
|
||||
0,
|
||||
CAP_FLAG_OUTPUT_PORT |
|
||||
CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
|
||||
{0}, {0},
|
||||
msm_vidc_adjust_frame_rate},
|
||||
|
||||
{OPERATING_RATE, ENC|DEC, CODECS_ALL,
|
||||
{OPERATING_RATE, ENC, CODECS_ALL,
|
||||
(MINIMUM_FPS << 16), (MAXIMUM_FPS << 16),
|
||||
1, (DEFAULT_FPS << 16)},
|
||||
|
||||
{OPERATING_RATE, DEC, CODECS_ALL,
|
||||
(MINIMUM_FPS << 16), (MAXIMUM_FPS << 16),
|
||||
1, (DEFAULT_FPS << 16),
|
||||
V4L2_CID_MPEG_VIDC_OPERATING_RATE,
|
||||
0,
|
||||
CAP_FLAG_OUTPUT_PORT |
|
||||
CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
|
||||
{0}, {0},
|
||||
msm_vidc_adjust_operating_rate},
|
||||
|
||||
{OPERATING_RATE, DEC, VP9,
|
||||
(MINIMUM_FPS << 16), (MAXIMUM_OVERRIDE_VP9_FPS << 16),
|
||||
1, (DEFAULT_FPS << 16)},
|
||||
1, (DEFAULT_FPS << 16),
|
||||
V4L2_CID_MPEG_VIDC_OPERATING_RATE,
|
||||
0,
|
||||
CAP_FLAG_OUTPUT_PORT |
|
||||
CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
|
||||
{0}, {0},
|
||||
msm_vidc_adjust_operating_rate},
|
||||
|
||||
{INPUT_RATE, ENC|DEC, CODECS_ALL,
|
||||
(MINIMUM_FPS << 16), INT_MAX,
|
||||
|
@@ -237,19 +237,47 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
|
||||
|
||||
{FRAME_RATE, DEC, CODECS_ALL,
|
||||
(MINIMUM_FPS << 16), (MAXIMUM_FPS << 16),
|
||||
1, (DEFAULT_FPS << 16)},
|
||||
1, (DEFAULT_FPS << 16),
|
||||
V4L2_CID_MPEG_VIDC_FRAME_RATE,
|
||||
0,
|
||||
CAP_FLAG_OUTPUT_PORT |
|
||||
CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
|
||||
{0}, {0},
|
||||
msm_vidc_adjust_frame_rate},
|
||||
|
||||
{FRAME_RATE, DEC, VP9,
|
||||
(MINIMUM_FPS << 16), (MAXIMUM_OVERRIDE_VP9_FPS << 16),
|
||||
1, (DEFAULT_FPS << 16)},
|
||||
1, (DEFAULT_FPS << 16),
|
||||
V4L2_CID_MPEG_VIDC_FRAME_RATE,
|
||||
0,
|
||||
CAP_FLAG_OUTPUT_PORT |
|
||||
CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
|
||||
{0}, {0},
|
||||
msm_vidc_adjust_frame_rate},
|
||||
|
||||
{OPERATING_RATE, ENC|DEC, CODECS_ALL,
|
||||
{OPERATING_RATE, ENC, CODECS_ALL,
|
||||
(MINIMUM_FPS << 16), (MAXIMUM_FPS << 16),
|
||||
1, (DEFAULT_FPS << 16)},
|
||||
|
||||
{OPERATING_RATE, DEC, CODECS_ALL,
|
||||
(MINIMUM_FPS << 16), (MAXIMUM_FPS << 16),
|
||||
1, (DEFAULT_FPS << 16),
|
||||
V4L2_CID_MPEG_VIDC_OPERATING_RATE,
|
||||
0,
|
||||
CAP_FLAG_OUTPUT_PORT |
|
||||
CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
|
||||
{0}, {0},
|
||||
msm_vidc_adjust_operating_rate},
|
||||
|
||||
{OPERATING_RATE, DEC, VP9,
|
||||
(MINIMUM_FPS << 16), (MAXIMUM_OVERRIDE_VP9_FPS << 16),
|
||||
1, (DEFAULT_FPS << 16)},
|
||||
1, (DEFAULT_FPS << 16),
|
||||
V4L2_CID_MPEG_VIDC_OPERATING_RATE,
|
||||
0,
|
||||
CAP_FLAG_OUTPUT_PORT |
|
||||
CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
|
||||
{0}, {0},
|
||||
msm_vidc_adjust_operating_rate},
|
||||
|
||||
{INPUT_RATE, ENC|DEC, CODECS_ALL,
|
||||
(MINIMUM_FPS << 16), INT_MAX,
|
||||
|
@@ -52,6 +52,8 @@ int msm_vidc_prepare_dependency_list(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);
|
||||
int msm_vidc_adjust_all_intra(void *instance, struct v4l2_ctrl *ctrl);
|
||||
int msm_vidc_adjust_frame_rate(void *instance, struct v4l2_ctrl *ctrl);
|
||||
int msm_vidc_adjust_operating_rate(void *instance, struct v4l2_ctrl *ctrl);
|
||||
|
||||
int msm_vidc_set_header_mode(void *instance,
|
||||
enum msm_vidc_inst_capability_type cap_id);
|
||||
|
@@ -1040,6 +1040,7 @@ static int msm_vidc_update_static_property(struct msm_vidc_inst *inst,
|
||||
if (rc)
|
||||
return rc;
|
||||
}
|
||||
|
||||
if (ctrl->id == V4L2_CID_MPEG_VIDC_PRIORITY) {
|
||||
rc = msm_vidc_adjust_session_priority(inst, ctrl);
|
||||
if (rc)
|
||||
@@ -2745,6 +2746,69 @@ int msm_vidc_adjust_roi_info(void *instance, struct v4l2_ctrl *ctrl)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int msm_vidc_adjust_frame_rate(void *instance, struct v4l2_ctrl *ctrl)
|
||||
{
|
||||
int rc = 0;
|
||||
struct msm_vidc_inst_capability *capability;
|
||||
struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
|
||||
u32 adjusted_value;
|
||||
|
||||
if (!inst || !inst->capabilities) {
|
||||
d_vpr_e("%s: invalid params\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
capability = inst->capabilities;
|
||||
|
||||
adjusted_value = ctrl ? ctrl->val : capability->cap[FRAME_RATE].value;
|
||||
|
||||
if (is_realtime_session(inst)) {
|
||||
rc = msm_vidc_check_core_mbps(inst);
|
||||
if (rc) {
|
||||
i_vpr_e(inst, "%s: unsupported load\n", __func__);
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
|
||||
inst->priority_level = MSM_VIDC_PRIORITY_HIGH;
|
||||
capability->cap[FRAME_RATE].flags |= CAP_FLAG_CLIENT_SET;
|
||||
|
||||
msm_vidc_update_cap_value(inst, FRAME_RATE, adjusted_value, __func__);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int msm_vidc_adjust_operating_rate(void *instance, struct v4l2_ctrl *ctrl)
|
||||
{
|
||||
int rc = 0;
|
||||
struct msm_vidc_inst_capability *capability;
|
||||
struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
|
||||
u32 adjusted_value;
|
||||
|
||||
if (!inst || !inst->capabilities) {
|
||||
d_vpr_e("%s: invalid params\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
capability = inst->capabilities;
|
||||
|
||||
adjusted_value = ctrl ? ctrl->val : capability->cap[OPERATING_RATE].value;
|
||||
|
||||
if (is_realtime_session(inst)) {
|
||||
rc = msm_vidc_check_core_mbps(inst);
|
||||
if (rc) {
|
||||
i_vpr_e(inst, "%s: unsupported load\n", __func__);
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
|
||||
inst->priority_level = MSM_VIDC_PRIORITY_HIGH;
|
||||
capability->cap[OPERATING_RATE].flags |= CAP_FLAG_CLIENT_SET;
|
||||
|
||||
msm_vidc_update_cap_value(inst, OPERATING_RATE, adjusted_value, __func__);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int msm_vidc_prepare_dependency_list(struct msm_vidc_inst *inst)
|
||||
{
|
||||
struct list_head root_list, opt_list;
|
||||
|
@@ -1316,6 +1316,8 @@ bool msm_vidc_allow_s_ctrl(struct msm_vidc_inst *inst, u32 id)
|
||||
case V4L2_CID_MPEG_VIDC_PRIORITY:
|
||||
case V4L2_CID_MPEG_VIDC_LOWLATENCY_REQUEST:
|
||||
case V4L2_CID_MPEG_VIDC_INPUT_METADATA_FD:
|
||||
case V4L2_CID_MPEG_VIDC_FRAME_RATE:
|
||||
case V4L2_CID_MPEG_VIDC_OPERATING_RATE:
|
||||
allow = true;
|
||||
break;
|
||||
default:
|
||||
|
@@ -66,6 +66,9 @@
|
||||
#define V4L2_CID_MPEG_VIDC_LOWLATENCY_REQUEST (V4L2_CID_MPEG_VIDC_BASE + 0x3)
|
||||
/* FIXme: */
|
||||
#define V4L2_CID_MPEG_VIDC_CODEC_CONFIG (V4L2_CID_MPEG_VIDC_BASE + 0x4)
|
||||
#define V4L2_CID_MPEG_VIDC_FRAME_RATE (V4L2_CID_MPEG_VIDC_BASE + 0x5)
|
||||
#define V4L2_CID_MPEG_VIDC_OPERATING_RATE (V4L2_CID_MPEG_VIDC_BASE + 0x6)
|
||||
|
||||
/* Encoder Intra refresh period */
|
||||
#define V4L2_CID_MPEG_VIDC_INTRA_REFRESH_PERIOD (V4L2_CID_MPEG_VIDC_BASE + 0xB)
|
||||
#define V4L2_CID_MPEG_VIDC_TIME_DELTA_BASED_RC (V4L2_CID_MPEG_VIDC_BASE + 0xD)
|
||||
|
Viittaa uudesa ongelmassa
Block a user