changeset 4160:ac62f8534409

hw spu support for dxr3 - patch by David Holm
author arpi
date Tue, 15 Jan 2002 00:23:16 +0000
parents 42fec596fe7c
children 315f5d5355fa
files DOCS/DXR3 libvo/vo_dxr3.c mplayer.c
diffstat 3 files changed, 44 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/DOCS/DXR3	Tue Jan 15 00:20:50 2002 +0000
+++ b/DOCS/DXR3	Tue Jan 15 00:23:16 2002 +0000
@@ -17,20 +17,23 @@
 
 2. Usage
 
-    -vo dxr3:<devicenum>	For video output
-    -ao oss:<devicefile>	For audio output
-    -ac hwac3			For digital audio output instead of analog
-    -vc mpegpes			For mpeg playback
-    <devicenum>			Number of device to use for playback (if you
-				have more than one card.). This can usually
-				be left out (-vo dxr3).
-				Mandrake 8.1 uses devfs by default. If you are
-				running mandrake 8.1 please use -vo dxr3:0
-    <devicefile>		Normally /dev/em8300_ma or
-				/dev/em8300_ma-<devicenum>
-				(-ao dxr3:/dev/em8300_ma). If left out the
-				default oss device will be used (normally
-				soundcard).
+    -vo dxr3:<devicenum>		For video output
+    -ao oss:<devicefile>		For audio output
+    -ac hwac3				For digital audio output instead of
+					analog
+    -vc mpegpes				For mpeg playback
+    -aop list=resample:fout=48000	If samplerate is below 44100Hz
+    <devicenum>				Number of device to use for playback
+				        (if you	have more than one card.).
+					This can usually be left out (-vo dxr3).
+					Mandrake 8.1 uses devfs by default. If
+					you are running mandrake 8.1 please use
+					-vo dxr3:0
+    <devicefile>			Normally /dev/em8300_ma or
+					/dev/em8300_ma-<devicenum>
+					(-ao dxr3:/dev/em8300_ma). If left out
+					the default oss device will be used
+					(normally soundcard).
 
 MPEG-1, MPEG-2, VCD and DVD Notes
 There are some important notes to take into account here for optimum playback.
--- a/libvo/vo_dxr3.c	Tue Jan 15 00:20:50 2002 +0000
+++ b/libvo/vo_dxr3.c	Tue Jan 15 00:23:16 2002 +0000
@@ -91,6 +91,8 @@
 }
 #endif
 
+extern int vidmode;
+
 static uint32_t init(uint32_t scr_width, uint32_t scr_height, uint32_t width, uint32_t height, uint32_t fullscreen, char *title, uint32_t format)
 {
 	int tmp1,tmp2;
@@ -112,7 +114,7 @@
 		sprintf(devname, "/dev/em8300_mv-%s", vo_subdevice);
 	else
 		sprintf(devname, "/dev/em8300_mv");
-	fd_video = open(devname, O_WRONLY);
+	fd_video = open(devname, O_WRONLY | O_NONBLOCK);
 	if (fd_video < 0) {
 		printf("VO: [dxr3] Error opening %s for writing!\n", devname);
 		uninit();
@@ -135,7 +137,7 @@
 	/* Subpic code isn't working yet, don't set to ON 
 	 * unless you are really sure what you are doing 
 	 */
-	ioval = EM8300_SPUMODE_OFF;
+	ioval = EM8300_SPUMODE_ON;
 	if (ioctl(fd_control, EM8300_IOCTL_SET_SPUMODE, &ioval) < 0) {
 		printf("VO: [dxr3] Unable to set subpicture mode!\n");
 		uninit();
@@ -332,11 +334,19 @@
 		vo_mpegpes_t *p = (vo_mpegpes_t *) src[0];
 		size_t data_left = p->size;
 
-		if (ioctl(fd_video, EM8300_IOCTL_VIDEO_SETPTS, &vo_pts) < 0)
-			printf("VO: [dxr3] Unable to set pts\n");
+		if (p->id == 0x20) {
+			if (ioctl(fd_spu, EM8300_IOCTL_SPU_SETPTS, &vo_pts) < 0)
+				printf("VO: [dxr3] Unable to set pts\n");
+
+			while (data_left)
+				data_left -= write(fd_spu, (void*) (p->data + p->size-data_left), data_left);
+		} else {
+			if (ioctl(fd_video, EM8300_IOCTL_VIDEO_SETPTS, &vo_pts) < 0)
+				printf("VO: [dxr3] Unable to set pts\n");
 		
-		while (data_left)
-			data_left -= write(fd_video, (void*) (p->data + p->size-data_left), data_left);
+			while (data_left)
+				data_left -= write(fd_video, (void*) (p->data + p->size-data_left), data_left);
+		}
 		return 0;
 	}
 #ifdef USE_MP1E
@@ -439,7 +449,7 @@
 	uint32_t flag = 0;
 	
 	if (format == IMGFMT_MPEGPES)
-		flag = 0x2 | 0x4;
+		flag = 0x2 | 0x4 | 0x8;
 #ifdef USE_MP1E
 	if (format == IMGFMT_YV12)
 		flag = 0x1 | 0x4;
--- a/mplayer.c	Tue Jan 15 00:20:50 2002 +0000
+++ b/mplayer.c	Tue Jan 15 00:23:16 2002 +0000
@@ -2333,7 +2333,16 @@
 
 #ifdef USE_DVDREAD
   // DVD sub:
-  if(vo_spudec){
+  if(vo_flags & 0x08){
+    static vo_mpegpes_t packet;
+    static vo_mpegpes_t *pkg=&packet;
+    packet.timestamp=sh_video->timer*90000.0;
+    packet.id=0x20; /* Subpic */
+    while((packet.size=ds_get_packet_sub(d_dvdsub,&packet.data))>0){
+      mp_msg(MSGT_CPLAYER,MSGL_V,"\rDVD sub: len=%d  v_pts=%5.3f  s_pts=%5.3f  \n",packet.size,d_video->pts,d_dvdsub->pts);
+      video_out->draw_frame(&pkg);
+    }
+  }else if(vo_spudec){
     unsigned char* packet=NULL;
     int len;
     current_module="spudec";