PKGBUILDs/extra/ogle/xvideofix.patch
2009-10-09 21:23:22 -05:00

205 lines
5.4 KiB
Diff

--- 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)