video: driver: handle dynamic qp setting
- make B and P frame QP controls as dynamic. - enable I/P/B QP to fw as and when these controls are set to the driver. - remove HEIC qp support. Change-Id: I7f45ab0bda75df8128bbbdfcebe66c2cae208b06 Signed-off-by: Darshana Patil <darshana@codeaurora.org>
This commit is contained in:
@@ -138,8 +138,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, P_FRAME_QP,
|
||||||
BLUR_TYPES, MIN_QUALITY}},
|
B_FRAME_QP, META_ROI_INFO, BLUR_TYPES, MIN_QUALITY}},
|
||||||
|
|
||||||
{PIX_FMTS, DEC, HEVC|HEIC,
|
{PIX_FMTS, DEC, HEVC|HEIC,
|
||||||
MSM_VIDC_FMT_NV12,
|
MSM_VIDC_FMT_NV12,
|
||||||
@@ -363,10 +363,10 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
|
|||||||
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
|
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
|
||||||
{0},
|
{0},
|
||||||
{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,
|
P_FRAME_QP, B_FRAME_QP, ENH_LAYER_COUNT, BIT_RATE,
|
||||||
BITRATE_BOOST, MIN_QUALITY, VBV_DELAY, PEAK_BITRATE,
|
CONTENT_ADAPTIVE_CODING, BITRATE_BOOST, MIN_QUALITY,
|
||||||
SLICE_MODE, META_ROI_INFO, BLUR_TYPES,
|
VBV_DELAY, PEAK_BITRATE,SLICE_MODE, META_ROI_INFO,
|
||||||
LOWLATENCY_MODE},
|
BLUR_TYPES, LOWLATENCY_MODE},
|
||||||
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,
|
||||||
@@ -381,7 +381,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
|
|||||||
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
|
CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
|
||||||
{0},
|
{0},
|
||||||
{LTR_COUNT, IR_RANDOM, TIME_DELTA_BASED_RC, I_FRAME_QP,
|
{LTR_COUNT, IR_RANDOM, TIME_DELTA_BASED_RC, I_FRAME_QP,
|
||||||
CONSTANT_QUALITY, ENH_LAYER_COUNT,
|
P_FRAME_QP, B_FRAME_QP, 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, BLUR_TYPES,
|
PEAK_BITRATE, SLICE_MODE, META_ROI_INFO, BLUR_TYPES,
|
||||||
@@ -711,14 +711,14 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
|
|||||||
MIN_QP_10BIT, MAX_QP, 1, MAX_QP,
|
MIN_QP_10BIT, MAX_QP, 1, MAX_QP,
|
||||||
V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_MAX_QP},
|
V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_MAX_QP},
|
||||||
|
|
||||||
{I_FRAME_QP, ENC, HEVC|HEIC,
|
{I_FRAME_QP, ENC, HEVC,
|
||||||
MIN_QP_10BIT, MAX_QP, 1, DEFAULT_QP,
|
MIN_QP_10BIT, MAX_QP, 1, DEFAULT_QP,
|
||||||
V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP,
|
V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP,
|
||||||
HFI_PROP_QP_PACKED,
|
HFI_PROP_QP_PACKED,
|
||||||
CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
|
CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
|
||||||
CAP_FLAG_DYNAMIC_ALLOWED,
|
CAP_FLAG_DYNAMIC_ALLOWED,
|
||||||
{PIX_FMTS, BITRATE_MODE}, {0},
|
{PIX_FMTS, BITRATE_MODE}, {0},
|
||||||
msm_vidc_adjust_hevc_frame_qp, msm_vidc_set_frame_qp},
|
msm_vidc_adjust_hevc_i_frame_qp, msm_vidc_set_frame_qp},
|
||||||
|
|
||||||
{I_FRAME_QP, ENC, H264,
|
{I_FRAME_QP, ENC, H264,
|
||||||
MIN_QP_8BIT, MAX_QP, 1, DEFAULT_QP,
|
MIN_QP_8BIT, MAX_QP, 1, DEFAULT_QP,
|
||||||
@@ -729,21 +729,41 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
|
|||||||
{BITRATE_MODE}, {0},
|
{BITRATE_MODE}, {0},
|
||||||
NULL, msm_vidc_set_frame_qp},
|
NULL, msm_vidc_set_frame_qp},
|
||||||
|
|
||||||
{P_FRAME_QP, ENC, HEVC|HEIC,
|
{P_FRAME_QP, ENC, HEVC,
|
||||||
MIN_QP_10BIT, MAX_QP, 1, DEFAULT_QP,
|
MIN_QP_10BIT, MAX_QP, 1, DEFAULT_QP,
|
||||||
V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_QP},
|
V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_QP,
|
||||||
|
HFI_PROP_QP_PACKED,
|
||||||
|
CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
|
||||||
|
CAP_FLAG_DYNAMIC_ALLOWED,
|
||||||
|
{PIX_FMTS, BITRATE_MODE}, {0},
|
||||||
|
msm_vidc_adjust_hevc_p_frame_qp, msm_vidc_set_frame_qp},
|
||||||
|
|
||||||
{P_FRAME_QP, ENC, H264,
|
{P_FRAME_QP, ENC, H264,
|
||||||
MIN_QP_8BIT, MAX_QP, 1, DEFAULT_QP,
|
MIN_QP_8BIT, MAX_QP, 1, DEFAULT_QP,
|
||||||
V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP},
|
V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP,
|
||||||
|
HFI_PROP_QP_PACKED,
|
||||||
|
CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
|
||||||
|
CAP_FLAG_DYNAMIC_ALLOWED,
|
||||||
|
{BITRATE_MODE}, {0},
|
||||||
|
NULL, msm_vidc_set_frame_qp},
|
||||||
|
|
||||||
{B_FRAME_QP, ENC, HEVC|HEIC,
|
{B_FRAME_QP, ENC, HEVC,
|
||||||
MIN_QP_10BIT, MAX_QP, 1, DEFAULT_QP,
|
MIN_QP_10BIT, MAX_QP, 1, DEFAULT_QP,
|
||||||
V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP},
|
V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP,
|
||||||
|
HFI_PROP_QP_PACKED,
|
||||||
|
CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
|
||||||
|
CAP_FLAG_DYNAMIC_ALLOWED,
|
||||||
|
{PIX_FMTS, BITRATE_MODE}, {0},
|
||||||
|
msm_vidc_adjust_hevc_b_frame_qp, msm_vidc_set_frame_qp},
|
||||||
|
|
||||||
{B_FRAME_QP, ENC, H264,
|
{B_FRAME_QP, ENC, H264,
|
||||||
MIN_QP_8BIT, MAX_QP, 1, DEFAULT_QP,
|
MIN_QP_8BIT, MAX_QP, 1, DEFAULT_QP,
|
||||||
V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP},
|
V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP,
|
||||||
|
HFI_PROP_QP_PACKED,
|
||||||
|
CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
|
||||||
|
CAP_FLAG_DYNAMIC_ALLOWED,
|
||||||
|
{BITRATE_MODE}, {0},
|
||||||
|
NULL, msm_vidc_set_frame_qp},
|
||||||
|
|
||||||
{LAYER_TYPE, ENC, HEVC,
|
{LAYER_TYPE, ENC, HEVC,
|
||||||
V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_B,
|
V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_B,
|
||||||
|
@@ -31,7 +31,9 @@ int msm_vidc_adjust_b_frame(void *instance, struct v4l2_ctrl *ctrl);
|
|||||||
int msm_vidc_adjust_peak_bitrate(void *instance, struct v4l2_ctrl *ctrl);
|
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_i_frame_qp(void *instance, struct v4l2_ctrl *ctrl);
|
||||||
|
int msm_vidc_adjust_hevc_p_frame_qp(void *instance, struct v4l2_ctrl *ctrl);
|
||||||
|
int msm_vidc_adjust_hevc_b_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_type(void *instance, struct v4l2_ctrl *ctrl);
|
||||||
int msm_vidc_adjust_blur_resolution(void *instance, struct v4l2_ctrl *ctrl);
|
int msm_vidc_adjust_blur_resolution(void *instance, struct v4l2_ctrl *ctrl);
|
||||||
int msm_vidc_adjust_cac(void *instance, struct v4l2_ctrl *ctrl);
|
int msm_vidc_adjust_cac(void *instance, struct v4l2_ctrl *ctrl);
|
||||||
|
@@ -40,8 +40,8 @@
|
|||||||
#define MAX_SUPPORTED_INSTANCES 16
|
#define MAX_SUPPORTED_INSTANCES 16
|
||||||
#define MAX_BSE_VPP_DELAY 6
|
#define MAX_BSE_VPP_DELAY 6
|
||||||
#define DEFAULT_BSE_VPP_DELAY 2
|
#define DEFAULT_BSE_VPP_DELAY 2
|
||||||
#define MAX_CAP_PARENTS 16
|
#define MAX_CAP_PARENTS 20
|
||||||
#define MAX_CAP_CHILDREN 16
|
#define MAX_CAP_CHILDREN 20
|
||||||
#define DEFAULT_BITSTREM_ALIGNMENT 16
|
#define DEFAULT_BITSTREM_ALIGNMENT 16
|
||||||
#define H265_BITSTREM_ALIGNMENT 32
|
#define H265_BITSTREM_ALIGNMENT 32
|
||||||
#define DEFAULT_MAX_HOST_BUF_COUNT 64
|
#define DEFAULT_MAX_HOST_BUF_COUNT 64
|
||||||
|
@@ -363,9 +363,6 @@ static int msm_vidc_adjust_hevc_qp(struct msm_vidc_inst *inst,
|
|||||||
CAP_TO_8BIT_QP(capability->cap[I_FRAME_MAX_QP].value);
|
CAP_TO_8BIT_QP(capability->cap[I_FRAME_MAX_QP].value);
|
||||||
CAP_TO_8BIT_QP(capability->cap[P_FRAME_MAX_QP].value);
|
CAP_TO_8BIT_QP(capability->cap[P_FRAME_MAX_QP].value);
|
||||||
CAP_TO_8BIT_QP(capability->cap[B_FRAME_MAX_QP].value);
|
CAP_TO_8BIT_QP(capability->cap[B_FRAME_MAX_QP].value);
|
||||||
} else if (cap_id == I_FRAME_QP) {
|
|
||||||
CAP_TO_8BIT_QP(capability->cap[P_FRAME_QP].value);
|
|
||||||
CAP_TO_8BIT_QP(capability->cap[B_FRAME_QP].value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
@@ -1751,7 +1748,7 @@ int msm_vidc_adjust_hevc_max_qp(void *instance, struct v4l2_ctrl *ctrl)
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
int msm_vidc_adjust_hevc_frame_qp(void *instance, struct v4l2_ctrl *ctrl)
|
int msm_vidc_adjust_hevc_i_frame_qp(void *instance, struct v4l2_ctrl *ctrl)
|
||||||
{
|
{
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
struct msm_vidc_inst_capability *capability;
|
struct msm_vidc_inst_capability *capability;
|
||||||
@@ -1768,6 +1765,54 @@ int msm_vidc_adjust_hevc_frame_qp(void *instance, struct v4l2_ctrl *ctrl)
|
|||||||
ctrl->val, __func__);
|
ctrl->val, __func__);
|
||||||
|
|
||||||
rc = msm_vidc_adjust_hevc_qp(inst, I_FRAME_QP);
|
rc = msm_vidc_adjust_hevc_qp(inst, I_FRAME_QP);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
int msm_vidc_adjust_hevc_p_frame_qp(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;
|
||||||
|
|
||||||
|
if (!inst || !inst->capabilities) {
|
||||||
|
d_vpr_e("%s: invalid params\n", __func__);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
capability = inst->capabilities;
|
||||||
|
|
||||||
|
if (ctrl)
|
||||||
|
msm_vidc_update_cap_value(inst, P_FRAME_QP,
|
||||||
|
ctrl->val, __func__);
|
||||||
|
|
||||||
|
rc = msm_vidc_adjust_hevc_qp(inst, P_FRAME_QP);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
int msm_vidc_adjust_hevc_b_frame_qp(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;
|
||||||
|
|
||||||
|
if (!inst || !inst->capabilities) {
|
||||||
|
d_vpr_e("%s: invalid params\n", __func__);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
capability = inst->capabilities;
|
||||||
|
|
||||||
|
if (ctrl)
|
||||||
|
msm_vidc_update_cap_value(inst, B_FRAME_QP,
|
||||||
|
ctrl->val, __func__);
|
||||||
|
|
||||||
|
rc = msm_vidc_adjust_hevc_qp(inst, B_FRAME_QP);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@@ -2578,10 +2623,19 @@ int msm_vidc_set_frame_qp(void *instance,
|
|||||||
}
|
}
|
||||||
capab = inst->capabilities;
|
capab = inst->capabilities;
|
||||||
|
|
||||||
if (msm_vidc_get_parent_value(inst, I_FRAME_QP,
|
if (msm_vidc_get_parent_value(inst, cap_id,
|
||||||
BITRATE_MODE, &rc_type, __func__))
|
BITRATE_MODE, &rc_type, __func__))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (inst->vb2q[OUTPUT_PORT].streaming) {
|
||||||
|
if (rc_type != HFI_RC_OFF) {
|
||||||
|
i_vpr_h(inst,
|
||||||
|
"%s: dynamic qp not allowed for rc type %d\n",
|
||||||
|
__func__, rc_type);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (rc_type == HFI_RC_OFF) {
|
if (rc_type == HFI_RC_OFF) {
|
||||||
/* Mandatorily set for rc off case */
|
/* Mandatorily set for rc off case */
|
||||||
i_qp_enable = p_qp_enable = b_qp_enable = 1;
|
i_qp_enable = p_qp_enable = b_qp_enable = 1;
|
||||||
|
@@ -1222,6 +1222,11 @@ bool msm_vidc_allow_s_ctrl(struct msm_vidc_inst *inst, u32 id)
|
|||||||
case V4L2_CID_HFLIP:
|
case V4L2_CID_HFLIP:
|
||||||
case V4L2_CID_VFLIP:
|
case V4L2_CID_VFLIP:
|
||||||
case V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP:
|
case V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP:
|
||||||
|
case V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_QP:
|
||||||
|
case V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP:
|
||||||
|
case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP:
|
||||||
|
case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP:
|
||||||
|
case V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP:
|
||||||
case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_LAYER:
|
case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_LAYER:
|
||||||
case V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER:
|
case V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER:
|
||||||
case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L0_BR:
|
case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L0_BR:
|
||||||
@@ -1255,7 +1260,7 @@ bool msm_vidc_allow_s_ctrl(struct msm_vidc_inst *inst, u32 id)
|
|||||||
|
|
||||||
exit:
|
exit:
|
||||||
if (!allow)
|
if (!allow)
|
||||||
i_vpr_e(inst, "%s: id %d not allowed in state %s\n",
|
i_vpr_e(inst, "%s: id %#x not allowed in state %s\n",
|
||||||
__func__, id, state_name(inst->state));
|
__func__, id, state_name(inst->state));
|
||||||
return allow;
|
return allow;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user