Commit fe7fbf3a authored by Michael Niedermayer's avatar Michael Niedermayer

avcodec/jpeglsdec: Return error codes from ls_decode_line()

Signed-off-by: 's avatarMichael Niedermayer <michael@niedermayer.cc>
parent c552c3ef
...@@ -222,7 +222,7 @@ static inline int ls_get_code_runterm(GetBitContext *gb, JLSState *state, ...@@ -222,7 +222,7 @@ static inline int ls_get_code_runterm(GetBitContext *gb, JLSState *state,
/** /**
* Decode one line of image * Decode one line of image
*/ */
static inline void ls_decode_line(JLSState *state, MJpegDecodeContext *s, static inline int ls_decode_line(JLSState *state, MJpegDecodeContext *s,
void *last, void *dst, int last2, int w, void *last, void *dst, int last2, int w,
int stride, int comp, int bits) int stride, int comp, int bits)
{ {
...@@ -234,7 +234,7 @@ static inline void ls_decode_line(JLSState *state, MJpegDecodeContext *s, ...@@ -234,7 +234,7 @@ static inline void ls_decode_line(JLSState *state, MJpegDecodeContext *s,
int err, pred; int err, pred;
if (get_bits_left(&s->gb) <= 0) if (get_bits_left(&s->gb) <= 0)
return; return AVERROR_INVALIDDATA;
/* compute gradients */ /* compute gradients */
Ra = x ? R(dst, x - stride) : R(last, x); Ra = x ? R(dst, x - stride) : R(last, x);
...@@ -263,11 +263,11 @@ static inline void ls_decode_line(JLSState *state, MJpegDecodeContext *s, ...@@ -263,11 +263,11 @@ static inline void ls_decode_line(JLSState *state, MJpegDecodeContext *s,
} }
/* if EOL reached, we stop decoding */ /* if EOL reached, we stop decoding */
if (r != 1 << ff_log2_run[state->run_index[comp]]) if (r != 1 << ff_log2_run[state->run_index[comp]])
return; return 0;
if (state->run_index[comp] < 31) if (state->run_index[comp] < 31)
state->run_index[comp]++; state->run_index[comp]++;
if (x + stride > w) if (x + stride > w)
return; return 0;
} }
/* decode aborted run */ /* decode aborted run */
r = ff_log2_run[state->run_index[comp]]; r = ff_log2_run[state->run_index[comp]];
...@@ -284,7 +284,7 @@ static inline void ls_decode_line(JLSState *state, MJpegDecodeContext *s, ...@@ -284,7 +284,7 @@ static inline void ls_decode_line(JLSState *state, MJpegDecodeContext *s,
if (x >= w) { if (x >= w) {
av_log(NULL, AV_LOG_ERROR, "run overflow\n"); av_log(NULL, AV_LOG_ERROR, "run overflow\n");
av_assert0(x <= w); av_assert0(x <= w);
return; return AVERROR_INVALIDDATA;
} }
/* decode run termination value */ /* decode run termination value */
...@@ -341,6 +341,8 @@ static inline void ls_decode_line(JLSState *state, MJpegDecodeContext *s, ...@@ -341,6 +341,8 @@ static inline void ls_decode_line(JLSState *state, MJpegDecodeContext *s,
W(dst, x, pred); W(dst, x, pred);
x += stride; x += stride;
} }
return 0;
} }
int ff_jpegls_decode_picture(MJpegDecodeContext *s, int near, int ff_jpegls_decode_picture(MJpegDecodeContext *s, int near,
...@@ -407,13 +409,16 @@ int ff_jpegls_decode_picture(MJpegDecodeContext *s, int near, ...@@ -407,13 +409,16 @@ int ff_jpegls_decode_picture(MJpegDecodeContext *s, int near,
width = s->width * stride; width = s->width * stride;
cur += off; cur += off;
for (i = 0; i < s->height; i++) { for (i = 0; i < s->height; i++) {
int ret;
if (s->bits <= 8) { if (s->bits <= 8) {
ls_decode_line(state, s, last, cur, t, width, stride, off, 8); ret = ls_decode_line(state, s, last, cur, t, width, stride, off, 8);
t = last[0]; t = last[0];
} else { } else {
ls_decode_line(state, s, last, cur, t, width, stride, off, 16); ret = ls_decode_line(state, s, last, cur, t, width, stride, off, 16);
t = *((uint16_t *)last); t = *((uint16_t *)last);
} }
if (ret < 0)
break;
last = cur; last = cur;
cur += s->picture_ptr->linesize[0]; cur += s->picture_ptr->linesize[0];
...@@ -429,9 +434,12 @@ int ff_jpegls_decode_picture(MJpegDecodeContext *s, int near, ...@@ -429,9 +434,12 @@ int ff_jpegls_decode_picture(MJpegDecodeContext *s, int near,
memset(cur, 0, s->picture_ptr->linesize[0]); memset(cur, 0, s->picture_ptr->linesize[0]);
width = s->width * stride; width = s->width * stride;
for (i = 0; i < s->height; i++) { for (i = 0; i < s->height; i++) {
int ret;
for (j = 0; j < stride; j++) { for (j = 0; j < stride; j++) {
ls_decode_line(state, s, last + j, cur + j, ret = ls_decode_line(state, s, last + j, cur + j,
Rc[j], width, stride, j, 8); Rc[j], width, stride, j, 8);
if (ret < 0)
break;
Rc[j] = last[j]; Rc[j] = last[j];
if (s->restart_interval && !--s->restart_count) { if (s->restart_interval && !--s->restart_count) {
...@@ -439,6 +447,8 @@ int ff_jpegls_decode_picture(MJpegDecodeContext *s, int near, ...@@ -439,6 +447,8 @@ int ff_jpegls_decode_picture(MJpegDecodeContext *s, int near,
skip_bits(&s->gb, 16); /* skip RSTn */ skip_bits(&s->gb, 16); /* skip RSTn */
} }
} }
if (ret < 0)
break;
last = cur; last = cur;
cur += s->picture_ptr->linesize[0]; cur += s->picture_ptr->linesize[0];
} }
......
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