diff options
Diffstat (limited to 'video/out/vo_vdpau.c')
-rw-r--r-- | video/out/vo_vdpau.c | 59 |
1 files changed, 24 insertions, 35 deletions
diff --git a/video/out/vo_vdpau.c b/video/out/vo_vdpau.c index b08348987a..b22dcba0ce 100644 --- a/video/out/vo_vdpau.c +++ b/video/out/vo_vdpau.c @@ -31,7 +31,6 @@ #include <limits.h> #include <assert.h> -#include "config.h" #include "video/vdpau.h" #include "video/vdpau_mixer.h" #include "video/hwdec.h" @@ -81,18 +80,18 @@ struct vdpctx { struct mp_image *current_image; int64_t current_pts; - int current_duration; + int64_t current_duration; int output_surface_w, output_surface_h; int rotation; - int force_yuv; + bool force_yuv; struct mp_vdpau_mixer *video_mixer; - int pullup; + bool pullup; float denoise; float sharpen; int hqscaling; - int chroma_deint; + bool chroma_deint; int flip_offset_window; int flip_offset_fs; int64_t flip_offset_us; @@ -105,9 +104,9 @@ struct vdpctx { int surface_num; // indexes output_surfaces int query_surface_num; VdpTime recent_vsync_time; - float user_fps; - int composite_detect; - int vsync_interval; + double user_fps; + bool composite_detect; + int64_t vsync_interval; uint64_t last_queue_time; uint64_t queue_time[MAX_OUTPUT_SURFACES]; uint64_t last_ideal_time; @@ -280,7 +279,7 @@ static void resize(struct vo *vo) vc->flip_offset_us = vo->opts->fullscreen ? 1000LL * vc->flip_offset_fs : 1000LL * vc->flip_offset_window; - vo_set_queue_params(vo, vc->flip_offset_us, 1); + vo_set_queue_params(vo, vc->flip_offset_us * 1000, 1); if (vc->output_surface_w < vo->dwidth || vc->output_surface_h < vo->dheight || vc->rotation != vo->params->rotate) @@ -600,7 +599,7 @@ static void generate_osd_part(struct vo *vo, struct sub_bitmaps *imgs) format = VDP_RGBA_FORMAT_B8G8R8A8; break; default: - abort(); + MP_ASSERT_UNREACHABLE(); }; assert(imgs->packed); @@ -722,12 +721,12 @@ static int update_presentation_queue_status(struct vo *vo) break; if (vc->vsync_interval > 1) { uint64_t qtime = vc->queue_time[vc->query_surface_num]; - int diff = ((int64_t)vtime - (int64_t)qtime) / 1e6; - MP_TRACE(vo, "Queue time difference: %d ms\n", diff); + double diff = MP_TIME_NS_TO_MS((int64_t)vtime - (int64_t)qtime); + MP_TRACE(vo, "Queue time difference: %.4f ms\n", diff); if (vtime < qtime + vc->vsync_interval / 2) - MP_VERBOSE(vo, "Frame shown too early (%d ms)\n", diff); + MP_VERBOSE(vo, "Frame shown too early (%.4f ms)\n", diff); if (vtime > qtime + vc->vsync_interval) - MP_VERBOSE(vo, "Frame shown late (%d ms)\n", diff); + MP_VERBOSE(vo, "Frame shown late (%.4f ms)\n", diff); } vc->query_surface_num = WRAP_ADD(vc->query_surface_num, 1, vc->num_output_surfaces); @@ -755,8 +754,8 @@ static void flip_page(struct vo *vo) struct vdp_functions *vdp = vc->vdp; VdpStatus vdp_st; - int64_t pts_us = vc->current_pts; - int duration = vc->current_duration; + int64_t pts_ns = vc->current_pts; + int64_t duration = vc->current_duration; vc->dropped_frame = true; // changed at end if false @@ -767,15 +766,10 @@ static void flip_page(struct vo *vo) if (vc->user_fps > 0) { vc->vsync_interval = 1e9 / vc->user_fps; } else if (vc->user_fps == 0) { - vc->vsync_interval = vo_get_vsync_interval(vo) * 1000; + vc->vsync_interval = vo_get_vsync_interval(vo); } vc->vsync_interval = MPMAX(vc->vsync_interval, 1); - if (duration > INT_MAX / 1000) - duration = -1; - else - duration *= 1000; - if (vc->vsync_interval == 1) duration = -1; // Make sure drop logic is disabled @@ -783,8 +777,8 @@ static void flip_page(struct vo *vo) vdp_st = vdp->presentation_queue_get_time(vc->flip_queue, &vdp_time); CHECK_VDP_WARNING(vo, "Error when calling vdp_presentation_queue_get_time"); - int64_t rel_pts_ns = (pts_us - mp_time_us()) * 1000; - if (!pts_us || rel_pts_ns < 0) + int64_t rel_pts_ns = pts_ns - mp_time_ns(); + if (!pts_ns || rel_pts_ns < 0) rel_pts_ns = 0; uint64_t now = vdp_time; @@ -1029,6 +1023,7 @@ static int preinit(struct vo *vo) vo_x11_uninit(vo); return -1; } + vc->mpvdp->hwctx.hw_imgfmt = IMGFMT_VDPAU; vo->hwdec_devs = hwdec_devices_create(); hwdec_devices_add(vo->hwdec_devs, &vc->mpvdp->hwctx); @@ -1076,9 +1071,6 @@ static int control(struct vo *vo, uint32_t request, void *data) case VOCTRL_SET_PANSCAN: checked_resize(vo); return VO_TRUE; - case VOCTRL_SET_EQUALIZER: - vo->want_redraw = true; - return true; case VOCTRL_RESET: forget_frames(vo, true); return true; @@ -1119,23 +1111,20 @@ const struct vo_driver video_out_vdpau = { .uninit = uninit, .priv_size = sizeof(struct vdpctx), .options = (const struct m_option []){ - {"chroma-deint", OPT_FLAG(chroma_deint), OPTDEF_INT(1)}, - {"pullup", OPT_FLAG(pullup)}, + {"chroma-deint", OPT_BOOL(chroma_deint), OPTDEF_INT(1)}, + {"pullup", OPT_BOOL(pullup)}, {"denoise", OPT_FLOAT(denoise), M_RANGE(0, 1)}, {"sharpen", OPT_FLOAT(sharpen), M_RANGE(-1, 1)}, {"hqscaling", OPT_INT(hqscaling), M_RANGE(0, 9)}, - {"fps", OPT_FLOAT(user_fps)}, - {"composite-detect", OPT_FLAG(composite_detect), OPTDEF_INT(1)}, + {"fps", OPT_DOUBLE(user_fps)}, + {"composite-detect", OPT_BOOL(composite_detect), OPTDEF_INT(1)}, {"queuetime-windowed", OPT_INT(flip_offset_window), OPTDEF_INT(50)}, {"queuetime-fs", OPT_INT(flip_offset_fs), OPTDEF_INT(50)}, {"output-surfaces", OPT_INT(num_output_surfaces), M_RANGE(2, MAX_OUTPUT_SURFACES), OPTDEF_INT(3)}, {"colorkey", OPT_COLOR(colorkey), .defval = &(const struct m_color){.r = 2, .g = 5, .b = 7, .a = 255}}, - {"force-yuv", OPT_FLAG(force_yuv)}, - {"queuetime_windowed", OPT_REPLACED("queuetime-windowed")}, - {"queuetime_fs", OPT_REPLACED("queuetime-fs")}, - {"output_surfaces", OPT_REPLACED("output-surfaces")}, + {"force-yuv", OPT_BOOL(force_yuv)}, {NULL}, }, .options_prefix = "vo-vdpau", |