diff libmpcodecs/vd_ffmpeg.c @ 28731:244353700b38

Create a set_format_params function that sets all the special options needed for XvMC/VDPAU acceleration in a single place. This should get closer to working with selecting acceleration via pix_fmt instead of via a special codec for each method.
author reimar
date Sun, 01 Mar 2009 09:03:01 +0000
parents c327b2e9b259
children 5a8aa763f889
line wrap: on
line diff
--- a/libmpcodecs/vd_ffmpeg.c	Sun Mar 01 06:45:27 2009 +0000
+++ b/libmpcodecs/vd_ffmpeg.c	Sun Mar 01 09:03:01 2009 +0000
@@ -200,6 +200,24 @@
     mp_msg(type, mp_level, buf);
 }
 
+static void set_format_params(struct AVCodecContext *avctx, enum PixelFormat fmt){
+    int imgfmt;
+    imgfmt = pixfmt2imgfmt(fmt);
+    if (IMGFMT_IS_XVMC(imgfmt) || IMGFMT_IS_VDPAU(imgfmt)) {
+        sh_video_t *sh     = avctx->opaque;
+        vd_ffmpeg_ctx *ctx = sh->context;
+        ctx->do_dr1    = 1;
+        ctx->do_slices = 1;
+	avctx->thread_count    = 1;
+        avctx->get_buffer      = get_buffer;
+        avctx->release_buffer  = release_buffer;
+        avctx->reget_buffer    = get_buffer;
+        avctx->draw_horiz_band = draw_slice;
+        mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_MPCODECS_XVMCAcceleratedMPEG2);
+        avctx->slice_flags = SLICE_FLAG_CODED_ORDER|SLICE_FLAG_ALLOW_FIELD;
+    }
+}
+
 // init driver
 static int init(sh_video_t *sh){
     AVCodecContext *avctx;
@@ -232,8 +250,6 @@
 
     if(lavc_codec->capabilities&CODEC_CAP_DR1 && !do_vis_debug && lavc_codec->id != CODEC_ID_H264 && lavc_codec->id != CODEC_ID_INTERPLAY_VIDEO && lavc_codec->id != CODEC_ID_ROQ)
         ctx->do_dr1=1;
-    if (lavc_codec->capabilities & CODEC_CAP_HWACCEL_VDPAU)
-        ctx->do_dr1=1;
     ctx->b_age= ctx->ip_age[0]= ctx->ip_age[1]= 256*256*256*64;
     ctx->ip_count= ctx->b_count= 0;
 
@@ -245,18 +261,14 @@
 #if CONFIG_VDPAU
     if(lavc_codec->capabilities & CODEC_CAP_HWACCEL_VDPAU){
         avctx->get_format = get_format;
-        avctx->draw_horiz_band = draw_slice;
-        avctx->slice_flags = SLICE_FLAG_CODED_ORDER|SLICE_FLAG_ALLOW_FIELD;
     }
 #endif /* CONFIG_VDPAU */
 #if CONFIG_XVMC
     if(lavc_codec->capabilities & CODEC_CAP_HWACCEL){
         mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_MPCODECS_XVMCAcceleratedCodec);
-        assert(ctx->do_dr1);//these are must to!
-        assert(ctx->do_slices); //it is (vo_)ffmpeg bug if this fails
         avctx->get_format= get_format;//for now only this decoder will use it
-        avctx->draw_horiz_band = draw_slice;
-        avctx->slice_flags=SLICE_FLAG_CODED_ORDER|SLICE_FLAG_ALLOW_FIELD;
+        // HACK around badly placed checks in mpeg_mc_decode_init
+        set_format_params(avctx, PIX_FMT_XVMC_MPEG2_IDCT);
     }
 #endif /* CONFIG_XVMC */
     if(ctx->do_dr1){
@@ -397,6 +409,8 @@
         uninit(sh);
         return 0;
     }
+    // this is necessary in case get_format was never called
+    set_format_params(avctx, avctx->pix_fmt);
     mp_msg(MSGT_DECVIDEO, MSGL_V, "INFO: libavcodec init OK!\n");
     return 1; //mpcodecs_config_vo(sh, sh->disp_w, sh->disp_h, IMGFMT_YV12);
 }
@@ -908,17 +922,7 @@
         }
     }
     selected_format = fmt[i];
-    imgfmt = pixfmt2imgfmt(selected_format);
-    if(IMGFMT_IS_XVMC(imgfmt) || IMGFMT_IS_VDPAU(imgfmt)) {
-        vd_ffmpeg_ctx *ctx = sh->context;
-        avctx->get_buffer= get_buffer;
-        avctx->release_buffer= release_buffer;
-        avctx->draw_horiz_band = draw_slice;
-        mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_MPCODECS_XVMCAcceleratedMPEG2);
-        assert(ctx->do_dr1);//these are must to!
-        assert(ctx->do_slices); //it is (vo_)ffmpeg bug if this fails
-        avctx->slice_flags=SLICE_FLAG_CODED_ORDER|SLICE_FLAG_ALLOW_FIELD;
-    }
+    set_format_params(avctx, selected_format);
     return selected_format;
 }
 #endif /* CONFIG_XVMC || CONFIG_VDPAU */