@@ -719,10 +719,18 @@ static int mtk_jpeg_buf_prepare(struct vb2_buffer *vb)
plane_fmt = q_data->pix_mp.plane_fmt[i];
if (ctx->enable_exif &&
q_data->fmt->fourcc == V4L2_PIX_FMT_JPEG)
- vb2_set_plane_payload(vb, i, plane_fmt.sizeimage +
- MTK_JPEG_MAX_EXIF_SIZE);
+ if (vb->planes[i].length > (plane_fmt.sizeimage +
+ MTK_JPEG_MAX_EXIF_SIZE))
+ vb2_set_plane_payload(vb, i, plane_fmt.sizeimage +
+ MTK_JPEG_MAX_EXIF_SIZE);
+ else
+ vb2_set_plane_payload(vb, i, vb->planes[i].length);
+
else
- vb2_set_plane_payload(vb, i, plane_fmt.sizeimage);
+ if (vb->planes[i].length > plane_fmt.sizeimage)
+ vb2_set_plane_payload(vb, i, plane_fmt.sizeimage);
+ else
+ vb2_set_plane_payload(vb, i, vb->planes[i].length);
}
return 0;
1. for multi-core jpegdec: core0: |<-------- decoding buffer0 and resolution changed to smaller core1: |<-------- decoding buffer1 core0: |<- handling resolution changing core0: |<- vb2_set_plane_payload 2. the payload size is changed on the step of set format. Because core1 is running and streaming has not been stopped, the format cannot be set again, resulting in no change in the payload size. 3. at this time, the payload size is bigger than buffer length, it will print a warnning call trace 4. set payload size must less than buffer length Signed-off-by: kyrie.wu <kyrie.wu@mediatek.com> --- .../media/platform/mediatek/jpeg/mtk_jpeg_core.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-)