summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Hellström <totte67@users.sourceforge.net>2004-10-03 12:36:14 +0000
committerThomas Hellström <totte67@users.sourceforge.net>2004-10-03 12:36:14 +0000
commit2a88e6b2322af7a8259eb8d4aa837c77d01a8079 (patch)
tree8960b1b4ae6dd8975f9c07689ad32762a04a8e81
parent9c822094404792a27b55c102e76cc5a532f92919 (diff)
downloadxine-lib-2a88e6b2322af7a8259eb8d4aa837c77d01a8079.tar.gz
xine-lib-2a88e6b2322af7a8259eb8d4aa837c77d01a8079.tar.bz2
Bugfix for IDCT and MOCOMP XvMC where the block pointer was not
initialized at frame start. Bugfix for MOCOMP XvMC where the xxmc driver ignored the value of the XVMC_UNSIGNED_INTRA flag. Minor cleanups and function moves. CVS patchset: 7010 CVS date: 2004/10/03 12:36:14
-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,