aboutsummaryrefslogtreecommitdiff
path: root/lib/ffmpeg/libavutil/x86
diff options
context:
space:
mode:
authorAnssi Hannula <anssi@xbmc.org>2011-02-02 01:29:29 +0200
committerAnssi Hannula <anssi@xbmc.org>2011-02-03 00:16:55 +0200
commit1a6a927ec5a0c305f58fa44bc0d023e007820b64 (patch)
tree480da2a288b605711c96a7315937c33ccf6c8257 /lib/ffmpeg/libavutil/x86
parent4d8e27ceb8c6218f4dd62b381ec786650f594ac9 (diff)
updated: internal ffmpeg to c3beafa0f1
Update internal FFmpeg to c3beafa0f1 from git://git.ffmpeg.org/ffmpeg.git. This update adds a new library, libavcore, which contains common multimedia utilities. Build scripts are updated to handle it (both internal and external). FFmpeg is no longer built with libfaad as it now supports LATM AAC audio natively. The unused build_xbmc.sh script is removed. The patchset in ffmpeg/patches has been updated, removals and additions are documented below. The following patches have been removed as no longer necessary: - Ticket #5481 - added support for LATM encapsulated AAC audio streams within FFmpeg (thanks Paul Kendall). - re-add libfaad wrapper to ffmpeg for now - added: ffmpeg spdif demuxer (fixes ac3-in-wav) - ffmpeg issue2137 patch for MKV (fixes #9014) - ffmpeg issue2137 patch for AVI (fixes #9014) - fixed: bitstream mode improperly set. Ticket #10981. - Add av_popcount() to libavutil/common.h and bump minor version - added: export DTS profile information in ffmpeg - Add av_get_profile_name() to get profile names. - Show profile in avcodec_string(). - libfaac: add recognized profiles array - dca: add profile names - h264: add profile names for the existing defines - dca: consider a stream with XXCh/X96 in ExSS as DTS-HD HRA - added: metadata support to oggenc with vorbis streams (submitted upstream Issue #555) The following patch has been removed as its purpose is unclear and upstream code has diverged (passthrough works even without it): - Setup wanted pkt size in spdif muxers header parser The following patch: - When PMT is found, we have found mpegts header information, and av_find_stream_info doesn't need to read more to find streams has been re-replaced with - Speed up mpegts av_find_stream_info. The latter was apparently accidentally reverted in the previous FFmpeg update. The following patch has been added to fix a build regression with the configure flags we use on darwin: - swscale: fix build with --enable-runtime-cpudetect --disable-mmx/mmx2/amd3dnow
Diffstat (limited to 'lib/ffmpeg/libavutil/x86')
-rw-r--r--lib/ffmpeg/libavutil/x86/cpu.c124
1 files changed, 124 insertions, 0 deletions
diff --git a/lib/ffmpeg/libavutil/x86/cpu.c b/lib/ffmpeg/libavutil/x86/cpu.c
new file mode 100644
index 0000000000..4b6cb0df00
--- /dev/null
+++ b/lib/ffmpeg/libavutil/x86/cpu.c
@@ -0,0 +1,124 @@
+/*
+ * CPU detection code, extracted from mmx.h
+ * (c)1997-99 by H. Dietz and R. Fisher
+ * Converted to C and improved by Fabrice Bellard.
+ *
+ * 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
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include "libavutil/x86_cpu.h"
+#include "libavutil/cpu.h"
+
+/* ebx saving is necessary for PIC. gcc seems unable to see it alone */
+#define cpuid(index,eax,ebx,ecx,edx)\
+ __asm__ volatile\
+ ("mov %%"REG_b", %%"REG_S"\n\t"\
+ "cpuid\n\t"\
+ "xchg %%"REG_b", %%"REG_S\
+ : "=a" (eax), "=S" (ebx),\
+ "=c" (ecx), "=d" (edx)\
+ : "0" (index));
+
+/* Function to test if multimedia instructions are supported... */
+int ff_get_cpu_flags_x86(void)
+{
+ int rval = 0;
+ int eax, ebx, ecx, edx;
+ int max_std_level, max_ext_level, std_caps=0, ext_caps=0;
+ int family=0, model=0;
+ union { int i[3]; char c[12]; } vendor;
+
+#if ARCH_X86_32
+ x86_reg a, c;
+ __asm__ volatile (
+ /* See if CPUID instruction is supported ... */
+ /* ... Get copies of EFLAGS into eax and ecx */
+ "pushfl\n\t"
+ "pop %0\n\t"
+ "mov %0, %1\n\t"
+
+ /* ... Toggle the ID bit in one copy and store */
+ /* to the EFLAGS reg */
+ "xor $0x200000, %0\n\t"
+ "push %0\n\t"
+ "popfl\n\t"
+
+ /* ... Get the (hopefully modified) EFLAGS */
+ "pushfl\n\t"
+ "pop %0\n\t"
+ : "=a" (a), "=c" (c)
+ :
+ : "cc"
+ );
+
+ if (a == c)
+ return 0; /* CPUID not supported */
+#endif
+
+ cpuid(0, max_std_level, vendor.i[0], vendor.i[2], vendor.i[1]);
+
+ if(max_std_level >= 1){
+ cpuid(1, eax, ebx, ecx, std_caps);
+ family = ((eax>>8)&0xf) + ((eax>>20)&0xff);
+ model = ((eax>>4)&0xf) + ((eax>>12)&0xf0);
+ if (std_caps & (1<<23))
+ rval |= AV_CPU_FLAG_MMX;
+ if (std_caps & (1<<25))
+ rval |= AV_CPU_FLAG_MMX2
+#if HAVE_SSE
+ | AV_CPU_FLAG_SSE;
+ if (std_caps & (1<<26))
+ rval |= AV_CPU_FLAG_SSE2;
+ if (ecx & 1)
+ rval |= AV_CPU_FLAG_SSE3;
+ if (ecx & 0x00000200 )
+ rval |= AV_CPU_FLAG_SSSE3;
+ if (ecx & 0x00080000 )
+ rval |= AV_CPU_FLAG_SSE4;
+ if (ecx & 0x00100000 )
+ rval |= AV_CPU_FLAG_SSE42;
+#endif
+ ;
+ }
+
+ cpuid(0x80000000, max_ext_level, ebx, ecx, edx);
+
+ if(max_ext_level >= 0x80000001){
+ cpuid(0x80000001, eax, ebx, ecx, ext_caps);
+ if (ext_caps & (1<<31))
+ rval |= AV_CPU_FLAG_3DNOW;
+ if (ext_caps & (1<<30))
+ rval |= AV_CPU_FLAG_3DNOWEXT;
+ if (ext_caps & (1<<23))
+ rval |= AV_CPU_FLAG_MMX;
+ if (ext_caps & (1<<22))
+ rval |= AV_CPU_FLAG_MMX2;
+ }
+
+ if (!strncmp(vendor.c, "GenuineIntel", 12) &&
+ family == 6 && (model == 9 || model == 13 || model == 14)) {
+ /* 6/9 (pentium-m "banias"), 6/13 (pentium-m "dothan"), and 6/14 (core1 "yonah")
+ * theoretically support sse2, but it's usually slower than mmx,
+ * so let's just pretend they don't. */
+ if (rval & AV_CPU_FLAG_SSE2) rval ^= AV_CPU_FLAG_SSE2SLOW|AV_CPU_FLAG_SSE2;
+ if (rval & AV_CPU_FLAG_SSE3) rval ^= AV_CPU_FLAG_SSE3SLOW|AV_CPU_FLAG_SSE3;
+ }
+
+ return rval;
+}