diff options
Diffstat (limited to 'video/out/vo_sdl.c')
-rw-r--r-- | video/out/vo_sdl.c | 63 |
1 files changed, 32 insertions, 31 deletions
diff --git a/video/out/vo_sdl.c b/video/out/vo_sdl.c index 039547f2d4..71791e2468 100644 --- a/video/out/vo_sdl.c +++ b/video/out/vo_sdl.c @@ -44,7 +44,6 @@ #include "video/mp_image.h" #include "win_state.h" -#include "config.h" #include "vo.h" struct formatmap_entry { @@ -62,7 +61,7 @@ const struct formatmap_entry formats[] = { {SDL_PIXELFORMAT_RGBX8888, IMGFMT_RGB0, 0}, // has no alpha -> bad for OSD {SDL_PIXELFORMAT_BGR888, IMGFMT_0BGR, 0}, // BGR888 means XBGR8888 {SDL_PIXELFORMAT_BGRX8888, IMGFMT_BGR0, 0}, // has no alpha -> bad for OSD - {SDL_PIXELFORMAT_ARGB8888, IMGFMT_ARGB, 1}, // matches SUBBITMAP_RGBA + {SDL_PIXELFORMAT_ARGB8888, IMGFMT_ARGB, 1}, // matches SUBBITMAP_BGRA {SDL_PIXELFORMAT_RGBA8888, IMGFMT_RGBA, 1}, {SDL_PIXELFORMAT_ABGR8888, IMGFMT_ABGR, 1}, {SDL_PIXELFORMAT_BGRA8888, IMGFMT_BGRA, 1}, @@ -71,7 +70,7 @@ const struct formatmap_entry formats[] = { {SDL_PIXELFORMAT_RGBX8888, IMGFMT_0BGR, 0}, // has no alpha -> bad for OSD {SDL_PIXELFORMAT_BGR888, IMGFMT_RGB0, 0}, // BGR888 means XBGR8888 {SDL_PIXELFORMAT_BGRX8888, IMGFMT_0RGB, 0}, // has no alpha -> bad for OSD - {SDL_PIXELFORMAT_ARGB8888, IMGFMT_BGRA, 1}, // matches SUBBITMAP_RGBA + {SDL_PIXELFORMAT_ARGB8888, IMGFMT_BGRA, 1}, // matches SUBBITMAP_BGRA {SDL_PIXELFORMAT_RGBA8888, IMGFMT_ABGR, 1}, {SDL_PIXELFORMAT_ABGR8888, IMGFMT_RGBA, 1}, {SDL_PIXELFORMAT_BGRA8888, IMGFMT_ARGB, 1}, @@ -193,9 +192,9 @@ struct priv { struct m_config_cache *opts_cache; // options - int allow_sw; - int switch_mode; - int vsync; + bool allow_sw; + bool switch_mode; + bool vsync; }; static bool lock_texture(struct vo *vo, struct mp_image *texmpi) @@ -241,7 +240,7 @@ static bool lock_texture(struct vo *vo, struct mp_image *texmpi) } static bool is_good_renderer(SDL_RendererInfo *ri, - const char *driver_name_wanted, int allow_sw, + const char *driver_name_wanted, bool allow_sw, struct formatmap_entry *osd_format) { if (driver_name_wanted && driver_name_wanted[0]) @@ -521,10 +520,13 @@ static void wakeup(struct vo *vo) SDL_PushEvent(&event); } -static void wait_events(struct vo *vo, int64_t until_time_us) +static void wait_events(struct vo *vo, int64_t until_time_ns) { - int64_t wait_us = until_time_us - mp_time_us(); - int timeout_ms = MPCLAMP((wait_us + 500) / 1000, 0, 10000); + int64_t wait_ns = until_time_ns - mp_time_ns(); + // Round-up to 1ms for short timeouts (100us, 1000us] + if (wait_ns > MP_TIME_US_TO_NS(100)) + wait_ns = MPMAX(wait_ns, MP_TIME_MS_TO_NS(1)); + int timeout_ms = MPCLAMP(wait_ns / MP_TIME_MS_TO_NS(1), 0, 10000); SDL_Event ev; while (SDL_WaitEventTimeout(&ev, timeout_ms)) { @@ -545,6 +547,10 @@ static void wait_events(struct vo *vo, int64_t until_time_us) case SDL_WINDOWEVENT_LEAVE: mp_input_put_key(vo->input_ctx, MP_KEY_MOUSE_LEAVE); break; + case SDL_WINDOWEVENT_FOCUS_LOST: + case SDL_WINDOWEVENT_FOCUS_GAINED: + vo_event(vo, VO_EVENT_FOCUS); + break; } break; case SDL_QUIT: @@ -621,9 +627,9 @@ static void wait_events(struct vo *vo, int64_t until_time_us) } case SDL_MOUSEWHEEL: { #if SDL_VERSION_ATLEAST(2, 0, 4) - double multiplier = ev.wheel.direction == SDL_MOUSEWHEEL_FLIPPED ? -0.1 : 0.1; + double multiplier = ev.wheel.direction == SDL_MOUSEWHEEL_FLIPPED ? -1 : 1; #else - double multiplier = 0.1; + double multiplier = 1; #endif int y_code = ev.wheel.y > 0 ? MP_WHEEL_UP : MP_WHEEL_DOWN; mp_input_put_wheel(vo->input_ctx, y_code, abs(ev.wheel.y) * multiplier); @@ -800,7 +806,7 @@ static void draw_osd(struct vo *vo) struct priv *vc = vo->priv; static const bool osdformats[SUBBITMAP_COUNT] = { - [SUBBITMAP_RGBA] = true, + [SUBBITMAP_BGRA] = true, }; osd_draw(vo->osd, vc->osd_res, vc->osd_pts, 0, osdformats, draw_osd_cb, vo); @@ -870,7 +876,7 @@ static int query_format(struct vo *vo, int format) return 0; } -static void draw_image(struct vo *vo, mp_image_t *mpi) +static void draw_frame(struct vo *vo, struct vo_frame *frame) { struct priv *vc = vo->priv; @@ -880,20 +886,16 @@ static void draw_image(struct vo *vo, mp_image_t *mpi) SDL_SetTextureBlendMode(vc->tex, SDL_BLENDMODE_NONE); - if (mpi) { - vc->osd_pts = mpi->pts; + if (frame->current) { + vc->osd_pts = frame->current->pts; mp_image_t texmpi; - if (!lock_texture(vo, &texmpi)) { - talloc_free(mpi); + if (!lock_texture(vo, &texmpi)) return; - } - mp_image_copy(&texmpi, mpi); + mp_image_copy(&texmpi, frame->current); SDL_UnlockTexture(vc->tex); - - talloc_free(mpi); } SDL_Rect src, dst; @@ -941,9 +943,6 @@ static int control(struct vo *vo, uint32_t request, void *data) } return 1; } - case VOCTRL_REDRAW_FRAME: - draw_image(vo, NULL); - return 1; case VOCTRL_SET_PANSCAN: force_resize(vo); return VO_TRUE; @@ -964,6 +963,9 @@ static int control(struct vo *vo, uint32_t request, void *data) case VOCTRL_UPDATE_WINDOW_TITLE: SDL_SetWindowTitle(vc->window, (char *)data); return true; + case VOCTRL_GET_FOCUSED: + *(bool *)data = SDL_GetWindowFlags(vc->window) & SDL_WINDOW_INPUT_FOCUS; + return VO_TRUE; } return VO_NOTIMPL; } @@ -976,20 +978,19 @@ const struct vo_driver video_out_sdl = { .priv_size = sizeof(struct priv), .priv_defaults = &(const struct priv) { .renderer_index = -1, - .vsync = 1, - .screensaver_enabled = false, + .vsync = true, }, .options = (const struct m_option []){ - OPT_FLAG("sw", allow_sw, 0), - OPT_FLAG("switch-mode", switch_mode, 0), - OPT_FLAG("vsync", vsync, 0), + {"sw", OPT_BOOL(allow_sw)}, + {"switch-mode", OPT_BOOL(switch_mode)}, + {"vsync", OPT_BOOL(vsync)}, {NULL} }, .preinit = preinit, .query_format = query_format, .reconfig = reconfig, .control = control, - .draw_image = draw_image, + .draw_frame = draw_frame, .uninit = uninit, .flip_page = flip_page, .wait_events = wait_events, |