msm: vidc: Update encoder o/p buffer size calc
Update enc o/p buffer size calc inline with
FW calculations.
Bug: 173692354
Test: Camera Recording, Video xTS
Change-Id: Ie5aae40cb51909446430b7b8d5ff9405bbcd7f8b
Signed-off-by: Priyanka Gujjula <pgujjula@codeaurora.org>
diff --git a/msm/vidc/msm_vidc_buffer_calculations.c b/msm/vidc/msm_vidc_buffer_calculations.c
index 7432372..b8f141f 100644
--- a/msm/vidc/msm_vidc_buffer_calculations.c
+++ b/msm/vidc/msm_vidc_buffer_calculations.c
@@ -273,6 +273,7 @@
#define HFI_VENUS_HEIGHT_ALIGNMENT 32
#define SYSTEM_LAL_TILE10 192
+#define NUM_MBS_480P (((640 + 15) >> 4) * ((480 + 15) >> 4))
#define NUM_MBS_720P (((1280 + 15) >> 4) * ((720 + 15) >> 4))
#define NUM_MBS_4k (((4096 + 15) >> 4) * ((2304 + 15) >> 4))
#define MB_SIZE_IN_PIXEL (16 * 16)
@@ -1002,8 +1003,9 @@
f = &inst->fmts[OUTPUT_PORT].v4l2_fmt;
/*
* Encoder output size calculation: 32 Align width/height
- * For resolution < 720p : YUVsize * 4
- * For resolution > 720p & <= 4K : YUVsize / 2
+ * For CQ or heic session : YUVsize * 2
+ * For resolution <= 480p : YUVsize * 2
+ * For resolution > 480p & <= 4K : YUVsize / 2
* For resolution > 4k : YUVsize / 4
* Initially frame_size = YUVsize * 2;
*/
@@ -1016,24 +1018,29 @@
mbs_per_frame = NUM_MBS_PER_FRAME(width, height);
frame_size = (width * height * 3);
- if (mbs_per_frame < NUM_MBS_720P)
- frame_size = frame_size << 1;
+ if (inst->rc_type == V4L2_MPEG_VIDEO_BITRATE_MODE_CQ ||
+ is_grid_session(inst) || is_image_session(inst))
+ goto calc_done;
+
+ if (mbs_per_frame <= NUM_MBS_480P)
+ goto calc_done; /* Default frame_size = YUVsize * 2 */
else if (mbs_per_frame <= NUM_MBS_4k)
frame_size = frame_size >> 2;
else
frame_size = frame_size >> 3;
- if ((inst->rc_type == RATE_CONTROL_OFF) ||
- (inst->rc_type == V4L2_MPEG_VIDEO_BITRATE_MODE_CQ))
+ if (inst->rc_type == RATE_CONTROL_OFF)
frame_size = frame_size << 1;
if (inst->rc_type == RATE_CONTROL_LOSSLESS)
frame_size = (width * height * 9) >> 2;
/* multiply by 10/8 (1.25) to get size for 10 bit case */
- if (f->fmt.pix_mp.pixelformat == V4L2_PIX_FMT_HEVC)
+ if (inst->core->platform_data->vpu_ver != VPU_VERSION_AR50_LITE &&
+ f->fmt.pix_mp.pixelformat == V4L2_PIX_FMT_HEVC)
frame_size = frame_size + (frame_size >> 2);
+calc_done:
return ALIGN(frame_size, SZ_4K);
}