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