Added CPU detection.
Original commit message from CVS: Added CPU detection. Added SSE optimisation to mpeg_play Modified the mpeg2 decoder and gstidct to use cpu detection. Cleanups in the mpeg1 and mpeg2 decoders.
This commit is contained in:
		
							parent
							
								
									2fa9336ace
								
							
						
					
					
						commit
						8d2a4dfbec
					
				| @ -15,6 +15,8 @@ libgst_la_SOURCES =	\ | ||||
| 	gstbuffer.c	\
 | ||||
| 	gstbufferpool.c	\
 | ||||
| 	gstclock.c	\
 | ||||
| 	gstcpu.c	\
 | ||||
| 	gstcpuid_i386.s	\
 | ||||
| 	gstelement.c	\
 | ||||
| 	gstelementfactory.c	\
 | ||||
| 	gstbin.c	\
 | ||||
| @ -42,6 +44,7 @@ libgstinclude_HEADERS =	\ | ||||
| 	gstbuffer.h	\
 | ||||
| 	gstbufferpool.h	\
 | ||||
| 	gstclock.h	\
 | ||||
| 	gstcpu.h	\
 | ||||
| 	gstelement.h	\
 | ||||
| 	gstbin.h	\
 | ||||
| 	gstpipeline.h	\
 | ||||
|  | ||||
| @ -36,6 +36,7 @@ void gst_init(int *argc,char **argv[]) { | ||||
| 
 | ||||
|   gtk_init(argc,argv); | ||||
| 
 | ||||
|   _gst_cpu_initialize(); | ||||
|   _gst_type_initialize(); | ||||
|   _gst_plugin_initialize(); | ||||
|   _gst_buffer_initialize(); | ||||
|  | ||||
| @ -30,8 +30,8 @@ | ||||
| #include <gst/gstobject.h> | ||||
| #include <gst/gstpad.h> | ||||
| #include <gst/gstbuffer.h> | ||||
| #include <gst/gstcpu.h> | ||||
| #include <gst/gstelement.h> | ||||
| 
 | ||||
| #include <gst/gstbin.h> | ||||
| #include <gst/gstpipeline.h> | ||||
| #include <gst/gstthread.h> | ||||
|  | ||||
							
								
								
									
										49
									
								
								gst/gstcpu.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								gst/gstcpu.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,49 @@ | ||||
| /* Gnome-Streamer
 | ||||
|  * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu> | ||||
|  * | ||||
|  * This library is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU Library General Public | ||||
|  * License as published by the Free Software Foundation; either | ||||
|  * version 2 of the License, or (at your option) any later version. | ||||
|  * | ||||
|  * This library 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 | ||||
|  * Library General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Library General Public | ||||
|  * License along with this library; if not, write to the | ||||
|  * Free Software Foundation, Inc., 59 Temple Place - Suite 330, | ||||
|  * Boston, MA 02111-1307, USA. | ||||
|  */ | ||||
| 
 | ||||
| 
 | ||||
| #include "config.h" | ||||
| #include "gstcpu.h" | ||||
| 
 | ||||
| static guint32 _gst_cpu_flags; | ||||
| 
 | ||||
| #ifdef __i386__ | ||||
| void gst_cpuid_i386(int,long *,long *,long *,long *); | ||||
| #define gst_cpuid gst_cpuid_i386 | ||||
| 
 | ||||
| #else | ||||
| #define gst_cpuid(o,a,b,c,d) | ||||
| #endif | ||||
| 
 | ||||
| void _gst_cpu_initialize(void)  | ||||
| { | ||||
|   long eax=0, ebx=0, ecx=0, edx=0; | ||||
| 
 | ||||
|   gst_cpuid(1, &eax, &ebx, &ecx, &edx); | ||||
| 
 | ||||
|   if (edx & (1<<23)) _gst_cpu_flags |= GST_CPU_FLAG_MMX; | ||||
|   if (edx & (1<<25)) _gst_cpu_flags |= GST_CPU_FLAG_SSE; | ||||
| 
 | ||||
|   g_print("CPU features (%08x)\n", _gst_cpu_flags); | ||||
| } | ||||
| 
 | ||||
| guint32 gst_cpu_get_flags(void)  | ||||
| { | ||||
|   return _gst_cpu_flags; | ||||
| } | ||||
							
								
								
									
										33
									
								
								gst/gstcpu.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								gst/gstcpu.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,33 @@ | ||||
| /* Gnome-Streamer
 | ||||
|  * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu> | ||||
|  * | ||||
|  * This library is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU Library General Public | ||||
|  * License as published by the Free Software Foundation; either | ||||
|  * version 2 of the License, or (at your option) any later version. | ||||
|  * | ||||
|  * This library 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 | ||||
|  * Library General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Library General Public | ||||
|  * License along with this library; if not, write to the | ||||
|  * Free Software Foundation, Inc., 59 Temple Place - Suite 330, | ||||
|  * Boston, MA 02111-1307, USA. | ||||
|  */ | ||||
| 
 | ||||
| 
 | ||||
| #ifndef __GST_CPU_H__ | ||||
| #define __GST_CPU_H__ | ||||
| 
 | ||||
| #include <glib.h> | ||||
| 
 | ||||
| #define  GST_CPU_FLAG_MMX 		(1 << 0) | ||||
| #define  GST_CPU_FLAG_SSE 		(1 << 1) | ||||
| 
 | ||||
| void _gst_cpu_initialize(); | ||||
| 
 | ||||
| guint32 gst_cpu_get_flags(); | ||||
| 
 | ||||
| #endif /* __GST_CPU_H__ */ | ||||
							
								
								
									
										45
									
								
								gst/gstcpuid_i386.s
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								gst/gstcpuid_i386.s
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,45 @@ | ||||
| 	.text | ||||
| .globl gst_cpuid_i386
 | ||||
| 	.type	 gst_cpuid_i386,@function
 | ||||
| gst_cpuid_i386: | ||||
| 	pushl %ebp | ||||
| 	movl %esp,%ebp | ||||
| 	pushl %edi | ||||
| 	pushl %ebx | ||||
| 	pushl %ecx | ||||
| 	pushl %edx | ||||
| 	movl 8(%ebp),%eax | ||||
| 	cpuid | ||||
| 	movl 12(%ebp),%edi | ||||
| 	test %edi,%edi | ||||
| 	jz L1	 | ||||
| 	movl %eax,(%edi) | ||||
| L1:	movl 16(%ebp),%edi | ||||
| 	test %edi,%edi | ||||
| 	jz L2 | ||||
| 	movl %ebx,(%edi) | ||||
| L2:	movl 20(%ebp),%edi | ||||
| 	test %edi,%edi | ||||
| 	jz L3 | ||||
| 	movl %ecx,(%edi) | ||||
| L3:	movl 24(%ebp),%edi | ||||
| 	test %edi,%edi | ||||
| 	jz L4 | ||||
| 	movl %edx,(%edi) | ||||
| L4:	popl %edx | ||||
| 	popl %ecx | ||||
| 	popl %ebx | ||||
| 	popl %edi | ||||
| 	movl %ebp,%esp | ||||
| 	popl %ebp | ||||
| 	ret | ||||
| 
 | ||||
| / doesn't work in user mode (MSRs are privileged) | ||||
| .globl siddisable
 | ||||
| siddisable: | ||||
| 	movl 0x119,%ecx | ||||
| 	rdmsr | ||||
| 	orl 0x200000,%eax | ||||
| 	wrmsr | ||||
| 	ret | ||||
| 	 | ||||
| @ -20,6 +20,7 @@ | ||||
| 
 | ||||
| #include <config.h> | ||||
| 
 | ||||
| #include <gst/gstcpu.h> | ||||
| #include "gstidct.h" | ||||
| #include "dct.h" | ||||
| 
 | ||||
| @ -33,10 +34,14 @@ GstIDCT *gst_idct_new(GstIDCTMethod method) | ||||
| 
 | ||||
|   if (method == GST_IDCT_DEFAULT) { | ||||
| #ifdef HAVE_LIBMMX | ||||
| 	 method = GST_IDCT_MMX32; | ||||
| #else | ||||
| 	 method = GST_IDCT_FAST_INT; | ||||
|     if (gst_cpu_get_flags() & GST_CPU_FLAG_MMX) { | ||||
|       method = GST_IDCT_MMX; | ||||
|     } | ||||
|     else | ||||
| #endif | ||||
|     { | ||||
|       method = GST_IDCT_FAST_INT; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   new->convert_sparse = gst_idct_int_sparse_idct; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user