video: driver: limit vp9 max spec to 4K@60
Added change to limit VP9 decode max spec is upto 4K@60. Change-Id: I5939a8cf6cd227d2cced5adb3628b36493b7b1fc Signed-off-by: Govindaraj Rajagopal <grajagop@codeaurora.org>
This commit is contained in:
@@ -107,11 +107,13 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
|
||||
*/
|
||||
|
||||
{FRAME_WIDTH, DEC, CODECS_ALL, 96, 8192, 1, 1920},
|
||||
{FRAME_WIDTH, DEC, VP9, 96, 4096, 1, 1920},
|
||||
{FRAME_WIDTH, ENC, CODECS_ALL, 128, 8192, 1, 1920},
|
||||
{LOSSLESS_FRAME_WIDTH, ENC, H264|HEVC, 128, 4096, 1, 1920},
|
||||
{SECURE_FRAME_WIDTH, DEC, H264|HEVC|VP9, 96, 4096, 1, 1920},
|
||||
{SECURE_FRAME_WIDTH, ENC, H264|HEVC, 128, 4096, 1, 1920},
|
||||
{FRAME_HEIGHT, DEC, CODECS_ALL, 96, 8192, 1, 1080},
|
||||
{FRAME_HEIGHT, DEC, VP9, 96, 4096, 1, 1080},
|
||||
{FRAME_HEIGHT, ENC, CODECS_ALL, 128, 8192, 1, 1080},
|
||||
{LOSSLESS_FRAME_HEIGHT, ENC, H264|HEVC, 128, 4096, 1, 1080},
|
||||
{SECURE_FRAME_HEIGHT, DEC, H264|HEVC|VP9, 96, 4096, 1, 1080},
|
||||
@@ -175,6 +177,8 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
|
||||
{MBPF, ENC, CODECS_ALL, 64, 138240, 1, 138240},
|
||||
{MBPF, DEC, CODECS_ALL, 36, 138240, 1, 138240},
|
||||
/* (4096 * 2304) / 256 */
|
||||
{MBPF, DEC, VP9, 36, 36864, 1, 36864},
|
||||
/* (4096 * 2304) / 256 */
|
||||
{LOSSLESS_MBPF, ENC, H264|HEVC, 64, 36864, 1, 36864},
|
||||
/* Batch Mode Decode */
|
||||
/* TODO: update with new values based on updated voltage corner */
|
||||
@@ -186,6 +190,8 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
|
||||
{MBPS, ENC, CODECS_ALL, 64, 3916800, 1, 3916800},
|
||||
/* ((1920 * 1088) / 256) * 960 fps */
|
||||
{MBPS, DEC, CODECS_ALL, 64, 7833600, 1, 7833600},
|
||||
/* ((4096 * 2304) / 256) * 60 */
|
||||
{MBPS, DEC, VP9, 36, 2211840, 1, 2211840},
|
||||
/* ((4096 * 2304) / 256) * 60 fps */
|
||||
{POWER_SAVE_MBPS, ENC, CODECS_ALL, 0, 2211840, 1, 2211840},
|
||||
|
||||
@@ -202,8 +208,17 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
|
||||
(MINIMUM_FPS << 16), (MAXIMUM_FPS << 16),
|
||||
1, (DEFAULT_FPS << 16)},
|
||||
|
||||
{FRAME_RATE, DEC, VP9,
|
||||
(MINIMUM_FPS << 16), (MAXIMUM_VP9_FPS << 16),
|
||||
1, (DEFAULT_FPS << 16)},
|
||||
|
||||
{OPERATING_RATE, ENC|DEC, CODECS_ALL,
|
||||
1, INT_MAX, 1, (DEFAULT_FPS << 16)},
|
||||
(MINIMUM_FPS << 16), (MAXIMUM_FPS << 16),
|
||||
1, (DEFAULT_FPS << 16)},
|
||||
|
||||
{OPERATING_RATE, DEC, VP9,
|
||||
(MINIMUM_FPS << 16), (MAXIMUM_VP9_FPS << 16),
|
||||
1, (DEFAULT_FPS << 16)},
|
||||
|
||||
{SCALE_FACTOR, ENC, H264|HEVC, 1, 8, 1, 8},
|
||||
|
||||
|
@@ -32,6 +32,7 @@
|
||||
#define DEFAULT_FPS 30
|
||||
#define MINIMUM_FPS 1
|
||||
#define MAXIMUM_FPS 960
|
||||
#define MAXIMUM_VP9_FPS 60
|
||||
#define SINGLE_INPUT_BUFFER 1
|
||||
#define SINGLE_OUTPUT_BUFFER 1
|
||||
#define MAX_NUM_INPUT_BUFFERS VIDEO_MAX_FRAME // same as VB2_MAX_FRAME
|
||||
|
@@ -2296,14 +2296,13 @@ int msm_vdec_s_param(struct msm_vidc_inst *inst,
|
||||
is_frame_rate = true;
|
||||
} else {
|
||||
timeperframe = &s_parm->parm.capture.timeperframe;
|
||||
max_rate = capability->cap[OPERATING_RATE].max;
|
||||
max_rate = capability->cap[OPERATING_RATE].max >> 16;
|
||||
default_rate = capability->cap[OPERATING_RATE].value >> 16;
|
||||
}
|
||||
|
||||
if (!timeperframe->denominator || !timeperframe->numerator) {
|
||||
i_vpr_e(inst,
|
||||
"%s: invalid rate for type %u\n",
|
||||
__func__, s_parm->type);
|
||||
i_vpr_e(inst, "%s: type %s, invalid rate\n", __func__,
|
||||
v4l2_type_name(s_parm->type));
|
||||
input_rate = default_rate;
|
||||
goto set_default;
|
||||
}
|
||||
@@ -2312,8 +2311,7 @@ int msm_vdec_s_param(struct msm_vidc_inst *inst,
|
||||
do_div(us_per_frame, timeperframe->denominator);
|
||||
|
||||
if (!us_per_frame) {
|
||||
i_vpr_e(inst, "%s: us_per_frame is zero\n",
|
||||
__func__);
|
||||
i_vpr_e(inst, "%s: us_per_frame is zero\n", __func__);
|
||||
rc = -EINVAL;
|
||||
goto exit;
|
||||
}
|
||||
@@ -2322,29 +2320,29 @@ int msm_vdec_s_param(struct msm_vidc_inst *inst,
|
||||
do_div(input_rate, us_per_frame);
|
||||
|
||||
set_default:
|
||||
i_vpr_h(inst, "%s: type %s, %s value %d\n",
|
||||
__func__, v4l2_type_name(s_parm->type),
|
||||
is_frame_rate ? "frame rate" : "operating rate", input_rate);
|
||||
|
||||
q16_rate = (u32)input_rate << 16;
|
||||
i_vpr_h(inst, "%s: %s value %d\n",
|
||||
__func__, is_frame_rate ? "frame rate" : "operating rate", input_rate);
|
||||
|
||||
msm_vidc_update_cap_value(inst,
|
||||
is_frame_rate ? FRAME_RATE : OPERATING_RATE,
|
||||
msm_vidc_update_cap_value(inst, is_frame_rate ? FRAME_RATE : OPERATING_RATE,
|
||||
q16_rate, __func__);
|
||||
|
||||
if ((s_parm->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE &&
|
||||
inst->vb2q[INPUT_PORT].streaming) ||
|
||||
(s_parm->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE &&
|
||||
inst->vb2q[OUTPUT_PORT].streaming)) {
|
||||
if (msm_vidc_check_core_mbps(inst)) {
|
||||
i_vpr_e(inst,
|
||||
"%s: Unsupported load with rate %d, setting default rate %d\n",
|
||||
__func__, input_rate, default_rate);
|
||||
msm_vidc_update_cap_value(inst,
|
||||
is_frame_rate ? FRAME_RATE : OPERATING_RATE,
|
||||
default_rate << 16, __func__);
|
||||
return -ENOMEM;
|
||||
if (is_realtime_session(inst) &&
|
||||
((s_parm->type == INPUT_MPLANE && inst->vb2q[INPUT_PORT].streaming) ||
|
||||
(s_parm->type == OUTPUT_MPLANE && inst->vb2q[OUTPUT_PORT].streaming))) {
|
||||
rc = msm_vidc_check_core_mbps(inst);
|
||||
if (rc) {
|
||||
i_vpr_e(inst, "%s: unsupported load\n", __func__);
|
||||
goto reset_rate;
|
||||
}
|
||||
rc = input_rate > max_rate;
|
||||
if (rc) {
|
||||
i_vpr_e(inst, "%s: unsupported rate %u, max %u\n", __func__,
|
||||
input_rate, max_rate);
|
||||
rc = -ENOMEM;
|
||||
goto reset_rate;
|
||||
}
|
||||
}
|
||||
|
||||
inst->priority_level = MSM_VIDC_PRIORITY_HIGH;
|
||||
|
||||
if (is_frame_rate)
|
||||
@@ -2352,6 +2350,15 @@ set_default:
|
||||
else
|
||||
capability->cap[OPERATING_RATE].flags |= CAP_FLAG_CLIENT_SET;
|
||||
|
||||
return 0;
|
||||
|
||||
reset_rate:
|
||||
if (rc) {
|
||||
i_vpr_e(inst, "%s: setting rate %u failed, reset to %u\n", __func__,
|
||||
input_rate, default_rate);
|
||||
msm_vidc_update_cap_value(inst, is_frame_rate ? FRAME_RATE : OPERATING_RATE,
|
||||
default_rate << 16, __func__);
|
||||
}
|
||||
exit:
|
||||
return rc;
|
||||
}
|
||||
|
@@ -1527,7 +1527,7 @@ int msm_venc_s_param(struct msm_vidc_inst *inst,
|
||||
|
||||
if (s_parm->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
|
||||
timeperframe = &s_parm->parm.output.timeperframe;
|
||||
max_rate = capability->cap[OPERATING_RATE].max;
|
||||
max_rate = capability->cap[OPERATING_RATE].max >> 16;
|
||||
default_rate = capability->cap[OPERATING_RATE].value >> 16;
|
||||
} else {
|
||||
timeperframe = &s_parm->parm.capture.timeperframe;
|
||||
@@ -1537,9 +1537,8 @@ int msm_venc_s_param(struct msm_vidc_inst *inst,
|
||||
}
|
||||
|
||||
if (!timeperframe->denominator || !timeperframe->numerator) {
|
||||
i_vpr_e(inst,
|
||||
"%s: invalid rate for type %u\n",
|
||||
__func__, s_parm->type);
|
||||
i_vpr_e(inst, "%s: type %s, invalid rate\n", __func__,
|
||||
v4l2_type_name(s_parm->type));
|
||||
input_rate = default_rate;
|
||||
goto set_default;
|
||||
}
|
||||
@@ -1548,8 +1547,7 @@ int msm_venc_s_param(struct msm_vidc_inst *inst,
|
||||
do_div(us_per_frame, timeperframe->denominator);
|
||||
|
||||
if (!us_per_frame) {
|
||||
i_vpr_e(inst, "%s: us_per_frame is zero\n",
|
||||
__func__);
|
||||
i_vpr_e(inst, "%s: us_per_frame is zero\n", __func__);
|
||||
rc = -EINVAL;
|
||||
goto exit;
|
||||
}
|
||||
@@ -1557,39 +1555,30 @@ int msm_venc_s_param(struct msm_vidc_inst *inst,
|
||||
input_rate = (u64)USEC_PER_SEC;
|
||||
do_div(input_rate, us_per_frame);
|
||||
|
||||
/* Check max allowed rate */
|
||||
if (input_rate > max_rate) {
|
||||
i_vpr_e(inst,
|
||||
"%s: Unsupported rate %llu, max_fps %u, type: %u\n",
|
||||
__func__, input_rate, max_rate, s_parm->type);
|
||||
rc = -ENOTSUPP;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
set_default:
|
||||
i_vpr_h(inst, "%s: type %s, %s value %d\n",
|
||||
__func__, v4l2_type_name(s_parm->type),
|
||||
is_frame_rate ? "frame rate" : "operating rate", input_rate);
|
||||
|
||||
q16_rate = (u32)input_rate << 16;
|
||||
i_vpr_h(inst, "%s: type %s, value %#x\n",
|
||||
__func__, v4l2_type_name(s_parm->type), q16_rate);
|
||||
|
||||
msm_vidc_update_cap_value(inst,
|
||||
is_frame_rate ? FRAME_RATE : OPERATING_RATE,
|
||||
msm_vidc_update_cap_value(inst, is_frame_rate ? FRAME_RATE : OPERATING_RATE,
|
||||
q16_rate, __func__);
|
||||
|
||||
if ((s_parm->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE &&
|
||||
inst->vb2q[INPUT_PORT].streaming) ||
|
||||
(s_parm->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE &&
|
||||
inst->vb2q[OUTPUT_PORT].streaming)) {
|
||||
if (msm_vidc_check_core_mbps(inst)) {
|
||||
i_vpr_e(inst,
|
||||
"%s: Unsupported load with rate %d, setting default rate %d\n",
|
||||
__func__, input_rate, default_rate);
|
||||
msm_vidc_update_cap_value(inst,
|
||||
is_frame_rate ? FRAME_RATE : OPERATING_RATE,
|
||||
default_rate << 16, __func__);
|
||||
return -ENOMEM;
|
||||
if (is_realtime_session(inst) &&
|
||||
((s_parm->type == INPUT_MPLANE && inst->vb2q[INPUT_PORT].streaming) ||
|
||||
(s_parm->type == OUTPUT_MPLANE && inst->vb2q[OUTPUT_PORT].streaming))) {
|
||||
rc = msm_vidc_check_core_mbps(inst);
|
||||
if (rc) {
|
||||
i_vpr_e(inst, "%s: unsupported load\n", __func__);
|
||||
goto reset_rate;
|
||||
}
|
||||
rc = input_rate > max_rate;
|
||||
if (rc) {
|
||||
i_vpr_e(inst, "%s: unsupported rate %u, max %u\n", __func__,
|
||||
input_rate, max_rate);
|
||||
rc = -ENOMEM;
|
||||
goto reset_rate;
|
||||
}
|
||||
}
|
||||
|
||||
inst->priority_level = MSM_VIDC_PRIORITY_HIGH;
|
||||
|
||||
if (is_frame_rate)
|
||||
@@ -1612,12 +1601,20 @@ set_default:
|
||||
sizeof(u32));
|
||||
if (rc) {
|
||||
i_vpr_e(inst,
|
||||
"%s: failed to set frame rate to fw\n",
|
||||
__func__);
|
||||
"%s: failed to set frame rate to fw\n", __func__);
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
reset_rate:
|
||||
if (rc) {
|
||||
i_vpr_e(inst, "%s: setting rate %u failed, reset to %u\n", __func__,
|
||||
input_rate, default_rate);
|
||||
msm_vidc_update_cap_value(inst, is_frame_rate ? FRAME_RATE : OPERATING_RATE,
|
||||
default_rate << 16, __func__);
|
||||
}
|
||||
exit:
|
||||
return rc;
|
||||
}
|
||||
|
@@ -1924,8 +1924,24 @@ int msm_vidc_adjust_session_priority(void *instance, struct v4l2_ctrl *ctrl)
|
||||
if (adjusted_value == 0 && rate_by_client) {
|
||||
rc = msm_vidc_check_core_mbps(inst);
|
||||
if (rc) {
|
||||
d_vpr_e("%s: priority 0 not feasible due to resource\n", __func__);
|
||||
return rc;
|
||||
i_vpr_e(inst, "%s: unsupported load\n", __func__);
|
||||
goto exit;
|
||||
}
|
||||
rc = capability->cap[FRAME_RATE].value > capability->cap[FRAME_RATE].max;
|
||||
if (rc) {
|
||||
i_vpr_e(inst, "%s: unsupported FRAME_RATE %u, max %u\n", __func__,
|
||||
capability->cap[FRAME_RATE].value >> 16,
|
||||
capability->cap[FRAME_RATE].max >> 16);
|
||||
rc = -ENOMEM;
|
||||
goto exit;
|
||||
}
|
||||
rc = capability->cap[OPERATING_RATE].value > capability->cap[OPERATING_RATE].max;
|
||||
if (rc) {
|
||||
i_vpr_e(inst, "%s: unsupported OPERATING_RATE %u, max %u\n", __func__,
|
||||
capability->cap[OPERATING_RATE].value >> 16,
|
||||
capability->cap[OPERATING_RATE].max >> 16);
|
||||
rc = -ENOMEM;
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1934,6 +1950,7 @@ int msm_vidc_adjust_session_priority(void *instance, struct v4l2_ctrl *ctrl)
|
||||
|
||||
msm_vidc_update_cap_value(inst, PRIORITY, adjusted_value, __func__);
|
||||
|
||||
exit:
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user