From: Miguel F. <mig...@us...> - 2005-07-17 21:50:50
|
Update of /cvsroot/xine/xine-lib/src/video_out In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31825/src/video_out Modified Files: Tag: xine-1_0 alphablend.c video_out_opengl.c video_out_xvmc.c video_out_xxmc.c xvmc_mocomp.c xvmc_vld.c xxmc.h Log Message: merging stuff to the xine-1_0 branch see ChangeLog for details Index: alphablend.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/video_out/alphablend.c,v retrieving revision 1.47.2.1 retrieving revision 1.47.2.2 diff -u -r1.47.2.1 -r1.47.2.2 --- alphablend.c 9 Feb 2005 19:39:41 -0000 1.47.2.1 +++ alphablend.c 17 Jul 2005 21:50:06 -0000 1.47.2.2 @@ -1639,7 +1639,10 @@ static void memblend_xx44(uint8_t *mem,uint8_t val, register size_t size, uint8_t mask) { - register uint8_t masked_val = val & mask; + register uint8_t + masked_val; + + if (0 == (masked_val = val & mask)) return; while(size--) { if ((*mem & mask) <= masked_val ) *mem = val; Index: video_out_opengl.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/video_out/video_out_opengl.c,v retrieving revision 1.45.2.2 retrieving revision 1.45.2.3 diff -u -r1.45.2.2 -r1.45.2.3 --- video_out_opengl.c 25 Apr 2005 14:43:17 -0000 1.45.2.2 +++ video_out_opengl.c 17 Jul 2005 21:50:07 -0000 1.45.2.3 @@ -187,7 +187,7 @@ /* OpenGL state */ GLXContext context; XVisualInfo *vinfo; - int fprog; + GLuint fprog; int tex_width, tex_height; /* independend of frame */ /* OpenGL capabilities */ const GLubyte *gl_exts; /* extension string - NULL if uninitialized */ @@ -675,8 +675,8 @@ static int render_help_verify_ext (opengl_driver_t *this, char *ext) { int ret = 0; int l = strlen (ext); - const GLubyte *e; - for (e = this->gl_exts; e && *e; e = strchr (e, ' ')) { + const char *e; + for (e = (char *) this->gl_exts; e && *e; e = strchr (e, ' ')) { while (isspace (*e)) e++; if (strncmp (e, ext, l) == 0 && (e[l] == 0 || e[l] == ' ')) { @@ -691,13 +691,14 @@ } /* Return the address of a linked function */ -static void *getdladdr(const GLubyte *funcName) { +static void *getdladdr (const GLubyte *_funcName) { + const char *funcName = (const char *) _funcName; #if defined(_WIN32) return NULL; #elif defined(__APPLE__) - char temp = xine_xmalloc (strlen (funcName) + 2); + char *temp = xine_xmalloc (strlen (funcName) + 2); void *res = NULL; temp[0] = '_'; /* Mac OS X prepends an underscore on function names */ strcpy (temp+1, funcName); @@ -719,10 +720,10 @@ } /* Return the address of the specified OpenGL extension function */ -static void *getaddr(const char *funcName) { +static void *getaddr (const char *funcName) { #if defined(_WIN32) - return (void*) wglGetProcAddress (funcName); + return (void*) wglGetProcAddress ((const GLubyte *) funcName); #else void * (*MYgetProcAddress) (const GLubyte *); @@ -730,13 +731,13 @@ /* Try to get address of extension via glXGetProcAddress[ARB], if that * fails try to get the address of a linked function */ - MYgetProcAddress = getdladdr ("glXGetProcAddress"); + MYgetProcAddress = getdladdr ((const GLubyte *) "glXGetProcAddress"); if (! MYgetProcAddress) - MYgetProcAddress = getdladdr ("glXGetProcAddressARB"); + MYgetProcAddress = getdladdr ((const GLubyte *) "glXGetProcAddressARB"); if (! MYgetProcAddress) MYgetProcAddress = getdladdr; - res = MYgetProcAddress (funcName); + res = MYgetProcAddress ((const GLubyte *) funcName); if (! res) fprintf (stderr, "Cannot find address for OpenGL extension function '%s',\n" "which should be available according to extension specs.\n", @@ -756,7 +757,7 @@ if (! this->gl_exts) { if (++num_tests > 10) { fprintf (stderr, "video_out_opengl: Cannot find OpenGL extensions (tried multiple times).\n"); - this->gl_exts = ""; + this->gl_exts = (const GLubyte *) ""; } } else num_tests = 0; Index: video_out_xvmc.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/video_out/video_out_xvmc.c,v retrieving revision 1.20.2.1 retrieving revision 1.20.2.2 diff -u -r1.20.2.1 -r1.20.2.2 --- video_out_xvmc.c 20 Apr 2005 17:21:14 -0000 1.20.2.1 +++ video_out_xvmc.c 17 Jul 2005 21:50:07 -0000 1.20.2.2 @@ -786,6 +786,10 @@ } xvmc->macroblocks = (xine_macroblocks_t *)&this->macroblocks; + this->macroblocks.num_blocks = 0; + this->macroblocks.macroblockptr = this->macroblocks.macroblockbaseptr; + this->macroblocks.xine_mc.blockptr = + this->macroblocks.xine_mc.blockbaseptr; if( flags & VO_NEW_SEQUENCE_FLAG ) { xvmc_set_context (this, width, height, ratio, format, flags, xvmc->macroblocks); @@ -843,7 +847,7 @@ blend_yuv(frame->vo_frame.base, overlay, frame->width, frame->height, frame->vo_frame.pitches, &this->alphablend_extra_data); - else + else if (frame->format != XINE_IMGFMT_XVMC) blend_yuy2(frame->vo_frame.base[0], overlay, frame->width, frame->height, frame->vo_frame.pitches[0], &this->alphablend_extra_data); Index: video_out_xxmc.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/video_out/video_out_xxmc.c,v retrieving revision 1.11.2.1 retrieving revision 1.11.2.2 diff -u -r1.11.2.1 -r1.11.2.2 --- video_out_xxmc.c 20 Apr 2005 17:21:14 -0000 1.11.2.1 +++ video_out_xxmc.c 17 Jul 2005 21:50:07 -0000 1.11.2.2 @@ -31,7 +31,7 @@ * * overlay support by James Courtier-Dutton <Ja...@su...> - July 2001 * X11 unscaled overlay support by Miguel Freitas - Nov 2003 - * XvMC VLD implementation by Thomas Hellström - August-Oct 2004 + * XvMC VLD implementation by Thomas Hellström - 2004, 2005. * XvMC merge by Thomas Hellström - Sep 2004 * */ @@ -41,8 +41,10 @@ #include "xxmc.h" #include <unistd.h> + static int gX11Fail; -static void xxmc_frame_updates(xxmc_driver_t *driver, xxmc_frame_t *frame); +static void xxmc_frame_updates(xxmc_driver_t *driver, xxmc_frame_t *frame, + int init_macroblocks); static void dispose_ximage (xxmc_driver_t *this, XShmSegmentInfo *shminfo, XvImage *myimage); @@ -349,7 +351,59 @@ } /* - * Here follows a number of callback function. + * Callback used by decoder to check that surfaces are still valid, + * and to lock the context so that it won't get destroyed during + * decoding. + */ + + +static int xxmc_lock_and_validate_surfaces(vo_frame_t *cur_frame, + vo_frame_t *fw_frame, + vo_frame_t *bw_frame, + unsigned pc_type) +{ + xxmc_driver_t + *driver = (xxmc_driver_t *) cur_frame->driver; + xxmc_frame_t + *frame; + + xvmc_context_reader_lock( &driver->xvmc_lock ); + + switch(pc_type) { + case XINE_PICT_B_TYPE: + frame = (xxmc_frame_t *) bw_frame; + if (!xxmc_xvmc_surface_valid( driver, frame->xvmc_surf)) break; + /* fall through */ + case XINE_PICT_P_TYPE: + frame = (xxmc_frame_t *) fw_frame; + if (!xxmc_xvmc_surface_valid( driver, frame->xvmc_surf)) break; + /* fall through */ + default: + frame = (xxmc_frame_t *) cur_frame; + if (!xxmc_xvmc_surface_valid( driver, frame->xvmc_surf)) break; + return 0; + } + + xvmc_context_reader_unlock( &driver->xvmc_lock ); + return -1; +} + +/* + * Callback for decoder. Decoding temporarily halted. Release the context. + */ + +static void xxmc_unlock_surfaces(vo_driver_t *this_gen) +{ + xxmc_driver_t + *driver = (xxmc_driver_t *) this_gen; + + xvmc_context_reader_unlock( &driver->xvmc_lock ); +} + +/* + * Callback for decoder. + * Check that the surface is vaid and + * flush outstanding rendering requests on this surface. */ static void xvmc_flush(vo_frame_t *this_gen) @@ -377,13 +431,13 @@ } - /* * Callback function for the VO-loop to duplicate frame data. * YV12 and YUY2 formats are taken care of in the xine-engine. + * This one only deals with hardware surfaces and duplicates them + * using a call to XvMCBlendSubpicture2 with a blank subpicture. */ - static void xxmc_duplicate_frame_data(vo_frame_t *this_gen, vo_frame_t *original) { @@ -409,7 +463,7 @@ this->format = original->format; this->ratio = original->ratio; - xxmc_frame_updates(driver,this); + xxmc_frame_updates(driver,this,0); /* * Allocate a dummy subpicture and copy using @@ -699,7 +753,6 @@ static void xxmc_dispose_context(xxmc_driver_t *driver) { if (driver->contextActive) { - if (driver->xvmc_accel & (XINE_XVMC_ACCEL_MOCOMP | XINE_XVMC_ACCEL_IDCT)) { xvmc_macroblocks_t *macroblocks = &driver->macroblocks; @@ -729,6 +782,13 @@ } } +/* + * Find a suitable XvMC Context according to the acceleration request + * passed to us in the xxmc variable, and to the acceleration type + * priority set up in this plugin. Result is returned in + * driver->xvmc_cur_cap. + */ + static int xxmc_find_context(xxmc_driver_t *driver, xine_xxmc_t *xxmc, unsigned width, unsigned height) { @@ -962,7 +1022,8 @@ } static void xxmc_frame_updates(xxmc_driver_t *driver, - xxmc_frame_t *frame) + xxmc_frame_t *frame, + int init_macroblocks) { xine_xxmc_t *xxmc = &frame->xxmc_data; @@ -987,38 +1048,47 @@ if (frame->xvmc_surf == NULL) { if (NULL == (frame->xvmc_surf = xxmc_xvmc_alloc_surface( driver, &driver->context))) { - printf("video_out_xxmc: ERROR: Accelerated surface allocation failed.\n" - "video_out_xxmc: You are probably out of framebuffer memory.\n" - "video_out_xxmc: Falling back to software decoding.\n"); + fprintf(stderr, "video_out_xxmc: ERROR: Accelerated surface allocation failed.\n" + "video_out_xxmc: You are probably out of framebuffer memory.\n" + "video_out_xxmc: Falling back to software decoding.\n"); driver->xvmc_accel = 0; xxmc_dispose_context( driver ); return; } - } + xxmc->xvmc.macroblocks = (xine_macroblocks_t *) &driver->macroblocks; + xxmc->xvmc.macroblocks->xvmc_accel = (driver->unsigned_intra) ? + 0 : XINE_VO_SIGNED_INTRA; + switch(driver->xvmc_accel) { + case XINE_XVMC_ACCEL_IDCT: + xxmc->xvmc.macroblocks->xvmc_accel |= XINE_VO_IDCT_ACCEL; + break; + case XINE_XVMC_ACCEL_MOCOMP: + xxmc->xvmc.macroblocks->xvmc_accel |= XINE_VO_MOTION_ACCEL; + break; + default: + xxmc->xvmc.macroblocks->xvmc_accel = 0; + } - xxmc->acceleration = driver->xvmc_accel; - xxmc->xvmc.macroblocks = (xine_macroblocks_t *) &driver->macroblocks; - xxmc->xvmc.macroblocks->xvmc_accel = (driver->unsigned_intra) ? - 0 : XINE_VO_SIGNED_INTRA; - switch(driver->xvmc_accel) { - case XINE_XVMC_ACCEL_IDCT: - xxmc->xvmc.macroblocks->xvmc_accel |= XINE_VO_IDCT_ACCEL; - break; - case XINE_XVMC_ACCEL_MOCOMP: - xxmc->xvmc.macroblocks->xvmc_accel |= XINE_VO_MOTION_ACCEL; - break; - default: - xxmc->xvmc.macroblocks->xvmc_accel = 0; - } - xxmc->proc_xxmc_flush = xvmc_flush; - xxmc->xvmc.proc_macro_block = xxmc_xvmc_proc_macro_block; - frame->vo_frame.proc_duplicate_frame_data = xxmc_duplicate_frame_data; + xxmc->proc_xxmc_flush = xvmc_flush; + xxmc->proc_xxmc_lock_valid = xxmc_lock_and_validate_surfaces; + xxmc->proc_xxmc_unlock = xxmc_unlock_surfaces; + + xxmc->xvmc.proc_macro_block = xxmc_xvmc_proc_macro_block; + frame->vo_frame.proc_duplicate_frame_data = xxmc_duplicate_frame_data; #ifdef HAVE_VLDXVMC - xxmc->proc_xxmc_begin = xvmc_vld_frame; - xxmc->proc_xxmc_slice = xvmc_vld_slice; + xxmc->proc_xxmc_begin = xvmc_vld_frame; + xxmc->proc_xxmc_slice = xvmc_vld_slice; #endif + } + if (init_macroblocks) { + driver->macroblocks.num_blocks = 0; + driver->macroblocks.macroblockptr = driver->macroblocks.macroblockbaseptr; + driver->macroblocks.xine_mc.blockptr = + driver->macroblocks.xine_mc.blockbaseptr; + } + xxmc->acceleration = driver->xvmc_accel; } @@ -1099,6 +1169,45 @@ frame->vo_frame.format = frame->format; } +/* + * Check if we need to change XvMC context due to an + * acceleration request change. + */ + +static int xxmc_accel_update(xxmc_driver_t *driver, + uint32_t last_request, + uint32_t new_request) +{ + int k; + + /* + * Same acceleration request. No need to change. + */ + + if (last_request == new_request) return 0; + + /* + * Current acceleration not valid. Change. + */ + + if ((driver->xvmc_accel & new_request) == 0) return 1; + + /* + * Test for possible use of a higher acceleration level. + */ + + for (k = 0; k < NUM_ACCEL_PRIORITY; ++k) { + if (last_request & accel_priority[k]) return 0; + if (new_request & accel_priority[k]) return 1; + } + + /* + * Should never get here. + */ + + return 0; +} + static void xxmc_do_update_frame(vo_driver_t *this_gen, vo_frame_t *frame_gen, @@ -1112,16 +1221,18 @@ xine_xxmc_t *xxmc = &frame->xxmc_data; xvmc_context_writer_lock( &this->xvmc_lock); - if ((this->last_accel_request != xxmc->acceleration) || + if (xxmc_accel_update(this, this->last_accel_request, xxmc->acceleration) || (this->xvmc_mpeg != xxmc->mpeg) || (this->xvmc_width != width) || (this->xvmc_height != height)) { this->last_accel_request = xxmc->acceleration; xxmc_xvmc_update_context(this, frame, width, height); - } + } else { + this->last_accel_request = xxmc->acceleration; + } if (this->contextActive) - xxmc_frame_updates(this, frame); + xxmc_frame_updates(this, frame, 1); xxmc_do_update_frame_xv(this_gen, frame_gen, width, height, ratio, xxmc->fallback_format, flags); Index: xvmc_mocomp.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/video_out/xvmc_mocomp.c,v retrieving revision 1.2.2.1 retrieving revision 1.2.2.2 diff -u -r1.2.2.1 -r1.2.2.2 --- xvmc_mocomp.c 20 Apr 2005 17:21:14 -0000 1.2.2.1 +++ xvmc_mocomp.c 17 Jul 2005 21:50:07 -0000 1.2.2.2 @@ -110,7 +110,6 @@ int top_field_first = current_frame->top_field_first; int picture_coding_type = current_frame->picture_coding_type; - xvmc_context_reader_lock( &this->xvmc_lock ); mbs->macroblockptr->x = x; mbs->macroblockptr->y = y; @@ -253,9 +252,6 @@ mbs->macroblockptr = mbs->macroblockbaseptr; mbs->xine_mc.blockptr = mbs->xine_mc.blockbaseptr; } - - xvmc_context_reader_unlock( &this->xvmc_lock ); - } Index: xvmc_vld.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/video_out/xvmc_vld.c,v retrieving revision 1.2 retrieving revision 1.2.2.1 diff -u -r1.2 -r1.2.2.1 --- xvmc_vld.c 3 Oct 2004 12:36:15 -0000 1.2 +++ xvmc_vld.c 17 Jul 2005 21:50:07 -0000 1.2.2.1 @@ -92,19 +92,14 @@ } qmx.load_chroma_intra_quantiser_matrix = 0; qmx.load_chroma_non_intra_quantiser_matrix = 0; - xvmc_context_reader_lock( &driver->xvmc_lock ); - if ( ! xxmc_xvmc_surface_valid( driver, cf->xvmc_surf)) { - cf->xxmc_data.result = 128; - xvmc_context_reader_unlock( &driver->xvmc_lock ); - return; - } + XVMCLOCKDISPLAY( driver->display ); XvMCLoadQMatrix(driver->display, &driver->context, &qmx); + while((cf->xxmc_data.result = XvMCBeginSurface(driver->display, &driver->context, cf->xvmc_surf, fs, bs, &ctl))); XVMCUNLOCKDISPLAY( driver->display ); - xvmc_context_reader_unlock( &driver->xvmc_lock ); driver->cpu_saver = 0.; } @@ -115,12 +110,6 @@ xxmc_driver_t *driver = (xxmc_driver_t *) cf->vo_frame.driver; - xvmc_context_reader_lock( &driver->xvmc_lock ); - if ( ! xxmc_xvmc_surface_valid( driver, cf->xvmc_surf)) { - cf->xxmc_data.result = 128; - xvmc_context_reader_unlock( &driver->xvmc_lock ); - return; - } XVMCLOCKDISPLAY( driver->display ); cf->xxmc_data.result = XvMCPutSlice2(driver->display,&driver->context,cf->xxmc_data.slice_data, @@ -133,7 +122,6 @@ */ XVMCUNLOCKDISPLAY( driver->display ); - xvmc_context_reader_unlock( &driver->xvmc_lock ); if (driver->cpu_save_enabled) { driver->cpu_saver += 1.; if (driver->cpu_saver >= cf->xxmc_data.sleep) { Index: xxmc.h =================================================================== RCS file: /cvsroot/xine/xine-lib/src/video_out/xxmc.h,v retrieving revision 1.6.2.1 retrieving revision 1.6.2.2 diff -u -r1.6.2.1 -r1.6.2.2 --- xxmc.h 20 Apr 2005 17:21:14 -0000 1.6.2.1 +++ xxmc.h 17 Jul 2005 21:50:07 -0000 1.6.2.2 @@ -178,8 +178,8 @@ #define XVMCLOCKDISPLAY(display) #define XVMCUNLOCKDISPLAY(display) #else -#define XVMCLOCKDISPLAY(display) XLockDisplay(display); -#define XVMCUNLOCKDISPLAY(display) XUnlockDisplay(display); +#define XVMCLOCKDISPLAY(display) XLockDisplay(display) +#define XVMCUNLOCKDISPLAY(display) XUnlockDisplay(display) #endif struct xxmc_driver_s { |