summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/video_out/video_out_xxmc.c51
-rw-r--r--src/video_out/xvmc_mocomp.c37
-rw-r--r--src/video_out/xvmc_vld.c27
-rw-r--r--src/video_out/xxmc.h4
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,