Web lists-archives.com

[MPlayer-dev-eng] [PATCH] Drop requirement for libavutil/x86/asm.h with shared FFmpeg




Hi,
 this patch adds a local copy of libavutil/x86/asm.h header as
mpx86asm.h, and changes all the references to it.

This allows to drop the check for the existence of the file in the
internal copy of libavutil, so that the compilation with shared FFmpeg
works out of the box.

asm.h is updated a few times a year in FFmpeg, so keeping it in sync
it's not going to be hard; also we probably don't need any new feature
that is added to it.


Please test, I did it only on x86.

Ciao,
 Roberto
Index: configure
===================================================================
--- configure	(revisione 37543)
+++ configure	(copia locale)
@@ -7128,7 +7128,6 @@
 
 if test "$ffmpeg" = yes; then
   test -e config.h || touch config.h
-  header_check libavutil/x86/asm.h || die "libavutil/x86/asm.h header is required for shared FFmpeg"
   def_ffmpeg='#define CONFIG_FFMPEG 1'
   if test "$ffmpeg_a" = yes ; then
     codecmodules="ffmpeg(internal) $codecmodules"
@@ -9359,6 +9358,9 @@
 
 ############################################################################
 
+# Create FFmpeg config files only for internal ffmpeg
+if test "$ffmpeg_a" = yes; then
+
 # Create avconfig.h for FFmpeg.
 cat > "$TMPH" << EOF
 /* Generated by mpconfigure */
@@ -9403,6 +9405,8 @@
 EOF
 touch ffmpeg/.config
 
+fi
+
 #############################################################################
 
 cat << EOF
Index: cpudetect.c
===================================================================
--- cpudetect.c	(revisione 37543)
+++ cpudetect.c	(copia locale)
@@ -16,7 +16,7 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#include "libavutil/x86/asm.h"
+#include "mpx86asm.h"
 #include "config.h"
 #include "cpudetect.h"
 #include "mp_msg.h"
Index: libmpcodecs/pullup.c
===================================================================
--- libmpcodecs/pullup.c	(revisione 37543)
+++ libmpcodecs/pullup.c	(copia locale)
@@ -20,7 +20,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "libavutil/x86/asm.h"
+#include "mpx86asm.h"
 #include "config.h"
 #include "pullup.h"
 
Index: libmpcodecs/vf_ass.c
===================================================================
--- libmpcodecs/vf_ass.c	(revisione 37543)
+++ libmpcodecs/vf_ass.c	(copia locale)
@@ -46,7 +46,7 @@
 #include "sub/eosd.h"
 
 #include "cpudetect.h"
-#include "libavutil/x86/asm.h"
+#include "mpx86asm.h"
 
 #define _r(c)  ((c)>>24)
 #define _g(c)  (((c)>>16)&0xFF)
Index: libmpcodecs/vf_decimate.c
===================================================================
--- libmpcodecs/vf_decimate.c	(revisione 37543)
+++ libmpcodecs/vf_decimate.c	(copia locale)
@@ -27,7 +27,7 @@
 #include "img_format.h"
 #include "mp_image.h"
 #include "vf.h"
-#include "libavutil/x86/asm.h"
+#include "mpx86asm.h"
 #include "libvo/fastmemcpy.h"
 
 
Index: libmpcodecs/vf_divtc.c
===================================================================
--- libmpcodecs/vf_divtc.c	(revisione 37543)
+++ libmpcodecs/vf_divtc.c	(copia locale)
@@ -26,7 +26,7 @@
 #include "mp_msg.h"
 #include "cpudetect.h"
 #include "libavutil/common.h"
-#include "libavutil/x86/asm.h"
+#include "mpx86asm.h"
 #include "mpbswap.h"
 
 #include "img_format.h"
Index: libmpcodecs/vf_filmdint.c
===================================================================
--- libmpcodecs/vf_filmdint.c	(revisione 37543)
+++ libmpcodecs/vf_filmdint.c	(copia locale)
@@ -30,7 +30,7 @@
 #include "vd.h"
 #include "vf.h"
 #include "cmmx.h"
-#include "libavutil/x86/asm.h"
+#include "mpx86asm.h"
 #include "libvo/fastmemcpy.h"
 
 #define NUM_STORED 4
Index: libmpcodecs/vf_fspp.c
===================================================================
--- libmpcodecs/vf_fspp.c	(revisione 37543)
+++ libmpcodecs/vf_fspp.c	(copia locale)
@@ -51,7 +51,7 @@
 #include "libavutil/internal.h"
 #include "libavutil/intreadwrite.h"
 #include "libavutil/mem.h"
-#include "libavutil/x86/asm.h"
+#include "mpx86asm.h"
 #include "libavcodec/avcodec.h"
 
 #undef free
Index: libmpcodecs/vf_gradfun.c
===================================================================
--- libmpcodecs/vf_gradfun.c	(revisione 37543)
+++ libmpcodecs/vf_gradfun.c	(copia locale)
@@ -41,7 +41,7 @@
 #include "libavutil/avutil.h"
 #include "libavutil/common.h"
 #include "libavutil/mem.h"
-#include "libavutil/x86/asm.h"
+#include "mpx86asm.h"
 
 struct vf_priv_s {
     int thresh;
Index: libmpcodecs/vf_ilpack.c
===================================================================
--- libmpcodecs/vf_ilpack.c	(revisione 37543)
+++ libmpcodecs/vf_ilpack.c	(copia locale)
@@ -29,7 +29,7 @@
 #include "mp_image.h"
 #include "vf.h"
 #include "libavutil/attributes.h"
-#include "libavutil/x86/asm.h"
+#include "mpx86asm.h"
 
 typedef void (pack_func_t)(unsigned char *dst, unsigned char *y,
     unsigned char *u, unsigned char *v, int w, int us, int vs);
Index: libmpcodecs/vf_ivtc.c
===================================================================
--- libmpcodecs/vf_ivtc.c	(revisione 37543)
+++ libmpcodecs/vf_ivtc.c	(copia locale)
@@ -27,7 +27,7 @@
 #include "img_format.h"
 #include "mp_image.h"
 #include "vf.h"
-#include "libavutil/x86/asm.h"
+#include "mpx86asm.h"
 #include "libvo/fastmemcpy.h"
 
 
Index: libmpcodecs/vf_noise.c
===================================================================
--- libmpcodecs/vf_noise.c	(revisione 37543)
+++ libmpcodecs/vf_noise.c	(copia locale)
@@ -37,7 +37,7 @@
 #include "vf.h"
 #include "libvo/fastmemcpy.h"
 #include "libavutil/mem.h"
-#include "libavutil/x86/asm.h"
+#include "mpx86asm.h"
 
 #define MAX_NOISE 4096
 #define MAX_SHIFT 1024
Index: libmpcodecs/vf_tfields.c
===================================================================
--- libmpcodecs/vf_tfields.c	(revisione 37543)
+++ libmpcodecs/vf_tfields.c	(copia locale)
@@ -27,7 +27,7 @@
 #include "img_format.h"
 #include "mp_image.h"
 #include "vf.h"
-#include "libavutil/x86/asm.h"
+#include "mpx86asm.h"
 #include "libmpdemux/demuxer.h"
 #include "libvo/fastmemcpy.h"
 
Index: libmpcodecs/vf_yadif.c
===================================================================
--- libmpcodecs/vf_yadif.c	(revisione 37543)
+++ libmpcodecs/vf_yadif.c	(copia locale)
@@ -34,7 +34,7 @@
 #include "libmpdemux/demuxer.h"
 #include "libvo/fastmemcpy.h"
 #include "libavutil/common.h"
-#include "libavutil/x86/asm.h"
+#include "mpx86asm.h"
 
 //===========================================================================//
 
Index: libvo/aclib_template.c
===================================================================
--- libvo/aclib_template.c	(revisione 37543)
+++ libvo/aclib_template.c	(copia locale)
@@ -80,7 +80,7 @@
 // 3dnow memcpy support from kernel 2.4.2
 //  by Pontscho/fresh!mindworkz
 
-#include "libavutil/x86/asm.h"
+#include "mpx86asm.h"
 
 #undef HAVE_ONLY_MMX1
 #if HAVE_MMX && !HAVE_MMX2 && !HAVE_AMD3DNOW && !HAVE_SSE
Index: mpx86asm.h
===================================================================
--- mpx86asm.h	(revisione 0)
+++ mpx86asm.h	(copia locale)
@@ -0,0 +1,162 @@
+/*
+ * This file is copied from FFmpeg.
+ * Source is libavutil/x86/asm.h from 21/08/2015
+ *
+ * MPlayer changes:
+ *  - Prefix multiple inclusion protection with MP_
+ */
+
+/*
+ * copyright (c) 2006 Michael Niedermayer <michaelni@xxxxxx>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef MP_AVUTIL_X86_ASM_H
+#define MP_AVUTIL_X86_ASM_H
+
+#include <stdint.h>
+#include "config.h"
+
+typedef struct xmm_reg { uint64_t a, b; } xmm_reg;
+typedef struct ymm_reg { uint64_t a, b, c, d; } ymm_reg;
+
+#if ARCH_X86_64
+#    define OPSIZE "q"
+#    define REG_a "rax"
+#    define REG_b "rbx"
+#    define REG_c "rcx"
+#    define REG_d "rdx"
+#    define REG_D "rdi"
+#    define REG_S "rsi"
+#    define PTR_SIZE "8"
+typedef int64_t x86_reg;
+
+/* REG_SP is defined in Solaris sys headers, so use REG_sp */
+#    define REG_sp "rsp"
+#    define REG_BP "rbp"
+#    define REGBP   rbp
+#    define REGa    rax
+#    define REGb    rbx
+#    define REGc    rcx
+#    define REGd    rdx
+#    define REGSP   rsp
+
+#elif ARCH_X86_32
+
+#    define OPSIZE "l"
+#    define REG_a "eax"
+#    define REG_b "ebx"
+#    define REG_c "ecx"
+#    define REG_d "edx"
+#    define REG_D "edi"
+#    define REG_S "esi"
+#    define PTR_SIZE "4"
+typedef int32_t x86_reg;
+
+#    define REG_sp "esp"
+#    define REG_BP "ebp"
+#    define REGBP   ebp
+#    define REGa    eax
+#    define REGb    ebx
+#    define REGc    ecx
+#    define REGd    edx
+#    define REGSP   esp
+#else
+typedef int x86_reg;
+#endif
+
+#define HAVE_7REGS (ARCH_X86_64 || (HAVE_EBX_AVAILABLE && HAVE_EBP_AVAILABLE))
+#define HAVE_6REGS (ARCH_X86_64 || (HAVE_EBX_AVAILABLE || HAVE_EBP_AVAILABLE))
+
+#if ARCH_X86_64 && defined(PIC)
+#    define BROKEN_RELOCATIONS 1
+#endif
+
+/*
+ * If gcc is not set to support sse (-msse) it will not accept xmm registers
+ * in the clobber list for inline asm. XMM_CLOBBERS takes a list of xmm
+ * registers to be marked as clobbered and evaluates to nothing if they are
+ * not supported, or to the list itself if they are supported. Since a clobber
+ * list may not be empty, XMM_CLOBBERS_ONLY should be used if the xmm
+ * registers are the only in the clobber list.
+ * For example a list with "eax" and "xmm0" as clobbers should become:
+ * : XMM_CLOBBERS("xmm0",) "eax"
+ * and a list with only "xmm0" should become:
+ * XMM_CLOBBERS_ONLY("xmm0")
+ */
+#if HAVE_XMM_CLOBBERS
+#    define XMM_CLOBBERS(...)        __VA_ARGS__
+#    define XMM_CLOBBERS_ONLY(...) : __VA_ARGS__
+#else
+#    define XMM_CLOBBERS(...)
+#    define XMM_CLOBBERS_ONLY(...)
+#endif
+
+/* Use to export labels from asm. */
+#define LABEL_MANGLE(a) EXTERN_PREFIX #a
+
+// Use rip-relative addressing if compiling PIC code on x86-64.
+#if ARCH_X86_64 && defined(PIC)
+#    define LOCAL_MANGLE(a) #a "(%%rip)"
+#else
+#    define LOCAL_MANGLE(a) #a
+#endif
+
+#if HAVE_INLINE_ASM_DIRECT_SYMBOL_REFS
+#   define MANGLE(a) EXTERN_PREFIX LOCAL_MANGLE(a)
+#   define NAMED_CONSTRAINTS_ADD(...)
+#   define NAMED_CONSTRAINTS(...)
+#   define NAMED_CONSTRAINTS_ARRAY_ADD(...)
+#   define NAMED_CONSTRAINTS_ARRAY(...)
+#else
+    /* When direct symbol references are used in code passed to a compiler that does not support them
+     *  then these references need to be converted to named asm constraints instead.
+     * Instead of returning a direct symbol MANGLE now returns a named constraint for that specific symbol.
+     * In order for this to work there must also be a corresponding entry in the asm-interface. To add this
+     *  entry use the macro NAMED_CONSTRAINTS() and pass in a list of each symbol reference used in the
+     *  corresponding block of code. (e.g. NAMED_CONSTRAINTS(var1,var2,var3) where var1 is the first symbol etc. ).
+     * If there are already existing constraints then use NAMED_CONSTRAINTS_ADD to add to the existing constraint list.
+     */
+#   define MANGLE(a) "%["#a"]"
+    // Intel/MSVC does not correctly expand va-args so we need a rather ugly hack in order to get it to work
+#   define FE_0(P,X) P(X)
+#   define FE_1(P,X,X1) P(X), FE_0(P,X1)
+#   define FE_2(P,X,X1,X2) P(X), FE_1(P,X1,X2)
+#   define FE_3(P,X,X1,X2,X3) P(X), FE_2(P,X1,X2,X3)
+#   define FE_4(P,X,X1,X2,X3,X4) P(X), FE_3(P,X1,X2,X3,X4)
+#   define FE_5(P,X,X1,X2,X3,X4,X5) P(X), FE_4(P,X1,X2,X3,X4,X5)
+#   define FE_6(P,X,X1,X2,X3,X4,X5,X6) P(X), FE_5(P,X1,X2,X3,X4,X5,X6)
+#   define FE_7(P,X,X1,X2,X3,X4,X5,X6,X7) P(X), FE_6(P,X1,X2,X3,X4,X5,X6,X7)
+#   define FE_8(P,X,X1,X2,X3,X4,X5,X6,X7,X8) P(X), FE_7(P,X1,X2,X3,X4,X5,X6,X7,X8)
+#   define FE_9(P,X,X1,X2,X3,X4,X5,X6,X7,X8,X9) P(X), FE_8(P,X1,X2,X3,X4,X5,X6,X7,X8,X9)
+#   define GET_FE_IMPL(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,NAME,...) NAME
+#   define GET_FE(A) GET_FE_IMPL A
+#   define GET_FE_GLUE(x, y) x y
+#   define FOR_EACH_VA(P,...) GET_FE_GLUE(GET_FE((__VA_ARGS__,FE_9,FE_8,FE_7,FE_6,FE_5,FE_4,FE_3,FE_2,FE_1,FE_0)), (P,__VA_ARGS__))
+#   define NAME_CONSTRAINT(x) [x] "m"(x)
+    // Parameters are a list of each symbol reference required
+#   define NAMED_CONSTRAINTS_ADD(...) , FOR_EACH_VA(NAME_CONSTRAINT,__VA_ARGS__)
+    // Same but without comma for when there are no previously defined constraints
+#   define NAMED_CONSTRAINTS(...) FOR_EACH_VA(NAME_CONSTRAINT,__VA_ARGS__)
+    // Same as above NAMED_CONSTRAINTS except used for passing arrays/pointers instead of normal variables
+#   define NAME_CONSTRAINT_ARRAY(x) [x] "m"(*x)
+#   define NAMED_CONSTRAINTS_ARRAY_ADD(...) , FOR_EACH_VA(NAME_CONSTRAINT_ARRAY,__VA_ARGS__)
+#   define NAMED_CONSTRAINTS_ARRAY(...) FOR_EACH_VA(NAME_CONSTRAINT_ARRAY,__VA_ARGS__)
+#endif
+
+#endif /* AVUTIL_X86_ASM_H */
_______________________________________________
MPlayer-dev-eng mailing list
MPlayer-dev-eng@xxxxxxxxxxxx
https://lists.mplayerhq.hu/mailman/listinfo/mplayer-dev-eng