| From 49a56266f96f2c6608373464af8755b431ef1513 Mon Sep 17 00:00:00 2001 |
| From: Hans Verkuil <hverkuil-cisco@xs4all.nl> |
| Date: Tue, 4 Feb 2020 13:45:04 +0100 |
| Subject: media: vicodec: process all 4 components for RGB32 formats |
| |
| From: Hans Verkuil <hverkuil-cisco@xs4all.nl> |
| |
| commit 49a56266f96f2c6608373464af8755b431ef1513 upstream. |
| |
| Only ARGB32-type pixelformat were assumed to have 4 components, which is |
| wrong since RGB32-type pixelformats may have an alpha channel, so they |
| should also assume 4 color components. |
| |
| The XRGB32-type pixelformats really have only 3 color components, but this |
| complicated matters since that creates strides that are sometimes width * 3 |
| and sometimes width * 4, and in fact this can result in buffer overflows. |
| |
| Keep things simple by just always processing all 4 color components. |
| |
| In the future we might want to optimize this again for the XRGB32-type |
| pixelformats, but for now keep it simple and robust. |
| |
| Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> |
| Cc: <stable@vger.kernel.org> # for v5.4 and up |
| Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/media/platform/vicodec/codec-v4l2-fwht.c | 34 ++++++----------------- |
| 1 file changed, 9 insertions(+), 25 deletions(-) |
| |
| --- a/drivers/media/platform/vicodec/codec-v4l2-fwht.c |
| +++ b/drivers/media/platform/vicodec/codec-v4l2-fwht.c |
| @@ -27,17 +27,17 @@ static const struct v4l2_fwht_pixfmt_inf |
| { V4L2_PIX_FMT_BGR24, 3, 3, 1, 3, 3, 1, 1, 3, 1, FWHT_FL_PIXENC_RGB}, |
| { V4L2_PIX_FMT_RGB24, 3, 3, 1, 3, 3, 1, 1, 3, 1, FWHT_FL_PIXENC_RGB}, |
| { V4L2_PIX_FMT_HSV24, 3, 3, 1, 3, 3, 1, 1, 3, 1, FWHT_FL_PIXENC_HSV}, |
| - { V4L2_PIX_FMT_BGR32, 4, 4, 1, 4, 4, 1, 1, 3, 1, FWHT_FL_PIXENC_RGB}, |
| - { V4L2_PIX_FMT_XBGR32, 4, 4, 1, 4, 4, 1, 1, 3, 1, FWHT_FL_PIXENC_RGB}, |
| + { V4L2_PIX_FMT_BGR32, 4, 4, 1, 4, 4, 1, 1, 4, 1, FWHT_FL_PIXENC_RGB}, |
| + { V4L2_PIX_FMT_XBGR32, 4, 4, 1, 4, 4, 1, 1, 4, 1, FWHT_FL_PIXENC_RGB}, |
| { V4L2_PIX_FMT_ABGR32, 4, 4, 1, 4, 4, 1, 1, 4, 1, FWHT_FL_PIXENC_RGB}, |
| - { V4L2_PIX_FMT_RGB32, 4, 4, 1, 4, 4, 1, 1, 3, 1, FWHT_FL_PIXENC_RGB}, |
| - { V4L2_PIX_FMT_XRGB32, 4, 4, 1, 4, 4, 1, 1, 3, 1, FWHT_FL_PIXENC_RGB}, |
| + { V4L2_PIX_FMT_RGB32, 4, 4, 1, 4, 4, 1, 1, 4, 1, FWHT_FL_PIXENC_RGB}, |
| + { V4L2_PIX_FMT_XRGB32, 4, 4, 1, 4, 4, 1, 1, 4, 1, FWHT_FL_PIXENC_RGB}, |
| { V4L2_PIX_FMT_ARGB32, 4, 4, 1, 4, 4, 1, 1, 4, 1, FWHT_FL_PIXENC_RGB}, |
| - { V4L2_PIX_FMT_BGRX32, 4, 4, 1, 4, 4, 1, 1, 3, 1, FWHT_FL_PIXENC_RGB}, |
| + { V4L2_PIX_FMT_BGRX32, 4, 4, 1, 4, 4, 1, 1, 4, 1, FWHT_FL_PIXENC_RGB}, |
| { V4L2_PIX_FMT_BGRA32, 4, 4, 1, 4, 4, 1, 1, 4, 1, FWHT_FL_PIXENC_RGB}, |
| - { V4L2_PIX_FMT_RGBX32, 4, 4, 1, 4, 4, 1, 1, 3, 1, FWHT_FL_PIXENC_RGB}, |
| + { V4L2_PIX_FMT_RGBX32, 4, 4, 1, 4, 4, 1, 1, 4, 1, FWHT_FL_PIXENC_RGB}, |
| { V4L2_PIX_FMT_RGBA32, 4, 4, 1, 4, 4, 1, 1, 4, 1, FWHT_FL_PIXENC_RGB}, |
| - { V4L2_PIX_FMT_HSV32, 4, 4, 1, 4, 4, 1, 1, 3, 1, FWHT_FL_PIXENC_HSV}, |
| + { V4L2_PIX_FMT_HSV32, 4, 4, 1, 4, 4, 1, 1, 4, 1, FWHT_FL_PIXENC_HSV}, |
| { V4L2_PIX_FMT_GREY, 1, 1, 1, 1, 0, 1, 1, 1, 1, FWHT_FL_PIXENC_RGB}, |
| }; |
| |
| @@ -175,22 +175,14 @@ static int prepare_raw_frame(struct fwht |
| case V4L2_PIX_FMT_RGB32: |
| case V4L2_PIX_FMT_XRGB32: |
| case V4L2_PIX_FMT_HSV32: |
| - rf->cr = rf->luma + 1; |
| - rf->cb = rf->cr + 2; |
| - rf->luma += 2; |
| - break; |
| - case V4L2_PIX_FMT_BGR32: |
| - case V4L2_PIX_FMT_XBGR32: |
| - rf->cb = rf->luma; |
| - rf->cr = rf->cb + 2; |
| - rf->luma++; |
| - break; |
| case V4L2_PIX_FMT_ARGB32: |
| rf->alpha = rf->luma; |
| rf->cr = rf->luma + 1; |
| rf->cb = rf->cr + 2; |
| rf->luma += 2; |
| break; |
| + case V4L2_PIX_FMT_BGR32: |
| + case V4L2_PIX_FMT_XBGR32: |
| case V4L2_PIX_FMT_ABGR32: |
| rf->cb = rf->luma; |
| rf->cr = rf->cb + 2; |
| @@ -198,10 +190,6 @@ static int prepare_raw_frame(struct fwht |
| rf->alpha = rf->cr + 1; |
| break; |
| case V4L2_PIX_FMT_BGRX32: |
| - rf->cb = rf->luma + 1; |
| - rf->cr = rf->cb + 2; |
| - rf->luma += 2; |
| - break; |
| case V4L2_PIX_FMT_BGRA32: |
| rf->alpha = rf->luma; |
| rf->cb = rf->luma + 1; |
| @@ -209,10 +197,6 @@ static int prepare_raw_frame(struct fwht |
| rf->luma += 2; |
| break; |
| case V4L2_PIX_FMT_RGBX32: |
| - rf->cr = rf->luma; |
| - rf->cb = rf->cr + 2; |
| - rf->luma++; |
| - break; |
| case V4L2_PIX_FMT_RGBA32: |
| rf->alpha = rf->luma + 3; |
| rf->cr = rf->luma; |