mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-28 20:53:54 +02:00
avcodec/jpeglsenc: Move check out of loop
ls_encode_line() encodes a line of input, going from left to right. In order to calculate a predicted value it uses the left and upper-left value of the output picture (that is, it uses how a decoder would see the already encoded part of the picture), unless this is the very first pixel of this line in which case one uses the first pixel of the last (upper) line and the line before the last line. Therefore the loop contained a check for whether this is the beginning of a new line. This commit moves said check out of the loop by initializing these values before the loop and by updating these values at the end of the loop body; already read/calculated values are reused for this (the prediction also needs the value of the upper pixel and this can be reused for the upper left value of the next iteration of the loop). Reviewed-by: Paul B Mahol <onemda@gmail.com> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
This commit is contained in:
parent
0788a74876
commit
fefe69c5c9
@ -145,16 +145,14 @@ static inline void ls_encode_line(JLSState *state, PutBitContext *pb,
|
||||
int stride, int comp, int bits)
|
||||
{
|
||||
int x = 0;
|
||||
int Ra, Rb, Rc, Rd;
|
||||
int Ra = R(last, 0), Rb, Rc = last2, Rd;
|
||||
int D0, D1, D2;
|
||||
|
||||
while (x < w) {
|
||||
int err, pred, sign;
|
||||
|
||||
/* compute gradients */
|
||||
Ra = x ? R(cur, x - stride) : R(last, x);
|
||||
Rb = R(last, x);
|
||||
Rc = x ? R(last, x - stride) : last2;
|
||||
Rd = (x >= w - stride) ? R(last, x) : R(last, x + stride);
|
||||
D0 = Rd - Rb;
|
||||
D1 = Rb - Rc;
|
||||
@ -194,9 +192,9 @@ static inline void ls_encode_line(JLSState *state, PutBitContext *pb,
|
||||
Ra = av_clip(pred + err * state->twonear, 0, state->maxval);
|
||||
else
|
||||
Ra = av_clip(pred - err * state->twonear, 0, state->maxval);
|
||||
W(cur, x, Ra);
|
||||
} else
|
||||
W(cur, x, R(in, x));
|
||||
Ra = R(in, x);
|
||||
W(cur, x, Ra);
|
||||
|
||||
if (err < 0)
|
||||
err += state->range;
|
||||
@ -236,12 +234,13 @@ static inline void ls_encode_line(JLSState *state, PutBitContext *pb,
|
||||
Ra = av_clip(pred + err * state->twonear, 0, state->maxval);
|
||||
else
|
||||
Ra = av_clip(pred - err * state->twonear, 0, state->maxval);
|
||||
W(cur, x, Ra);
|
||||
} else
|
||||
W(cur, x, R(in, x));
|
||||
Ra = R(in, x);
|
||||
W(cur, x, Ra);
|
||||
|
||||
ls_encode_regular(state, pb, context, err);
|
||||
}
|
||||
Rc = Rb;
|
||||
x += stride;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user