Message ID | 1395780682.11851.18.camel@nicolas-tpx230 (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Le mardi 25 mars 2014 à 16:51 -0400, Nicolas Dufresne a écrit : > For tiled format, we need to allocated a multiple of the row size. A > good example is for 1280x720, wich get adjusted to 1280x736. In tiles, > this mean Y plane is 20x23 and UV plane 20x12. Because of the rounding, > the previous code would only have enough space to fit half of the last > row. > > Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> > --- > drivers/media/platform/exynos4-is/fimc-core.c | 13 +++++++++++-- > 1 file changed, 11 insertions(+), 2 deletions(-) > > diff --git a/drivers/media/platform/exynos4-is/fimc-core.c b/drivers/media/platform/exynos4-is/fimc-core.c > index 2e70fab..0e94412 100644 > --- a/drivers/media/platform/exynos4-is/fimc-core.c > +++ b/drivers/media/platform/exynos4-is/fimc-core.c > @@ -736,6 +736,7 @@ void fimc_adjust_mplane_format(struct fimc_fmt *fmt, u32 width, u32 height, > for (i = 0; i < pix->num_planes; ++i) { > struct v4l2_plane_pix_format *plane_fmt = &pix->plane_fmt[i]; > u32 bpl = plane_fmt->bytesperline; > + u32 sizeimage; > > if (fmt->colplanes > 1 && (bpl == 0 || bpl < pix->width)) > bpl = pix->width; /* Planar */ > @@ -755,8 +756,16 @@ void fimc_adjust_mplane_format(struct fimc_fmt *fmt, u32 width, u32 height, > bytesperline /= 2; > > plane_fmt->bytesperline = bytesperline; > - plane_fmt->sizeimage = max((pix->width * pix->height * > - fmt->depth[i]) / 8, plane_fmt->sizeimage); > + sizeimage = pix->width * pix->height * fmt->depth[i] / 8; > + > + /* Ensure full last row for tiled formats */ > + if (tiled_fmt(fmt)) { > + /* 64 * 32 * plane_fmt->bytesperline / 64 */ > + u32 row_size = plane_fmt->bytesperline * 32; > + sizeimage = ALIGN(sizeimage, row_size); I made a mistake here, and it seems I've badly tested it too (was setting the size from the test application). ALIGN won't work as row_size is not a power of two. Sorry for that, will send an update. roundup(sizeimage, row_size) would be the way to go. Will resubmit. > + } > + > + plane_fmt->sizeimage = max(sizeimage, plane_fmt->sizeimage); > } > } >
diff --git a/drivers/media/platform/exynos4-is/fimc-core.c b/drivers/media/platform/exynos4-is/fimc-core.c index 2e70fab..0e94412 100644 --- a/drivers/media/platform/exynos4-is/fimc-core.c +++ b/drivers/media/platform/exynos4-is/fimc-core.c @@ -736,6 +736,7 @@ void fimc_adjust_mplane_format(struct fimc_fmt *fmt, u32 width, u32 height, for (i = 0; i < pix->num_planes; ++i) { struct v4l2_plane_pix_format *plane_fmt = &pix->plane_fmt[i]; u32 bpl = plane_fmt->bytesperline; + u32 sizeimage; if (fmt->colplanes > 1 && (bpl == 0 || bpl < pix->width)) bpl = pix->width; /* Planar */ @@ -755,8 +756,16 @@ void fimc_adjust_mplane_format(struct fimc_fmt *fmt, u32 width, u32 height, bytesperline /= 2; plane_fmt->bytesperline = bytesperline; - plane_fmt->sizeimage = max((pix->width * pix->height * - fmt->depth[i]) / 8, plane_fmt->sizeimage); + sizeimage = pix->width * pix->height * fmt->depth[i] / 8; + + /* Ensure full last row for tiled formats */ + if (tiled_fmt(fmt)) { + /* 64 * 32 * plane_fmt->bytesperline / 64 */ + u32 row_size = plane_fmt->bytesperline * 32; + sizeimage = ALIGN(sizeimage, row_size); + } + + plane_fmt->sizeimage = max(sizeimage, plane_fmt->sizeimage); } }
For tiled format, we need to allocated a multiple of the row size. A good example is for 1280x720, wich get adjusted to 1280x736. In tiles, this mean Y plane is 20x23 and UV plane 20x12. Because of the rounding, the previous code would only have enough space to fit half of the last row. Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> --- drivers/media/platform/exynos4-is/fimc-core.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)