diff options
-rw-r--r-- | libavcodec/jpeglsenc.c | 50 |
1 files changed, 27 insertions, 23 deletions
diff --git a/libavcodec/jpeglsenc.c b/libavcodec/jpeglsenc.c index 33fe058e59..363f7fe201 100644 --- a/libavcodec/jpeglsenc.c +++ b/libavcodec/jpeglsenc.c @@ -141,7 +141,7 @@ static inline void ls_encode_run(JLSState *state, PutBitContext *pb, int run, * Encode one line of image */ static inline void ls_encode_line(JLSState *state, PutBitContext *pb, - void *last, void *cur, int last2, int w, + void *last, void *cur, const void *in, int last2, int w, int stride, int comp, int bits) { int x = 0; @@ -168,7 +168,7 @@ static inline void ls_encode_line(JLSState *state, PutBitContext *pb, run = 0; RUNval = Ra; - while (x < w && (FFABS(R(cur, x) - RUNval) <= state->near)) { + while (x < w && (FFABS(R(in, x) - RUNval) <= state->near)) { run++; W(cur, x, Ra); x += stride; @@ -179,7 +179,7 @@ static inline void ls_encode_line(JLSState *state, PutBitContext *pb, Rb = R(last, x); RItype = FFABS(Ra - Rb) <= state->near; pred = RItype ? Ra : Rb; - err = R(cur, x) - pred; + err = R(in, x) - pred; if (!RItype && Ra > Rb) err = -err; @@ -195,7 +195,9 @@ static inline void ls_encode_line(JLSState *state, PutBitContext *pb, else Ra = av_clip(pred - err * state->twonear, 0, state->maxval); W(cur, x, Ra); - } + } else + W(cur, x, R(in, x)); + if (err < 0) err += state->range; if (err >= state->range + 1 >> 1) @@ -218,11 +220,11 @@ static inline void ls_encode_line(JLSState *state, PutBitContext *pb, context = -context; sign = 1; pred = av_clip(pred - state->C[context], 0, state->maxval); - err = pred - R(cur, x); + err = pred - R(in, x); } else { sign = 0; pred = av_clip(pred + state->C[context], 0, state->maxval); - err = R(cur, x) - pred; + err = R(in, x) - pred; } if (state->near) { @@ -235,7 +237,8 @@ static inline void ls_encode_line(JLSState *state, PutBitContext *pb, else Ra = av_clip(pred - err * state->twonear, 0, state->maxval); W(cur, x, Ra); - } + } else + W(cur, x, R(in, x)); ls_encode_regular(state, pb, context, err); } @@ -276,8 +279,8 @@ static int encode_picture_ls(AVCodecContext *avctx, AVPacket *pkt, GetBitContext gb; uint8_t *buf2 = NULL; uint8_t *zero = NULL; - uint8_t *cur = NULL; - uint8_t *last = NULL; + const uint8_t *in; + uint8_t *last, *cur; JLSState *state = NULL; int i, size, ret; int comps; @@ -343,28 +346,29 @@ FF_ENABLE_DEPRECATION_WARNINGS ls_store_lse(state, &pb); - zero = last = av_mallocz(FFABS(p->linesize[0])); + zero = last = av_calloc(FFABS(p->linesize[0]), 2); if (!zero) goto memfail; + cur = zero + FFABS(p->linesize[0]); - cur = p->data[0]; + in = p->data[0]; if (avctx->pix_fmt == AV_PIX_FMT_GRAY8) { int t = 0; for (i = 0; i < avctx->height; i++) { - ls_encode_line(state, &pb2, last, cur, t, avctx->width, 1, 0, 8); + ls_encode_line(state, &pb2, last, cur, in, t, avctx->width, 1, 0, 8); t = last[0]; - last = cur; - cur += p->linesize[0]; + FFSWAP(void *, last, cur); + in += p->linesize[0]; } } else if (avctx->pix_fmt == AV_PIX_FMT_GRAY16) { int t = 0; for (i = 0; i < avctx->height; i++) { - ls_encode_line(state, &pb2, last, cur, t, avctx->width, 1, 0, 16); + ls_encode_line(state, &pb2, last, cur, in, t, avctx->width, 1, 0, 16); t = *((uint16_t *)last); - last = cur; - cur += p->linesize[0]; + FFSWAP(void *, last, cur); + in += p->linesize[0]; } } else if (avctx->pix_fmt == AV_PIX_FMT_RGB24) { int j, width; @@ -373,12 +377,12 @@ FF_ENABLE_DEPRECATION_WARNINGS width = avctx->width * 3; for (i = 0; i < avctx->height; i++) { for (j = 0; j < 3; j++) { - ls_encode_line(state, &pb2, last + j, cur + j, Rc[j], + ls_encode_line(state, &pb2, last + j, cur + j, in + j, Rc[j], width, 3, j, 8); Rc[j] = last[j]; } - last = cur; - cur += p->linesize[0]; + FFSWAP(void *, last, cur); + in += p->linesize[0]; } } else if (avctx->pix_fmt == AV_PIX_FMT_BGR24) { int j, width; @@ -387,12 +391,12 @@ FF_ENABLE_DEPRECATION_WARNINGS width = avctx->width * 3; for (i = 0; i < avctx->height; i++) { for (j = 2; j >= 0; j--) { - ls_encode_line(state, &pb2, last + j, cur + j, Rc[j], + ls_encode_line(state, &pb2, last + j, cur + j, in + j, Rc[j], width, 3, j, 8); Rc[j] = last[j]; } - last = cur; - cur += p->linesize[0]; + FFSWAP(void *, last, cur); + in += p->linesize[0]; } } |