diff options
-rw-r--r-- | src/video_out/video_out_xxmc.c | 51 | ||||
-rw-r--r-- | src/video_out/xvmc_mocomp.c | 37 | ||||
-rw-r--r-- | src/video_out/xvmc_vld.c | 27 | ||||
-rw-r--r-- | src/video_out/xxmc.h | 4 |
4 files changed, 56 insertions, 63 deletions
diff --git a/src/video_out/video_out_xxmc.c b/src/video_out/video_out_xxmc.c index 98dc0db86..ffbd2280c 100644 --- a/src/video_out/video_out_xxmc.c +++ b/src/video_out/video_out_xxmc.c @@ -18,7 +18,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * - * $Id: video_out_xxmc.c,v 1.1 2004/09/28 18:49:40 miguelfreitas Exp $ + * $Id: video_out_xxmc.c,v 1.2 2004/10/03 12:36:14 totte67 Exp $ * * video_out_xxmc.c, X11 decoding accelerated video extension interface for xine * @@ -353,6 +353,32 @@ static void xxmc_xvmc_free_subpicture(xxmc_driver_t *this, XvMCSubpicture *sub) * Here follows a number of callback function. */ +static void xvmc_flush(vo_frame_t *this_gen) +{ + + xxmc_frame_t + *frame = (xxmc_frame_t *) this_gen; + xxmc_driver_t + *driver = (xxmc_driver_t *) this_gen->driver; + + xvmc_context_reader_lock( &driver->xvmc_lock ); + + if ( ! xxmc_xvmc_surface_valid( driver, frame->xvmc_surf)) { + frame->xxmc_data.result = 128; + xvmc_context_reader_unlock( &driver->xvmc_lock ); + return; + } + + XVMCLOCKDISPLAY( driver->display ); + frame->xxmc_data.result = XvMCFlushSurface( driver->display, frame->xvmc_surf ); + frame->xxmc_data.result = XvMCSyncSurface( driver->display, frame->xvmc_surf ); + XVMCUNLOCKDISPLAY( driver->display ); + + xvmc_context_reader_unlock( &driver->xvmc_lock ); + +} + + /* * Callback function for the VO-loop to duplicate frame data. @@ -744,7 +770,8 @@ static int xxmc_find_context(xxmc_driver_t *driver, xine_xxmc_t *xxmc, request_mpeg_flags = xxmc->mpeg; found = 0; - + curCap = NULL; + for (k = 0; k < NUM_ACCEL_PRIORITY; ++k) { request_accel_flags = xxmc->acceleration & accel_priority[k]; if (!request_accel_flags) continue; @@ -773,6 +800,7 @@ static int xxmc_find_context(xxmc_driver_t *driver, xine_xxmc_t *xxmc, } if ( found ) { driver->xvmc_accel = request_accel_flags; + driver->unsigned_intra = curCap->flags & XVMC_INTRA_UNSIGNED; return 1; } driver->xvmc_accel = 0; @@ -785,7 +813,7 @@ static int xxmc_create_context(xxmc_driver_t *driver, unsigned width, unsigned h curCap = driver->xvmc_cap + driver->xvmc_cur_cap; xprintf(driver->xine, XINE_VERBOSITY_LOG, - "video_out_xxmc: Creating new XvMC Context\n"); + "video_out_xxmc: Creating new XvMC Context %d\n",curCap->type_id); XVMCLOCKDISPLAY( driver->display ); if (Success == XvMCCreateContext( driver->display, driver->xv_port, curCap->type_id, width, @@ -1079,17 +1107,23 @@ static void xxmc_update_xxmc(vo_frame_t *vo_img) { xxmc->format = XINE_IMGFMT_XXMC; 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; + xxmc->xvmc.macroblocks->xvmc_accel |= XINE_VO_IDCT_ACCEL; break; case XINE_XVMC_ACCEL_MOCOMP: - xxmc->xvmc.macroblocks->xvmc_accel = XINE_VO_MOTION_ACCEL; + xxmc->xvmc.macroblocks->xvmc_accel |= XINE_VO_MOTION_ACCEL; break; default: xxmc->xvmc.macroblocks->xvmc_accel = 0; } - } + } + driver->macroblocks.num_blocks = 0; + driver->macroblocks.macroblockptr = driver->macroblocks.macroblockbaseptr; + driver->macroblocks.xine_mc.blockptr = driver->macroblocks.xine_mc.blockbaseptr; + xxmc->decoded = 0; } xvmc_context_writer_unlock( &driver->xvmc_lock); @@ -1131,18 +1165,17 @@ static void xxmc_update_frame_format (vo_driver_t *this_gen, xxmc_driver_t *this = (xxmc_driver_t *) this_gen; xxmc_frame_t *frame = (xxmc_frame_t *) frame_gen; + frame->vo_frame.accel_data = &frame->xxmc_data; if ( XINE_IMGFMT_XXMC == format ) { frame->xxmc_data.proc_xxmc_frame = xxmc_update_xxmc; - frame->xxmc_data.proc_xxmc_flush = xvmc_vld_flush; + frame->xxmc_data.proc_xxmc_flush = xvmc_flush; #ifdef HAVE_VLDXVMC frame->xxmc_data.proc_xxmc_begin = xvmc_vld_frame; frame->xxmc_data.proc_xxmc_slice = xvmc_vld_slice; #endif frame->xxmc_data.xvmc.proc_macro_block = xxmc_xvmc_proc_macro_block; - frame->vo_frame.accel_data = &frame->xxmc_data; frame->vo_frame.proc_duplicate_frame_data = xxmc_duplicate_frame_data; } else { - frame->vo_frame.accel_data = &frame->xxmc_data; frame->xxmc_data.format = format; } diff --git a/src/video_out/xvmc_mocomp.c b/src/video_out/xvmc_mocomp.c index 94c6e9906..ca6873ccb 100644 --- a/src/video_out/xvmc_mocomp.c +++ b/src/video_out/xvmc_mocomp.c @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * - * $Id: xvmc_mocomp.c,v 1.1 2004/09/28 18:49:40 miguelfreitas Exp $ + * $Id: xvmc_mocomp.c,v 1.2 2004/10/03 12:36:15 totte67 Exp $ * * XvMC image support by Jack Kelliher */ @@ -236,31 +236,16 @@ void xxmc_xvmc_proc_macro_block(int x, int y, int mb_type, int motion_type, fflush(stdout); #endif - if (picture_coding_type == XINE_PICT_B_TYPE) - xvmc_render_macro_blocks( - current_frame, - backward_ref_frame, - forward_ref_frame, - picture_structure, - second_field ? XVMC_SECOND_FIELD : 0, - mbs); - if (picture_coding_type == XINE_PICT_P_TYPE) - xvmc_render_macro_blocks( - current_frame, - NULL, - forward_ref_frame, - picture_structure, - second_field ? XVMC_SECOND_FIELD : 0, - mbs); - if (picture_coding_type == XINE_PICT_I_TYPE) - xvmc_render_macro_blocks( - current_frame, - NULL, - NULL, - picture_structure, - second_field ? XVMC_SECOND_FIELD : 0, - mbs); - + xvmc_render_macro_blocks( + current_frame, + (picture_coding_type == XINE_PICT_B_TYPE) ? + backward_ref_frame : NULL, + (picture_coding_type != XINE_PICT_I_TYPE) ? + forward_ref_frame : NULL, + picture_structure, + second_field ? XVMC_SECOND_FIELD : 0, + mbs); + mbs->num_blocks = 0; mbs->macroblockptr = mbs->macroblockbaseptr; mbs->xine_mc.blockptr = mbs->xine_mc.blockbaseptr; diff --git a/src/video_out/xvmc_vld.c b/src/video_out/xvmc_vld.c index d542ca515..e667761d7 100644 --- a/src/video_out/xvmc_vld.c +++ b/src/video_out/xvmc_vld.c @@ -18,7 +18,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * - * $Id: xvmc_vld.c,v 1.1 2004/09/28 18:49:40 miguelfreitas Exp $ + * $Id: xvmc_vld.c,v 1.2 2004/10/03 12:36:15 totte67 Exp $ * * xvmc_vld.c, X11 decoding accelerated video extension interface for xine * @@ -144,28 +144,3 @@ void xvmc_vld_slice(vo_frame_t *this_gen) } #endif -extern void xvmc_vld_flush(vo_frame_t *this_gen) -{ - - xxmc_frame_t - *frame = (xxmc_frame_t *) this_gen; - xxmc_driver_t - *driver = (xxmc_driver_t *) this_gen->driver; - - xvmc_context_reader_lock( &driver->xvmc_lock ); - - if ( ! xxmc_xvmc_surface_valid( driver, frame->xvmc_surf)) { - frame->xxmc_data.result = 128; - xvmc_context_reader_unlock( &driver->xvmc_lock ); - return; - } - - XVMCLOCKDISPLAY( driver->display ); - frame->xxmc_data.result = XvMCFlushSurface( driver->display, frame->xvmc_surf ); - frame->xxmc_data.result = XvMCSyncSurface( driver->display, frame->xvmc_surf ); - XVMCUNLOCKDISPLAY( driver->display ); - - xvmc_context_reader_unlock( &driver->xvmc_lock ); - -} - diff --git a/src/video_out/xxmc.h b/src/video_out/xxmc.h index b11d9207e..74825add4 100644 --- a/src/video_out/xxmc.h +++ b/src/video_out/xxmc.h @@ -18,7 +18,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * - * $Id: xxmc.h,v 1.1 2004/09/28 18:49:40 miguelfreitas Exp $ + * $Id: xxmc.h,v 1.2 2004/10/03 12:36:15 totte67 Exp $ * * video_out_xxmc.c, X11 decoding accelerated video extension interface for xine * @@ -248,6 +248,7 @@ struct xxmc_driver_s { unsigned xvmc_height; int have_xvmc_autopaint; int xoverlay_ck; + int unsigned_intra; /* * Only creation and destruction of the below. @@ -277,7 +278,6 @@ extern int xxmc_xvmc_surface_valid(xxmc_driver_t *this, XvMCSurface *surf); extern void xvmc_vld_slice(vo_frame_t *this_gen); extern void xvmc_vld_frame(struct vo_frame_s *this_gen); -extern void xvmc_vld_flush(vo_frame_t *this_gen); extern void xxmc_xvmc_proc_macro_block(int x, int y, int mb_type, int motion_type, int (*mv_field_sel)[2], int *dmvector, |