[FFmpeg-devel] [PATCH] avcodec/mpegvideo: Remove spec-incompliant inverse quantisation

Andreas Rheinhardt andreas.rheinhardt at outlook.com
Mon Oct 30 15:11:27 EET 2023


Section 7.4.4 of the MPEG-2 specifications requires that the
last bit of the last coefficient be toggled so that the sum
of all coefficients is odd; both our decoder and encoder
did this only if the bitexact flag has been set (although
stuff like this should be behind AV_CODEC_FLAG2_FAST).
This patch changes this by removing the spec-incompliant
functions.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
---
 libavcodec/mips/mpegvideo_init_mips.c |  4 --
 libavcodec/mips/mpegvideo_mips.h      |  2 -
 libavcodec/mips/mpegvideo_mmi.c       | 93 ---------------------------
 libavcodec/mpegvideo.c                | 32 ---------
 libavcodec/x86/mpegvideo.c            | 72 ---------------------
 5 files changed, 203 deletions(-)

diff --git a/libavcodec/mips/mpegvideo_init_mips.c b/libavcodec/mips/mpegvideo_init_mips.c
index f687ad18f1..1b383ee3f5 100644
--- a/libavcodec/mips/mpegvideo_init_mips.c
+++ b/libavcodec/mips/mpegvideo_init_mips.c
@@ -33,10 +33,6 @@ 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)
-                s->dct_unquantize_mpeg2_intra = ff_dct_unquantize_mpeg2_intra_mmi;
-
         s->denoise_dct= ff_denoise_dct_mmi;
     }
 
diff --git a/libavcodec/mips/mpegvideo_mips.h b/libavcodec/mips/mpegvideo_mips.h
index 760d7b3295..0bc0e375bd 100644
--- a/libavcodec/mips/mpegvideo_mips.h
+++ b/libavcodec/mips/mpegvideo_mips.h
@@ -31,8 +31,6 @@ void ff_dct_unquantize_mpeg1_intra_mmi(MpegEncContext *s, int16_t *block,
         int n, int qscale);
 void ff_dct_unquantize_mpeg1_inter_mmi(MpegEncContext *s, int16_t *block,
         int n, int qscale);
-void ff_dct_unquantize_mpeg2_intra_mmi(MpegEncContext *s, int16_t *block,
-        int n, int qscale);
 void ff_denoise_dct_mmi(MpegEncContext *s, int16_t *block);
 
 #endif /* AVCODEC_MIPS_MPEGVIDEO_MIPS_H */
diff --git a/libavcodec/mips/mpegvideo_mmi.c b/libavcodec/mips/mpegvideo_mmi.c
index 3d5b5e20ab..d0bf1a3c10 100644
--- a/libavcodec/mips/mpegvideo_mmi.c
+++ b/libavcodec/mips/mpegvideo_mmi.c
@@ -342,99 +342,6 @@ void ff_dct_unquantize_mpeg1_inter_mmi(MpegEncContext *s, int16_t *block,
     );
 }
 
-void ff_dct_unquantize_mpeg2_intra_mmi(MpegEncContext *s, int16_t *block,
-        int n, int qscale)
-{
-    uint64_t nCoeffs;
-    const uint16_t *quant_matrix;
-    int block0;
-    double ftmp[10];
-    uint64_t tmp[1];
-    mips_reg addr[1];
-    DECLARE_VAR_ALL64;
-    DECLARE_VAR_ADDRT;
-
-    assert(s->block_last_index[n]>=0);
-
-    if (s->alternate_scan)
-        nCoeffs = 63;
-    else
-        nCoeffs = s->intra_scantable.raster_end[s->block_last_index[n]];
-
-    if (n < 4)
-        block0 = block[0] * s->y_dc_scale;
-    else
-        block0 = block[0] * s->c_dc_scale;
-
-    quant_matrix = s->intra_matrix;
-
-    __asm__ volatile (
-        "dli        %[tmp0],    0x0f                                    \n\t"
-        "pcmpeqh    %[ftmp0],   %[ftmp0],       %[ftmp0]                \n\t"
-        "mtc1       %[tmp0],    %[ftmp3]                                \n\t"
-        "mtc1       %[qscale],  %[ftmp9]                                \n\t"
-        "psrlh      %[ftmp0],   %[ftmp0],       %[ftmp3]                \n\t"
-        "packsswh   %[ftmp9],   %[ftmp9],       %[ftmp9]                \n\t"
-        "packsswh   %[ftmp9],   %[ftmp9],       %[ftmp9]                \n\t"
-        "or         %[addr0],   %[nCoeffs],     $0                      \n\t"
-        ".p2align   4                                                   \n\t"
-
-        "1:                                                             \n\t"
-        MMI_LDXC1(%[ftmp1], %[addr0], %[block], 0x00)
-        MMI_LDXC1(%[ftmp2], %[addr0], %[block], 0x08)
-        "mov.d      %[ftmp3],   %[ftmp1]                                \n\t"
-        "mov.d      %[ftmp4],   %[ftmp2]                                \n\t"
-        MMI_LDXC1(%[ftmp5], %[addr0], %[quant], 0x00)
-        MMI_LDXC1(%[ftmp6], %[addr0], %[quant], 0x08)
-        "pmullh     %[ftmp5],   %[ftmp5],       %[ftmp9]                \n\t"
-        "pmullh     %[ftmp6],   %[ftmp6],       %[ftmp9]                \n\t"
-        "pxor       %[ftmp7],   %[ftmp7],       %[ftmp7]                \n\t"
-        "pxor       %[ftmp8],   %[ftmp8],       %[ftmp8]                \n\t"
-        "pcmpgth    %[ftmp7],   %[ftmp7],       %[ftmp1]                \n\t"
-        "pcmpgth    %[ftmp8],   %[ftmp8],       %[ftmp2]                \n\t"
-        "pxor       %[ftmp1],   %[ftmp1],       %[ftmp7]                \n\t"
-        "pxor       %[ftmp2],   %[ftmp2],       %[ftmp8]                \n\t"
-        "psubh      %[ftmp1],   %[ftmp1],       %[ftmp7]                \n\t"
-        "psubh      %[ftmp2],   %[ftmp2],       %[ftmp8]                \n\t"
-        "pmullh     %[ftmp1],   %[ftmp1],       %[ftmp5]                \n\t"
-        "pmullh     %[ftmp2],   %[ftmp2],       %[ftmp6]                \n\t"
-        "pxor       %[ftmp5],   %[ftmp5],       %[ftmp5]                \n\t"
-        "pxor       %[ftmp6],   %[ftmp6],       %[ftmp6]                \n\t"
-        "pcmpeqh    %[ftmp5],   %[ftmp5],       %[ftmp3]                \n\t"
-        "dli        %[tmp0],    0x03                                    \n\t"
-        "pcmpeqh    %[ftmp6] ,  %[ftmp6],       %[ftmp4]                \n\t"
-        "mtc1       %[tmp0],    %[ftmp3]                                \n\t"
-        "psrah      %[ftmp1],   %[ftmp1],       %[ftmp3]                \n\t"
-        "psrah      %[ftmp2],   %[ftmp2],       %[ftmp3]                \n\t"
-        "pxor       %[ftmp1],   %[ftmp1],       %[ftmp7]                \n\t"
-        "pxor       %[ftmp2],   %[ftmp2],       %[ftmp8]                \n\t"
-        "psubh      %[ftmp1],   %[ftmp1],       %[ftmp7]                \n\t"
-        "psubh      %[ftmp2],   %[ftmp2],       %[ftmp8]                \n\t"
-        "pandn      %[ftmp5],   %[ftmp5],       %[ftmp1]                \n\t"
-        "pandn      %[ftmp6],   %[ftmp6],       %[ftmp2]                \n\t"
-        MMI_SDXC1(%[ftmp5], %[addr0], %[block], 0x00)
-        MMI_SDXC1(%[ftmp6], %[addr0], %[block], 0x08)
-        PTR_ADDIU  "%[addr0],   %[addr0],       0x10                    \n\t"
-        "blez       %[addr0],   1b                                      \n\t"
-        : [ftmp0]"=&f"(ftmp[0]),            [ftmp1]"=&f"(ftmp[1]),
-          [ftmp2]"=&f"(ftmp[2]),            [ftmp3]"=&f"(ftmp[3]),
-          [ftmp4]"=&f"(ftmp[4]),            [ftmp5]"=&f"(ftmp[5]),
-          [ftmp6]"=&f"(ftmp[6]),            [ftmp7]"=&f"(ftmp[7]),
-          [ftmp8]"=&f"(ftmp[8]),            [ftmp9]"=&f"(ftmp[9]),
-          [tmp0]"=&r"(tmp[0]),
-          RESTRICT_ASM_ALL64
-          RESTRICT_ASM_ADDRT
-          [addr0]"=&r"(addr[0])
-        : [block]"r"((mips_reg)(block+nCoeffs)),
-          [quant]"r"((mips_reg)(quant_matrix+nCoeffs)),
-          [nCoeffs]"r"((mips_reg)(2*(-nCoeffs))),
-          [qscale]"r"(qscale)
-        : "memory"
-    );
-
-    block[0]= block0;
-}
-
 void ff_denoise_dct_mmi(MpegEncContext *s, int16_t *block)
 {
     const int intra = s->mb_intra;
diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c
index 81796e42bb..dadb8462e1 100644
--- a/libavcodec/mpegvideo.c
+++ b/libavcodec/mpegvideo.c
@@ -104,36 +104,6 @@ static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
 {
     int i, level, nCoeffs;
     const uint16_t *quant_matrix;
-
-    if (s->q_scale_type) qscale = ff_mpeg2_non_linear_qscale[qscale];
-    else                 qscale <<= 1;
-
-    if(s->alternate_scan) nCoeffs= 63;
-    else nCoeffs= s->block_last_index[n];
-
-    block[0] *= n < 4 ? s->y_dc_scale : s->c_dc_scale;
-    quant_matrix = s->intra_matrix;
-    for(i=1;i<=nCoeffs;i++) {
-        int j= s->intra_scantable.permutated[i];
-        level = block[j];
-        if (level) {
-            if (level < 0) {
-                level = -level;
-                level = (int)(level * qscale * quant_matrix[j]) >> 4;
-                level = -level;
-            } else {
-                level = (int)(level * qscale * quant_matrix[j]) >> 4;
-            }
-            block[j] = level;
-        }
-    }
-}
-
-static void dct_unquantize_mpeg2_intra_bitexact(MpegEncContext *s,
-                                   int16_t *block, int n, int qscale)
-{
-    int i, level, nCoeffs;
-    const uint16_t *quant_matrix;
     int sum=-1;
 
     if (s->q_scale_type) qscale = ff_mpeg2_non_linear_qscale[qscale];
@@ -295,8 +265,6 @@ static av_cold int dct_init(MpegEncContext *s)
     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)
-        s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_bitexact;
     s->dct_unquantize_mpeg2_inter = dct_unquantize_mpeg2_inter_c;
 
 #if HAVE_INTRINSICS_NEON
diff --git a/libavcodec/x86/mpegvideo.c b/libavcodec/x86/mpegvideo.c
index 73967cafda..f3384dfaa5 100644
--- a/libavcodec/x86/mpegvideo.c
+++ b/libavcodec/x86/mpegvideo.c
@@ -23,7 +23,6 @@
 #include "libavutil/cpu.h"
 #include "libavutil/x86/asm.h"
 #include "libavutil/x86/cpu.h"
-#include "libavcodec/avcodec.h"
 #include "libavcodec/mpegvideo.h"
 #include "libavcodec/mpegvideodata.h"
 
@@ -300,75 +299,6 @@ __asm__ volatile(
         );
 }
 
-static void dct_unquantize_mpeg2_intra_mmx(MpegEncContext *s,
-                                     int16_t *block, int n, int qscale)
-{
-    x86_reg nCoeffs;
-    const uint16_t *quant_matrix;
-    int block0;
-
-    av_assert2(s->block_last_index[n]>=0);
-
-    if (s->q_scale_type) qscale = ff_mpeg2_non_linear_qscale[qscale];
-    else                 qscale <<= 1;
-
-    if(s->alternate_scan) nCoeffs= 63; //FIXME
-    else nCoeffs= s->intra_scantable.raster_end[ s->block_last_index[n] ];
-
-    if (n < 4)
-        block0 = block[0] * s->y_dc_scale;
-    else
-        block0 = block[0] * s->c_dc_scale;
-    quant_matrix = s->intra_matrix;
-__asm__ volatile(
-                "pcmpeqw %%mm7, %%mm7           \n\t"
-                "psrlw $15, %%mm7               \n\t"
-                "movd %2, %%mm6                 \n\t"
-                "packssdw %%mm6, %%mm6          \n\t"
-                "packssdw %%mm6, %%mm6          \n\t"
-                "mov %3, %%"FF_REG_a"           \n\t"
-                ".p2align 4                     \n\t"
-                "1:                             \n\t"
-                "movq (%0, %%"FF_REG_a"), %%mm0 \n\t"
-                "movq 8(%0, %%"FF_REG_a"), %%mm1\n\t"
-                "movq (%1, %%"FF_REG_a"), %%mm4 \n\t"
-                "movq 8(%1, %%"FF_REG_a"), %%mm5\n\t"
-                "pmullw %%mm6, %%mm4            \n\t" // q=qscale*quant_matrix[i]
-                "pmullw %%mm6, %%mm5            \n\t" // q=qscale*quant_matrix[i]
-                "pxor %%mm2, %%mm2              \n\t"
-                "pxor %%mm3, %%mm3              \n\t"
-                "pcmpgtw %%mm0, %%mm2           \n\t" // block[i] < 0 ? -1 : 0
-                "pcmpgtw %%mm1, %%mm3           \n\t" // block[i] < 0 ? -1 : 0
-                "pxor %%mm2, %%mm0              \n\t"
-                "pxor %%mm3, %%mm1              \n\t"
-                "psubw %%mm2, %%mm0             \n\t" // abs(block[i])
-                "psubw %%mm3, %%mm1             \n\t" // abs(block[i])
-                "pmullw %%mm4, %%mm0            \n\t" // abs(block[i])*q
-                "pmullw %%mm5, %%mm1            \n\t" // abs(block[i])*q
-                "pxor %%mm4, %%mm4              \n\t"
-                "pxor %%mm5, %%mm5              \n\t" // FIXME slow
-                "pcmpeqw (%0, %%"FF_REG_a"), %%mm4 \n\t" // block[i] == 0 ? -1 : 0
-                "pcmpeqw 8(%0, %%"FF_REG_a"), %%mm5\n\t" // block[i] == 0 ? -1 : 0
-                "psraw $4, %%mm0                \n\t"
-                "psraw $4, %%mm1                \n\t"
-                "pxor %%mm2, %%mm0              \n\t"
-                "pxor %%mm3, %%mm1              \n\t"
-                "psubw %%mm2, %%mm0             \n\t"
-                "psubw %%mm3, %%mm1             \n\t"
-                "pandn %%mm0, %%mm4             \n\t"
-                "pandn %%mm1, %%mm5             \n\t"
-                "movq %%mm4, (%0, %%"FF_REG_a") \n\t"
-                "movq %%mm5, 8(%0, %%"FF_REG_a")\n\t"
-
-                "add $16, %%"FF_REG_a"          \n\t"
-                "jng 1b                         \n\t"
-                ::"r" (block+nCoeffs), "r"(quant_matrix+nCoeffs), "rm" (qscale), "g" (-2*nCoeffs)
-                : "%"FF_REG_a, "memory"
-        );
-    block[0]= block0;
-        //Note, we do not do mismatch control for intra as errors cannot accumulate
-}
-
 static void dct_unquantize_mpeg2_inter_mmx(MpegEncContext *s,
                                      int16_t *block, int n, int qscale)
 {
@@ -461,8 +391,6 @@ 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))
-            s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_mmx;
         s->dct_unquantize_mpeg2_inter = dct_unquantize_mpeg2_inter_mmx;
     }
 #endif /* HAVE_MMX_INLINE */
-- 
2.34.1



More information about the ffmpeg-devel mailing list