Commit 74799372 authored by Dafna Hirschfeld's avatar Dafna Hirschfeld Committed by Mauro Carvalho Chehab

media: vicodec: Handle the case that the reference buffer is NULL

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: default avatarDafna Hirschfeld <dafna3@gmail.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent 50e4c5e1
...@@ -841,6 +841,7 @@ static bool decode_plane(struct fwht_cframe *cf, const __be16 **rlco, ...@@ -841,6 +841,7 @@ static bool decode_plane(struct fwht_cframe *cf, const __be16 **rlco,
s16 copy[8 * 8]; s16 copy[8 * 8];
u16 stat; u16 stat;
unsigned int i, j; unsigned int i, j;
bool is_intra = !ref;
width = round_up(width, 8); width = round_up(width, 8);
height = round_up(height, 8); height = round_up(height, 8);
...@@ -872,7 +873,7 @@ static bool decode_plane(struct fwht_cframe *cf, const __be16 **rlco, ...@@ -872,7 +873,7 @@ static bool decode_plane(struct fwht_cframe *cf, const __be16 **rlco,
if (copies) { if (copies) {
memcpy(cf->de_fwht, copy, sizeof(copy)); memcpy(cf->de_fwht, copy, sizeof(copy));
if (stat & PFRAME_BIT) if ((stat & PFRAME_BIT) && !is_intra)
add_deltas(cf->de_fwht, refp, add_deltas(cf->de_fwht, refp,
ref_stride, ref_step); ref_stride, ref_step);
fill_decoder_block(dstp, cf->de_fwht, fill_decoder_block(dstp, cf->de_fwht,
...@@ -884,18 +885,18 @@ static bool decode_plane(struct fwht_cframe *cf, const __be16 **rlco, ...@@ -884,18 +885,18 @@ static bool decode_plane(struct fwht_cframe *cf, const __be16 **rlco,
stat = derlc(rlco, cf->coeffs, end_of_rlco_buf); stat = derlc(rlco, cf->coeffs, end_of_rlco_buf);
if (stat & OVERFLOW_BIT) if (stat & OVERFLOW_BIT)
return false; return false;
if (stat & PFRAME_BIT) if ((stat & PFRAME_BIT) && !is_intra)
dequantize_inter(cf->coeffs); dequantize_inter(cf->coeffs);
else else
dequantize_intra(cf->coeffs); dequantize_intra(cf->coeffs);
ifwht(cf->coeffs, cf->de_fwht, ifwht(cf->coeffs, cf->de_fwht,
(stat & PFRAME_BIT) ? 0 : 1); ((stat & PFRAME_BIT) && !is_intra) ? 0 : 1);
copies = (stat & DUPS_MASK) >> 1; copies = (stat & DUPS_MASK) >> 1;
if (copies) if (copies)
memcpy(copy, cf->de_fwht, sizeof(copy)); memcpy(copy, cf->de_fwht, sizeof(copy));
if (stat & PFRAME_BIT) if ((stat & PFRAME_BIT) && !is_intra)
add_deltas(cf->de_fwht, refp, add_deltas(cf->de_fwht, refp,
ref_stride, ref_step); ref_stride, ref_step);
fill_decoder_block(dstp, cf->de_fwht, dst_stride, fill_decoder_block(dstp, cf->de_fwht, dst_stride,
......
...@@ -99,6 +99,17 @@ static int prepare_raw_frame(struct fwht_raw_frame *rf, ...@@ -99,6 +99,17 @@ static int prepare_raw_frame(struct fwht_raw_frame *rf,
rf->alpha = NULL; rf->alpha = NULL;
rf->components_num = info->components_num; 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) { switch (info->id) {
case V4L2_PIX_FMT_GREY: case V4L2_PIX_FMT_GREY:
rf->cb = NULL; rf->cb = NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment