avcodec/mpegvideo: Move permutated_intra scans to {H263Dec,MPVEnc}Ctx

Only used by these two.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
Andreas Rheinhardt
2025-06-25 09:39:52 +02:00
parent c9c452688b
commit 3946e57797
13 changed files with 51 additions and 33 deletions

View File

@@ -108,6 +108,11 @@ av_cold int ff_h263_decode_init(AVCodecContext *avctx)
s->y_dc_scale_table =
s->c_dc_scale_table = ff_mpeg1_dc_scale_table;
ff_permute_scantable(h->permutated_intra_h_scantable, ff_alternate_horizontal_scan,
s->idsp.idct_permutation);
ff_permute_scantable(h->permutated_intra_v_scantable, ff_alternate_vertical_scan,
s->idsp.idct_permutation);
ff_mpv_unquantize_init(&unquant_dsp_ctx,
avctx->flags & AV_CODEC_FLAG_BITEXACT, 0);
// dct_unquantize defaults for H.263;

View File

@@ -97,6 +97,9 @@ typedef struct H263DecContext {
GetBitContext last_resync_gb; ///< used to search for the next resync marker
uint8_t permutated_intra_h_scantable[64];
uint8_t permutated_intra_v_scantable[64];
DECLARE_ALIGNED_32(int16_t, block)[6][64];
} H263DecContext;

View File

@@ -542,9 +542,9 @@ static int h263_decode_block(H263DecContext *const h, int16_t block[64],
rl = &ff_rl_intra_aic;
if (h->c.ac_pred) {
if (h->c.h263_aic_dir)
scan_table = h->c.permutated_intra_v_scantable; /* left */
scan_table = h->permutated_intra_v_scantable; /* left */
else
scan_table = h->c.permutated_intra_h_scantable; /* top */
scan_table = h->permutated_intra_h_scantable; /* top */
}
} else if (h->c.mb_intra) {
/* DC coef */

View File

@@ -38,6 +38,7 @@
#include "codec_internal.h"
#include "mpegvideo.h"
#include "flvenc.h"
#include "mpegvideodata.h"
#include "mpegvideoenc.h"
#include "h263.h"
#include "h263enc.h"
@@ -824,6 +825,11 @@ av_cold void ff_h263_encode_init(MPVMainEncContext *const m)
ff_h263dsp_init(&s->c.h263dsp);
ff_permute_scantable(s->permutated_intra_h_scantable, ff_alternate_horizontal_scan,
s->c.idsp.idct_permutation);
ff_permute_scantable(s->permutated_intra_v_scantable, ff_alternate_vertical_scan,
s->c.idsp.idct_permutation);
if (s->c.codec_id == AV_CODEC_ID_MPEG4)
return;

View File

@@ -1425,9 +1425,9 @@ static inline int mpeg4_decode_block(Mpeg4DecContext *ctx, int16_t *block,
}
if (h->c.ac_pred) {
if (dc_pred_dir == 0)
scan_table = h->c.permutated_intra_v_scantable; /* left */
scan_table = h->permutated_intra_v_scantable; /* left */
else
scan_table = h->c.permutated_intra_h_scantable; /* top */
scan_table = h->permutated_intra_h_scantable; /* top */
} else {
scan_table = h->c.intra_scantable.permutated;
}
@@ -3232,14 +3232,14 @@ static int decode_vop_header(Mpeg4DecContext *ctx, GetBitContext *gb,
if (h->c.alternate_scan) {
ff_init_scantable(h->c.idsp.idct_permutation, &h->c.intra_scantable, ff_alternate_vertical_scan);
ff_permute_scantable(h->c.permutated_intra_h_scantable, ff_alternate_vertical_scan,
ff_permute_scantable(h->permutated_intra_h_scantable, ff_alternate_vertical_scan,
h->c.idsp.idct_permutation);
} else {
ff_init_scantable(h->c.idsp.idct_permutation, &h->c.intra_scantable, ff_zigzag_direct);
ff_permute_scantable(h->c.permutated_intra_h_scantable, ff_alternate_horizontal_scan,
ff_permute_scantable(h->permutated_intra_h_scantable, ff_alternate_horizontal_scan,
h->c.idsp.idct_permutation);
}
ff_permute_scantable(h->c.permutated_intra_v_scantable, ff_alternate_vertical_scan,
ff_permute_scantable(h->permutated_intra_v_scantable, ff_alternate_vertical_scan,
h->c.idsp.idct_permutation);
if (h->c.pict_type == AV_PICTURE_TYPE_S) {
@@ -3609,21 +3609,23 @@ static av_cold void permute_quant_matrix(uint16_t matrix[64],
}
static av_cold void switch_to_xvid_idct(AVCodecContext *const avctx,
MpegEncContext *const s)
H263DecContext *const h)
{
uint8_t old_permutation[64];
memcpy(old_permutation, s->idsp.idct_permutation, sizeof(old_permutation));
memcpy(old_permutation, h->c.idsp.idct_permutation, sizeof(old_permutation));
avctx->idct_algo = FF_IDCT_XVID;
ff_mpv_idct_init(s);
ff_permute_scantable(s->permutated_intra_h_scantable,
s->alternate_scan ? ff_alternate_vertical_scan : ff_alternate_horizontal_scan,
s->idsp.idct_permutation);
ff_mpv_idct_init(&h->c);
ff_permute_scantable(h->permutated_intra_h_scantable,
h->c.alternate_scan ? ff_alternate_vertical_scan : ff_alternate_horizontal_scan,
h->c.idsp.idct_permutation);
ff_permute_scantable(h->permutated_intra_v_scantable, ff_alternate_vertical_scan,
h->c.idsp.idct_permutation);
// Normal (i.e. non-studio) MPEG-4 does not use the chroma matrices.
permute_quant_matrix(s->inter_matrix, s->idsp.idct_permutation, old_permutation);
permute_quant_matrix(s->intra_matrix, s->idsp.idct_permutation, old_permutation);
permute_quant_matrix(h->c.inter_matrix, h->c.idsp.idct_permutation, old_permutation);
permute_quant_matrix(h->c.intra_matrix, h->c.idsp.idct_permutation, old_permutation);
}
void ff_mpeg4_workaround_bugs(AVCodecContext *avctx)
@@ -3735,7 +3737,7 @@ void ff_mpeg4_workaround_bugs(AVCodecContext *avctx)
if (ctx->xvid_build >= 0 &&
avctx->idct_algo == FF_IDCT_AUTO && !h->c.studio_profile) {
switch_to_xvid_idct(avctx, &h->c);
switch_to_xvid_idct(avctx, h);
}
}

View File

@@ -223,7 +223,7 @@ static inline int decide_ac_pred(MPVEncContext *const s, int16_t block[6][64],
ac_val1[i + 8] = level;
}
}
st[n] = s->c.permutated_intra_h_scantable;
st[n] = s->permutated_intra_h_scantable;
} else {
const int xy = s->c.mb_x - 1 + s->c.mb_y * s->c.mb_stride;
/* left prediction */
@@ -245,7 +245,7 @@ static inline int decide_ac_pred(MPVEncContext *const s, int16_t block[6][64],
ac_val1[i + 8] = block[n][s->c.idsp.idct_permutation[i]];
}
}
st[n] = s->c.permutated_intra_v_scantable;
st[n] = s->permutated_intra_v_scantable;
}
for (i = 63; i > 0; i--) // FIXME optimize

View File

@@ -94,10 +94,6 @@ av_cold void ff_mpv_idct_init(MpegEncContext *s)
ff_init_scantable(s->idsp.idct_permutation, &s->inter_scantable, ff_zigzag_direct);
ff_init_scantable(s->idsp.idct_permutation, &s->intra_scantable, ff_zigzag_direct);
}
ff_permute_scantable(s->permutated_intra_h_scantable, ff_alternate_horizontal_scan,
s->idsp.idct_permutation);
ff_permute_scantable(s->permutated_intra_v_scantable, ff_alternate_vertical_scan,
s->idsp.idct_permutation);
}
av_cold int ff_mpv_init_duplicate_contexts(MpegEncContext *s)

View File

@@ -79,9 +79,6 @@ typedef struct MpegEncContext {
/* WARNING: changes above this line require updates to hardcoded
* offsets used in ASM. */
uint8_t permutated_intra_h_scantable[64];
uint8_t permutated_intra_v_scantable[64];
struct AVCodecContext *avctx;
/* The following pointer is intended for codecs sharing code
* between decoder and encoder and in need of a common context to do so. */

View File

@@ -193,6 +193,9 @@ typedef struct MPVEncContext {
int intra_penalty;
uint8_t permutated_intra_h_scantable[64];
uint8_t permutated_intra_v_scantable[64];
DECLARE_ALIGNED_32(int16_t, blocks)[2][12][64]; // for HQ mode we need to keep the best block
} MPVEncContext;

View File

@@ -118,7 +118,9 @@ static av_cold void msmpeg4_common_init_static(void)
init_h263_dc_for_msmpeg4();
}
av_cold void ff_msmpeg4_common_init(MpegEncContext *s)
av_cold void ff_msmpeg4_common_init(MPVContext *const s,
uint8_t permutated_intra_h_scantable[64],
uint8_t permutated_intra_v_scantable[64])
{
static AVOnce init_static_once = AV_ONCE_INIT;
@@ -148,9 +150,9 @@ av_cold void ff_msmpeg4_common_init(MpegEncContext *s)
s->c_dc_scale_table= ff_wmv1_c_dc_scale_table;
ff_init_scantable(s->idsp.idct_permutation, &s->intra_scantable, ff_wmv1_scantable[1]);
ff_init_scantable(s->idsp.idct_permutation, &s->inter_scantable, ff_wmv1_scantable[0]);
ff_permute_scantable(s->permutated_intra_h_scantable, ff_wmv1_scantable[2],
ff_permute_scantable(permutated_intra_h_scantable, ff_wmv1_scantable[2],
s->idsp.idct_permutation);
ff_permute_scantable(s->permutated_intra_v_scantable, ff_wmv1_scantable[3],
ff_permute_scantable(permutated_intra_v_scantable, ff_wmv1_scantable[3],
s->idsp.idct_permutation);
break;
}

View File

@@ -31,7 +31,9 @@
#define DC_MAX 119
void ff_msmpeg4_common_init(MpegEncContext *s);
void ff_msmpeg4_common_init(MPVContext *const s,
uint8_t permutated_intra_h_scantable[64],
uint8_t permutated_intra_v_scantable[64]);
int ff_msmpeg4_coded_block_pred(MpegEncContext * s, int n,
uint8_t **coded_block_ptr);

View File

@@ -655,9 +655,9 @@ int ff_msmpeg4_decode_block(MSMP4DecContext *const ms, int16_t * block,
}
if (h->c.ac_pred) {
if (dc_pred_dir == 0)
scan_table = h->c.permutated_intra_v_scantable; /* left */
scan_table = h->permutated_intra_v_scantable; /* left */
else
scan_table = h->c.permutated_intra_h_scantable; /* top */
scan_table = h->permutated_intra_h_scantable; /* top */
} else {
scan_table = h->c.intra_scantable.permutated;
}
@@ -849,7 +849,8 @@ av_cold int ff_msmpeg4_decode_init(AVCodecContext *avctx)
h->decode_header = msmpeg4_decode_picture_header;
ff_msmpeg4_common_init(&h->c);
ff_msmpeg4_common_init(&h->c, h->permutated_intra_h_scantable,
h->permutated_intra_v_scantable);
switch (h->c.msmpeg4_version) {
case MSMP4_V1:

View File

@@ -675,7 +675,8 @@ av_cold void ff_msmpeg4_encode_init(MPVMainEncContext *const m)
MPVEncContext *const s = &m->s;
static AVOnce init_static_once = AV_ONCE_INIT;
ff_msmpeg4_common_init(&s->c);
ff_msmpeg4_common_init(&s->c, s->permutated_intra_h_scantable,
s->permutated_intra_v_scantable);
if (s->c.msmpeg4_version <= MSMP4_WMV1) {
m->encode_picture_header = msmpeg4_encode_picture_header;