In the stateless decoder the reference buffer is null if the
frame is an I-frame (flagged with FWHT_FL_I_FRAME).
Make sure not to dereference it in that case.

Signed-off-by: Dafna Hirschfeld <daf...@gmail.com>
---
 drivers/media/platform/vicodec/codec-fwht.c      |  9 +++++----
 drivers/media/platform/vicodec/codec-v4l2-fwht.c | 11 +++++++++++
 2 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/drivers/media/platform/vicodec/codec-fwht.c 
b/drivers/media/platform/vicodec/codec-fwht.c
index 9a0dc739c58c..25992817f45b 100644
--- a/drivers/media/platform/vicodec/codec-fwht.c
+++ b/drivers/media/platform/vicodec/codec-fwht.c
@@ -834,6 +834,7 @@ static bool decode_plane(struct fwht_cframe *cf, const 
__be16 **rlco,
        s16 copy[8 * 8];
        u16 stat;
        unsigned int i, j;
+       bool is_intra = !ref;
 
        width = round_up(width, 8);
        height = round_up(height, 8);
@@ -865,7 +866,7 @@ static bool decode_plane(struct fwht_cframe *cf, const 
__be16 **rlco,
 
                        if (copies) {
                                memcpy(cf->de_fwht, copy, sizeof(copy));
-                               if (stat & PFRAME_BIT)
+                               if ((stat & PFRAME_BIT) && !is_intra)
                                        add_deltas(cf->de_fwht, refp,
                                                   ref_stride, ref_step);
                                fill_decoder_block(dstp, cf->de_fwht,
@@ -877,18 +878,18 @@ static bool decode_plane(struct fwht_cframe *cf, const 
__be16 **rlco,
                        stat = derlc(rlco, cf->coeffs, end_of_rlco_buf);
                        if (stat & OVERFLOW_BIT)
                                return false;
-                       if (stat & PFRAME_BIT)
+                       if ((stat & PFRAME_BIT) && !is_intra)
                                dequantize_inter(cf->coeffs);
                        else
                                dequantize_intra(cf->coeffs);
 
                        ifwht(cf->coeffs, cf->de_fwht,
-                             (stat & PFRAME_BIT) ? 0 : 1);
+                             ((stat & PFRAME_BIT) && !is_intra) ? 0 : 1);
 
                        copies = (stat & DUPS_MASK) >> 1;
                        if (copies)
                                memcpy(copy, cf->de_fwht, sizeof(copy));
-                       if (stat & PFRAME_BIT)
+                       if ((stat & PFRAME_BIT) && !is_intra)
                                add_deltas(cf->de_fwht, refp,
                                           ref_stride, ref_step);
                        fill_decoder_block(dstp, cf->de_fwht, dst_stride,
diff --git a/drivers/media/platform/vicodec/codec-v4l2-fwht.c 
b/drivers/media/platform/vicodec/codec-v4l2-fwht.c
index 372ed95e1a1f..01e7f09efc4e 100644
--- a/drivers/media/platform/vicodec/codec-v4l2-fwht.c
+++ b/drivers/media/platform/vicodec/codec-v4l2-fwht.c
@@ -99,6 +99,17 @@ static int prepare_raw_frame(struct fwht_raw_frame *rf,
        rf->alpha = NULL;
        rf->components_num = info->components_num;
 
+       /*
+        * The buffer is NULL if it is the reference
+        * frame of an I-frame in the stateless decoder
+        */
+       if (!buf) {
+               rf->luma = NULL;
+               rf->cb = NULL;
+               rf->cr = NULL;
+               rf->alpha = NULL;
+               return 0;
+       }
        switch (info->id) {
        case V4L2_PIX_FMT_GREY:
                rf->cb = NULL;
-- 
2.17.1

Reply via email to