Three Patches for Ogle 0.9.2

Sander Jansen <[email protected]> Fri, 22 Apr 2005 18:51:22 -0700
Newsgroups gmane.comp.video.ogle.devel,gmane.comp.video.ogle.user
Message-ID <[email protected]>
The following patches are for Ogle-0.9.2:

1) Two patches to make ogle compile with GCC 3.4 
2) Improved Xvideo Init; Other media players are grabbing the xv port so no 
other apps can use the same port. Ogle should do this too, so no one can 
steal ogles xv port. Also check other existing ports for compatible layers.

Hope this can be of use to anyone.
	
	Sander
gcc34alsafix.patch (text/x-diff, 359 B)
--- ogle-0.9.2/libogleao/alsa_audio.c	2003-10-18 17:38:30.000000000 -0700
+++ ogle-0.9.2-patch/libogleao/alsa_audio.c	2005-04-22 18:21:23.000000000 -0700
@@ -248,10 +248,9 @@
       //Shouldn't ctl_handle be closed here?
     }
     
-    snd_ctl_close(ctl_handle);
-  
-  __diga_end:
+    snd_ctl_close(ctl_handle);  
   }
+  __diga_end:
   
   return 0;
 }
gcc34configure.patch (text/x-diff, 416 B)
--- ogle-0.9.2/configure.in	2003-11-04 03:18:41.000000000 -0800
+++ ogle-0.9.2-patch/configure.in	2005-04-22 18:39:56.000000000 -0700
@@ -724,7 +724,7 @@
 dnl what about k6 / athlon
 dnl will it still assemble the mmx instructions when -march=i386
 dnl	  CFLAGS="$CFLAGS -march=$host_cpu"
-	  XCFLAGS="$CFLAGS -march=i586 -mcpu=pentiumpro"
+	  XCFLAGS="$CFLAGS -march=i586 -mtune=pentiumpro"
 	fi
 	USE_MMX=yes
 	;;
xvideofix.patch (text/x-diff, 5.4 KB)
--- ogle-0.9.2/mpeg2_video/video_output_x11.c	2003-11-04 04:02:10.000000000 -0800
+++ ogle-0.9.2-patch/mpeg2_video/video_output_x11.c	2005-04-22 18:37:56.000000000 -0700
@@ -286,6 +286,7 @@
   }
 }
 
+
 /* This section of the code looks for the Xv extension for hardware
  * yuv->rgb and scaling. If it is not found, or any suitable adapter
  * is not found, use_xv will be set to 0. Otherwise it allocates a
@@ -299,121 +300,136 @@
 {
   int xv_found = 0;
 #ifdef HAVE_XV
-  int i, j;
+  int i, j, k;
   int result;
 
   xv_port = 0; /* We have no port yet. */
-  
+
   /* Check for the Xvideo extension */
-  result = XvQueryExtension(mydisplay, &xv_version, &xv_release, 
-			    &xv_request_base, &xv_event_base, 
+  result = XvQueryExtension(mydisplay, &xv_version, &xv_release,
+			    &xv_request_base, &xv_event_base,
 			    &xv_error_base);
   if(result != Success) {
     WARNING("%s", "Xvideo extension not found\n");
     use_xv = 0;
     return;
   }
-  
+
   NOTE("Found Xv extension %d.%d, checking for suitable adaptors\n",
        xv_version, xv_release);
-  
+
   /* Check for available adaptors */
-  result = XvQueryAdaptors(mydisplay, DefaultRootWindow (mydisplay), 
+  result = XvQueryAdaptors(mydisplay, DefaultRootWindow (mydisplay),
 			   &xv_num_adaptors, &xv_adaptor_info);
   if(result != Success) {
     WARNING("%s", "No Xv adaptors found\n");
     use_xv = 0;
     return;
   }
-      
+
   /* Check adaptors */
   for(i = 0; i < xv_num_adaptors; i++) {
-    
+
     /* Is it usable for displaying XvImages */
     if(!(xv_adaptor_info[i].type & XvInputMask) ||
        !(xv_adaptor_info[i].type & XvImageMask))
       continue;
-    
-    xv_port = xv_adaptor_info[i].base_id;
-      
-    /* Check image formats of adaptor */
-    xv_formats = XvListImageFormats(mydisplay, xv_port, &xv_num_formats);
-    for(j = 0; j < xv_num_formats; j++) {
-      if(xv_formats[j].id == 0x32315659) { /* YV12 */
-	//if(xv_formats[j].id == 0x30323449) { /* I420 */
-	xv_id = xv_formats[j].id;
-	break;
-      } 
-    }
-    /* No matching format found */
-    if(j == xv_num_formats)
-      continue;
-      
-    NOTE("Xv adaptor \"%s\" port %li image format %i\n",
-	 xv_adaptor_info[i].name, xv_port, xv_id);
-      
-    /* Allocate XvImages */
+
+		/* Check Available Ports */
+		for (j = 0; j <  xv_adaptor_info[i].num_ports && !xv_port ; j++) {
+			
+			/* Check Image formats of adaptor */
+			xv_formats = XvListImageFormats(mydisplay,xv_adaptor_info[i].base_id + j, &xv_num_formats); 
+			for (k = 0; k < xv_num_formats; k ++) {
+				
+				/* Check for proper format (YV12) and see if we can grab the port */			
+				if ( (xv_formats[k].id == 0x32315659) && (XvGrabPort(mydisplay,xv_adaptor_info[i].base_id + j,0) == Success) ) { 
+					xv_id = xv_formats[k].id;
+					xv_port = xv_adaptor_info[i].base_id +  j;
+					break;
+					}
+				
+				}
+
+			/* delete stuff nicely */
+			XFree(xv_formats);	
+			}
+		
+		/* Check next Adapter */
+		if (xv_port==0) continue;		
+				
+		/* Report what we found */							
+    NOTE("Xv adaptor \"%s\" port %li image format %i\n", xv_adaptor_info[i].name, xv_port, xv_id);
+			
+		/* Allocate XvImage */
     xv_image = XvShmCreateImage(mydisplay, xv_port, xv_id, NULL,
 				padded_width,
-				padded_height, 
+				padded_height,
 				&shm_info);
-    
-    /* Got an Image? */
+
+    /* Got an milk? */
     if(xv_image == NULL)
       continue;
-    
+		
     /* Test and see if we really got padded_width x padded_height */
     if(xv_image->width != padded_width ||
        xv_image->height != padded_height) {
       FATAL("XvShmCreateImage got size: %d x %d\n",
 	    xv_image->width, xv_image->height);
       exit(1);
-    }
-    
+    	}
+		
+		/* Now Finish Up */
     shm_info.shmid = picture_buffer_shmid;
     shm_info.shmaddr = picture_buffer_addr;
-    
-    /* Set the data pointer to the decoders picture segment. */  
+
+    /* Set the data pointer to the decoders picture segment. */
     //    xv_image->data = picture_data->y;
     shm_info.readOnly = True;
-    
+
     /* make sure we don't have any unhandled errors */
     XSync(mydisplay, False);
-    
+
     /* set error handler so we can check if xshmattach failed */
     prev_xerrhandler = XSetErrorHandler(xshm_errorhandler);
-    
+
     /* get the serial of the xshmattach request */
     req_serial = NextRequest(mydisplay);
-    
+
     /* try to attach */
     XShmAttach(mydisplay, &shm_info);
-    
+
     /* make sure xshmattach has been processed and any errors
        have been returned to us */
     XSync(mydisplay, False);
-    
+
     /* revert to the previous xerrorhandler */
     XSetErrorHandler(prev_xerrhandler);
-    
+
     if(use_xshm) {
 #if 0
       shmctl(shm_info.shmid, IPC_RMID, 0); // only works on Linux..
 #endif
-      
+
       CompletionType = XShmGetEventBase(mydisplay) + ShmCompletion;
     }
     xv_found = 1;
 
     /* All set up! */
     break;
-  }
+		}
+	
+	/* Clean up */
+	XvFreeAdaptorInfo(xv_adaptor_info);
+
 #endif /* HAVE_XV */
+	/* In case we didn't find a working Xv */ 
   if(!xv_found) {
     use_xv = 0;
-  }
-}
-     
+	  }
+	
+	}
+
 
 /* This section of the code tries to use the MIT XShm extension for 
  * accellerated transfers to to X. XShm extension is need and only
@@ -1726,6 +1742,8 @@
 
   if(mydisplay) {
     XSync(mydisplay,True);
+    if (use_xv) 
+      XvUngrabPort(mydisplay,xv_port,CurrentTime);
     if(use_xshm)
       XShmDetach(mydisplay, &shm_info);
     if(window.ximage != 0)