From 197328a67e67e0aefe35a00f0c078c58975c0490 Mon Sep 17 00:00:00 2001 From: Deepa Guthyappa Madivalara Date: Fri, 10 Jun 2022 14:54:56 -0700 Subject: [PATCH] video: driver: update bitstream buffer size calculation calculate bitstream buffer size using firware macro Change-Id: I1a06007ae8cd2852d70a426ba57119563813ebc5 Signed-off-by: Deepa Guthyappa Madivalara --- .../variant/iris3/src/msm_vidc_buffer_iris3.c | 35 ++++++++++++++++++- driver/vidc/inc/msm_vidc_buffer.h | 2 ++ driver/vidc/src/msm_vidc_buffer.c | 2 +- driver/vidc/src/msm_vidc_driver.c | 2 +- 4 files changed, 38 insertions(+), 3 deletions(-) diff --git a/driver/variant/iris3/src/msm_vidc_buffer_iris3.c b/driver/variant/iris3/src/msm_vidc_buffer_iris3.c index f84e6f662b..5acf971322 100644 --- a/driver/variant/iris3/src/msm_vidc_buffer_iris3.c +++ b/driver/variant/iris3/src/msm_vidc_buffer_iris3.c @@ -546,6 +546,39 @@ static u32 msm_vidc_encoder_vpss_size_iris3(struct msm_vidc_inst* inst) return size; } +static u32 msm_vidc_encoder_output_size_iris3(struct msm_vidc_inst *inst) +{ + u32 frame_size; + struct v4l2_format *f; + bool is_ten_bit = false; + int bitrate_mode, frame_rc; + u32 hfi_rc_type = HFI_RC_VBR_CFR; + + if (!inst || !inst->capabilities) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + + f = &inst->fmts[OUTPUT_PORT]; + if (f->fmt.pix_mp.pixelformat == V4L2_PIX_FMT_HEVC || + f->fmt.pix_mp.pixelformat == V4L2_PIX_FMT_HEIC) + is_ten_bit = true; + + bitrate_mode = inst->capabilities->cap[BITRATE_MODE].value; + frame_rc = inst->capabilities->cap[FRAME_RC_ENABLE].value; + if (!frame_rc && !is_image_session(inst)) + hfi_rc_type = HFI_RC_OFF; + else if (bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_CQ) + hfi_rc_type = HFI_RC_CQ; + + HFI_BUFFER_BITSTREAM_ENC(frame_size, f->fmt.pix_mp.width, + f->fmt.pix_mp.height, hfi_rc_type, is_ten_bit); + + frame_size = msm_vidc_enc_delivery_mode_based_output_buf_size(inst, frame_size); + + return frame_size; +} + struct msm_vidc_buf_type_handle { enum msm_vidc_buffer_type type; u32 (*handle)(struct msm_vidc_inst *inst); @@ -572,7 +605,7 @@ int msm_buffer_size_iris3(struct msm_vidc_inst *inst, }; static const struct msm_vidc_buf_type_handle enc_buf_type_handle[] = { {MSM_VIDC_BUF_INPUT, msm_vidc_encoder_input_size }, - {MSM_VIDC_BUF_OUTPUT, msm_vidc_encoder_output_size }, + {MSM_VIDC_BUF_OUTPUT, msm_vidc_encoder_output_size_iris3 }, {MSM_VIDC_BUF_INPUT_META, msm_vidc_encoder_input_meta_size }, {MSM_VIDC_BUF_OUTPUT_META, msm_vidc_encoder_output_meta_size }, {MSM_VIDC_BUF_BIN, msm_vidc_encoder_bin_size_iris3 }, diff --git a/driver/vidc/inc/msm_vidc_buffer.h b/driver/vidc/inc/msm_vidc_buffer.h index 16220936a5..b91fb8e169 100644 --- a/driver/vidc/inc/msm_vidc_buffer.h +++ b/driver/vidc/inc/msm_vidc_buffer.h @@ -31,5 +31,7 @@ u32 msm_vidc_encoder_input_size(struct msm_vidc_inst *inst); u32 msm_vidc_encoder_output_size(struct msm_vidc_inst *inst); u32 msm_vidc_encoder_input_meta_size(struct msm_vidc_inst *inst); u32 msm_vidc_encoder_output_meta_size(struct msm_vidc_inst *inst); +u32 msm_vidc_enc_delivery_mode_based_output_buf_size(struct msm_vidc_inst *inst, + u32 frame_size); #endif // __H_MSM_VIDC_BUFFER_H__ diff --git a/driver/vidc/src/msm_vidc_buffer.c b/driver/vidc/src/msm_vidc_buffer.c index 12ff854f7b..694217cfe7 100644 --- a/driver/vidc/src/msm_vidc_buffer.c +++ b/driver/vidc/src/msm_vidc_buffer.c @@ -313,7 +313,7 @@ u32 msm_vidc_encoder_input_size(struct msm_vidc_inst *inst) return size; } -static u32 msm_vidc_enc_delivery_mode_based_output_buf_size(struct msm_vidc_inst *inst, +u32 msm_vidc_enc_delivery_mode_based_output_buf_size(struct msm_vidc_inst *inst, u32 frame_size) { u32 slice_size; diff --git a/driver/vidc/src/msm_vidc_driver.c b/driver/vidc/src/msm_vidc_driver.c index eeec76162c..e2e8314acb 100644 --- a/driver/vidc/src/msm_vidc_driver.c +++ b/driver/vidc/src/msm_vidc_driver.c @@ -6233,7 +6233,7 @@ static bool msm_vidc_allow_image_encode_session(struct msm_vidc_inst *inst) } /* is bitrate mode CQ */ - allow = capability->cap[BITRATE_MODE].value == HFI_RC_CQ; + allow = capability->cap[BITRATE_MODE].value == V4L2_MPEG_VIDEO_BITRATE_MODE_CQ; if (!allow) { i_vpr_e(inst, "%s: bitrate mode is not CQ: %#x\n", __func__, capability->cap[BITRATE_MODE].value);