msm: vidc: Fix for slice mode configuration

When layers are enabled, bitrates are set layerwise.
Need to add the cumulative layer bitrates and calculate
bytes per slice accordingly.

Change-Id: I17616a3b4f73d33c32badbbf8b9aacb60123f54a
Signed-off-by: Manikanta Kanamarlapudi <quic_kmanikan@quicinc.com>
Cette révision appartient à :
Manikanta Kanamarlapudi
2022-08-11 15:38:29 +05:30
révisé par Gerrit - the friendly Code Review server
Parent 203f09ac3f
révision 5a0859f15d
4 fichiers modifiés avec 66 ajouts et 52 suppressions

Voir le fichier

@@ -2138,7 +2138,7 @@ static struct msm_platform_inst_cap_dependency instance_cap_dependency_data_anor
{ENH_LAYER_COUNT, ENC, H264|HEVC,
{BITRATE_MODE, META_EVA_STATS},
{GOP_SIZE, B_FRAME, BIT_RATE, MIN_QUALITY},
{GOP_SIZE, B_FRAME, BIT_RATE, MIN_QUALITY, SLICE_MODE},
msm_vidc_adjust_layer_count,
msm_vidc_set_layer_count_and_type},
@@ -2245,7 +2245,7 @@ static struct msm_platform_inst_cap_dependency instance_cap_dependency_data_anor
msm_vidc_set_deblock_mode},
{SLICE_MODE, ENC, H264|HEVC,
{BITRATE_MODE, ALL_INTRA},
{BITRATE_MODE, ALL_INTRA, ENH_LAYER_COUNT},
{STAGE, DELIVERY_MODE},
msm_vidc_adjust_slice_count,
msm_vidc_set_slice_count},

Voir le fichier

@@ -2319,7 +2319,7 @@ static struct msm_platform_inst_cap_dependency instance_cap_dependency_data_kala
{ENH_LAYER_COUNT, ENC, H264|HEVC,
{BITRATE_MODE, META_EVA_STATS},
{GOP_SIZE, B_FRAME, BIT_RATE, MIN_QUALITY},
{GOP_SIZE, B_FRAME, BIT_RATE, MIN_QUALITY, SLICE_MODE},
msm_vidc_adjust_layer_count,
msm_vidc_set_layer_count_and_type},
@@ -2426,7 +2426,7 @@ static struct msm_platform_inst_cap_dependency instance_cap_dependency_data_kala
msm_vidc_set_deblock_mode},
{SLICE_MODE, ENC, H264|HEVC,
{BITRATE_MODE, ALL_INTRA},
{BITRATE_MODE, ALL_INTRA, ENH_LAYER_COUNT},
{STAGE, DELIVERY_MODE},
msm_vidc_adjust_slice_count,
msm_vidc_set_slice_count},

Voir le fichier

@@ -1907,7 +1907,7 @@ static struct msm_platform_inst_cap_dependency instance_cap_dependency_data_waip
{ENH_LAYER_COUNT, ENC, H264|HEVC,
{BITRATE_MODE, META_EVA_STATS},
{GOP_SIZE, B_FRAME, BIT_RATE, MIN_QUALITY},
{GOP_SIZE, B_FRAME, BIT_RATE, MIN_QUALITY, SLICE_MODE},
msm_vidc_adjust_layer_count,
msm_vidc_set_layer_count_and_type},
@@ -2002,7 +2002,7 @@ static struct msm_platform_inst_cap_dependency instance_cap_dependency_data_waip
msm_vidc_set_deblock_mode},
{SLICE_MODE, ENC, H264|HEVC,
{BITRATE_MODE, ALL_INTRA},
{BITRATE_MODE, ALL_INTRA, ENH_LAYER_COUNT},
{STAGE},
msm_vidc_adjust_slice_count,
msm_vidc_set_slice_count},

Voir le fichier

@@ -1644,13 +1644,54 @@ int msm_vidc_adjust_chroma_qp_index_offset(void *instance,
return 0;
}
static bool msm_vidc_check_all_layer_bitrate_set(struct msm_vidc_inst *inst)
{
bool layer_bitrate_set = true;
u32 cap_id = 0, i, enh_layer_count;
u32 layer_br_caps[6] = {L0_BR, L1_BR, L2_BR, L3_BR, L4_BR, L5_BR};
enh_layer_count = inst->capabilities->cap[ENH_LAYER_COUNT].value;
for (i = 0; i <= enh_layer_count; i++) {
if (i >= ARRAY_SIZE(layer_br_caps))
break;
cap_id = layer_br_caps[i];
if (!(inst->capabilities->cap[cap_id].flags & CAP_FLAG_CLIENT_SET)) {
layer_bitrate_set = false;
break;
}
}
return layer_bitrate_set;
}
static u32 msm_vidc_get_cumulative_bitrate(struct msm_vidc_inst *inst)
{
int i;
u32 cap_id = 0;
u32 cumulative_br = 0;
s32 enh_layer_count;
u32 layer_br_caps[6] = {L0_BR, L1_BR, L2_BR, L3_BR, L4_BR, L5_BR};
enh_layer_count = inst->capabilities->cap[ENH_LAYER_COUNT].value;
for (i = 0; i <= enh_layer_count; i++) {
if (i >= ARRAY_SIZE(layer_br_caps))
break;
cap_id = layer_br_caps[i];
cumulative_br += inst->capabilities->cap[cap_id].value;
}
return cumulative_br;
}
int msm_vidc_adjust_slice_count(void *instance, struct v4l2_ctrl *ctrl)
{
struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
struct msm_vidc_inst_capability *capability;
struct v4l2_format *output_fmt;
s32 adjusted_value, rc_type = -1, slice_mode, all_intra = 0;
u32 slice_val, mbpf = 0, mbps = 0, max_mbpf = 0, max_mbps = 0;
s32 adjusted_value, rc_type = -1, slice_mode, all_intra, enh_layer_count = 0;
u32 slice_val, mbpf = 0, mbps = 0, max_mbpf = 0, max_mbps = 0, bitrate = 0;
u32 update_cap, max_avg_slicesize, output_width, output_height;
u32 min_width, min_height, max_width, max_height, fps;
@@ -1669,9 +1710,24 @@ int msm_vidc_adjust_slice_count(void *instance, struct v4l2_ctrl *ctrl)
if (msm_vidc_get_parent_value(inst, SLICE_MODE,
BITRATE_MODE, &rc_type, __func__) ||
msm_vidc_get_parent_value(inst, SLICE_MODE,
ALL_INTRA, &all_intra, __func__))
ALL_INTRA, &all_intra, __func__) ||
msm_vidc_get_parent_value(inst, SLICE_MODE,
ENH_LAYER_COUNT, &enh_layer_count, __func__))
return -EINVAL;
if (capability->cap[BIT_RATE].flags & CAP_FLAG_CLIENT_SET) {
bitrate = capability->cap[BIT_RATE].value;
} else if (msm_vidc_check_all_layer_bitrate_set(inst)) {
bitrate = msm_vidc_get_cumulative_bitrate(inst);
} else {
adjusted_value = V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE;
update_cap = SLICE_MODE;
i_vpr_h(inst,
"%s: client did not set bitrate & layerwise bitrates\n",
__func__);
goto exit;
}
fps = capability->cap[FRAME_RATE].value >> 16;
if (fps > MAX_SLICES_FRAME_RATE ||
(rc_type != HFI_RC_OFF &&
@@ -1739,8 +1795,7 @@ int msm_vidc_adjust_slice_count(void *instance, struct v4l2_ctrl *ctrl)
slice_val = capability->cap[SLICE_MAX_BYTES].value;
update_cap = SLICE_MAX_BYTES;
if (rc_type != HFI_RC_OFF) {
max_avg_slicesize = ((capability->cap[BIT_RATE].value /
fps) / 8) /
max_avg_slicesize = ((bitrate / fps) / 8) /
MAX_SLICES_PER_FRAME;
slice_val = max(slice_val, max_avg_slicesize);
}
@@ -1961,47 +2016,6 @@ exit:
return 0;
}
static bool msm_vidc_check_all_layer_bitrate_set(struct msm_vidc_inst *inst)
{
bool layer_bitrate_set = true;
u32 cap_id = 0, i, enh_layer_count;
u32 layer_br_caps[6] = {L0_BR, L1_BR, L2_BR, L3_BR, L4_BR, L5_BR};
enh_layer_count = inst->capabilities->cap[ENH_LAYER_COUNT].value;
for (i = 0; i <= enh_layer_count; i++) {
if (i >= ARRAY_SIZE(layer_br_caps))
break;
cap_id = layer_br_caps[i];
if (!(inst->capabilities->cap[cap_id].flags & CAP_FLAG_CLIENT_SET)) {
layer_bitrate_set = false;
break;
}
}
return layer_bitrate_set;
}
static u32 msm_vidc_get_cumulative_bitrate(struct msm_vidc_inst *inst)
{
int i;
u32 cap_id = 0;
u32 cumulative_br = 0;
s32 enh_layer_count;
u32 layer_br_caps[6] = {L0_BR, L1_BR, L2_BR, L3_BR, L4_BR, L5_BR};
enh_layer_count = inst->capabilities->cap[ENH_LAYER_COUNT].value;
for (i = 0; i <= enh_layer_count; i++) {
if (i >= ARRAY_SIZE(layer_br_caps))
break;
cap_id = layer_br_caps[i];
cumulative_br += inst->capabilities->cap[cap_id].value;
}
return cumulative_br;
}
int msm_vidc_adjust_bitrate(void *instance, struct v4l2_ctrl *ctrl)
{
int i, rc = 0;