[packages/libdv] - rel 7 - add patches from fedora - switch to gtk+2
baggins
baggins at pld-linux.org
Mon Jun 1 09:20:42 CEST 2026
commit 7ba6b0049b7f5ce912725b5e7042642d8def3d4b
Author: Jan Rękorajski <baggins at pld-linux.org>
Date: Mon Jun 1 09:20:14 2026 +0200
- rel 7
- add patches from fedora
- switch to gtk+2
libdv-dso-linking.patch | 20 +
libdv-gcc14.patch | 32 +
libdv-gtk2.patch | 29 +
libdv-no-exec-stack.patch | 146 ++++
libdv-pic.patch | 1640 +++++++++++++++++++++++++++++++++++++++++++++
libdv.spec | 22 +-
6 files changed, 1883 insertions(+), 6 deletions(-)
---
diff --git a/libdv.spec b/libdv.spec
index 5f38506..cd1a461 100644
--- a/libdv.spec
+++ b/libdv.spec
@@ -11,12 +11,17 @@ Summary: DV video software codec
Summary(pl.UTF-8): Biblioteka do obsługi formatu wideo DV
Name: libdv
Version: 1.0.0
-Release: 6
+Release: 7
License: LGPL v2.1+
Group: Libraries
-Source0: http://dl.sourceforge.net/libdv/%{name}-%{version}.tar.gz
+Source0: http://downloads.sourceforge.net/libdv/%{name}-%{version}.tar.gz
# Source0-md5: f895162161cfa4bb4a94c070a7caa6c7
Patch0: %{name}-include_fix.patch
+Patch1: %{name}-no-exec-stack.patch
+Patch2: %{name}-pic.patch
+Patch3: %{name}-gtk2.patch
+Patch4: %{name}-dso-linking.patch
+Patch5: %{name}-gcc14.patch
URL: http://libdv.sourceforge.net/
BuildRequires: autoconf >= 2.59-9
BuildRequires: automake
@@ -26,7 +31,7 @@ BuildRequires: popt-devel
BuildRequires: rpmbuild(macros) >= 1.213
%if %{with gui}
BuildRequires: SDL-devel >= 1.1.6
-BuildRequires: gtk+-devel >= 1.2.10-3
+BuildRequires: gtk+2-devel
BuildRequires: xorg-lib-libXv-devel
%endif
BuildRoot: %{tmpdir}/%{name}-%{version}-root-%(id -u -n)
@@ -85,6 +90,11 @@ Programy do kodowania i odtwarzania plików DV.
%prep
%setup -q
%patch -P0 -p1
+%patch -P1 -p1
+%patch -P2 -p1
+%patch -P3 -p1
+%patch -P4 -p1
+%patch -P5 -p1
%build
%{__libtoolize}
@@ -123,12 +133,12 @@ rm -rf $RPM_BUILD_ROOT
%files
%defattr(644,root,root,755)
%doc AUTHORS ChangeLog NEWS README.* TODO
-%attr(755,root,root) %{_libdir}/libdv.so.*.*.*
-%attr(755,root,root) %ghost %{_libdir}/libdv.so.4
+%{_libdir}/libdv.so.*.*.*
+%ghost %{_libdir}/libdv.so.4
%files devel
%defattr(644,root,root,755)
-%attr(755,root,root) %{_libdir}/libdv.so
+%{_libdir}/libdv.so
%{_libdir}/libdv.la
%{_includedir}/libdv
%{_pkgconfigdir}/libdv.pc
diff --git a/libdv-dso-linking.patch b/libdv-dso-linking.patch
new file mode 100644
index 0000000..9117c58
--- /dev/null
+++ b/libdv-dso-linking.patch
@@ -0,0 +1,20 @@
+diff -Naur libdv-1.0.0.old/Makefile.am libdv-1.0.0/Makefile.am
+--- libdv-1.0.0.old/Makefile.am 2022-03-24 20:11:25.269668921 +0100
++++ libdv-1.0.0/Makefile.am 2022-03-24 20:14:29.849878099 +0100
+@@ -5,6 +5,7 @@
+ endif
+
+ SUBDIRS = libdv encodedv $(gtk_subdirs)
++ACLOCAL_AMFLAGS = -I m4
+
+ AUX_DIST = $(ac_aux_dir)/config.guess \
+ $(ac_aux_dir)/config.sub \
+diff -Naur libdv-1.0.0.old/playdv/Makefile.am libdv-1.0.0/playdv/Makefile.am
+--- libdv-1.0.0.old/playdv/Makefile.am 2022-03-24 20:11:25.274669008 +0100
++++ libdv-1.0.0/playdv/Makefile.am 2022-03-24 20:14:29.815877508 +0100
+@@ -15,4 +15,4 @@
+ noinst_HEADERS= display.h oss.h
+
+ playdv_SOURCES= playdv.c display.c display.h oss.c
+-playdv_LDADD= $(SDL_LIBS) $(GTK_LIBS) $(XV_LIB) ../libdv/libdv.la $(POPT_LIB)
++playdv_LDADD= $(SDL_LIBS) $(GTK_LIBS) $(XV_LIB) ../libdv/libdv.la $(POPT_LIB) -lX11 -lXext
diff --git a/libdv-gcc14.patch b/libdv-gcc14.patch
new file mode 100644
index 0000000..7b5a0a1
--- /dev/null
+++ b/libdv-gcc14.patch
@@ -0,0 +1,32 @@
+--- a/libdv/dv.orig.c 2024-03-17 21:51:33.216006756 +0100
++++ b/libdv/dv.c 2024-03-17 21:53:50.975829509 +0100
+@@ -35,6 +35,13 @@
+ * @{
+ */
+
++#if defined __GNUC__ && __GNUC__ >= 14
++#pragma GCC diagnostic warning "-Wimplicit-function-declaration"
++#pragma GCC diagnostic warning "-Wincompatible-pointer-types"
++#pragma GCC diagnostic warning "-Wint-conversion"
++#pragma GCC diagnostic warning "-Wreturn-mismatch"
++#endif
++
+ #if HAVE_CONFIG_H
+ # include <config.h>
+ #endif
+--- a/libdv/quant.orig.c 2024-03-17 22:16:58.212228098 +0100
++++ b/libdv/quant.c 2024-03-17 22:18:20.503660888 +0100
+@@ -37,6 +37,13 @@
+ * @{
+ */
+
++#if defined __GNUC__ && __GNUC__ >= 14
++#pragma GCC diagnostic warning "-Wimplicit-function-declaration"
++#pragma GCC diagnostic warning "-Wincompatible-pointer-types"
++#pragma GCC diagnostic warning "-Wint-conversion"
++#pragma GCC diagnostic warning "-Wreturn-mismatch"
++#endif
++
+ #if HAVE_CONFIG_H
+ # include <config.h>
+ #endif
diff --git a/libdv-gtk2.patch b/libdv-gtk2.patch
new file mode 100644
index 0000000..da10646
--- /dev/null
+++ b/libdv-gtk2.patch
@@ -0,0 +1,29 @@
+diff -Naur libdv-1.0.0.old/configure.ac libdv-1.0.0/configure.ac
+--- libdv-1.0.0.old/configure.ac 2022-03-24 20:11:25.268668903 +0100
++++ libdv-1.0.0/configure.ac 2022-03-24 20:14:11.568560254 +0100
+@@ -1,12 +1,14 @@
+ dnl Process this file with autoconf to produce a configure script.
+-AC_INIT(libdv/parse.c)
++AC_INIT(libdv, 1.0.0)
++AC_CONFIG_SRCDIR(libdv/parse.c)
++AC_CONFIG_MACRO_DIRS([m4])
+ dnl AC_CONFIG_AUX_DIR(config)
+ AM_CONFIG_HEADER(config.h)
+
+ RPM_RELEASE=1
+ AC_CANONICAL_HOST
+ AC_CANONICAL_TARGET
+-AM_INIT_AUTOMAKE(libdv, 1.0.0)
++AM_INIT_AUTOMAKE
+
+ AM_MAINTAINER_MODE
+ AC_LIBTOOL_PICMODE(no)
+@@ -162,7 +164,7 @@
+ dnl Checks for libraries.
+ have_gtk="false"
+ if $use_gtk; then
+- REQUIRES='glib >= 1.2.4 gtk+ >= 1.2.4'
++ REQUIRES='glib-2.0 >= 2.1.0 gtk+-x11-2.0 >= 2.1.0'
+ PKG_CHECK_MODULES(GTK,$REQUIRES,have_gtk="true",have_gtk="false")
+ AC_DEFINE(HAVE_GTK)
+ fi
diff --git a/libdv-no-exec-stack.patch b/libdv-no-exec-stack.patch
new file mode 100644
index 0000000..af4bff6
--- /dev/null
+++ b/libdv-no-exec-stack.patch
@@ -0,0 +1,146 @@
+diff -Naur libdv-1.0.0.old/libdv/dct_block_mmx.S libdv-1.0.0/libdv/dct_block_mmx.S
+--- libdv-1.0.0.old/libdv/dct_block_mmx.S 2022-03-24 20:11:25.273668990 +0100
++++ libdv-1.0.0/libdv/dct_block_mmx.S 2022-03-24 20:12:54.495220228 +0100
+@@ -1217,3 +1217,7 @@
+ popl %esi
+ popl %ebp
+ ret
++
++#ifdef __ELF__
++.section .note.GNU-stack,"", at progbits
++#endif
+diff -Naur libdv-1.0.0.old/libdv/dct_block_mmx_x86_64.S libdv-1.0.0/libdv/dct_block_mmx_x86_64.S
+--- libdv-1.0.0.old/libdv/dct_block_mmx_x86_64.S 2022-03-24 20:11:25.273668990 +0100
++++ libdv-1.0.0/libdv/dct_block_mmx_x86_64.S 2022-03-24 20:12:54.507220437 +0100
+@@ -1207,3 +1207,7 @@
+ pop %r12
+
+ ret
++
++#ifdef __ELF__
++.section .note.GNU-stack,"", at progbits
++#endif
+diff -Naur libdv-1.0.0.old/libdv/encode_x86_64.S libdv-1.0.0/libdv/encode_x86_64.S
+--- libdv-1.0.0.old/libdv/encode_x86_64.S 2022-03-24 20:11:25.273668990 +0100
++++ libdv-1.0.0/libdv/encode_x86_64.S 2022-03-24 20:12:54.508220455 +0100
+@@ -612,3 +612,6 @@
+
+
+
++#ifdef __ELF__
++.section .note.GNU-stack,"", at progbits
++#endif
+diff -Naur libdv-1.0.0.old/libdv/encode_x86.S libdv-1.0.0/libdv/encode_x86.S
+--- libdv-1.0.0.old/libdv/encode_x86.S 2022-03-24 20:11:25.273668990 +0100
++++ libdv-1.0.0/libdv/encode_x86.S 2022-03-24 20:12:54.508220455 +0100
+@@ -611,3 +611,6 @@
+
+
+
++#ifdef __ELF__
++.section .note.GNU-stack,"", at progbits
++#endif
+diff -Naur libdv-1.0.0.old/libdv/idct_block_mmx.S libdv-1.0.0/libdv/idct_block_mmx.S
+--- libdv-1.0.0.old/libdv/idct_block_mmx.S 2022-03-24 20:11:25.273668990 +0100
++++ libdv-1.0.0/libdv/idct_block_mmx.S 2022-03-24 20:12:54.508220455 +0100
+@@ -649,3 +649,6 @@
+ .long 0,0
+ .align 8
+
++#ifdef __ELF__
++.section .note.GNU-stack,"", at progbits
++#endif
+diff -Naur libdv-1.0.0.old/libdv/idct_block_mmx_x86_64.S libdv-1.0.0/libdv/idct_block_mmx_x86_64.S
+--- libdv-1.0.0.old/libdv/idct_block_mmx_x86_64.S 2022-03-24 20:11:25.272668973 +0100
++++ libdv-1.0.0/libdv/idct_block_mmx_x86_64.S 2022-03-24 20:12:54.508220455 +0100
+@@ -654,3 +654,6 @@
+ .long 0,0
+ .align 8
+
++#ifdef __ELF__
++.section .note.GNU-stack,"", at progbits
++#endif
+diff -Naur libdv-1.0.0.old/libdv/quant_x86_64.S libdv-1.0.0/libdv/quant_x86_64.S
+--- libdv-1.0.0.old/libdv/quant_x86_64.S 2022-03-24 20:11:25.272668973 +0100
++++ libdv-1.0.0/libdv/quant_x86_64.S 2022-03-24 20:12:54.509220472 +0100
+@@ -463,3 +463,6 @@
+
+
+
++#ifdef __ELF__
++.section .note.GNU-stack,"", at progbits
++#endif
+diff -Naur libdv-1.0.0.old/libdv/quant_x86.S libdv-1.0.0/libdv/quant_x86.S
+--- libdv-1.0.0.old/libdv/quant_x86.S 2022-03-24 20:11:25.273668990 +0100
++++ libdv-1.0.0/libdv/quant_x86.S 2022-03-24 20:12:54.509220472 +0100
+@@ -458,3 +458,6 @@
+
+
+
++#ifdef __ELF__
++.section .note.GNU-stack,"", at progbits
++#endif
+diff -Naur libdv-1.0.0.old/libdv/rgbtoyuv.S libdv-1.0.0/libdv/rgbtoyuv.S
+--- libdv-1.0.0.old/libdv/rgbtoyuv.S 2022-03-24 20:11:25.273668990 +0100
++++ libdv-1.0.0/libdv/rgbtoyuv.S 2022-03-24 20:12:54.509220472 +0100
+@@ -1451,3 +1451,6 @@
+
+
+
++#ifdef __ELF__
++.section .note.GNU-stack,"", at progbits
++#endif
+diff -Naur libdv-1.0.0.old/libdv/rgbtoyuv_x86_64.S libdv-1.0.0/libdv/rgbtoyuv_x86_64.S
+--- libdv-1.0.0.old/libdv/rgbtoyuv_x86_64.S 2022-03-24 20:11:25.273668990 +0100
++++ libdv-1.0.0/libdv/rgbtoyuv_x86_64.S 2022-03-24 20:12:54.509220472 +0100
+@@ -1391,3 +1391,6 @@
+
+
+
++#ifdef __ELF__
++.section .note.GNU-stack,"", at progbits
++#endif
+diff -Naur libdv-1.0.0.old/libdv/transpose_x86_64.S libdv-1.0.0/libdv/transpose_x86_64.S
+--- libdv-1.0.0.old/libdv/transpose_x86_64.S 2022-03-24 20:11:25.273668990 +0100
++++ libdv-1.0.0/libdv/transpose_x86_64.S 2022-03-24 20:12:54.509220472 +0100
+@@ -190,3 +190,7 @@
+ pop %r12
+
+ ret $0
++
++#ifdef __ELF__
++.section .note.GNU-stack,"", at progbits
++#endif
+diff -Naur libdv-1.0.0.old/libdv/transpose_x86.S libdv-1.0.0/libdv/transpose_x86.S
+--- libdv-1.0.0.old/libdv/transpose_x86.S 2022-03-24 20:11:25.273668990 +0100
++++ libdv-1.0.0/libdv/transpose_x86.S 2022-03-24 20:12:54.509220472 +0100
+@@ -190,3 +190,7 @@
+ popl %ebp
+
+ ret $0
++
++#ifdef __ELF__
++.section .note.GNU-stack,"", at progbits
++#endif
+diff -Naur libdv-1.0.0.old/libdv/vlc_x86_64.S libdv-1.0.0/libdv/vlc_x86_64.S
+--- libdv-1.0.0.old/libdv/vlc_x86_64.S 2022-03-24 20:11:25.272668973 +0100
++++ libdv-1.0.0/libdv/vlc_x86_64.S 2022-03-24 20:12:54.510220489 +0100
+@@ -673,3 +673,7 @@
+ .align 16
+ const_f_0_0_0:
+ .short 0xffff,0,0,0
++
++#ifdef __ELF__
++.section .note.GNU-stack,"", at progbits
++#endif
+diff -Naur libdv-1.0.0.old/libdv/vlc_x86.S libdv-1.0.0/libdv/vlc_x86.S
+--- libdv-1.0.0.old/libdv/vlc_x86.S 2022-03-24 20:11:25.273668990 +0100
++++ libdv-1.0.0/libdv/vlc_x86.S 2022-03-24 20:12:54.510220489 +0100
+@@ -587,3 +587,7 @@
+ .align 16
+ const_f_0_0_0:
+ .short 0xffff,0,0,0
++
++#ifdef __ELF__
++.section .note.GNU-stack,"", at progbits
++#endif
diff --git a/libdv-pic.patch b/libdv-pic.patch
new file mode 100644
index 0000000..45cf1d0
--- /dev/null
+++ b/libdv-pic.patch
@@ -0,0 +1,1640 @@
+diff -Naur libdv-1.0.0.old/libdv/asm_common.S libdv-1.0.0/libdv/asm_common.S
+--- libdv-1.0.0.old/libdv/asm_common.S 1970-01-01 01:00:00.000000000 +0100
++++ libdv-1.0.0/libdv/asm_common.S 2022-03-24 20:13:32.551881896 +0100
+@@ -0,0 +1,29 @@
++/* public domain, do what you want */
++
++#ifdef __PIC__
++# define MUNG(sym) sym##@GOTOFF(%ebp)
++# define MUNG_ARR(sym, args...) sym##@GOTOFF(%ebp,##args)
++#else
++# define MUNG(sym) sym
++# define MUNG_ARR(sym, args...) sym(,##args)
++#endif
++
++#ifdef __PIC__
++# undef __i686 /* gcc define gets in our way */
++# define LOAD_PIC_REG(reg) \
++ .ifndef __i686.get_pc_thunk.reg; \
++ .section .gnu.linkonce.t.__i686.get_pc_thunk.reg,"ax", at progbits; \
++ .global __i686.get_pc_thunk.reg; \
++ .hidden __i686.get_pc_thunk.reg; \
++ .type __i686.get_pc_thunk.reg, at function; \
++ __i686.get_pc_thunk.reg: \
++ movl (%esp), %e##reg; \
++ ret; \
++ .size __i686.get_pc_thunk.reg,.-__i686.get_pc_thunk.reg; \
++ .previous; \
++ .endif; \
++ call __i686.get_pc_thunk.reg; \
++ addl $_GLOBAL_OFFSET_TABLE_, %e##reg
++#else
++# define LOAD_PIC_REG(reg)
++#endif
+diff -Naur libdv-1.0.0.old/libdv/dct_block_mmx.S libdv-1.0.0/libdv/dct_block_mmx.S
+--- libdv-1.0.0.old/libdv/dct_block_mmx.S 2022-03-24 20:13:23.543725277 +0100
++++ libdv-1.0.0/libdv/dct_block_mmx.S 2022-03-24 20:13:32.551881896 +0100
+@@ -55,6 +55,8 @@
+
+ .section .note.GNU-stack, "", @progbits
+
++#include "asm_common.S"
++
+ .text
+
+ .align 8
+@@ -64,10 +66,11 @@
+ _dv_dct_88_block_mmx:
+
+ pushl %ebp
+- movl %esp, %ebp
+ pushl %esi
+
+- movl 8(%ebp), %esi # source
++ LOAD_PIC_REG(bp)
++
++ movl 12(%esp), %esi # source
+
+ # column 0
+ movq 16*0(%esi), %mm0 # v0
+@@ -90,22 +93,22 @@
+
+ movq 16*3(%esi), %mm5 # v3
+ movq 16*4(%esi), %mm7 # v4
+- movq %mm7, scratch1 # scratch1: v4 ;
++ movq %mm7, MUNG(scratch1) # scratch1: v4 ;
+ movq %mm5, %mm7 # duplicate v3
+- paddw scratch1, %mm5 # v03: v3+v4
+- psubw scratch1, %mm7 # v04: v3-v4
+- movq %mm5, scratch2 # scratch2: v03
++ paddw MUNG(scratch1), %mm5 # v03: v3+v4
++ psubw MUNG(scratch1), %mm7 # v04: v3-v4
++ movq %mm5, MUNG(scratch2) # scratch2: v03
+ movq %mm0, %mm5 # mm5: v00
+
+- paddw scratch2, %mm0 # v10: v00+v03
+- psubw scratch2, %mm5 # v13: v00-v03
+- movq %mm3, scratch3 # scratch3: v02
++ paddw MUNG(scratch2), %mm0 # v10: v00+v03
++ psubw MUNG(scratch2), %mm5 # v13: v00-v03
++ movq %mm3, MUNG(scratch3) # scratch3: v02
+ movq %mm1, %mm3 # duplicate v01
+
+- paddw scratch3, %mm1 # v11: v01+v02
+- psubw scratch3, %mm3 # v12: v01-v02
++ paddw MUNG(scratch3), %mm1 # v11: v01+v02
++ psubw MUNG(scratch3), %mm3 # v12: v01-v02
+
+- movq %mm6, scratch4 # scratch4: v05
++ movq %mm6, MUNG(scratch4) # scratch4: v05
+ movq %mm0, %mm6 # duplicate v10
+
+ paddw %mm1, %mm0 # v10+v11
+@@ -115,10 +118,10 @@
+ movq %mm6, 16*4(%esi) # out4: v10-v11
+
+ movq %mm4, %mm0 # mm0: v06
+- paddw scratch4, %mm4 # v15: v05+v06
++ paddw MUNG(scratch4), %mm4 # v15: v05+v06
+ paddw %mm2, %mm0 # v16: v07+v06
+
+- pmulhw WA3, %mm4 # v35~: WA3*v15
++ pmulhw MUNG(WA3), %mm4 # v35~: WA3*v15
+ psllw $1, %mm4 # v35: compensate the coeefient scale
+
+ movq %mm4, %mm6 # duplicate v35
+@@ -127,7 +130,7 @@
+
+ paddw %mm5, %mm3 # v22: v12+v13
+
+- pmulhw WA1, %mm3 # v32~: WA1*v22
++ pmulhw MUNG(WA1), %mm3 # v32~: WA1*v22
+ psllw $16-NSHIFT, %mm3 # v32: compensate the coeefient scale
+ movq %mm5, %mm6 # duplicate v13
+
+@@ -138,13 +141,13 @@
+ movq %mm6, 16*6(%esi) # out6: v13-v32
+
+
+- paddw scratch4, %mm7 # v14n: v04+v05
++ paddw MUNG(scratch4), %mm7 # v14n: v04+v05
+ movq %mm0, %mm5 # duplicate v16
+
+ psubw %mm7, %mm0 # va1: v16-v14n
+- pmulhw WA5, %mm0 # va0~: va1*WA5
+- pmulhw WA4, %mm5 # v36~~: v16*WA4
+- pmulhw WA2, %mm7 # v34~~: v14n*WA2
++ pmulhw MUNG(WA5), %mm0 # va0~: va1*WA5
++ pmulhw MUNG(WA4), %mm5 # v36~~: v16*WA4
++ pmulhw MUNG(WA2), %mm7 # v34~~: v14n*WA2
+ psllw $16-WA4_SHIFT, %mm5 # v36: compensate the coeefient scale
+ psllw $16-NSHIFT, %mm7 # v34: compensate the coeefient scale
+
+@@ -192,22 +195,22 @@
+
+ movq 16*3(%esi), %mm5 # v3
+ movq 16*4(%esi), %mm7 # v4
+- movq %mm7, scratch1 # scratch1: v4 ;
++ movq %mm7, MUNG(scratch1) # scratch1: v4 ;
+ movq %mm5, %mm7 # duplicate v3
+- paddw scratch1, %mm5 # v03: v3+v4
+- psubw scratch1, %mm7 # v04: v3-v4
+- movq %mm5, scratch2 # scratch2: v03
++ paddw MUNG(scratch1), %mm5 # v03: v3+v4
++ psubw MUNG(scratch1), %mm7 # v04: v3-v4
++ movq %mm5, MUNG(scratch2) # scratch2: v03
+ movq %mm0, %mm5 # mm5: v00
+
+- paddw scratch2, %mm0 # v10: v00+v03
+- psubw scratch2, %mm5 # v13: v00-v03
+- movq %mm3, scratch3 # scratc3: v02
++ paddw MUNG(scratch2), %mm0 # v10: v00+v03
++ psubw MUNG(scratch2), %mm5 # v13: v00-v03
++ movq %mm3, MUNG(scratch3) # scratc3: v02
+ movq %mm1, %mm3 # duplicate v01
+
+- paddw scratch3, %mm1 # v11: v01+v02
+- psubw scratch3, %mm3 # v12: v01-v02
++ paddw MUNG(scratch3), %mm1 # v11: v01+v02
++ psubw MUNG(scratch3), %mm3 # v12: v01-v02
+
+- movq %mm6, scratch4 # scratc4: v05
++ movq %mm6, MUNG(scratch4) # scratc4: v05
+ movq %mm0, %mm6 # duplicate v10
+
+ paddw %mm1, %mm0 # v10+v11
+@@ -217,10 +220,10 @@
+ movq %mm6, 16*4(%esi) # out4: v10-v11
+
+ movq %mm4, %mm0 # mm0: v06
+- paddw scratch4, %mm4 # v15: v05+v06
++ paddw MUNG(scratch4), %mm4 # v15: v05+v06
+ paddw %mm2, %mm0 # v16: v07+v06
+
+- pmulhw WA3, %mm4 # v35~: WA3*v15
++ pmulhw MUNG(WA3), %mm4 # v35~: WA3*v15
+ psllw $16-NSHIFT, %mm4 # v35: compensate the coeefient scale
+
+ movq %mm4, %mm6 # duplicate v35
+@@ -229,7 +232,7 @@
+
+ paddw %mm5, %mm3 # v22: v12+v13
+
+- pmulhw WA1, %mm3 # v32~: WA3*v15
++ pmulhw MUNG(WA1), %mm3 # v32~: WA3*v15
+ psllw $16-NSHIFT, %mm3 # v32: compensate the coeefient scale
+ movq %mm5, %mm6 # duplicate v13
+
+@@ -239,13 +242,13 @@
+ movq %mm5, 16*2(%esi) # out2: v13+v32
+ movq %mm6, 16*6(%esi) # out6: v13-v32
+
+- paddw scratch4, %mm7 # v14n: v04+v05
++ paddw MUNG(scratch4), %mm7 # v14n: v04+v05
+ movq %mm0, %mm5 # duplicate v16
+
+ psubw %mm7, %mm0 # va1: v16-v14n
+- pmulhw WA2, %mm7 # v34~~: v14n*WA2
+- pmulhw WA5, %mm0 # va0~: va1*WA5
+- pmulhw WA4, %mm5 # v36~~: v16*WA4
++ pmulhw MUNG(WA2), %mm7 # v34~~: v14n*WA2
++ pmulhw MUNG(WA5), %mm0 # va0~: va1*WA5
++ pmulhw MUNG(WA4), %mm5 # v36~~: v16*WA4
+ psllw $16-NSHIFT, %mm7
+ psllw $16-WA4_SHIFT, %mm5 # v36: compensate the coeffient
+ # scale note that WA4 is shifted 1 bit less than the others
+@@ -759,11 +762,12 @@
+ _dv_dct_248_block_mmx:
+
+ pushl %ebp
+- movl %esp, %ebp
+ pushl %esi
+ pushl %edi
+
+- movl 8(%ebp), %esi # source
++ LOAD_PIC_REG(bp)
++
++ movl 16(%esp), %esi # source
+
+ # column 0
+
+@@ -787,7 +791,7 @@
+ paddw %mm1, %mm0 # v20: v10+v11
+ psubw %mm1, %mm3 # v21: v10-v11
+
+- pmulhw WA1, %mm5 # v32~: WA1*v22
++ pmulhw MUNG(WA1), %mm5 # v32~: WA1*v22
+ movq %mm4, %mm2
+ psllw $16-NSHIFT, %mm5 # v32: compensate the coeffient scale
+
+@@ -826,7 +830,7 @@
+ paddw %mm1, %mm0 # v20: v10+v11
+ psubw %mm1, %mm3 # v21: v10-v11
+
+- pmulhw WA1, %mm5 # v32~: WA1*v22
++ pmulhw MUNG(WA1), %mm5 # v32~: WA1*v22
+ movq %mm4, %mm2
+ psllw $16-NSHIFT, %mm5 # v32: compensate the coeffient scale
+
+@@ -863,7 +867,7 @@
+ paddw %mm1, %mm0 # v20: v10+v11
+ psubw %mm1, %mm3 # v21: v10-v11
+
+- pmulhw WA1, %mm5 # v32~: WA1*v22
++ pmulhw MUNG(WA1), %mm5 # v32~: WA1*v22
+ movq %mm4, %mm2
+ psllw $16-NSHIFT, %mm5 # v32: compensate the coeffient scale
+
+@@ -900,7 +904,7 @@
+ paddw %mm1, %mm0 # v20: v10+v11
+ psubw %mm1, %mm3 # v21: v10-v11
+
+- pmulhw WA1, %mm5 # v32~: WA1*v22
++ pmulhw MUNG(WA1), %mm5 # v32~: WA1*v22
+ movq %mm4, %mm2
+ psllw $16-NSHIFT, %mm5 # v32: compensate the coeffient scale
+
+diff -Naur libdv-1.0.0.old/libdv/dv.c libdv-1.0.0/libdv/dv.c
+--- libdv-1.0.0.old/libdv/dv.c 2022-03-24 20:11:25.271668956 +0100
++++ libdv-1.0.0/libdv/dv.c 2022-03-24 20:13:32.551881896 +0100
+@@ -205,6 +205,9 @@
+ } /* dv_reconfigure */
+
+
++extern uint8_t dv_quant_offset[4];
++extern uint8_t dv_quant_shifts[22][4];
++
+ static inline void
+ dv_decode_macroblock(dv_decoder_t *dv, dv_macroblock_t *mb, unsigned int quality) {
+ int i;
+@@ -218,7 +221,7 @@
+ dv_idct_248 (co248, mb->b[i].coeffs);
+ } else {
+ #if ARCH_X86
+- _dv_quant_88_inverse_x86(mb->b[i].coeffs,mb->qno,mb->b[i].class_no);
++ _dv_quant_88_inverse_x86(mb->b[i].coeffs,mb->qno,mb->b[i].class_no,dv_quant_offset,dv_quant_shifts[0]);
+ _dv_idct_88(mb->b[i].coeffs);
+ #elif ARCH_X86_64
+ _dv_quant_88_inverse_x86_64(mb->b[i].coeffs,mb->qno,mb->b[i].class_no);
+@@ -250,7 +253,7 @@
+ dv_idct_248 (co248, mb->b[b].coeffs);
+ } else {
+ #if ARCH_X86
+- _dv_quant_88_inverse_x86(bl->coeffs,mb->qno,bl->class_no);
++ _dv_quant_88_inverse_x86(bl->coeffs,mb->qno,bl->class_no,dv_quant_offset,dv_quant_shifts[0]);
+ _dv_weight_88_inverse(bl->coeffs);
+ _dv_idct_88(bl->coeffs);
+ #elif ARCH_X86_64
+diff -Naur libdv-1.0.0.old/libdv/encode.c libdv-1.0.0/libdv/encode.c
+--- libdv-1.0.0.old/libdv/encode.c 2022-03-24 20:11:25.272668973 +0100
++++ libdv-1.0.0/libdv/encode.c 2022-03-24 20:13:32.596882678 +0100
+@@ -521,7 +521,8 @@
+ }
+
+ extern unsigned long _dv_vlc_encode_block_mmx(dv_coeff_t* coeffs,
+- dv_vlc_entry_t ** out);
++ dv_vlc_entry_t ** out,
++ dv_vlc_entry_t * lookup);
+
+ extern unsigned long _dv_vlc_encode_block_mmx_x86_64(dv_coeff_t* coeffs,
+ dv_vlc_entry_t ** out);
+@@ -558,7 +559,7 @@
+ #elif ARCH_X86
+ int num_bits;
+
+- num_bits = _dv_vlc_encode_block_mmx(coeffs, &o);
++ num_bits = _dv_vlc_encode_block_mmx(coeffs, &o, vlc_encode_lookup);
+ emms();
+ #else
+ int num_bits;
+@@ -574,7 +575,7 @@
+ return num_bits;
+ }
+
+-extern unsigned long _dv_vlc_num_bits_block_x86(dv_coeff_t* coeffs);
++extern unsigned long _dv_vlc_num_bits_block_x86(dv_coeff_t* coeffs, unsigned char* lookup);
+ extern unsigned long _dv_vlc_num_bits_block_x86_64(dv_coeff_t* coeffs);
+
+ extern unsigned long _dv_vlc_num_bits_block(dv_coeff_t* coeffs)
+@@ -600,7 +601,7 @@
+ #elif ARCH_X86_64
+ return _dv_vlc_num_bits_block_x86_64(coeffs);
+ #else
+- return _dv_vlc_num_bits_block_x86(coeffs);
++ return _dv_vlc_num_bits_block_x86(coeffs, vlc_num_bits_lookup);
+ #endif
+ }
+
+diff -Naur libdv-1.0.0.old/libdv/encode_x86.S libdv-1.0.0/libdv/encode_x86.S
+--- libdv-1.0.0.old/libdv/encode_x86.S 2022-03-24 20:13:23.544725294 +0100
++++ libdv-1.0.0/libdv/encode_x86.S 2022-03-24 20:13:32.596882678 +0100
+@@ -23,9 +23,6 @@
+ * The libdv homepage is http://libdv.sourceforge.net/.
+ */
+
+-.data
+-ALLONE: .word 1,1,1,1
+-VLCADDMASK: .byte 255,0,0,0,255,0,0,0
+
+
+ .section .note.GNU-stack, "", @progbits
+@@ -50,11 +47,14 @@
+
+ movl $63, %ecx
+
+- movl vlc_encode_lookup, %esi
++ movl 4+4*4+8(%esp), %esi # vlc_encode_lookup
+
+ pxor %mm0, %mm0
+ pxor %mm2, %mm2
+- movq VLCADDMASK, %mm1
++ pushl $0x000000FF # these four lines
++ pushl $0x000000FF # load VLCADDMASK
++ movq (%esp), %mm1 # into %mm1 off the stack
++ addl $8, %esp # --> no TEXTRELs
+ xorl %ebp, %ebp
+ subl $8, %edx
+ vlc_encode_block_mmx_loop:
+@@ -128,7 +128,7 @@
+ addl $2, %edi
+
+ movl $63, %ecx
+- movl vlc_num_bits_lookup, %esi
++ movl 4+4*4+4(%esp), %esi # vlc_num_bits_lookup
+
+ vlc_num_bits_block_x86_loop:
+ movw (%edi), %ax
+@@ -594,8 +594,11 @@
+ paddw %mm5, %mm1
+
+ paddw %mm1, %mm0
+-
+- pmaddwd ALLONE, %mm0
++
++ pushl $0x00010001 # these four lines
++ pushl $0x00010001 # load ALLONE
++ pmaddwd (%esp), %mm0 # into %mm0 off the stack
++ addl $8, %esp # --> no TEXTRELs
+ movq %mm0, %mm1
+ psrlq $32, %mm1
+ paddd %mm1, %mm0
+diff -Naur libdv-1.0.0.old/libdv/idct_block_mmx.S libdv-1.0.0/libdv/idct_block_mmx.S
+--- libdv-1.0.0.old/libdv/idct_block_mmx.S 2022-03-24 20:13:23.544725294 +0100
++++ libdv-1.0.0/libdv/idct_block_mmx.S 2022-03-24 20:13:32.597882695 +0100
+@@ -8,6 +8,8 @@
+
+ .section .note.GNU-stack, "", @progbits
+
++#include "asm_common.S"
++
+ .text
+ .align 4
+ .global _dv_idct_block_mmx
+@@ -15,10 +17,12 @@
+ .type _dv_idct_block_mmx, at function
+ _dv_idct_block_mmx:
+ pushl %ebp
+- movl %esp,%ebp
+ pushl %esi
+- leal preSC, %ecx
+- movl 8(%ebp),%esi /* source matrix */
++
++ LOAD_PIC_REG(bp)
++
++ leal MUNG(preSC), %ecx
++ movl 12(%esp),%esi /* source matrix */
+
+ /*
+ * column 0: even part
+@@ -36,7 +40,7 @@
+ movq %mm1, %mm2 /* added 11/1/96 */
+ pmulhw 8*8(%esi),%mm5 /* V8 */
+ psubsw %mm0, %mm1 /* V16 */
+- pmulhw x5a825a825a825a82, %mm1 /* 23170 ->V18 */
++ pmulhw MUNG(x5a825a825a825a82), %mm1 /* 23170 ->V18 */
+ paddsw %mm0, %mm2 /* V17 */
+ movq %mm2, %mm0 /* duplicate V17 */
+ psraw $1, %mm2 /* t75=t82 */
+@@ -77,7 +81,7 @@
+ paddsw %mm0, %mm3 /* V29 ; free mm0 */
+ movq %mm7, %mm1 /* duplicate V26 */
+ psraw $1, %mm3 /* t91=t94 */
+- pmulhw x539f539f539f539f,%mm7 /* V33 */
++ pmulhw MUNG(x539f539f539f539f),%mm7 /* V33 */
+ psraw $1, %mm1 /* t96 */
+ movq %mm5, %mm0 /* duplicate V2 */
+ psraw $2, %mm4 /* t85=t87 */
+@@ -85,15 +89,15 @@
+ psubsw %mm4, %mm0 /* V28 ; free mm4 */
+ movq %mm0, %mm2 /* duplicate V28 */
+ psraw $1, %mm5 /* t90=t93 */
+- pmulhw x4546454645464546,%mm0 /* V35 */
++ pmulhw MUNG(x4546454645464546),%mm0 /* V35 */
+ psraw $1, %mm2 /* t97 */
+ movq %mm5, %mm4 /* duplicate t90=t93 */
+ psubsw %mm2, %mm1 /* V32 ; free mm2 */
+- pmulhw x61f861f861f861f8,%mm1 /* V36 */
++ pmulhw MUNG(x61f861f861f861f8),%mm1 /* V36 */
+ psllw $1, %mm7 /* t107 */
+ paddsw %mm3, %mm5 /* V31 */
+ psubsw %mm3, %mm4 /* V30 ; free mm3 */
+- pmulhw x5a825a825a825a82,%mm4 /* V34 */
++ pmulhw MUNG(x5a825a825a825a82),%mm4 /* V34 */
+ nop
+ psubsw %mm1, %mm0 /* V38 */
+ psubsw %mm7, %mm1 /* V37 ; free mm7 */
+@@ -160,7 +164,7 @@
+ psubsw %mm7, %mm1 /* V50 */
+ pmulhw 8*9(%esi), %mm5 /* V9 */
+ paddsw %mm7, %mm2 /* V51 */
+- pmulhw x5a825a825a825a82, %mm1 /* 23170 ->V52 */
++ pmulhw MUNG(x5a825a825a825a82), %mm1 /* 23170 ->V52 */
+ movq %mm2, %mm6 /* duplicate V51 */
+ psraw $1, %mm2 /* t138=t144 */
+ movq %mm3, %mm4 /* duplicate V1 */
+@@ -201,11 +205,11 @@
+ * even more by doing the correction step in a later stage when the number
+ * is actually multiplied by 16
+ */
+- paddw x0005000200010001, %mm4
++ paddw MUNG(x0005000200010001), %mm4
+ psubsw %mm6, %mm3 /* V60 ; free mm6 */
+ psraw $1, %mm0 /* t154=t156 */
+ movq %mm3, %mm1 /* duplicate V60 */
+- pmulhw x539f539f539f539f, %mm1 /* V67 */
++ pmulhw MUNG(x539f539f539f539f), %mm1 /* V67 */
+ movq %mm5, %mm6 /* duplicate V3 */
+ psraw $2, %mm4 /* t148=t150 */
+ paddsw %mm4, %mm5 /* V61 */
+@@ -214,13 +218,13 @@
+ psllw $1, %mm1 /* t169 */
+ paddsw %mm0, %mm5 /* V65 -> result */
+ psubsw %mm0, %mm4 /* V64 ; free mm0 */
+- pmulhw x5a825a825a825a82, %mm4 /* V68 */
++ pmulhw MUNG(x5a825a825a825a82), %mm4 /* V68 */
+ psraw $1, %mm3 /* t158 */
+ psubsw %mm6, %mm3 /* V66 */
+ movq %mm5, %mm2 /* duplicate V65 */
+- pmulhw x61f861f861f861f8, %mm3 /* V70 */
++ pmulhw MUNG(x61f861f861f861f8), %mm3 /* V70 */
+ psllw $1, %mm6 /* t165 */
+- pmulhw x4546454645464546, %mm6 /* V69 */
++ pmulhw MUNG(x4546454645464546), %mm6 /* V69 */
+ psraw $1, %mm2 /* t172 */
+ /* moved from next block */
+ movq 8*5(%esi), %mm0 /* V56 */
+@@ -345,7 +349,7 @@
+ * movq 8*13(%esi), %mm4 tmt13
+ */
+ psubsw %mm4, %mm3 /* V134 */
+- pmulhw x5a825a825a825a82, %mm3 /* 23170 ->V136 */
++ pmulhw MUNG(x5a825a825a825a82), %mm3 /* 23170 ->V136 */
+ movq 8*9(%esi), %mm6 /* tmt9 */
+ paddsw %mm4, %mm5 /* V135 ; mm4 free */
+ movq %mm0, %mm4 /* duplicate tmt1 */
+@@ -374,17 +378,17 @@
+ psubsw %mm7, %mm0 /* V144 */
+ movq %mm0, %mm3 /* duplicate V144 */
+ paddsw %mm7, %mm2 /* V147 ; free mm7 */
+- pmulhw x539f539f539f539f, %mm0 /* 21407-> V151 */
++ pmulhw MUNG(x539f539f539f539f), %mm0 /* 21407-> V151 */
+ movq %mm1, %mm7 /* duplicate tmt3 */
+ paddsw %mm5, %mm7 /* V145 */
+ psubsw %mm5, %mm1 /* V146 ; free mm5 */
+ psubsw %mm1, %mm3 /* V150 */
+ movq %mm7, %mm5 /* duplicate V145 */
+- pmulhw x4546454645464546, %mm1 /* 17734-> V153 */
++ pmulhw MUNG(x4546454645464546), %mm1 /* 17734-> V153 */
+ psubsw %mm2, %mm5 /* V148 */
+- pmulhw x61f861f861f861f8, %mm3 /* 25080-> V154 */
++ pmulhw MUNG(x61f861f861f861f8), %mm3 /* 25080-> V154 */
+ psllw $2, %mm0 /* t311 */
+- pmulhw x5a825a825a825a82, %mm5 /* 23170-> V152 */
++ pmulhw MUNG(x5a825a825a825a82), %mm5 /* 23170-> V152 */
+ paddsw %mm2, %mm7 /* V149 ; free mm2 */
+ psllw $1, %mm1 /* t313 */
+ nop /* without the nop - freeze here for one clock */
+@@ -410,7 +414,7 @@
+ paddsw %mm3, %mm6 /* V164 ; free mm3 */
+ movq %mm4, %mm3 /* duplicate V142 */
+ psubsw %mm5, %mm4 /* V165 ; free mm5 */
+- movq %mm2, scratch7 /* out7 */
++ movq %mm2, MUNG(scratch7) /* out7 */
+ psraw $4, %mm6
+ psraw $4, %mm4
+ paddsw %mm5, %mm3 /* V162 */
+@@ -421,11 +425,11 @@
+ */
+ movq %mm6, 8*9(%esi) /* out9 */
+ paddsw %mm1, %mm0 /* V161 */
+- movq %mm3, scratch5 /* out5 */
++ movq %mm3, MUNG(scratch5) /* out5 */
+ psubsw %mm1, %mm5 /* V166 ; free mm1 */
+ movq %mm4, 8*11(%esi) /* out11 */
+ psraw $4, %mm5
+- movq %mm0, scratch3 /* out3 */
++ movq %mm0, MUNG(scratch3) /* out3 */
+ movq %mm2, %mm4 /* duplicate V140 */
+ movq %mm5, 8*13(%esi) /* out13 */
+ paddsw %mm7, %mm2 /* V160 */
+@@ -435,7 +439,7 @@
+ /* moved from the next block */
+ movq 8*3(%esi), %mm7
+ psraw $4, %mm4
+- movq %mm2, scratch1 /* out1 */
++ movq %mm2, MUNG(scratch1) /* out1 */
+ /* moved from the next block */
+ movq %mm0, %mm1
+ movq %mm4, 8*15(%esi) /* out15 */
+@@ -492,15 +496,15 @@
+ paddsw %mm4, %mm3 /* V113 ; free mm4 */
+ movq %mm0, %mm4 /* duplicate V110 */
+ paddsw %mm1, %mm2 /* V111 */
+- pmulhw x539f539f539f539f, %mm0 /* 21407-> V117 */
++ pmulhw MUNG(x539f539f539f539f), %mm0 /* 21407-> V117 */
+ psubsw %mm1, %mm5 /* V112 ; free mm1 */
+ psubsw %mm5, %mm4 /* V116 */
+ movq %mm2, %mm1 /* duplicate V111 */
+- pmulhw x4546454645464546, %mm5 /* 17734-> V119 */
++ pmulhw MUNG(x4546454645464546), %mm5 /* 17734-> V119 */
+ psubsw %mm3, %mm2 /* V114 */
+- pmulhw x61f861f861f861f8, %mm4 /* 25080-> V120 */
++ pmulhw MUNG(x61f861f861f861f8), %mm4 /* 25080-> V120 */
+ paddsw %mm3, %mm1 /* V115 ; free mm3 */
+- pmulhw x5a825a825a825a82, %mm2 /* 23170-> V118 */
++ pmulhw MUNG(x5a825a825a825a82), %mm2 /* 23170-> V118 */
+ psllw $2, %mm0 /* t266 */
+ movq %mm1, (%esi) /* save V115 */
+ psllw $1, %mm5 /* t268 */
+@@ -518,7 +522,7 @@
+ movq %mm6, %mm3 /* duplicate tmt4 */
+ psubsw %mm0, %mm6 /* V100 */
+ paddsw %mm0, %mm3 /* V101 ; free mm0 */
+- pmulhw x5a825a825a825a82, %mm6 /* 23170 ->V102 */
++ pmulhw MUNG(x5a825a825a825a82), %mm6 /* 23170 ->V102 */
+ movq %mm7, %mm5 /* duplicate tmt0 */
+ movq 8*8(%esi), %mm1 /* tmt8 */
+ paddsw %mm1, %mm7 /* V103 */
+@@ -552,10 +556,10 @@
+ movq 8*2(%esi), %mm3 /* V123 */
+ paddsw %mm4, %mm7 /* out0 */
+ /* moved up from next block */
+- movq scratch3, %mm0
++ movq MUNG(scratch3), %mm0
+ psraw $4, %mm7
+ /* moved up from next block */
+- movq scratch5, %mm6
++ movq MUNG(scratch5), %mm6
+ psubsw %mm4, %mm1 /* out14 ; free mm4 */
+ paddsw %mm3, %mm5 /* out2 */
+ psraw $4, %mm1
+@@ -566,7 +570,7 @@
+ movq %mm5, 8*2(%esi) /* out2 ; free mm5 */
+ psraw $4, %mm2
+ /* moved up to the prev block */
+- movq scratch7, %mm4
++ movq MUNG(scratch7), %mm4
+ /* moved up to the prev block */
+ psraw $4, %mm0
+ movq %mm2, 8*12(%esi) /* out12 ; free mm2 */
+@@ -580,7 +584,7 @@
+ * psraw $4, %mm0
+ * psraw $4, %mm6
+ */
+- movq scratch1, %mm1
++ movq MUNG(scratch1), %mm1
+ psraw $4, %mm4
+ movq %mm0, 8*3(%esi) /* out3 */
+ psraw $4, %mm1
+diff -Naur libdv-1.0.0.old/libdv/parse.c libdv-1.0.0/libdv/parse.c
+--- libdv-1.0.0.old/libdv/parse.c 2022-03-24 20:11:25.272668973 +0100
++++ libdv-1.0.0/libdv/parse.c 2022-03-24 20:13:32.597882695 +0100
+@@ -477,6 +477,13 @@
+ exit(0);
+ #endif
+ } /* dv_parse_ac_coeffs */
++#if defined __GNUC__ && __ELF__
++# define dv_strong_hidden_alias(name, aliasname) \
++ extern __typeof (name) aliasname __attribute__ ((alias (#name), visibility ("hidden")))
++dv_strong_hidden_alias(dv_parse_ac_coeffs, asm_dv_parse_ac_coeffs);
++#else
++int asm_dv_parse_ac_coeffs(dv_videosegment_t *seg) { return dv_parse_ac_coeffs(seg); }
++#endif
+
+ /* ---------------------------------------------------------------------------
+ */
+diff -Naur libdv-1.0.0.old/libdv/quant.c libdv-1.0.0/libdv/quant.c
+--- libdv-1.0.0.old/libdv/quant.c 2022-03-24 20:11:25.272668973 +0100
++++ libdv-1.0.0/libdv/quant.c 2022-03-24 20:13:32.597882695 +0100
+@@ -144,7 +144,7 @@
+ uint32_t dv_quant_248_mul_tab [2] [22] [64];
+ uint32_t dv_quant_88_mul_tab [2] [22] [64];
+
+-extern void _dv_quant_x86(dv_coeff_t *block,int qno,int klass);
++extern void _dv_quant_x86(dv_coeff_t *block,int qno,int klass,uint8_t *dv_quant_offset,uint8_t *dv_quant_shifts);
+ extern void _dv_quant_x86_64(dv_coeff_t *block,int qno,int klass);
+ static void quant_248_inverse_std(dv_coeff_t *block,int qno,int klass,dv_248_coeff_t *co);
+ static void quant_248_inverse_mmx(dv_coeff_t *block,int qno,int klass,dv_248_coeff_t *co);
+@@ -210,7 +210,7 @@
+ _dv_quant_x86_64(block, qno, klass);
+ emms();
+ #else
+- _dv_quant_x86(block, qno, klass);
++ _dv_quant_x86(block, qno, klass, dv_quant_offset, dv_quant_shifts);
+ emms();
+ #endif
+ }
+diff -Naur libdv-1.0.0.old/libdv/quant.h libdv-1.0.0/libdv/quant.h
+--- libdv-1.0.0.old/libdv/quant.h 2022-03-24 20:11:25.271668956 +0100
++++ libdv-1.0.0/libdv/quant.h 2022-03-24 20:13:32.597882695 +0100
+@@ -27,7 +27,7 @@
+ extern void _dv_quant_88_inverse(dv_coeff_t *block,int qno,int klass);
+ extern void (*_dv_quant_248_inverse) (dv_coeff_t *block,int qno,int klass,
+ dv_248_coeff_t *co);
+-extern void _dv_quant_88_inverse_x86(dv_coeff_t *block,int qno,int klass);
++extern void _dv_quant_88_inverse_x86(dv_coeff_t *block,int qno,int klass, uint8_t *offset, uint8_t (*shifts)[4]);
+ extern void _dv_quant_88_inverse_x86_64(dv_coeff_t *block,int qno,int klass);
+ extern void dv_quant_init (void);
+ #ifdef __cplusplus
+diff -Naur libdv-1.0.0.old/libdv/quant_x86.S libdv-1.0.0/libdv/quant_x86.S
+--- libdv-1.0.0.old/libdv/quant_x86.S 2022-03-24 20:13:23.545725311 +0100
++++ libdv-1.0.0/libdv/quant_x86.S 2022-03-24 20:13:32.598882713 +0100
+@@ -75,10 +75,13 @@
+
+ /* pq = dv_quant_shifts[qno + dv_quant_offset[class]]; */
+ movl ARGn(1),%eax /* qno */
++ movl ARGn(3),%ebx /* dv_quant_offset */
++ addl ARGn(2),%ebx /* class */
++ movzbl (%ebx),%ecx
+ movl ARGn(2),%ebx /* class */
+- movzbl dv_quant_offset(%ebx),%ecx
+ addl %ecx,%eax
+- leal dv_quant_shifts(,%eax,4),%edx /* edx is pq */
++ movl ARGn(4),%edx /* dv_quant_shifts */
++ leal (%edx,%eax,4),%edx /* edx is pq */
+
+ /* extra = (class == 3); */
+ /* 0 1 2 3 */
+@@ -218,11 +221,13 @@
+
+ /* pq = dv_quant_shifts[qno + dv_quant_offset[class]]; */
+ movl ARGn(1),%eax /* qno */
++ movl ARGn(3),%ebx /* offset */
++ addl ARGn(2),%ebx /* class */
++ movzbl (%ebx),%ecx
+ movl ARGn(2),%ebx /* class */
+-
+- movzbl dv_quant_offset(%ebx),%ecx
++ movl ARGn(4),%edx /* shifts */
+ addl %ecx,%eax
+- leal dv_quant_shifts(,%eax,4),%edx /* edx is pq */
++ leal (%edx,%eax,4),%edx /* edx is pq */
+
+ /* extra = (class == 3); */
+ /* 0 1 2 3 */
+diff -Naur libdv-1.0.0.old/libdv/rgbtoyuv.S libdv-1.0.0/libdv/rgbtoyuv.S
+--- libdv-1.0.0.old/libdv/rgbtoyuv.S 2022-03-24 20:13:23.545725311 +0100
++++ libdv-1.0.0/libdv/rgbtoyuv.S 2022-03-24 20:13:32.598882713 +0100
+@@ -41,9 +41,6 @@
+ #define DV_WIDTH_SHORT_HALF 720
+ #define DV_WIDTH_BYTE_HALF 360
+
+-.global _dv_rgbtoycb_mmx
+-# .global yuvtoycb_mmx
+-
+ .data
+
+ .align 8
+@@ -110,17 +107,19 @@
+ VBG0B: .long 0,0
+
+ #endif
+-
++
++#include "asm_common.S"
++
+ .section .note.GNU-stack, "", @progbits
+
+ .text
+
+-#define _inPtr 8
+-#define _rows 12
+-#define _columns 16
+-#define _outyPtr 20
+-#define _outuPtr 24
+-#define _outvPtr 28
++#define _inPtr 24+8
++#define _rows 24+12
++#define _columns 24+16
++#define _outyPtr 24+20
++#define _outuPtr 24+24
++#define _outvPtr 24+28
+
+ .global _dv_rgbtoycb_mmx
+ .hidden _dv_rgbtoycb_mmx
+@@ -128,7 +127,6 @@
+ _dv_rgbtoycb_mmx:
+
+ pushl %ebp
+- movl %esp, %ebp
+ pushl %eax
+ pushl %ebx
+ pushl %ecx
+@@ -136,46 +134,47 @@
+ pushl %esi
+ pushl %edi
+
+- leal ZEROSX, %eax #This section gets around a bug
++ LOAD_PIC_REG(bp)
++
++ leal MUNG(ZEROSX), %eax #This section gets around a bug
+ movq (%eax), %mm0 #unlikely to persist
+- movq %mm0, ZEROS
+- leal OFFSETDX, %eax
++ movq %mm0, MUNG(ZEROS)
++ leal MUNG(OFFSETDX), %eax
+ movq (%eax), %mm0
+- movq %mm0, OFFSETD
+- leal OFFSETWX, %eax
++ movq %mm0, MUNG(OFFSETD)
++ leal MUNG(OFFSETWX), %eax
+ movq (%eax), %mm0
+- movq %mm0, OFFSETW
+- leal OFFSETBX, %eax
++ movq %mm0, MUNG(OFFSETW)
++ leal MUNG(OFFSETBX), %eax
+ movq (%eax), %mm0
+- movq %mm0, OFFSETB
+- leal YR0GRX, %eax
++ movq %mm0, MUNG(OFFSETB)
++ leal MUNG(YR0GRX), %eax
+ movq (%eax), %mm0
+- movq %mm0, YR0GR
+- leal YBG0BX, %eax
++ movq %mm0, MUNG(YR0GR)
++ leal MUNG(YBG0BX), %eax
+ movq (%eax), %mm0
+- movq %mm0, YBG0B
+- leal UR0GRX, %eax
++ movq %mm0, MUNG(YBG0B)
++ leal MUNG(UR0GRX), %eax
+ movq (%eax), %mm0
+- movq %mm0, UR0GR
+- leal UBG0BX, %eax
++ movq %mm0, MUNG(UR0GR)
++ leal MUNG(UBG0BX), %eax
+ movq (%eax), %mm0
+- movq %mm0, UBG0B
+- leal VR0GRX, %eax
++ movq %mm0, MUNG(UBG0B)
++ leal MUNG(VR0GRX), %eax
+ movq (%eax), %mm0
+- movq %mm0, VR0GR
+- leal VBG0BX, %eax
++ movq %mm0, MUNG(VR0GR)
++ leal MUNG(VBG0BX), %eax
+ movq (%eax), %mm0
+- movq %mm0, VBG0B
+-
+- movl _rows(%ebp), %eax
+- movl _columns(%ebp), %ebx
++ movq %mm0, MUNG(VBG0B)
++ movl _rows(%esp), %eax
++ movl _columns(%esp), %ebx
+ mull %ebx #number pixels
+ shrl $3, %eax #number of loops
+ movl %eax, %edi #loop counter in edi
+- movl _inPtr(%ebp), %eax
+- movl _outyPtr(%ebp), %ebx
+- movl _outuPtr(%ebp), %ecx
+- movl _outvPtr(%ebp), %edx
++ movl _inPtr(%esp), %eax
++ movl _outyPtr(%esp), %ebx
++ movl _outuPtr(%esp), %ecx
++ movl _outvPtr(%esp), %edx
+ rgbtoycb_mmx_loop:
+ movq (%eax), %mm1 #load G2R2B1G1R1B0G0R0
+ pxor %mm6, %mm6 #0 -> mm6
+@@ -189,29 +188,29 @@
+ punpcklbw %mm6, %mm1 #B1G1R1B0 -> mm1
+ movq %mm0, %mm2 #R1B0G0R0 -> mm2
+
+- pmaddwd YR0GR, %mm0 #yrR1,ygG0+yrR0 -> mm0
++ pmaddwd MUNG(YR0GR), %mm0 #yrR1,ygG0+yrR0 -> mm0
+ movq %mm1, %mm3 #B1G1R1B0 -> mm3
+
+- pmaddwd YBG0B, %mm1 #ybB1+ygG1,ybB0 -> mm1
++ pmaddwd MUNG(YBG0B), %mm1 #ybB1+ygG1,ybB0 -> mm1
+ movq %mm2, %mm4 #R1B0G0R0 -> mm4
+
+- pmaddwd UR0GR, %mm2 #urR1,ugG0+urR0 -> mm2
++ pmaddwd MUNG(UR0GR), %mm2 #urR1,ugG0+urR0 -> mm2
+ movq %mm3, %mm5 #B1G1R1B0 -> mm5
+
+- pmaddwd UBG0B, %mm3 #ubB1+ugG1,ubB0 -> mm3
++ pmaddwd MUNG(UBG0B), %mm3 #ubB1+ugG1,ubB0 -> mm3
+ punpckhbw %mm6, %mm7 # 00G2R2 -> mm7
+
+- pmaddwd VR0GR, %mm4 #vrR1,vgG0+vrR0 -> mm4
++ pmaddwd MUNG(VR0GR), %mm4 #vrR1,vgG0+vrR0 -> mm4
+ paddd %mm1, %mm0 #Y1Y0 -> mm0
+
+- pmaddwd VBG0B, %mm5 #vbB1+vgG1,vbB0 -> mm5
++ pmaddwd MUNG(VBG0B), %mm5 #vbB1+vgG1,vbB0 -> mm5
+
+ movq 8(%eax), %mm1 #R5B4G4R4B3G3R3B2 -> mm1
+ paddd %mm3, %mm2 #U1U0 -> mm2
+
+ movq %mm1, %mm6 #R5B4G4R4B3G3R3B2 -> mm6
+
+- punpcklbw ZEROS, %mm1 #B3G3R3B2 -> mm1
++ punpcklbw MUNG(ZEROS), %mm1 #B3G3R3B2 -> mm1
+ paddd %mm5, %mm4 #V1V0 -> mm4
+
+ movq %mm1, %mm5 #B3G3R3B2 -> mm5
+@@ -219,29 +218,29 @@
+
+ paddd %mm7, %mm1 #R3B200+00G2R2=R3B2G2R2->mm1
+
+- punpckhbw ZEROS, %mm6 #R5B4G4R3 -> mm6
++ punpckhbw MUNG(ZEROS), %mm6 #R5B4G4R3 -> mm6
+ movq %mm1, %mm3 #R3B2G2R2 -> mm3
+
+- pmaddwd YR0GR, %mm1 #yrR3,ygG2+yrR2 -> mm1
++ pmaddwd MUNG(YR0GR), %mm1 #yrR3,ygG2+yrR2 -> mm1
+ movq %mm5, %mm7 #B3G3R3B2 -> mm7
+
+- pmaddwd YBG0B, %mm5 #ybB3+ygG3,ybB2 -> mm5
++ pmaddwd MUNG(YBG0B), %mm5 #ybB3+ygG3,ybB2 -> mm5
+ psrad $FIXPSHIFT, %mm0 #32-bit scaled Y1Y0 -> mm0
+
+- movq %mm6, TEMP0 #R5B4G4R4 -> TEMP0
++ movq %mm6, MUNG(TEMP0) #R5B4G4R4 -> TEMP0
+ movq %mm3, %mm6 #R3B2G2R2 -> mm6
+- pmaddwd UR0GR, %mm6 #urR3,ugG2+urR2 -> mm6
++ pmaddwd MUNG(UR0GR), %mm6 #urR3,ugG2+urR2 -> mm6
+ psrad $FIXPSHIFT, %mm2 #32-bit scaled U1U0 -> mm2
+
+ paddd %mm5, %mm1 #Y3Y2 -> mm1
+ movq %mm7, %mm5 #B3G3R3B2 -> mm5
+- pmaddwd UBG0B, %mm7 #ubB3+ugG3,ubB2
++ pmaddwd MUNG(UBG0B), %mm7 #ubB3+ugG3,ubB2
+ psrad $FIXPSHIFT, %mm1 #32-bit scaled Y3Y2 -> mm1
+
+- pmaddwd VR0GR, %mm3 #vrR3,vgG2+vgR2
++ pmaddwd MUNG(VR0GR), %mm3 #vrR3,vgG2+vgR2
+ packssdw %mm1, %mm0 #Y3Y2Y1Y0 -> mm0
+
+- pmaddwd VBG0B, %mm5 #vbB3+vgG3,vbB2 -> mm5
++ pmaddwd MUNG(VBG0B), %mm5 #vbB3+vgG3,vbB2 -> mm5
+ psrad $FIXPSHIFT, %mm4 #32-bit scaled V1V0 -> mm4
+
+ movq 16(%eax), %mm1 #B7G7R7B6G6R6B5G5 -> mm7
+@@ -256,58 +255,58 @@
+ movq %mm7, %mm5 #R7B6G6R6B5G500 -> mm5
+ psrad $FIXPSHIFT, %mm3 #32-bit scaled V3V2 -> mm3
+
+- paddw OFFSETY, %mm0
++ paddw MUNG(OFFSETY), %mm0
+ movq %mm0, (%ebx) #store Y3Y2Y1Y0
+ packssdw %mm6, %mm2 #32-bit scaled U3U2U1U0 -> mm2
+
+- movq TEMP0, %mm0 #R5B4G4R4 -> mm0
++ movq MUNG(TEMP0), %mm0 #R5B4G4R4 -> mm0
+ addl $8, %ebx
+-
+- punpcklbw ZEROS, %mm7 #B5G500 -> mm7
++
++ punpcklbw MUNG(ZEROS), %mm7 #B5G500 -> mm7
+ movq %mm0, %mm6 #R5B4G4R4 -> mm6
+
+- movq %mm2, TEMPU #32-bit scaled U3U2U1U0 -> TEMPU
++ movq %mm2, MUNG(TEMPU) #32-bit scaled U3U2U1U0 -> TEMPU
+ psrlq $32, %mm0 #00R5B4 -> mm0
+
+ paddw %mm0, %mm7 #B5G5R5B4 -> mm7
+ movq %mm6, %mm2 #B5B4G4R4 -> mm2
+
+- pmaddwd YR0GR, %mm2 #yrR5,ygG4+yrR4 -> mm2
++ pmaddwd MUNG(YR0GR), %mm2 #yrR5,ygG4+yrR4 -> mm2
+ movq %mm7, %mm0 #B5G5R5B4 -> mm0
+
+- pmaddwd YBG0B, %mm7 #ybB5+ygG5,ybB4 -> mm7
++ pmaddwd MUNG(YBG0B), %mm7 #ybB5+ygG5,ybB4 -> mm7
+ packssdw %mm3, %mm4 #32-bit scaled V3V2V1V0 -> mm4
+
+ addl $24, %eax #increment RGB count
+
+- movq %mm4, TEMPV #(V3V2V1V0)/256 -> mm4
++ movq %mm4, MUNG(TEMPV) #(V3V2V1V0)/256 -> mm4
+ movq %mm6, %mm4 #B5B4G4R4 -> mm4
+
+- pmaddwd UR0GR, %mm6 #urR5,ugG4+urR4
++ pmaddwd MUNG(UR0GR), %mm6 #urR5,ugG4+urR4
+ movq %mm0, %mm3 #B5G5R5B4 -> mm0
+
+- pmaddwd UBG0B, %mm0 #ubB5+ugG5,ubB4
++ pmaddwd MUNG(UBG0B), %mm0 #ubB5+ugG5,ubB4
+ paddd %mm7, %mm2 #Y5Y4 -> mm2
+
+- pmaddwd VR0GR, %mm4 #vrR5,vgG4+vrR4 -> mm4
++ pmaddwd MUNG(VR0GR), %mm4 #vrR5,vgG4+vrR4 -> mm4
+ pxor %mm7, %mm7 #0 -> mm7
+
+- pmaddwd VBG0B, %mm3 #vbB5+vgG5,vbB4 -> mm3
++ pmaddwd MUNG(VBG0B), %mm3 #vbB5+vgG5,vbB4 -> mm3
+ punpckhbw %mm7, %mm1 #B7G7R7B6 -> mm1
+
+ paddd %mm6, %mm0 #U5U4 -> mm0
+ movq %mm1, %mm6 #B7G7R7B6 -> mm6
+
+- pmaddwd YBG0B, %mm6 #ybB7+ygG7,ybB6 -> mm6
++ pmaddwd MUNG(YBG0B), %mm6 #ybB7+ygG7,ybB6 -> mm6
+ punpckhbw %mm7, %mm5 #R7B6G6R6 -> mm5
+
+ movq %mm5, %mm7 #R7B6G6R6 -> mm7
+ paddd %mm4, %mm3 #V5V4 -> mm3
+
+- pmaddwd YR0GR, %mm5 #yrR7,ygG6+yrR6 -> mm5
++ pmaddwd MUNG(YR0GR), %mm5 #yrR7,ygG6+yrR6 -> mm5
+ movq %mm1, %mm4 #B7G7R7B6 -> mm4
+
+- pmaddwd UBG0B, %mm4 #ubB7+ugG7,ubB6 -> mm4
++ pmaddwd MUNG(UBG0B), %mm4 #ubB7+ugG7,ubB6 -> mm4
+ psrad $FIXPSHIFT, %mm0 #32-bit scaled U5U4 -> mm0
+
+ psrad $FIXPSHIFT, %mm2 #32-bit scaled Y5Y4 -> mm2
+@@ -315,25 +314,25 @@
+ paddd %mm5, %mm6 #Y7Y6 -> mm6
+ movq %mm7, %mm5 #R7B6G6R6 -> mm5
+
+- pmaddwd UR0GR, %mm7 #urR7,ugG6+ugR6 -> mm7
++ pmaddwd MUNG(UR0GR), %mm7 #urR7,ugG6+ugR6 -> mm7
+ psrad $FIXPSHIFT, %mm3 #32-bit scaled V5V4 -> mm3
+
+- pmaddwd VBG0B, %mm1 #vbB7+vgG7,vbB6 -> mm1
++ pmaddwd MUNG(VBG0B), %mm1 #vbB7+vgG7,vbB6 -> mm1
+ psrad $FIXPSHIFT, %mm6 #32-bit scaled Y7Y6 -> mm6
+
+ packssdw %mm6, %mm2 #Y7Y6Y5Y4 -> mm2
+
+- pmaddwd VR0GR, %mm5 #vrR7,vgG6+vrR6 -> mm5
++ pmaddwd MUNG(VR0GR), %mm5 #vrR7,vgG6+vrR6 -> mm5
+ paddd %mm4, %mm7 #U7U6 -> mm7
+
+ psrad $FIXPSHIFT, %mm7 #32-bit scaled U7U6 -> mm7
+- paddw OFFSETY, %mm2
++ paddw MUNG(OFFSETY), %mm2
+ movq %mm2, (%ebx) #store Y7Y6Y5Y4
+
+- movq ALLONE, %mm6
++ movq MUNG(ALLONE), %mm6
+ packssdw %mm7, %mm0 #32-bit scaled U7U6U5U4 -> mm0
+
+- movq TEMPU, %mm4 #32-bit scaled U3U2U1U0 -> mm4
++ movq MUNG(TEMPU), %mm4 #32-bit scaled U3U2U1U0 -> mm4
+ pmaddwd %mm6, %mm0 #U7U6U5U4 averaged -> (U7U6)(U5U4)=UU3 UU2->mm0
+
+ pmaddwd %mm6, %mm4 #U3U2U1U0 averaged -> (U3U2)(U1U0)=UU1 UU0->mm4
+@@ -343,8 +342,8 @@
+
+ psrad $FIXPSHIFT, %mm1 #32-bit scaled V7V6 -> mm1
+ psraw $1, %mm4 #divide UU3 UU2 UU1 UU0 by 2 -> mm4
+-
+- movq TEMPV, %mm5 #32-bit scaled V3V2V1V0 -> mm5
++
++ movq MUNG(TEMPV), %mm5 #32-bit scaled V3V2V1V0 -> mm5
+
+ movq %mm4, (%ecx) # store U
+
+@@ -434,14 +433,15 @@
+ _dv_pgm_copy_y_block_mmx:
+
+ pushl %ebp
+- movl %esp, %ebp
+ pushl %esi
+ pushl %edi
+-
+- movl 8(%ebp), %edi # dest
+- movl 12(%ebp), %esi # src
+
+- movq OFFSETY, %mm7
++ LOAD_PIC_REG(bp)
++
++ movl 16(%esp), %edi # dest
++ movl 20(%esp), %esi # src
++
++ movq MUNG(OFFSETY), %mm7
+ pxor %mm6, %mm6
+
+ movq (%esi), %mm0
+@@ -578,14 +578,15 @@
+ _dv_video_copy_y_block_mmx:
+
+ pushl %ebp
+- movl %esp, %ebp
+ pushl %esi
+ pushl %edi
+-
+- movl 8(%ebp), %edi # dest
+- movl 12(%ebp), %esi # src
+
+- movq OFFSETBX, %mm7
++ LOAD_PIC_REG(bp)
++
++ movl 16(%esp), %edi # dest
++ movl 20(%esp), %esi # src
++
++ movq MUNG(OFFSETBX), %mm7
+ pxor %mm6, %mm6
+
+ movq (%esi), %mm0
+@@ -870,16 +871,16 @@
+ _dv_pgm_copy_pal_c_block_mmx:
+
+ pushl %ebp
+- movl %esp, %ebp
+ pushl %esi
+ pushl %edi
+ pushl %ebx
+-
+- movl 8(%ebp), %edi # dest
+- movl 12(%ebp), %esi # src
+
++ LOAD_PIC_REG(bp)
++
++ movl 20(%esp), %edi # dest
++ movl 24(%esp), %esi # src
+
+- movq OFFSETBX, %mm7
++ movq MUNG(OFFSETBX), %mm7
+ pxor %mm6, %mm6
+
+
+@@ -1020,15 +1021,16 @@
+ _dv_video_copy_pal_c_block_mmx:
+
+ pushl %ebp
+- movl %esp, %ebp
+ pushl %esi
+ pushl %edi
+ pushl %ebx
+-
+- movl 8(%ebp), %edi # dest
+- movl 12(%ebp), %esi # src
+
+- movq OFFSETBX, %mm7
++ LOAD_PIC_REG(bp)
++
++ movl 20(%esp), %edi # dest
++ movl 24(%esp), %esi # src
++
++ movq MUNG(OFFSETBX), %mm7
+ paddw %mm7, %mm7
+ pxor %mm6, %mm6
+
+@@ -1117,18 +1119,18 @@
+ _dv_ppm_copy_ntsc_c_block_mmx:
+
+ pushl %ebp
+- movl %esp, %ebp
+ pushl %esi
+ pushl %edi
+ pushl %ebx
+-
+- movl 8(%ebp), %edi # dest
+- movl 12(%ebp), %esi # src
++
++ LOAD_PIC_REG(bp)
++
++ movl 20(%esp), %edi # dest
++ movl 24(%esp), %esi # src
+
+ movl $4, %ebx
+
+- movq ALLONE, %mm6
+-
++ movq MUNG(ALLONE), %mm6
+ ppm_copy_ntsc_c_block_mmx_loop:
+
+ movq (%esi), %mm0
+@@ -1192,14 +1194,15 @@
+ _dv_pgm_copy_ntsc_c_block_mmx:
+
+ pushl %ebp
+- movl %esp, %ebp
+ pushl %esi
+ pushl %edi
+-
+- movl 8(%ebp), %edi # dest
+- movl 12(%ebp), %esi # src
+
+- movq OFFSETBX, %mm7
++ LOAD_PIC_REG(bp)
++
++ movl 16(%esp), %edi # dest
++ movl 20(%esp), %esi # src
++
++ movq MUNG(OFFSETBX), %mm7
+ paddw %mm7, %mm7
+ pxor %mm6, %mm6
+
+@@ -1351,15 +1354,16 @@
+ _dv_video_copy_ntsc_c_block_mmx:
+
+ pushl %ebp
+- movl %esp, %ebp
+ pushl %esi
+ pushl %edi
+ pushl %ebx
+-
+- movl 8(%ebp), %edi # dest
+- movl 12(%ebp), %esi # src
+
+- movq OFFSETBX, %mm7
++ LOAD_PIC_REG(bp)
++
++ movl 20(%esp), %edi # dest
++ movl 24(%esp), %esi # src
++
++ movq MUNG(OFFSETBX), %mm7
+ paddw %mm7, %mm7
+ pxor %mm6, %mm6
+
+diff -Naur libdv-1.0.0.old/libdv/rgbtoyuv_x86_64.S libdv-1.0.0/libdv/rgbtoyuv_x86_64.S
+--- libdv-1.0.0.old/libdv/rgbtoyuv_x86_64.S 2022-03-24 20:13:23.546725329 +0100
++++ libdv-1.0.0/libdv/rgbtoyuv_x86_64.S 2022-03-24 20:13:32.598882713 +0100
+@@ -41,9 +41,6 @@
+ #define DV_WIDTH_SHORT_HALF 720
+ #define DV_WIDTH_BYTE_HALF 360
+
+-.global _dv_rgbtoycb_mmx_x86_64
+-# .global yuvtoycb_mmx_x86_64
+-
+ .data
+
+ .align 8
+diff -Naur libdv-1.0.0.old/libdv/vlc_x86.S libdv-1.0.0/libdv/vlc_x86.S
+--- libdv-1.0.0.old/libdv/vlc_x86.S 2022-03-24 20:13:23.547725346 +0100
++++ libdv-1.0.0/libdv/vlc_x86.S 2022-03-24 20:13:32.599882730 +0100
+@@ -1,31 +1,39 @@
+ #include "asmoff.h"
+ .section .note.GNU-stack, "", @progbits
++ #include "asm_common.S"
+
+ .text
+ .align 4
+ .globl dv_decode_vlc
++.globl asm_dv_decode_vlc
++.hidden asm_dv_decode_vlc
++asm_dv_decode_vlc = dv_decode_vlc
++
+ .type dv_decode_vlc, at function
+ dv_decode_vlc:
+ pushl %ebx
++ pushl %ebp
++
++ LOAD_PIC_REG(bp)
+
+- /* Args are at 8(%esp). */
+- movl 8(%esp),%eax /* %eax is bits */
+- movl 12(%esp),%ebx /* %ebx is maxbits */
++ /* Args are at 12(%esp). */
++ movl 12(%esp),%eax /* %eax is bits */
++ movl 16(%esp),%ebx /* %ebx is maxbits */
+ andl $0x3f,%ebx /* limit index range STL*/
+
+- movl dv_vlc_class_index_mask(,%ebx,4),%edx
++ movl MUNG_ARR(dv_vlc_class_index_mask,%ebx,4),%edx
+ andl %eax,%edx
+- movl dv_vlc_class_index_rshift(,%ebx,4),%ecx
++ movl MUNG_ARR(dv_vlc_class_index_rshift,%ebx,4),%ecx
+ sarl %cl,%edx
+- movl dv_vlc_classes(,%ebx,4),%ecx
++ movl MUNG_ARR(dv_vlc_classes,%ebx,4),%ecx
+ movsbl (%ecx,%edx,1),%edx /* %edx is class */
+
+- movl dv_vlc_index_mask(,%edx,4),%ebx
+- movl dv_vlc_index_rshift(,%edx,4),%ecx
++ movl MUNG_ARR(dv_vlc_index_mask,%edx,4),%ebx
++ movl MUNG_ARR(dv_vlc_index_rshift,%edx,4),%ecx
+ andl %eax,%ebx
+ sarl %cl,%ebx
+
+- movl dv_vlc_lookups(,%edx,4),%edx
++ movl MUNG_ARR(dv_vlc_lookups,%edx,4),%edx
+ movl (%edx,%ebx,4),%edx
+
+ /* Now %edx holds result, like this:
+@@ -44,7 +52,7 @@
+ movl %edx,%ecx
+ sarl $8,%ecx
+ andl $0xff,%ecx
+- movl sign_mask(,%ecx,4),%ebx
++ movl MUNG_ARR(sign_mask,%ecx,4),%ebx
+ andl %ebx,%eax
+ negl %eax
+ sarl $31,%eax
+@@ -65,14 +73,14 @@
+ *result = broken;
+ Note that the 'broken' pattern is all ones (i.e. 0xffffffff)
+ */
+- movl 12(%esp),%ebx /* %ebx is maxbits */
++ movl 16(%esp),%ebx /* %ebx is maxbits */
+ subl %ecx,%ebx
+ sbbl %ebx,%ebx
+ orl %ebx,%edx
+
+- movl 16(%esp),%eax
++ movl 20(%esp),%eax
+ movl %edx,(%eax)
+-
++ popl %ebp
+ popl %ebx
+ ret
+
+@@ -82,21 +90,28 @@
+ .type __dv_decode_vlc, at function
+ __dv_decode_vlc:
+ pushl %ebx
++ pushl %ebp
++
++ LOAD_PIC_REG(bp)
+
+- /* Args are at 8(%esp). */
+- movl 8(%esp),%eax /* %eax is bits */
++ /* Args are at 12(%esp). */
++ movl 12(%esp),%eax /* %eax is bits */
+
+ movl %eax,%edx /* %edx is class */
+ andl $0xfe00,%edx
+ sarl $9,%edx
++#ifdef __PIC__
++ movsbl dv_vlc_class_lookup5 at GOTOFF(%ebp,%edx),%edx
++#else
+ movsbl dv_vlc_class_lookup5(%edx),%edx
+-
+- movl dv_vlc_index_mask(,%edx,4),%ebx
+- movl dv_vlc_index_rshift(,%edx,4),%ecx
++#endif
++
++ movl MUNG_ARR(dv_vlc_index_mask,%edx,4),%ebx
++ movl MUNG_ARR(dv_vlc_index_rshift,%edx,4),%ecx
+ andl %eax,%ebx
+ sarl %cl,%ebx
+
+- movl dv_vlc_lookups(,%edx,4),%edx
++ movl MUNG_ARR(dv_vlc_lookups,%edx,4),%edx
+ movl (%edx,%ebx,4),%edx
+
+ /* Now %edx holds result, like this:
+@@ -114,7 +129,7 @@
+ movl %edx,%ecx
+ sarl $8,%ecx
+ andl $0xff,%ecx
+- movl sign_mask(,%ecx,4),%ecx
++ movl MUNG_ARR(sign_mask,%ecx,4),%ecx
+ andl %ecx,%eax
+ negl %eax
+ sarl $31,%eax
+@@ -129,9 +144,9 @@
+ xorl %eax,%edx
+ subl %eax,%edx
+
+- movl 12(%esp),%eax
++ movl 16(%esp),%eax
+ movl %edx,(%eax)
+-
++ popl %ebp
+ popl %ebx
+ ret
+
+@@ -142,6 +157,10 @@
+ */
+ .text
+ .align 4
++.globl asm_dv_parse_ac_coeffs_pass0
++.hidden asm_dv_parse_ac_coeffs_pass0
++ asm_dv_parse_ac_coeffs_pass0 = dv_parse_ac_coeffs_pass0
++
+ .globl dv_parse_ac_coeffs_pass0
+ .type dv_parse_ac_coeffs_pass0, at function
+ dv_parse_ac_coeffs_pass0:
+@@ -150,6 +169,8 @@
+ pushl %esi
+ pushl %ebp
+
++ LOAD_PIC_REG(si)
++
+ #define ARGn(N) (20+(4*(N)))(%esp)
+
+ /*
+@@ -162,8 +183,10 @@
+ ebp bl
+ */
+ movl ARGn(2),%ebp
++#ifndef __PIC__
+ movl ARGn(0),%esi
+ movl bitstream_t_buf(%esi),%esi
++#endif
+ movl dv_block_t_offset(%ebp),%edi
+ movl dv_block_t_reorder(%ebp),%ebx
+
+@@ -173,7 +196,11 @@
+
+ movq dv_block_t_coeffs(%ebp),%mm1
+ pxor %mm0,%mm0
++#ifdef __PIC__
++ pand const_f_0_0_0 at GOTOFF(%esi),%mm1
++#else
+ pand const_f_0_0_0,%mm1
++#endif
+ movq %mm1,dv_block_t_coeffs(%ebp)
+ movq %mm0,(dv_block_t_coeffs + 8)(%ebp)
+ movq %mm0,(dv_block_t_coeffs + 16)(%ebp)
+@@ -194,9 +221,17 @@
+ readloop:
+ movl %edi,%ecx
+ shrl $3,%ecx
++#ifdef __PIC__
++ movl ARGn(0),%eax
++ addl bitstream_t_buf(%eax),%ecx
++ movzbl (%ecx),%eax
++ movzbl 1(%ecx),%edx
++ movzbl 2(%ecx),%ecx
++#else
+ movzbl (%esi,%ecx,1),%eax
+ movzbl 1(%esi,%ecx,1),%edx
+ movzbl 2(%esi,%ecx,1),%ecx
++#endif
+ shll $16,%eax
+ shll $8,%edx
+ orl %ecx,%eax
+@@ -220,7 +255,11 @@
+
+ /* Attempt to use the shortcut first. If it hits, then
+ this vlc term has been decoded. */
++#ifdef __PIC__
++ movl dv_vlc_class1_shortcut at GOTOFF(%esi,%ecx,4),%edx
++#else
+ movl dv_vlc_class1_shortcut(,%ecx,4),%edx
++#endif
+ test $0x80,%edx
+ je done_decode
+
+@@ -231,12 +270,19 @@
+ movl %ebx,dv_block_t_reorder(%ebp)
+
+ /* %eax is bits */
+-
++#ifdef __PIC__
++ movsbl dv_vlc_class_lookup5 at GOTOFF(%esi,%ecx),%ecx
++
++ movl dv_vlc_index_mask at GOTOFF(%esi,%ecx,4),%ebx
++ movl dv_vlc_lookups at GOTOFF(%esi,%ecx,4),%edx
++ movl dv_vlc_index_rshift at GOTOFF(%esi,%ecx,4),%ecx
++#else
+ movsbl dv_vlc_class_lookup5(%ecx),%ecx
+
+ movl dv_vlc_index_mask(,%ecx,4),%ebx
+ movl dv_vlc_lookups(,%ecx,4),%edx
+ movl dv_vlc_index_rshift(,%ecx,4),%ecx
++#endif
+ andl %eax,%ebx
+ sarl %cl,%ebx
+
+@@ -259,7 +305,11 @@
+ movl %edx,%ecx
+ sarl $8,%ecx
+ andl $0xff,%ecx
++#ifdef __PIC__
++ movl sign_mask at GOTOFF(%esi,%ecx,4),%ecx
++#else
+ movl sign_mask(,%ecx,4),%ecx
++#endif
+ andl %ecx,%eax
+ negl %eax
+ sarl $31,%eax
+@@ -329,10 +379,16 @@
+
+ slowpath:
+ /* slow path: use dv_decode_vlc */;
++#ifdef __PIC__
++ pushl %esi
++ leal vlc at GOTOFF(%esi),%esi
++ xchgl %esi,(%esp) /* last parameter is &vlc */
++#else
+ pushl $vlc /* last parameter is &vlc */
++#endif
+ pushl %edx /* bits_left */
+ pushl %eax /* bits */
+- call dv_decode_vlc
++ call asm_dv_decode_vlc
+ addl $12,%esp
+ test $0x80,%edx /* If (vlc.run < 0) break */
+ jne escape
+@@ -369,6 +425,8 @@
+ pushl %esi
+ pushl %ebp
+
++ LOAD_PIC_REG(si)
++
+ #define ARGn(N) (20+(4*(N)))(%esp)
+
+ movl ARGn(1),%eax /* quality */
+@@ -377,7 +435,11 @@
+ jz its_mono
+ movl $6,%ebx
+ its_mono:
++#ifdef __PIC__
++ movl %ebx,n_blocks at GOTOFF(%esi)
++#else
+ movl %ebx,n_blocks
++#endif
+
+ /*
+ * ebx seg/b
+@@ -388,15 +450,22 @@
+ * ebp bl
+ */
+ movl ARGn(0),%ebx
++#ifndef __PIC__
+ movl dv_videosegment_t_bs(%ebx),%esi
+ movl bitstream_t_buf(%esi),%esi
++#endif
+ leal dv_videosegment_t_mb(%ebx),%edi
+
+ movl $0,%eax
+ movl $0,%ecx
+ macloop:
++#ifdef __PIC__
++ movl %eax,m at GOTOFF(%esi)
++ movl %ecx,mb_start at GOTOFF(%esi)
++#else
+ movl %eax,m
+ movl %ecx,mb_start
++#endif
+
+ movl ARGn(0),%ebx
+
+@@ -404,7 +473,13 @@
+ /* mb->qno = bitstream_get(bs,4); */
+ movl %ecx,%edx
+ shr $3,%edx
++#ifdef __PIC__
++ movl dv_videosegment_t_bs(%ebx),%ecx
++ movl bitstream_t_buf(%ecx),%ecx
++ movzbl 3(%ecx,%edx,1),%edx
++#else
+ movzbl 3(%esi,%edx,1),%edx
++#endif
+ andl $0xf,%edx
+ movl %edx,dv_macroblock_t_qno(%edi)
+
+@@ -415,7 +490,11 @@
+ movl %edx,dv_macroblock_t_eob_count(%edi)
+
+ /* mb->i = (seg->i + dv_super_map_vertical[m]) % (seg->isPAL?12:10); */
++#ifdef __PIC__
++ movl dv_super_map_vertical at GOTOFF(%esi,%eax,4),%edx
++#else
+ movl dv_super_map_vertical(,%eax,4),%edx
++#endif
+ movl dv_videosegment_t_i(%ebx),%ecx
+ addl %ecx,%edx
+
+@@ -426,11 +505,20 @@
+ andl $1,%ecx
+ shll $5,%ecx /* ecx = (isPAL ? 32 : 0) */
+
++#ifdef __PIC__
++ leal mod_10 at GOTOFF(%esi),%edx
++ movzbl (%edx,%ecx,1),%edx /* uses mod_12 for PAL */
++#else
+ movzbl mod_10(%edx,%ecx,1),%edx /* uses mod_12 for PAL */
++#endif
+ movl %edx,dv_macroblock_t_i(%edi)
+
+ /* mb->j = dv_super_map_horizontal[m]; */
++#ifdef __PIC__
++ movl dv_super_map_horizontal at GOTOFF(%esi,%eax,4),%edx
++#else
+ movl dv_super_map_horizontal(,%eax,4),%edx
++#endif
+ movl %edx,dv_macroblock_t_j(%edi)
+
+ /* mb->k = seg->k; */
+@@ -449,12 +537,28 @@
+ +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
+ */
+ /* dc = bitstream_get(bs,9); */
++#ifdef __PIC__
++ movl mb_start at GOTOFF(%esi),%ecx
++#else
+ movl mb_start,%ecx
++#endif
+ shr $3,%ecx
++#ifdef __PIC__
++ movzbl blk_start at GOTOFF(%esi,%ebx),%edx
++#else
+ movzbl blk_start(%ebx),%edx
++#endif
+ addl %ecx,%edx
++#ifdef __PIC__
++ movl ARGn(0),%ecx
++ movl dv_videosegment_t_bs(%ecx),%ecx
++ movl bitstream_t_buf(%ecx),%ecx
++ movzbl (%ecx,%edx,1),%eax /* hi byte */
++ movzbl 1(%ecx,%edx,1),%ecx /* lo byte */
++#else
+ movzbl (%esi,%edx,1),%eax /* hi byte */
+ movzbl 1(%esi,%edx,1),%ecx /* lo byte */
++#endif
+ shll $8,%eax
+ orl %ecx,%eax
+
+@@ -481,7 +585,11 @@
+
+ /* bl->reorder = &dv_reorder[bl->dct_mode][1]; */
+ shll $6,%eax
++#ifdef __PIC__
++ leal dv_reorder at GOTOFF+1(%esi,%eax),%eax
++#else
+ addl $(dv_reorder+1),%eax
++#endif
+ movl %eax,dv_block_t_reorder(%ebp)
+
+ /* bl->reorder_sentinel = bl->reorder + 63; */
+@@ -489,13 +597,22 @@
+ movl %eax,dv_block_t_reorder_sentinel(%ebp)
+
+ /* bl->offset= mb_start + dv_parse_bit_start[b]; */
++#ifdef __PIC__
++ movl mb_start at GOTOFF(%esi),%ecx
++ movl dv_parse_bit_start at GOTOFF(%esi,%ebx,4),%eax
++#else
+ movl mb_start,%ecx
+ movl dv_parse_bit_start(,%ebx,4),%eax
++#endif
+ addl %ecx,%eax
+ movl %eax,dv_block_t_offset(%ebp)
+
+ /* bl->end= mb_start + dv_parse_bit_end[b]; */
++#ifdef __PIC__
++ movl dv_parse_bit_end at GOTOFF(%esi,%ebx,4),%eax
++#else
+ movl dv_parse_bit_end(,%ebx,4),%eax
++#endif
+ addl %ecx,%eax
+ movl %eax,dv_block_t_end(%ebp)
+
+@@ -507,7 +624,11 @@
+ /* no AC pass. Just zero out the remaining coeffs */
+ movq dv_block_t_coeffs(%ebp),%mm1
+ pxor %mm0,%mm0
++#ifdef __PIC__
++ pand const_f_0_0_0 at GOTOFF(%esi),%mm1
++#else
+ pand const_f_0_0_0,%mm1
++#endif
+ movq %mm1,dv_block_t_coeffs(%ebp)
+ movq %mm0,(dv_block_t_coeffs + 8)(%ebp)
+ movq %mm0,(dv_block_t_coeffs + 16)(%ebp)
+@@ -532,18 +653,27 @@
+ pushl %ebp
+ pushl %edi
+ pushl %eax
+- call dv_parse_ac_coeffs_pass0
++ call asm_dv_parse_ac_coeffs_pass0
+ addl $12,%esp
+ done_ac:
+
++#ifdef __PIC__
++ movl n_blocks at GOTOFF(%esi),%eax
++#else
+ movl n_blocks,%eax
++#endif
+ addl $dv_block_t_size,%ebp
+ incl %ebx
+ cmpl %eax,%ebx
+ jnz blkloop
+
++#ifdef __PIC__
++ movl m at GOTOFF(%esi),%eax
++ movl mb_start at GOTOFF(%esi),%ecx
++#else
+ movl m,%eax
+ movl mb_start,%ecx
++#endif
+ addl $(8 * 80),%ecx
+ addl $dv_macroblock_t_size,%edi
+ incl %eax
+@@ -561,7 +691,7 @@
+
+ andl $DV_QUALITY_AC_MASK,%eax
+ cmpl $DV_QUALITY_AC_2,%eax
+- jz dv_parse_ac_coeffs
++ jz asm_dv_parse_ac_coeffs
+ movl $0,%eax
+ ret
+
================================================================
---- gitweb:
http://git.pld-linux.org/gitweb.cgi/packages/libdv.git/commitdiff/7ba6b0049b7f5ce912725b5e7042642d8def3d4b
More information about the pld-cvs-commit
mailing list