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->y_dc_scale_table =
s->c_dc_scale_table = ff_mpeg1_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, ff_mpv_unquantize_init(&unquant_dsp_ctx,
avctx->flags & AV_CODEC_FLAG_BITEXACT, 0); avctx->flags & AV_CODEC_FLAG_BITEXACT, 0);
// dct_unquantize defaults for H.263; // 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 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]; DECLARE_ALIGNED_32(int16_t, block)[6][64];
} H263DecContext; } H263DecContext;

View File

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

View File

@@ -38,6 +38,7 @@
#include "codec_internal.h" #include "codec_internal.h"
#include "mpegvideo.h" #include "mpegvideo.h"
#include "flvenc.h" #include "flvenc.h"
#include "mpegvideodata.h"
#include "mpegvideoenc.h" #include "mpegvideoenc.h"
#include "h263.h" #include "h263.h"
#include "h263enc.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_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) if (s->c.codec_id == AV_CODEC_ID_MPEG4)
return; return;

View File

@@ -1425,9 +1425,9 @@ static inline int mpeg4_decode_block(Mpeg4DecContext *ctx, int16_t *block,
} }
if (h->c.ac_pred) { if (h->c.ac_pred) {
if (dc_pred_dir == 0) if (dc_pred_dir == 0)
scan_table = h->c.permutated_intra_v_scantable; /* left */ scan_table = h->permutated_intra_v_scantable; /* left */
else else
scan_table = h->c.permutated_intra_h_scantable; /* top */ scan_table = h->permutated_intra_h_scantable; /* top */
} else { } else {
scan_table = h->c.intra_scantable.permutated; 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) { if (h->c.alternate_scan) {
ff_init_scantable(h->c.idsp.idct_permutation, &h->c.intra_scantable, ff_alternate_vertical_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); h->c.idsp.idct_permutation);
} else { } else {
ff_init_scantable(h->c.idsp.idct_permutation, &h->c.intra_scantable, ff_zigzag_direct); 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); 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); h->c.idsp.idct_permutation);
if (h->c.pict_type == AV_PICTURE_TYPE_S) { 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, static av_cold void switch_to_xvid_idct(AVCodecContext *const avctx,
MpegEncContext *const s) H263DecContext *const h)
{ {
uint8_t old_permutation[64]; 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; avctx->idct_algo = FF_IDCT_XVID;
ff_mpv_idct_init(s); ff_mpv_idct_init(&h->c);
ff_permute_scantable(s->permutated_intra_h_scantable, ff_permute_scantable(h->permutated_intra_h_scantable,
s->alternate_scan ? ff_alternate_vertical_scan : ff_alternate_horizontal_scan, h->c.alternate_scan ? ff_alternate_vertical_scan : ff_alternate_horizontal_scan,
s->idsp.idct_permutation); 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. // 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(h->c.inter_matrix, h->c.idsp.idct_permutation, old_permutation);
permute_quant_matrix(s->intra_matrix, s->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) void ff_mpeg4_workaround_bugs(AVCodecContext *avctx)
@@ -3735,7 +3737,7 @@ void ff_mpeg4_workaround_bugs(AVCodecContext *avctx)
if (ctx->xvid_build >= 0 && if (ctx->xvid_build >= 0 &&
avctx->idct_algo == FF_IDCT_AUTO && !h->c.studio_profile) { 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; ac_val1[i + 8] = level;
} }
} }
st[n] = s->c.permutated_intra_h_scantable; st[n] = s->permutated_intra_h_scantable;
} else { } else {
const int xy = s->c.mb_x - 1 + s->c.mb_y * s->c.mb_stride; const int xy = s->c.mb_x - 1 + s->c.mb_y * s->c.mb_stride;
/* left prediction */ /* 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]]; 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 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->inter_scantable, ff_zigzag_direct);
ff_init_scantable(s->idsp.idct_permutation, &s->intra_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) 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 /* WARNING: changes above this line require updates to hardcoded
* offsets used in ASM. */ * offsets used in ASM. */
uint8_t permutated_intra_h_scantable[64];
uint8_t permutated_intra_v_scantable[64];
struct AVCodecContext *avctx; struct AVCodecContext *avctx;
/* The following pointer is intended for codecs sharing code /* The following pointer is intended for codecs sharing code
* between decoder and encoder and in need of a common context to do so. */ * 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; 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 DECLARE_ALIGNED_32(int16_t, blocks)[2][12][64]; // for HQ mode we need to keep the best block
} MPVEncContext; } MPVEncContext;

View File

@@ -118,7 +118,9 @@ static av_cold void msmpeg4_common_init_static(void)
init_h263_dc_for_msmpeg4(); 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; 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; 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->intra_scantable, ff_wmv1_scantable[1]);
ff_init_scantable(s->idsp.idct_permutation, &s->inter_scantable, ff_wmv1_scantable[0]); 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); 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); s->idsp.idct_permutation);
break; break;
} }

View File

@@ -31,7 +31,9 @@
#define DC_MAX 119 #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, int ff_msmpeg4_coded_block_pred(MpegEncContext * s, int n,
uint8_t **coded_block_ptr); 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 (h->c.ac_pred) {
if (dc_pred_dir == 0) if (dc_pred_dir == 0)
scan_table = h->c.permutated_intra_v_scantable; /* left */ scan_table = h->permutated_intra_v_scantable; /* left */
else else
scan_table = h->c.permutated_intra_h_scantable; /* top */ scan_table = h->permutated_intra_h_scantable; /* top */
} else { } else {
scan_table = h->c.intra_scantable.permutated; 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; 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) { switch (h->c.msmpeg4_version) {
case MSMP4_V1: case MSMP4_V1:

View File

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