diff mpegvideo.c @ 1381:f07e17427140 libavcodec

initial XvMC support
author iive
date Sat, 26 Jul 2003 01:28:49 +0000
parents b47a402bbe7f
children 18cdce49339e
line wrap: on
line diff
--- a/mpegvideo.c	Sat Jul 26 00:49:46 2003 +0000
+++ b/mpegvideo.c	Sat Jul 26 01:28:49 2003 +0000
@@ -52,6 +52,12 @@
 static int dct_quantize_trellis_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow);
 #endif //CONFIG_ENCODERS
 
+#ifdef HAVE_XVMC
+extern int  XVMC_field_start(MpegEncContext*s, AVCodecContext *avctx);
+extern void XVMC_field_end(MpegEncContext *s);
+extern void XVMC_decode_mb(MpegEncContext *s, DCTELEM block[6][64]);
+#endif
+
 void (*draw_edges)(uint8_t *buf, int wrap, int width, int height, int w)= draw_edges_c;
 
 
@@ -1028,6 +1034,10 @@
     }else 
         s->dct_unquantize = s->dct_unquantize_mpeg1;
 
+#ifdef HAVE_XVMC
+    if(s->avctx->xvmc_acceleration)
+        return XVMC_field_start(s, avctx);
+#endif
     return 0;
 }
 
@@ -1036,6 +1046,12 @@
 {
     int i;
     /* draw edge for correct motion prediction if outside */
+#ifdef HAVE_XVMC
+//just to make sure that all data is rendered.
+    if(s->avctx->xvmc_acceleration){
+        XVMC_field_end(s);
+    }else
+#endif
     if(s->codec_id!=CODEC_ID_SVQ1 && s->codec_id != CODEC_ID_MPEG1VIDEO){
         if (s->pict_type != B_TYPE && !s->intra_only && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
             draw_edges(s->current_picture.data[0], s->linesize  , s->h_edge_pos   , s->v_edge_pos   , EDGE_WIDTH  );
@@ -2382,6 +2398,12 @@
 {
     int mb_x, mb_y;
     const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
+#ifdef HAVE_XVMC
+    if(s->avctx->xvmc_acceleration){
+        XVMC_decode_mb(s,block);
+        return;
+    }
+#endif
 
     mb_x = s->mb_x;
     mb_y = s->mb_y;