mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 10:09:10 +02:00
media: qcom: camss: Use proper BPL alignment helper and non-power-of-two rounding
Bytes-per-line (BPL) alignment in CAMSS currently uses ALIGN(), which only works correctly for power-of-two values. Some RAW Bayer packing formats (e.g. RAW10/12/14) require non-power-of-two alignment such as 3, 5, or 7-byte multiples, so ALIGN() produces incorrect results. Introduce the use of roundup() with the per-format alignment returned by camss_format_get_bpl_alignment() when no hardware alignment is enforced (video->bpl_alignment). Signed-off-by: Loic Poulain <loic.poulain@oss.qualcomm.com> Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org> Signed-off-by: Bryan O'Donoghue <bod@kernel.org>
This commit is contained in:
parent
91978c39ee
commit
ac437a96b7
|
|
@ -47,6 +47,9 @@ static int video_mbus_to_pix_mp(const struct v4l2_mbus_framefmt *mbus,
|
|||
unsigned int i;
|
||||
u32 bytesperline;
|
||||
|
||||
if (!alignment)
|
||||
alignment = camss_format_get_bpl_alignment(f);
|
||||
|
||||
memset(pix, 0, sizeof(*pix));
|
||||
v4l2_fill_pix_format_mplane(pix, mbus);
|
||||
pix->pixelformat = f->pixelformat;
|
||||
|
|
@ -54,7 +57,7 @@ static int video_mbus_to_pix_mp(const struct v4l2_mbus_framefmt *mbus,
|
|||
for (i = 0; i < pix->num_planes; i++) {
|
||||
bytesperline = pix->width / f->hsub[i].numerator *
|
||||
f->hsub[i].denominator * f->bpp[i] / 8;
|
||||
bytesperline = ALIGN(bytesperline, alignment);
|
||||
bytesperline = roundup(bytesperline, alignment);
|
||||
pix->plane_fmt[i].bytesperline = bytesperline;
|
||||
pix->plane_fmt[i].sizeimage = pix->height /
|
||||
f->vsub[i].numerator * f->vsub[i].denominator *
|
||||
|
|
@ -459,6 +462,7 @@ static int video_g_fmt(struct file *file, void *fh, struct v4l2_format *f)
|
|||
|
||||
static int __video_try_fmt(struct camss_video *video, struct v4l2_format *f)
|
||||
{
|
||||
unsigned int alignment = video->bpl_alignment;
|
||||
struct v4l2_pix_format_mplane *pix_mp;
|
||||
const struct camss_format_info *fi;
|
||||
struct v4l2_plane_pix_format *p;
|
||||
|
|
@ -491,6 +495,9 @@ static int __video_try_fmt(struct camss_video *video, struct v4l2_format *f)
|
|||
width = pix_mp->width;
|
||||
height = pix_mp->height;
|
||||
|
||||
if (!alignment)
|
||||
alignment = camss_format_get_bpl_alignment(fi);
|
||||
|
||||
memset(pix_mp, 0, sizeof(*pix_mp));
|
||||
|
||||
pix_mp->pixelformat = fi->pixelformat;
|
||||
|
|
@ -500,7 +507,7 @@ static int __video_try_fmt(struct camss_video *video, struct v4l2_format *f)
|
|||
for (i = 0; i < pix_mp->num_planes; i++) {
|
||||
bpl = pix_mp->width / fi->hsub[i].numerator *
|
||||
fi->hsub[i].denominator * fi->bpp[i] / 8;
|
||||
bpl = ALIGN(bpl, video->bpl_alignment);
|
||||
bpl = roundup(bpl, alignment);
|
||||
pix_mp->plane_fmt[i].bytesperline = bpl;
|
||||
pix_mp->plane_fmt[i].sizeimage = pix_mp->height /
|
||||
fi->vsub[i].numerator * fi->vsub[i].denominator * bpl;
|
||||
|
|
@ -525,7 +532,7 @@ static int __video_try_fmt(struct camss_video *video, struct v4l2_format *f)
|
|||
lines = p->sizeimage / p->bytesperline;
|
||||
|
||||
if (p->bytesperline < bytesperline[i])
|
||||
p->bytesperline = ALIGN(bytesperline[i], 8);
|
||||
p->bytesperline = roundup(bytesperline[i], alignment);
|
||||
|
||||
if (p->sizeimage < p->bytesperline * lines)
|
||||
p->sizeimage = p->bytesperline * lines;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user