1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-08-04 22:03:09 +02:00

avcodec/ituh263dec: Simplify AIC handling

Possible by using block_index.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
Andreas Rheinhardt
2025-05-25 20:17:39 +02:00
parent 822be72f0a
commit 950137a7c8

View File

@ -448,34 +448,25 @@ static void h263_decode_dquant(MpegEncContext *s){
static void h263_pred_acdc(MpegEncContext * s, int16_t *block, int n) static void h263_pred_acdc(MpegEncContext * s, int16_t *block, int n)
{ {
int x, y, wrap, a, c, pred_dc, scale; int wrap, a, c, pred_dc, scale;
int16_t *dc_val, *ac_val, *ac_val1; const int xy = s->block_index[n];
int16_t *const dc_val = s->dc_val[0] + xy;
int16_t *const ac_val = (s->ac_val[0] + xy)[0];
/* find prediction */ /* find prediction */
if (n < 4) { if (n < 4) {
x = 2 * s->mb_x + (n & 1);
y = 2 * s->mb_y + (n>> 1);
wrap = s->b8_stride; wrap = s->b8_stride;
dc_val = s->dc_val[0];
ac_val = s->ac_val[0][0];
scale = s->y_dc_scale; scale = s->y_dc_scale;
} else { } else {
x = s->mb_x;
y = s->mb_y;
wrap = s->mb_stride; wrap = s->mb_stride;
dc_val = s->dc_val[n - 4 + 1];
ac_val = s->ac_val[n - 4 + 1][0];
scale = s->c_dc_scale; scale = s->c_dc_scale;
} }
ac_val += ((y) * wrap + (x)) * 16;
ac_val1 = ac_val;
/* B C /* B C
* A X * A X
*/ */
a = dc_val[(x - 1) + (y) * wrap]; a = dc_val[-1];
c = dc_val[(x) + (y - 1) * wrap]; c = dc_val[-wrap];
/* No prediction outside GOB boundary */ /* No prediction outside GOB boundary */
if (s->first_slice_line && n != 3) { if (s->first_slice_line && n != 3) {
@ -488,18 +479,18 @@ static void h263_pred_acdc(MpegEncContext * s, int16_t *block, int n)
if (s->h263_aic_dir) { if (s->h263_aic_dir) {
/* left prediction */ /* left prediction */
if (a != 1024) { if (a != 1024) {
ac_val -= 16; int16_t *const ac_val2 = ac_val - 16;
for (int i = 1; i < 8; i++) { for (int i = 1; i < 8; i++) {
block[s->idsp.idct_permutation[i << 3]] += ac_val[i]; block[s->idsp.idct_permutation[i << 3]] += ac_val2[i];
} }
pred_dc = a; pred_dc = a;
} }
} else { } else {
/* top prediction */ /* top prediction */
if (c != 1024) { if (c != 1024) {
ac_val -= 16 * wrap; int16_t *const ac_val2 = ac_val - 16 * wrap;
for (int i = 1; i < 8; i++) { for (int i = 1; i < 8; i++) {
block[s->idsp.idct_permutation[i]] += ac_val[i + 8]; block[s->idsp.idct_permutation[i]] += ac_val2[i + 8];
} }
pred_dc = c; pred_dc = c;
} }
@ -523,14 +514,14 @@ static void h263_pred_acdc(MpegEncContext * s, int16_t *block, int n)
block[0] |= 1; block[0] |= 1;
/* Update AC/DC tables */ /* Update AC/DC tables */
dc_val[(x) + (y) * wrap] = block[0]; *dc_val = block[0];
/* left copy */ /* left copy */
for (int i = 1; i < 8; i++) for (int i = 1; i < 8; i++)
ac_val1[i] = block[s->idsp.idct_permutation[i << 3]]; ac_val[i] = block[s->idsp.idct_permutation[i << 3]];
/* top copy */ /* top copy */
for (int i = 1; i < 8; i++) for (int i = 1; i < 8; i++)
ac_val1[8 + i] = block[s->idsp.idct_permutation[i]]; ac_val[8 + i] = block[s->idsp.idct_permutation[i]];
} }
static int h263_decode_block(MpegEncContext * s, int16_t * block, static int h263_decode_block(MpegEncContext * s, int16_t * block,