mirror of
https://github.com/mpv-player/mpv
synced 2024-12-16 03:45:23 +00:00
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. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@28766 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
838d841f76
commit
1002389056
@ -200,6 +200,24 @@ void mp_msp_av_log_callback(void *ptr, int level, const char *fmt, va_list vl)
|
||||
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 @@ static int init(sh_video_t *sh){
|
||||
|
||||
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 @@ static int init(sh_video_t *sh){
|
||||
#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 @@ static int init(sh_video_t *sh){
|
||||
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 @@ static enum PixelFormat get_format(struct AVCodecContext *avctx,
|
||||
}
|
||||
}
|
||||
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 */
|
||||
|
Loading…
Reference in New Issue
Block a user