X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fvideo_output%2Fdisplay.c;h=7d747c215b4946f243f7882c83c0d2c51d5ec34b;hb=dd50e81c8969905671c66dfe7a927ca41aa2ded7;hp=cc5451daca220e386b22081e8aa7471ad21828a0;hpb=1fa88f66c121b9951db9b480eb578e98c710b977;p=vlc diff --git a/src/video_output/display.c b/src/video_output/display.c index cc5451daca..7d747c215b 100644 --- a/src/video_output/display.c +++ b/src/video_output/display.c @@ -58,7 +58,7 @@ static picture_t *VideoBufferNew(filter_t *filter) vd->fmt.i_width == fmt->i_width && vd->fmt.i_height == fmt->i_height); - picture_pool_t *pool = vout_display_Pool(vd, 1); + picture_pool_t *pool = vout_display_Pool(vd, 3); if (!pool) return NULL; return picture_pool_Get(pool); @@ -128,7 +128,6 @@ static vout_display_t *vout_display_New(vlc_object_t *obj, if (load_module) { vd->module = module_need(vd, "vout display", module, module && *module != '\0'); if (!vd->module) { - vlc_object_detach(vd); vlc_object_release(vd); return NULL; } @@ -143,8 +142,6 @@ static vout_display_t *vout_display_New(vlc_object_t *obj, */ static void vout_display_Delete(vout_display_t *vd) { - vlc_object_detach(vd); - if (vd->module) module_unneed(vd, vd->module); @@ -211,14 +208,10 @@ void vout_display_PlacePicture(vout_display_place_t *place, return; /* */ - unsigned width; - unsigned height; unsigned display_width; unsigned display_height; if (cfg->is_display_filled) { - width = source->i_visible_width; - height = source->i_visible_height; display_width = cfg->display.width; display_height = cfg->display.height; } else { @@ -226,17 +219,17 @@ void vout_display_PlacePicture(vout_display_place_t *place, cfg_tmp.display.width = 0; cfg_tmp.display.height = 0; - vout_display_GetDefaultDisplaySize(&width, &height, + vout_display_GetDefaultDisplaySize(&display_width, &display_height, source, &cfg_tmp); - display_width = width; - display_height = height; if (do_clipping) { display_width = __MIN(display_width, cfg->display.width); display_height = __MIN(display_height, cfg->display.height); } } + const unsigned width = source->i_visible_width; + const unsigned height = source->i_visible_height; /* Compute the height if we use the width to fill up display_width */ const int64_t scaled_height = (int64_t)height * display_width * cfg->display.sar.num * source->i_sar_den / width / source->i_sar_num / cfg->display.sar.den; /* And the same but switching width/height */ @@ -393,7 +386,7 @@ static void VoutDisplayCreateRender(vout_display_t *vd) if (!convert) return; - msg_Err(vd, "A filter to adapt decoder to display is needed"); + msg_Dbg(vd, "A filter to adapt decoder to display is needed"); osys->filters = filter_chain_New(vd, "video filter2", false, FilterAllocationInit, @@ -532,9 +525,6 @@ static void VoutDisplayEventMouse(vout_display_t *vd, int event, va_list args) if (!vd->info.has_hide_mouse) osys->mouse.last_moved = mdate(); - /* */ - vlc_mutex_unlock(&osys->lock); - /* */ vout_SendEventMouseVisible(osys->vout); #ifdef ALLOW_DUMMY_VOUT @@ -542,6 +532,7 @@ static void VoutDisplayEventMouse(vout_display_t *vd, int event, va_list args) #else vout_SendDisplayEventMouse(osys->vout, &m); #endif + vlc_mutex_unlock(&osys->lock); } static void VoutDisplayEvent(vout_display_t *vd, int event, va_list args) @@ -980,7 +971,8 @@ void vout_SetDisplayZoom(vout_display_t *vd, int num, int den) { vout_display_owner_sys_t *osys = vd->owner.sys; - if (osys->zoom.num != num || osys->zoom.den != den) { + if (osys->is_display_filled || + osys->zoom.num != num || osys->zoom.den != den) { osys->ch_zoom = true; osys->zoom.num = num; osys->zoom.den = den; @@ -1050,8 +1042,7 @@ static vout_display_t *DisplayNew(vout_thread_t *vout, vout_display_cfg_t *cfg = &osys->cfg; *cfg = state->cfg; - osys->wm_state_initial = state->is_on_top - ? VOUT_WINDOW_STATE_ABOVE : VOUT_WINDOW_STATE_NORMAL; + osys->wm_state_initial = VOUT_WINDOW_STATE_NORMAL; osys->sar_initial.num = state->sar.num; osys->sar_initial.den = state->sar.den; vout_display_GetDefaultDisplaySize(&cfg->display.width, &cfg->display.height, @@ -1075,6 +1066,8 @@ static vout_display_t *DisplayNew(vout_thread_t *vout, osys->is_display_filled = cfg->is_display_filled; osys->zoom.num = cfg->zoom.num; osys->zoom.den = cfg->zoom.den; + osys->wm_state = state->is_on_top ? VOUT_WINDOW_STATE_ABOVE + : VOUT_WINDOW_STATE_NORMAL; osys->source = *source_org; @@ -1124,7 +1117,7 @@ static vout_display_t *DisplayNew(vout_thread_t *vout, if (osys->sar.num != source_org->i_sar_num || osys->sar.den != source_org->i_sar_den) osys->ch_sar = true; - if (osys->wm_state != VOUT_WINDOW_STATE_NORMAL) + if (osys->wm_state != osys->wm_state_initial) osys->ch_wm_state = true; if (osys->crop.x != source_org->i_x_offset || osys->crop.y != source_org->i_y_offset || @@ -1169,17 +1162,11 @@ vout_display_t *vout_NewDisplay(vout_thread_t *vout, double_click_timeout, hide_timeout, NULL); } -static void SplitterClose(vout_display_t *vd) -{ - VLC_UNUSED(vd); - assert(0); -} - -#if 0 /***************************************************************************** * *****************************************************************************/ struct vout_display_sys_t { + picture_pool_t *pool; video_splitter_t *splitter; /* */ @@ -1210,7 +1197,7 @@ static void SplitterDelWindow(vout_display_t *vd, vout_window_t *window) } static void SplitterEvent(vout_display_t *vd, int event, va_list args) { - vout_display_owner_sys_t *osys = vd->owner.sys; + //vout_display_owner_sys_t *osys = vd->owner.sys; switch (event) { #if 0 @@ -1236,10 +1223,12 @@ static void SplitterEvent(vout_display_t *vd, int event, va_list args) } } -static picture_t *SplitterGet(vout_display_t *vd) +static picture_pool_t *SplitterPool(vout_display_t *vd, unsigned count) { - /* TODO pool ? */ - return picture_NewFromFormat(&vd->fmt); + vout_display_sys_t *sys = vd->sys; + if (!sys->pool) + sys->pool = picture_pool_NewFromFormat(&vd->fmt, count); + return sys->pool; } static void SplitterPrepare(vout_display_t *vd, picture_t *picture) { @@ -1255,27 +1244,10 @@ static void SplitterPrepare(vout_display_t *vd, picture_t *picture) } for (int i = 0; i < sys->count; i++) { - /* */ - /* FIXME now vout_FilterDisplay already return a direct buffer FIXME */ - sys->picture[i] = vout_FilterDisplay(sys->display[i], sys->picture[i]); - if (!sys->picture[i]) - continue; - - /* */ - picture_t *direct = vout_display_Get(sys->display[i]); - if (!direct) { - msg_Err(vd, "Failed to get a direct buffer"); - picture_Release(sys->picture[i]); - sys->picture[i] = NULL; - continue; - } - - /* FIXME not always needed (easy when there is a osys->filters) */ - picture_Copy(direct, sys->picture[i]); - picture_Release(sys->picture[i]); - sys->picture[i] = direct; - - vout_display_Prepare(sys->display[i], sys->picture[i]); + if (vout_IsDisplayFiltered(sys->display[i])) + sys->picture[i] = vout_FilterDisplay(sys->display[i], sys->picture[i]); + if (sys->picture[i]) + vout_display_Prepare(sys->display[i], sys->picture[i]); } } static void SplitterDisplay(vout_display_t *vd, picture_t *picture) @@ -1297,7 +1269,7 @@ static void SplitterManage(vout_display_t *vd) vout_display_sys_t *sys = vd->sys; for (int i = 0; i < sys->count; i++) - vout_ManageDisplay(sys->display[i]); + vout_ManageDisplay(sys->display[i], true); } static int SplitterPictureNew(video_splitter_t *splitter, picture_t *picture[]) @@ -1305,8 +1277,13 @@ static int SplitterPictureNew(video_splitter_t *splitter, picture_t *picture[]) vout_display_sys_t *wsys = splitter->p_owner->wrapper->sys; for (int i = 0; i < wsys->count; i++) { - /* TODO pool ? */ - picture[i] = picture_NewFromFormat(&wsys->display[i]->source); + if (vout_IsDisplayFiltered(wsys->display[i])) { + /* TODO use a pool ? */ + picture[i] = picture_NewFromFormat(&wsys->display[i]->source); + } else { + picture_pool_t *pool = vout_display_Pool(wsys->display[i], 1); + picture[i] = pool ? picture_pool_Get(pool) : NULL; + } if (!picture[i]) { for (int j = 0; j < i; j++) picture_Release(picture[j]); @@ -1331,6 +1308,9 @@ static void SplitterClose(vout_display_t *vd) free(splitter->p_owner); video_splitter_Delete(splitter); + if (sys->pool) + picture_pool_Delete(sys->pool); + /* */ for (int i = 0; i < sys->count; i++) vout_DeleteDisplay(sys->display[i], NULL); @@ -1368,8 +1348,9 @@ vout_display_t *vout_NewSplitter(vout_thread_t *vout, if (!sys->picture ) abort(); sys->splitter = splitter; + sys->pool = NULL; - wrapper->get = SplitterGet; + wrapper->pool = SplitterPool; wrapper->prepare = SplitterPrepare; wrapper->display = SplitterDisplay; wrapper->control = SplitterControl; @@ -1419,7 +1400,6 @@ vout_display_t *vout_NewSplitter(vout_thread_t *vout, return wrapper; } -#endif /***************************************************************************** * TODO move out @@ -1427,6 +1407,19 @@ vout_display_t *vout_NewSplitter(vout_thread_t *vout, #include "vout_internal.h" void vout_SendDisplayEventMouse(vout_thread_t *vout, const vlc_mouse_t *m) { + vlc_mouse_t tmp; + + /* The check on p_spu is needed as long as ALLOW_DUMMY_VOUT is defined */ + if (vout->p->p_spu && spu_ProcessMouse( vout->p->p_spu, m, &vout->p->display.vd->source)) + return; + + vlc_mutex_lock( &vout->p->vfilter_lock ); + if (vout->p->p_vf2_chain) { + if (!filter_chain_MouseFilter(vout->p->p_vf2_chain, &tmp, m)) + m = &tmp; + } + vlc_mutex_unlock( &vout->p->vfilter_lock ); + if (vlc_mouse_HasMoved(&vout->p->mouse, m)) { vout_SendEventMouseMoved(vout, m->i_x, m->i_y); } @@ -1458,10 +1451,14 @@ static void DummyVoutSendDisplayEventMouse(vout_thread_t *vout, vlc_mouse_t *fal if (!vout->p) { p.mouse = *fallback; + vlc_mutex_init(&p.vfilter_lock); + p.p_vf2_chain = NULL; + p.p_spu = NULL; vout->p = &p; } vout_SendDisplayEventMouse(vout, m); if (vout->p == &p) { + vlc_mutex_destroy(&p.vfilter_lock); *fallback = p.mouse; vout->p = NULL; }