mirror of
https://mirror.skon.top/https://github.com/FFmpeg/FFmpeg
synced 2026-04-20 12:50:49 +08:00
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:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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. */
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user