From 3d1656ba8bae3fb1820bca9b929aeb41b2d28b8f Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Wed, 19 Mar 2025 15:24:57 +0100
Subject: [PATCH 77/77] avcodec/mpegvideo: Only keep the actually used
 unquantize funcs

For all encoders and all decoders except MPEG-4 the unquantize
functions to use don't change at all and therefore needn't be
kept in the context. So discard them after setting them;
for MPEG-4, the functions get assigned on a per-frame basis.

Decoders not using any unquantize functions (H.261, MPEG-1/2)
as well as decoders that only call ff_mpv_reconstruct_mb()
through error resilience (RV30/40, the VC-1 family) don't have
the remaining pointers set at all.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
 libavcodec/arm/mpegvideo_arm.c        |  5 ++--
 libavcodec/arm/mpegvideo_arm.h        |  4 +--
 libavcodec/arm/mpegvideo_armv5te.c    |  2 +-
 libavcodec/h263dec.c                  | 15 ++++-------
 libavcodec/mips/mpegvideo_init_mips.c |  9 ++++---
 libavcodec/mpeg4videodec.c            | 13 +++++++++
 libavcodec/mpeg4videodec.h            |  5 ++++
 libavcodec/mpegvideo.c                |  2 --
 libavcodec/mpegvideo.h                | 12 ---------
 libavcodec/mpegvideo_enc.c            | 34 +++++++++++++++++-------
 libavcodec/mpegvideo_unquantize.c     | 15 ++++++-----
 libavcodec/mpegvideo_unquantize.h     | 38 ++++++++++++++++++++++-----
 libavcodec/neon/mpegvideo.c           |  3 ++-
 libavcodec/ppc/mpegvideo_altivec.c    |  7 ++---
 libavcodec/x86/mpegvideo.c            |  5 ++--
 15 files changed, 108 insertions(+), 61 deletions(-)

diff --git a/libavcodec/arm/mpegvideo_arm.c b/libavcodec/arm/mpegvideo_arm.c
index e32451b554..e5e418b6c4 100644
--- a/libavcodec/arm/mpegvideo_arm.c
+++ b/libavcodec/arm/mpegvideo_arm.c
@@ -46,12 +46,13 @@ void ff_dct_unquantize_h263_inter_neon(MpegEncContext *s, int16_t *block,
 void ff_dct_unquantize_h263_intra_neon(MpegEncContext *s, int16_t *block,
                                        int n, int qscale);
 
-av_cold void ff_mpv_common_init_arm(MpegEncContext *s)
+av_cold void ff_mpv_unquantize_init_arm(MPVUnquantDSPContext *s,
+                                        AVCodecContext *avctx)
 {
     int cpu_flags = av_get_cpu_flags();
 
     if (have_armv5te(cpu_flags))
-        ff_mpv_common_init_armv5te(s);
+        ff_mpv_unquantize_init_armv5te(s);
 
     if (have_neon(cpu_flags)) {
         s->dct_unquantize_h263_intra = ff_dct_unquantize_h263_intra_neon;
diff --git a/libavcodec/arm/mpegvideo_arm.h b/libavcodec/arm/mpegvideo_arm.h
index 709ae6b247..93da7a5664 100644
--- a/libavcodec/arm/mpegvideo_arm.h
+++ b/libavcodec/arm/mpegvideo_arm.h
@@ -19,8 +19,8 @@
 #ifndef AVCODEC_ARM_MPEGVIDEO_ARM_H
 #define AVCODEC_ARM_MPEGVIDEO_ARM_H
 
-#include "libavcodec/mpegvideo.h"
+#include "libavcodec/mpegvideo_unquantize.h"
 
-void ff_mpv_common_init_armv5te(MpegEncContext *s);
+void ff_mpv_unquantize_init_armv5te(MPVUnquantDSPContext *s);
 
 #endif /* AVCODEC_ARM_MPEGVIDEO_ARM_H */
diff --git a/libavcodec/arm/mpegvideo_armv5te.c b/libavcodec/arm/mpegvideo_armv5te.c
index e20bb4c645..2737f68643 100644
--- a/libavcodec/arm/mpegvideo_armv5te.c
+++ b/libavcodec/arm/mpegvideo_armv5te.c
@@ -95,7 +95,7 @@ static void dct_unquantize_h263_inter_armv5te(MpegEncContext *s,
     ff_dct_unquantize_h263_armv5te(block, qmul, qadd, nCoeffs + 1);
 }
 
-av_cold void ff_mpv_common_init_armv5te(MpegEncContext *s)
+av_cold void ff_mpv_unquantize_init_armv5te(MPVUnquantDSPContext *s)
 {
     s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_armv5te;
     s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_armv5te;
diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c
index 8434f6e7cf..8d00e5bf3d 100644
--- a/libavcodec/h263dec.c
+++ b/libavcodec/h263dec.c
@@ -44,6 +44,7 @@
 #include "mpegvideo.h"
 #include "mpegvideodata.h"
 #include "mpegvideodec.h"
+#include "mpegvideo_unquantize.h"
 #include "msmpeg4dec.h"
 #include "thread.h"
 #include "wmv2dec.h"
@@ -90,6 +91,7 @@ static enum AVPixelFormat h263_get_format(AVCodecContext *avctx)
 av_cold int ff_h263_decode_init(AVCodecContext *avctx)
 {
     MpegEncContext *s = avctx->priv_data;
+    MPVUnquantDSPContext unquant_dsp_ctx;
     int ret;
 
     s->out_format      = FMT_H263;
@@ -105,10 +107,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_mpv_unquantize_init(&unquant_dsp_ctx, avctx, 0);
     // dct_unquantize defaults for H.263;
     // they might change on a per-frame basis for MPEG-4.
-    s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
-    s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
+    s->dct_unquantize_intra = unquant_dsp_ctx.dct_unquantize_h263_intra;
+    s->dct_unquantize_inter = unquant_dsp_ctx.dct_unquantize_h263_inter;
 
     /* select sub codec */
     switch (avctx->codec->id) {
@@ -117,9 +120,6 @@ av_cold int ff_h263_decode_init(AVCodecContext *avctx)
         avctx->chroma_sample_location = AVCHROMA_LOC_CENTER;
         break;
     case AV_CODEC_ID_MPEG4:
-        // dct_unquantize_inter is only used with MPEG-2 quantizers,
-        // so we can already set dct_unquantize_inter here once and for all.
-        s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
         break;
     case AV_CODEC_ID_MSMPEG4V1:
         s->h263_pred       = 1;
@@ -508,11 +508,6 @@ retry:
             goto retry;
         if (s->studio_profile != (s->idsp.idct == NULL))
             ff_mpv_idct_init(s);
-        if (s->mpeg_quant) {
-            s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
-        } else {
-            s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
-        }
     }
 
     /* After H.263 & MPEG-4 header decode we have the height, width,
diff --git a/libavcodec/mips/mpegvideo_init_mips.c b/libavcodec/mips/mpegvideo_init_mips.c
index a9acae94ce..0de8245460 100644
--- a/libavcodec/mips/mpegvideo_init_mips.c
+++ b/libavcodec/mips/mpegvideo_init_mips.c
@@ -24,7 +24,8 @@
 #include "h263dsp_mips.h"
 #include "mpegvideo_mips.h"
 
-av_cold void ff_mpv_common_init_mips(MpegEncContext *s)
+av_cold void ff_mpv_unquantize_init_mips(MPVUnquantDSPContext *s,
+                                         AVCodecContext *avctx, int q_scale_type)
 {
     int cpu_flags = av_get_cpu_flags();
 
@@ -34,15 +35,15 @@ av_cold void ff_mpv_common_init_mips(MpegEncContext *s)
         s->dct_unquantize_mpeg1_intra = ff_dct_unquantize_mpeg1_intra_mmi;
         s->dct_unquantize_mpeg1_inter = ff_dct_unquantize_mpeg1_inter_mmi;
 
-        if (!(s->avctx->flags & AV_CODEC_FLAG_BITEXACT))
-            if (!s->q_scale_type)
+        if (!(avctx->flags & AV_CODEC_FLAG_BITEXACT))
+            if (!q_scale_type)
                 s->dct_unquantize_mpeg2_intra = ff_dct_unquantize_mpeg2_intra_mmi;
     }
 
     if (have_msa(cpu_flags)) {
         s->dct_unquantize_h263_intra = ff_dct_unquantize_h263_intra_msa;
         s->dct_unquantize_h263_inter = ff_dct_unquantize_h263_inter_msa;
-        if (!s->q_scale_type)
+        if (!q_scale_type)
             s->dct_unquantize_mpeg2_inter = ff_dct_unquantize_mpeg2_inter_msa;
     }
 }
diff --git a/libavcodec/mpeg4videodec.c b/libavcodec/mpeg4videodec.c
index 139b6d4b08..8803801b63 100644
--- a/libavcodec/mpeg4videodec.c
+++ b/libavcodec/mpeg4videodec.c
@@ -35,6 +35,7 @@
 #include "mpegvideo.h"
 #include "mpegvideodata.h"
 #include "mpegvideodec.h"
+#include "mpegvideo_unquantize.h"
 #include "mpeg4video.h"
 #include "mpeg4videodata.h"
 #include "mpeg4videodec.h"
@@ -3390,6 +3391,9 @@ static int decode_vop_header(Mpeg4DecContext *ctx, GetBitContext *gb,
         }
     }
 
+    s->dct_unquantize_intra = s->mpeg_quant ? ctx->dct_unquantize_mpeg2_intra
+                                            : ctx->dct_unquantize_h263_intra;
+
 end:
     /* detect buggy encoders which don't set the low_delay flag
      * (divx4/xvid/opendivx). Note we cannot detect divx5 without B-frames
@@ -3862,6 +3866,7 @@ static av_cold int decode_init(AVCodecContext *avctx)
     static AVOnce init_static_once = AV_ONCE_INIT;
     Mpeg4DecContext *ctx = avctx->priv_data;
     MpegEncContext *s = &ctx->m;
+    MPVUnquantDSPContext unquant_dsp_ctx;
     int ret;
 
     ctx->divx_version =
@@ -3872,6 +3877,14 @@ static av_cold int decode_init(AVCodecContext *avctx)
     if ((ret = ff_h263_decode_init(avctx)) < 0)
         return ret;
 
+    ff_mpv_unquantize_init(&unquant_dsp_ctx, avctx, 0);
+
+    ctx->dct_unquantize_h263_intra  = unquant_dsp_ctx.dct_unquantize_h263_intra;
+    ctx->dct_unquantize_mpeg2_intra = unquant_dsp_ctx.dct_unquantize_mpeg2_intra;
+    // dct_unquantize_inter is only used with MPEG-2 quantizers,
+    // so we can already set dct_unquantize_inter here once and for all.
+    s->dct_unquantize_inter = unquant_dsp_ctx.dct_unquantize_mpeg2_inter;
+
     s->h263_pred = 1;
     s->low_delay = 0; /* default, might be overridden in the vol header during header parsing */
     s->decode_mb = mpeg4_decode_mb;
diff --git a/libavcodec/mpeg4videodec.h b/libavcodec/mpeg4videodec.h
index bb14d24c88..3a254f2838 100644
--- a/libavcodec/mpeg4videodec.h
+++ b/libavcodec/mpeg4videodec.h
@@ -88,6 +88,11 @@ typedef struct Mpeg4DecContext {
 
     Mpeg4VideoDSPContext mdsp;
 
+    void (*dct_unquantize_mpeg2_intra)(MpegEncContext *s,
+                                       int16_t *block/*align 16*/, int n, int qscale);
+    void (*dct_unquantize_h263_intra)(MpegEncContext *s,
+                                      int16_t *block/*align 16*/, int n, int qscale);
+
     DECLARE_ALIGNED(8, int32_t, block32)[12][64];
     // 0 = DCT, 1 = DPCM top to bottom scan, -1 = DPCM bottom to top scan
     int dpcm_direction;
diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c
index 9a40937bbd..794b2d0f66 100644
--- a/libavcodec/mpegvideo.c
+++ b/libavcodec/mpegvideo.c
@@ -112,8 +112,6 @@ av_cold void ff_mpv_idct_init(MpegEncContext *s)
                          s->idsp.idct_permutation);
     ff_permute_scantable(s->permutated_intra_v_scantable, ff_alternate_vertical_scan,
                          s->idsp.idct_permutation);
-
-    ff_mpv_unquantize_init(s);
 }
 
 static av_cold int init_duplicate_context(MpegEncContext *s)
diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h
index 7379160159..2d60c9ddf0 100644
--- a/libavcodec/mpegvideo.h
+++ b/libavcodec/mpegvideo.h
@@ -326,18 +326,6 @@ typedef struct MpegEncContext {
 #define SLICE_END       -2 ///<end marker found
 #define SLICE_NOEND     -3 ///<no end marker or error found but mb count exceeded
 
-    void (*dct_unquantize_mpeg1_intra)(struct MpegEncContext *s,
-                           int16_t *block/*align 16*/, int n, int qscale);
-    void (*dct_unquantize_mpeg1_inter)(struct MpegEncContext *s,
-                           int16_t *block/*align 16*/, int n, int qscale);
-    void (*dct_unquantize_mpeg2_intra)(struct MpegEncContext *s,
-                           int16_t *block/*align 16*/, int n, int qscale);
-    void (*dct_unquantize_mpeg2_inter)(struct MpegEncContext *s,
-                           int16_t *block/*align 16*/, int n, int qscale);
-    void (*dct_unquantize_h263_intra)(struct MpegEncContext *s,
-                           int16_t *block/*align 16*/, int n, int qscale);
-    void (*dct_unquantize_h263_inter)(struct MpegEncContext *s,
-                           int16_t *block/*align 16*/, int n, int qscale);
     void (*dct_unquantize_intra)(struct MpegEncContext *s, // unquantizer to use (MPEG-4 can use both)
                            int16_t *block/*align 16*/, int n, int qscale);
     void (*dct_unquantize_inter)(struct MpegEncContext *s, // unquantizer to use (MPEG-4 can use both)
diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c
index 95d774155a..7be485bcad 100644
--- a/libavcodec/mpegvideo_enc.c
+++ b/libavcodec/mpegvideo_enc.c
@@ -60,6 +60,7 @@
 #include "mjpegenc_common.h"
 #include "mathops.h"
 #include "mpegutils.h"
+#include "mpegvideo_unquantize.h"
 #include "mjpegenc.h"
 #include "speedhqenc.h"
 #include "msmpeg4enc.h"
@@ -310,6 +311,24 @@ av_cold void ff_dct_encode_init(MPVEncContext *const s)
         s->dct_quantize  = dct_quantize_trellis_c;
 }
 
+static av_cold void init_unquantize(MpegEncContext *const s, AVCodecContext *avctx)
+{
+    MPVUnquantDSPContext unquant_dsp_ctx;
+
+    ff_mpv_unquantize_init(&unquant_dsp_ctx, avctx, s->q_scale_type);
+
+    if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
+        s->dct_unquantize_intra = unquant_dsp_ctx.dct_unquantize_mpeg2_intra;
+        s->dct_unquantize_inter = unquant_dsp_ctx.dct_unquantize_mpeg2_inter;
+    } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
+        s->dct_unquantize_intra = unquant_dsp_ctx.dct_unquantize_h263_intra;
+        s->dct_unquantize_inter = unquant_dsp_ctx.dct_unquantize_h263_inter;
+    } else {
+        s->dct_unquantize_intra = unquant_dsp_ctx.dct_unquantize_mpeg1_intra;
+        s->dct_unquantize_inter = unquant_dsp_ctx.dct_unquantize_mpeg1_inter;
+    }
+}
+
 static av_cold int me_cmp_init(MPVMainEncContext *const m, AVCodecContext *avctx)
 {
     MPVEncContext *const s = &m->s;
@@ -1013,6 +1032,7 @@ av_cold int ff_mpv_encode_init(AVCodecContext *avctx)
      * to the slice contexts, so we initialize various fields of it
      * before calling ff_mpv_common_init(). */
     ff_mpv_idct_init(&s->c);
+    init_unquantize(&s->c, avctx);
     ff_fdctdsp_init(&s->fdsp, avctx);
     ff_mpegvideoencdsp_init(&s->mpvencdsp, avctx);
     ff_pixblockdsp_init(&s->pdsp, avctx);
@@ -1031,15 +1051,11 @@ av_cold int ff_mpv_encode_init(AVCodecContext *avctx)
 
     ff_dct_encode_init(s);
 
-    if (s->c.mpeg_quant || s->c.codec_id == AV_CODEC_ID_MPEG2VIDEO) {
-        s->c.dct_unquantize_intra = s->c.dct_unquantize_mpeg2_intra;
-        s->c.dct_unquantize_inter = s->c.dct_unquantize_mpeg2_inter;
-    } else if (s->c.out_format == FMT_H263 || s->c.out_format == FMT_H261) {
-        s->c.dct_unquantize_intra = s->c.dct_unquantize_h263_intra;
-        s->c.dct_unquantize_inter = s->c.dct_unquantize_h263_inter;
-    } else {
-        s->c.dct_unquantize_intra = s->c.dct_unquantize_mpeg1_intra;
-        s->c.dct_unquantize_inter = s->c.dct_unquantize_mpeg1_inter;
+    if (s->c.slice_context_count > 1) {
+        s->rtp_mode = 1;
+
+        if (avctx->codec_id == AV_CODEC_ID_H263P)
+            s->c.h263_slice_structured = 1;
     }
 
     if (CONFIG_H263_ENCODER && s->c.out_format == FMT_H263) {
diff --git a/libavcodec/mpegvideo_unquantize.c b/libavcodec/mpegvideo_unquantize.c
index 12bacdf424..fe45f350d7 100644
--- a/libavcodec/mpegvideo_unquantize.c
+++ b/libavcodec/mpegvideo_unquantize.c
@@ -246,28 +246,29 @@ static void dct_unquantize_h263_inter_c(MpegEncContext *s,
     }
 }
 
-av_cold void ff_mpv_unquantize_init(MpegEncContext *s)
+av_cold void ff_mpv_unquantize_init(MPVUnquantDSPContext *s,
+                                    AVCodecContext *avctx, int q_scale_type)
 {
     s->dct_unquantize_h263_intra  = dct_unquantize_h263_intra_c;
     s->dct_unquantize_h263_inter  = dct_unquantize_h263_inter_c;
     s->dct_unquantize_mpeg1_intra = dct_unquantize_mpeg1_intra_c;
     s->dct_unquantize_mpeg1_inter = dct_unquantize_mpeg1_inter_c;
     s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_c;
-    if (s->avctx->flags & AV_CODEC_FLAG_BITEXACT)
+    if (avctx->flags & AV_CODEC_FLAG_BITEXACT)
         s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_bitexact;
     s->dct_unquantize_mpeg2_inter = dct_unquantize_mpeg2_inter_c;
 
 #if HAVE_INTRINSICS_NEON
-    ff_mpv_common_init_neon(s);
+    ff_mpv_unquantize_init_neon(s, avctx);
 #endif
 
 #if ARCH_ARM
-    ff_mpv_common_init_arm(s);
+    ff_mpv_unquantize_init_arm(s, avctx);
 #elif ARCH_PPC
-    ff_mpv_common_init_ppc(s);
+    ff_mpv_unquantize_init_ppc(s, avctx);
 #elif ARCH_X86
-    ff_mpv_common_init_x86(s);
+    ff_mpv_unquantize_init_x86(s, avctx);
 #elif ARCH_MIPS
-    ff_mpv_common_init_mips(s);
+    ff_mpv_unquantize_init_mips(s. avctx, q_scale_type);
 #endif
 }
diff --git a/libavcodec/mpegvideo_unquantize.h b/libavcodec/mpegvideo_unquantize.h
index 1e7590561c..cfa349cccd 100644
--- a/libavcodec/mpegvideo_unquantize.h
+++ b/libavcodec/mpegvideo_unquantize.h
@@ -25,13 +25,39 @@
 #ifndef AVCODEC_MPEGVIDEO_UNQUANTIZE_H
 #define AVCODEC_MPEGVIDEO_UNQUANTIZE_H
 
+#include <stdint.h>
+
+#include "config.h"
+
+typedef struct AVCodecContext AVCodecContext;
 typedef struct MpegEncContext MpegEncContext;
 
-void ff_mpv_unquantize_init(MpegEncContext *s);
-void ff_mpv_common_init_arm(MpegEncContext *s);
-void ff_mpv_common_init_neon(MpegEncContext *s);
-void ff_mpv_common_init_ppc(MpegEncContext *s);
-void ff_mpv_common_init_x86(MpegEncContext *s);
-void ff_mpv_common_init_mips(MpegEncContext *s);
+typedef struct MPVUnquantDSPContext {
+    void (*dct_unquantize_mpeg1_intra)(struct MpegEncContext *s,
+                           int16_t *block/*align 16*/, int n, int qscale);
+    void (*dct_unquantize_mpeg1_inter)(struct MpegEncContext *s,
+                           int16_t *block/*align 16*/, int n, int qscale);
+    void (*dct_unquantize_mpeg2_intra)(struct MpegEncContext *s,
+                           int16_t *block/*align 16*/, int n, int qscale);
+    void (*dct_unquantize_mpeg2_inter)(struct MpegEncContext *s,
+                           int16_t *block/*align 16*/, int n, int qscale);
+    void (*dct_unquantize_h263_intra)(struct MpegEncContext *s,
+                           int16_t *block/*align 16*/, int n, int qscale);
+    void (*dct_unquantize_h263_inter)(struct MpegEncContext *s,
+                           int16_t *block/*align 16*/, int n, int qscale);
+} MPVUnquantDSPContext;
+
+#if !ARCH_MIPS
+#define ff_mpv_unquantize_init(s, avctx, q_scale_type) ff_mpv_unquantize_init(s, avctx)
+#endif
+
+void ff_mpv_unquantize_init(MPVUnquantDSPContext *s,
+                            AVCodecContext *avctx, int q_scale_type);
+void ff_mpv_unquantize_init_arm(MPVUnquantDSPContext *s, AVCodecContext *avctx);
+void ff_mpv_unquantize_init_neon(MPVUnquantDSPContext *s, AVCodecContext *avctx);
+void ff_mpv_unquantize_init_ppc(MPVUnquantDSPContext *s, AVCodecContext *avctx);
+void ff_mpv_unquantize_init_x86(MPVUnquantDSPContext *s, AVCodecContext *avctx);
+void ff_mpv_unquantize_init_mips(MPVUnquantDSPContext *s, AVCodecContext *avctx,
+                                 int q_scale_type);
 
 #endif /* AVCODEC_MPEGVIDEO_UNQUANTIZE_H */
diff --git a/libavcodec/neon/mpegvideo.c b/libavcodec/neon/mpegvideo.c
index a8b2a0606d..24cf8fe9b2 100644
--- a/libavcodec/neon/mpegvideo.c
+++ b/libavcodec/neon/mpegvideo.c
@@ -125,7 +125,8 @@ static void dct_unquantize_h263_intra_neon(MpegEncContext *s, int16_t *block,
 }
 
 
-av_cold void ff_mpv_common_init_neon(MpegEncContext *s)
+av_cold void ff_mpv_unquantize_init_neon(MPVUnquantDSPContext *s,
+                                         AVCodecContext *avctx)
 {
     int cpu_flags = av_get_cpu_flags();
 
diff --git a/libavcodec/ppc/mpegvideo_altivec.c b/libavcodec/ppc/mpegvideo_altivec.c
index c361ca7857..f2801fdd50 100644
--- a/libavcodec/ppc/mpegvideo_altivec.c
+++ b/libavcodec/ppc/mpegvideo_altivec.c
@@ -117,14 +117,15 @@ static void dct_unquantize_h263_altivec(MpegEncContext *s,
 
 #endif /* HAVE_ALTIVEC */
 
-av_cold void ff_mpv_common_init_ppc(MpegEncContext *s)
+av_cold void ff_mpv_unquantize_init_ppc(MPVUnquantDSPContext *s,
+                                        AVCodecContext *avctx)
 {
 #if HAVE_ALTIVEC
     if (!PPC_ALTIVEC(av_get_cpu_flags()))
         return;
 
-    if ((s->avctx->dct_algo == FF_DCT_AUTO) ||
-        (s->avctx->dct_algo == FF_DCT_ALTIVEC)) {
+    if ((avctx->dct_algo == FF_DCT_AUTO) ||
+        (avctx->dct_algo == FF_DCT_ALTIVEC)) {
         s->dct_unquantize_h263_intra = dct_unquantize_h263_altivec;
         s->dct_unquantize_h263_inter = dct_unquantize_h263_altivec;
     }
diff --git a/libavcodec/x86/mpegvideo.c b/libavcodec/x86/mpegvideo.c
index 11a5ee474b..2d026afc41 100644
--- a/libavcodec/x86/mpegvideo.c
+++ b/libavcodec/x86/mpegvideo.c
@@ -450,7 +450,8 @@ __asm__ volatile(
 
 #endif /* HAVE_MMX_INLINE */
 
-av_cold void ff_mpv_common_init_x86(MpegEncContext *s)
+av_cold void ff_mpv_unquantize_init_x86(MPVUnquantDSPContext *s,
+                                        AVCodecContext *avctx)
 {
 #if HAVE_MMX_INLINE
     int cpu_flags = av_get_cpu_flags();
@@ -460,7 +461,7 @@ av_cold void ff_mpv_common_init_x86(MpegEncContext *s)
         s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_mmx;
         s->dct_unquantize_mpeg1_intra = dct_unquantize_mpeg1_intra_mmx;
         s->dct_unquantize_mpeg1_inter = dct_unquantize_mpeg1_inter_mmx;
-        if (!(s->avctx->flags & AV_CODEC_FLAG_BITEXACT))
+        if (!(avctx->flags & AV_CODEC_FLAG_BITEXACT))
             s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_mmx;
         s->dct_unquantize_mpeg2_inter = dct_unquantize_mpeg2_inter_mmx;
     }
-- 
2.45.2