<html><head></head><body>Hi,<br><br>We have already covered this in (audio and) video-related IRL discussions and concluded every time that the current system is the least bad.<br><br>We can't probe the output based on the output format of the filter chain because that's not even necessarily fixed. The system is deliberately optimised for NOT changing the format, or for the output to drive/anticipate the change of format knowingly (notably in pass- through/hardware cases).<br><br>Accordingly, filters are generally expected to fail to probe if they cannot handle a format.<br><br>This patchset is basically taking the worse of both approaches, being output-then-filter and filter-then-output. It breaks probing/fallback of output modules and adds more complexity all over.<br><br><div class="gmail_quote">Le 20 octobre 2020 15:32:42 GMT+03:00, Romain Vimont <rom1v@videolabs.io> a écrit :<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<pre class="k9mail">The vout is created first, based on the input format. Then filters<br>(filter_t) could be added, possibly producing pictures in a different<br>format.<br><br>      input ---> filters --->    MISMATCH    [I420] vout<br>            I420         RGBA<br><br>To avoid a mismatch between the output of the last filter and the<br>expected format of the vout input, a converter was added when necessary<br>to compensate:<br><br>      input ---> filters ---> converter ---> [I420] vout<br>            I420         RGBA           I420<br><br>But this was often a waste, and it caused problems for opaque formats.<br><br>Instead, request the vout to adapt itself to the actual format produced<br>by the last filter. If it can, we can avoid an additional converter.<br><br>      input ---> filters --->    MISMATCH    [I420] vout<br>            I420         RGBA<br><br>      input ---> filters ------------------> [RGBA] vout<br>            I420         RGBA<br><br>If the vout does not support the new format (or does not accept to<br>update its format), a converter is still added as before.<br><br>Co-authored-by: Alexandre Janniaux <ajanni@videolabs.io><hr> include/vlc_vout_display.h              | 11 +++++<br> modules/hw/mmal/vout.c                  |  2 +-<br> modules/hw/vdpau/display.c              |  2 +-<br> modules/video_output/android/display.c  |  2 +-<br> modules/video_output/caca.c             |  2 +-<br> modules/video_output/caopengllayer.m    |  2 +-<br> modules/video_output/decklink.cpp       |  2 +-<br> modules/video_output/fb.c               |  2 +-<br> modules/video_output/flaschen.c         |  2 +-<br> modules/video_output/ios.m              |  2 +-<br> modules/video_output/kms.c              |  2 +-<br> modules/video_output/kva.c              |  2 +-<br> modules/video_output/macosx.m           |  2 +-<br> modules/video_output/opengl/display.c   |  2 +-<br> modules/video_output/splitter.c         |  2 +-<br> modules/video_output/vdummy.c           |  4 +-<br> modules/video_output/vmem.c             |  2 +-<br> modules/video_output/vulkan/display.c   |  2 +-<br> modules/video_output/wayland/shm.c      |  2 +-<br> modules/video_output/win32/direct3d11.c |  2 +-<br> modules/video_output/win32/direct3d9.c  |  2 +-<br> modules/video_output/win32/glwin32.c    |  2 +-<br> modules/video_output/win32/wingdi.c     |  2 +-<br> modules/video_output/xcb/render.c       |  2 +-<br> modules/video_output/xcb/x11.c          |  2 +-<br> modules/video_output/yuv.c              |  2 +-<br> src/video_output/display.c              | 10 +++++<br> src/video_output/display.h              |  2 +<br> src/video_output/video_output.c         | 57 ++++++++++++++++++++++---<br> 29 files changed, 99 insertions(+), 33 deletions(-)<br><br>diff --git a/include/vlc_vout_display.h b/include/vlc_vout_display.h<br>index df9e81eb6d..3b7b504d0b 100644<br>--- a/include/vlc_vout_display.h<br>+++ b/include/vlc_vout_display.h<br>@@ -320,6 +320,17 @@ struct vlc_display_operations<br>      * \param vp viewpoint to use on the next render<br>      */<br>     int        (*set_viewpoint)(vout_display_t *, const vlc_viewpoint_t *vp);<br>+<br>+    /**<br>+     * Notifies a change in the input format.<br>+     *<br>+     * \param fmt the requested input format, could be modified by the display<br>+     *            module to report the actual format<br>+     * \param ctx the video context<br>+     * \return VLC_SUCCESS on success, another value on error<br>+     */<br>+    int (*update_format)(vout_display_t *, video_format_t *fmt,<br>+                         vlc_video_context *ctx);<br> };<br> <br> struct vout_display_t {<br>diff --git a/modules/hw/mmal/vout.c b/modules/hw/mmal/vout.c<br>index 93dadd4ded..efba230ca6 100644<br>--- a/modules/hw/mmal/vout.c<br>+++ b/modules/hw/mmal/vout.c<br>@@ -1094,7 +1094,7 @@ static int find_display_num(const char * name)<br> }<br> <br> static const struct vlc_display_operations ops = {<br>-    CloseMmalVout, vd_prepare, vd_display, vd_control, vd_reset_pictures, NULL,<br>+    CloseMmalVout, vd_prepare, vd_display, vd_control, vd_reset_pictures, NULL, NULL,<br> };<br> <br> static int OpenMmalVout(vout_display_t *vd, const vout_display_cfg_t *cfg,<br>diff --git a/modules/hw/vdpau/display.c b/modules/hw/vdpau/display.c<br>index 70eaa4b8db..e548cf90a0 100644<br>--- a/modules/hw/vdpau/display.c<br>+++ b/modules/hw/vdpau/display.c<br>@@ -286,7 +286,7 @@ static int Control(vout_display_t *vd, int query)<br> }<br> <br> static const struct vlc_display_operations ops = {<br>-    Close, Queue, Wait, Control, ResetPictures, NULL,<br>+    Close, Queue, Wait, Control, ResetPictures, NULL, NULL,<br> };<br> <br> static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,<br>diff --git a/modules/video_output/android/display.c b/modules/video_output/android/display.c<br>index 10ac60bb0a..1f542aa6f9 100644<br>--- a/modules/video_output/android/display.c<br>+++ b/modules/video_output/android/display.c<br>@@ -477,7 +477,7 @@ static void SetRGBMask(video_format_t *p_fmt)<br> }<br> <br> static const struct vlc_display_operations ops = {<br>-    Close, Prepare, Display, Control, NULL, NULL,<br>+    Close, Prepare, Display, Control, NULL, NULL, NULL,<br> };<br> <br> static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,<br>diff --git a/modules/video_output/caca.c b/modules/video_output/caca.c<br>index d4a66c5e37..d01c259e41 100644<br>--- a/modules/video_output/caca.c<br>+++ b/modules/video_output/caca.c<br>@@ -371,7 +371,7 @@ static void Close(vout_display_t *vd)<br> }<br> <br> static const struct vlc_display_operations ops = {<br>-    Close, Prepare, PictureDisplay, Control, NULL, NULL,<br>+    Close, Prepare, PictureDisplay, Control, NULL, NULL, NULL,<br> };<br> <br> /**<br>diff --git a/modules/video_output/caopengllayer.m b/modules/video_output/caopengllayer.m<br>index 587817d153..551def799a 100644<br>--- a/modules/video_output/caopengllayer.m<br>+++ b/modules/video_output/caopengllayer.m<br>@@ -119,7 +119,7 @@ static int SetViewpoint(vout_display_t *vd, const vlc_viewpoint_t *vp)<br> }<br> <br> static const struct vlc_display_operations ops = {<br>-    Close, PictureRender, PictureDisplay, Control, NULL, SetViewpoint,<br>+    Close, PictureRender, PictureDisplay, Control, NULL, SetViewpoint, NULL,<br> };<br> <br> /*****************************************************************************<br>diff --git a/modules/video_output/decklink.cpp b/modules/video_output/decklink.cpp<br>index 4f25dc6d01..d44709ace4 100644<br>--- a/modules/video_output/decklink.cpp<br>+++ b/modules/video_output/decklink.cpp<br>@@ -769,7 +769,7 @@ static int ControlVideo(vout_display_t *vd, int query)<br> }<br> <br> static const struct vlc_display_operations ops = {<br>-    CloseVideo, PrepareVideo, NULL, ControlVideo, NULL, NULL,<br>+    CloseVideo, PrepareVideo, NULL, ControlVideo, NULL, NULL, NULL,<br> };<br> <br> static int OpenVideo(vout_display_t *vd, const vout_display_cfg_t *cfg,<br>diff --git a/modules/video_output/fb.c b/modules/video_output/fb.c<br>index 4ea44c154c..c92b9ccd09 100644<br>--- a/modules/video_output/fb.c<br>+++ b/modules/video_output/fb.c<br>@@ -162,7 +162,7 @@ static void ClearScreen(vout_display_sys_t *sys)<br> }<br> <br> static const struct vlc_display_operations ops = {<br>-    Close, NULL, Display, Control, NULL, NULL,<br>+    Close, NULL, Display, Control, NULL, NULL, NULL,<br> };<br> <br> /**<br>diff --git a/modules/video_output/flaschen.c b/modules/video_output/flaschen.c<br>index ec515c9b8b..46bab8fa17 100644<br>--- a/modules/video_output/flaschen.c<br>+++ b/modules/video_output/flaschen.c<br>@@ -82,7 +82,7 @@ static void            Display(vout_display_t *, picture_t *);<br> static int             Control(vout_display_t *, int);<br> <br> static const struct vlc_display_operations ops = {<br>-    Close, NULL, Display, Control, NULL, NULL,<br>+    Close, NULL, Display, Control, NULL, NULL, NULL,<br> };<br> <br> /*****************************************************************************<br>diff --git a/modules/video_output/ios.m b/modules/video_output/ios.m<br>index 07c8355d45..682d0800c8 100644<br>--- a/modules/video_output/ios.m<br>+++ b/modules/video_output/ios.m<br>@@ -152,7 +152,7 @@ static int SetViewpoint(vout_display_t *vd, const vlc_viewpoint_t *vp)<br> }<br> <br> static const struct vlc_display_operations ops = {<br>-    Close, PictureRender, PictureDisplay, Control, NULL, SetViewpoint,<br>+    Close, PictureRender, PictureDisplay, Control, NULL, SetViewpoint, NULL,<br> };<br> <br> static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,<br>diff --git a/modules/video_output/kms.c b/modules/video_output/kms.c<br>index 9965f3a8ef..ec7b1c32ef 100644<br>--- a/modules/video_output/kms.c<br>+++ b/modules/video_output/kms.c<br>@@ -663,7 +663,7 @@ static void Close(vout_display_t *vd)<br> }<br> <br> static const struct vlc_display_operations ops = {<br>-    Close, Prepare, Display, Control, NULL, NULL,<br>+    Close, Prepare, Display, Control, NULL, NULL, NULL,<br> };<br> <br> /**<br>diff --git a/modules/video_output/kva.c b/modules/video_output/kva.c<br>index badef7a452..edb79bd4eb 100644<br>--- a/modules/video_output/kva.c<br>+++ b/modules/video_output/kva.c<br>@@ -156,7 +156,7 @@ static void Prepare(vout_display_t *vd, picture_t *pic, subpicture_t *subpic, vl<br> }<br> <br> static const struct vlc_display_operations ops = {<br>-    Close, Prepare, Display, Control, NULL, NULL,<br>+    Close, Prepare, Display, Control, NULL, NULL, NULL,<br> };<br> <br> static void PMThread( void *arg )<br>diff --git a/modules/video_output/macosx.m b/modules/video_output/macosx.m<br>index 9ce48deaaf..6f32009b3f 100644<br>--- a/modules/video_output/macosx.m<br>+++ b/modules/video_output/macosx.m<br>@@ -138,7 +138,7 @@ static int SetViewpoint(vout_display_t *vd, const vlc_viewpoint_t *vp)<br> }<br> <br> static const struct vlc_display_operations ops = {<br>-    Close, PictureRender, PictureDisplay, Control, NULL, SetViewpoint,<br>+    Close, PictureRender, PictureDisplay, Control, NULL, SetViewpoint, NULL,<br> };<br> <br> static int Open (vout_display_t *vd, const vout_display_cfg_t *cfg,<br>diff --git a/modules/video_output/opengl/display.c b/modules/video_output/opengl/display.c<br>index b4d79cf0ca..82e0dc5156 100644<br>--- a/modules/video_output/opengl/display.c<br>+++ b/modules/video_output/opengl/display.c<br>@@ -94,7 +94,7 @@ static int SetViewpoint(vout_display_t *vd, const vlc_viewpoint_t *vp)<br> }<br> <br> static const struct vlc_display_operations ops = {<br>-    Close, PictureRender, PictureDisplay, Control, NULL, SetViewpoint,<br>+    Close, PictureRender, PictureDisplay, Control, NULL, SetViewpoint, NULL,<br> };<br> <br> /**<br>diff --git a/modules/video_output/splitter.c b/modules/video_output/splitter.c<br>index 6ca82e34c1..8bffeb3591 100644<br>--- a/modules/video_output/splitter.c<br>+++ b/modules/video_output/splitter.c<br>@@ -220,7 +220,7 @@ static vout_window_t *video_splitter_CreateWindow(vlc_object_t *obj,<br> }<br> <br> static const struct vlc_display_operations ops = {<br>-    vlc_vidsplit_Close, vlc_vidsplit_Prepare, vlc_vidsplit_Display, vlc_vidsplit_Control, NULL, NULL,<br>+    vlc_vidsplit_Close, vlc_vidsplit_Prepare, vlc_vidsplit_Display, vlc_vidsplit_Control, NULL, NULL, NULL,<br> };<br> <br> static int vlc_vidsplit_Open(vout_display_t *vd,<br>diff --git a/modules/video_output/vdummy.c b/modules/video_output/vdummy.c<br>index 91309cca24..90d984be2c 100644<br>--- a/modules/video_output/vdummy.c<br>+++ b/modules/video_output/vdummy.c<br>@@ -85,7 +85,7 @@ static void Open(vout_display_t *vd, video_format_t *fmt)<br> }<br> <br> static const struct vlc_display_operations ops_dummy = {<br>-    NULL, NULL, NULL, Control, NULL, NULL,<br>+    NULL, NULL, NULL, Control, NULL, NULL, NULL,<br> };<br> <br> static int OpenDummy(vout_display_t *vd, const vout_display_cfg_t *cfg,<br>@@ -98,7 +98,7 @@ static int OpenDummy(vout_display_t *vd, const vout_display_cfg_t *cfg,<br> }<br> <br> static const struct vlc_display_operations ops_stats = {<br>-    NULL, NULL, DisplayStat, Control, NULL, NULL,<br>+    NULL, NULL, DisplayStat, Control, NULL, NULL, NULL,<br> };<br> <br> static int OpenStats(vout_display_t *vd, const vout_display_cfg_t *cfg,<br>diff --git a/modules/video_output/vmem.c b/modules/video_output/vmem.c<br>index ce077db7a3..559ec1ebdd 100644<br>--- a/modules/video_output/vmem.c<br>+++ b/modules/video_output/vmem.c<br>@@ -106,7 +106,7 @@ static void           Display(vout_display_t *, picture_t *);<br> static int            Control(vout_display_t *, int);<br> <br> static const struct vlc_display_operations ops = {<br>-    Close, Prepare, Display, Control, NULL, NULL,<br>+    Close, Prepare, Display, Control, NULL, NULL, NULL,<br> };<br> <br> /*****************************************************************************<br>diff --git a/modules/video_output/vulkan/display.c b/modules/video_output/vulkan/display.c<br>index cba7ca8903..b57591eb0c 100644<br>--- a/modules/video_output/vulkan/display.c<br>+++ b/modules/video_output/vulkan/display.c<br>@@ -78,7 +78,7 @@ static void Close(vout_display_t *);<br> static void UpdateParams(vout_display_t *);<br> <br> static const struct vlc_display_operations ops = {<br>-    Close, PictureRender, PictureDisplay, Control, NULL, NULL,<br>+    Close, PictureRender, PictureDisplay, Control, NULL, NULL, NULL,<br> };<br> <br> // Allocates a Vulkan surface and instance for video output.<br>diff --git a/modules/video_output/wayland/shm.c b/modules/video_output/wayland/shm.c<br>index 4480fa6d3a..a336658d8d 100644<br>--- a/modules/video_output/wayland/shm.c<br>+++ b/modules/video_output/wayland/shm.c<br>@@ -263,7 +263,7 @@ static void Close(vout_display_t *vd)<br> }<br> <br> static const struct vlc_display_operations ops = {<br>-    Close, Prepare, Display, Control, ResetPictures, NULL,<br>+    Close, Prepare, Display, Control, ResetPictures, NULL, NULL,<br> };<br> <br> static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,<br>diff --git a/modules/video_output/win32/direct3d11.c b/modules/video_output/win32/direct3d11.c<br>index c4a020fb06..95551f43ea 100644<br>--- a/modules/video_output/win32/direct3d11.c<br>+++ b/modules/video_output/win32/direct3d11.c<br>@@ -305,7 +305,7 @@ static int SetViewpoint(vout_display_t *vd, const vlc_viewpoint_t *viewpoint)<br> }<br> <br> static const struct vlc_display_operations ops = {<br>-    Close, Prepare, Display, Control, NULL, SetViewpoint,<br>+    Close, Prepare, Display, Control, NULL, SetViewpoint, NULL,<br> };<br> <br> static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,<br>diff --git a/modules/video_output/win32/direct3d9.c b/modules/video_output/win32/direct3d9.c<br>index 55235f63d6..b1a3bdc8e9 100644<br>--- a/modules/video_output/win32/direct3d9.c<br>+++ b/modules/video_output/win32/direct3d9.c<br>@@ -1761,7 +1761,7 @@ static void LocalSwapchainSwap( void *opaque )<br> }<br> <br> static const struct vlc_display_operations ops = {<br>-    Close, Prepare, Display, Control, NULL, NULL,<br>+    Close, Prepare, Display, Control, NULL, NULL, NULL,<br> };<br> <br> /**<br>diff --git a/modules/video_output/win32/glwin32.c b/modules/video_output/win32/glwin32.c<br>index 627a33ccc4..07df857732 100644<br>--- a/modules/video_output/win32/glwin32.c<br>+++ b/modules/video_output/win32/glwin32.c<br>@@ -109,7 +109,7 @@ static vout_window_t *EmbedVideoWindow_Create(vout_display_t *vd)<br> }<br> <br> static const struct vlc_display_operations ops = {<br>-    Close, Prepare, Display, Control, NULL, SetViewpoint,<br>+    Close, Prepare, Display, Control, NULL, SetViewpoint, NULL,<br> };<br> <br> /**<br>diff --git a/modules/video_output/win32/wingdi.c b/modules/video_output/win32/wingdi.c<br>index e25eed09e3..56a9f68aff 100644<br>--- a/modules/video_output/win32/wingdi.c<br>+++ b/modules/video_output/win32/wingdi.c<br>@@ -104,7 +104,7 @@ static int Control(vout_display_t *vd, int query)<br> }<br> <br> static const struct vlc_display_operations ops = {<br>-    Close, Prepare, Display, Control, NULL, NULL,<br>+    Close, Prepare, Display, Control, NULL, NULL, NULL,<br> };<br> <br> /* */<br>diff --git a/modules/video_output/xcb/render.c b/modules/video_output/xcb/render.c<br>index 1cf833f2c6..6aa1f83fc3 100644<br>--- a/modules/video_output/xcb/render.c<br>+++ b/modules/video_output/xcb/render.c<br>@@ -541,7 +541,7 @@ FindVisual(const xcb_setup_t *setup, const xcb_screen_t *scr,<br> }<br> <br> static const struct vlc_display_operations ops = {<br>-    Close, Prepare, Display, Control, NULL, NULL,<br>+    Close, Prepare, Display, Control, NULL, NULL, NULL,<br> };<br> <br> /**<br>diff --git a/modules/video_output/xcb/x11.c b/modules/video_output/xcb/x11.c<br>index f48471f0c5..0472f2c3d0 100644<br>--- a/modules/video_output/xcb/x11.c<br>+++ b/modules/video_output/xcb/x11.c<br>@@ -251,7 +251,7 @@ static xcb_visualid_t ScreenToFormat(const xcb_setup_t *setup,<br> }<br> <br> static const struct vlc_display_operations ops = {<br>-    Close, Prepare, Display, Control, ResetPictures, NULL,<br>+    Close, Prepare, Display, Control, ResetPictures, NULL, NULL,<br> };<br> <br> /**<br>diff --git a/modules/video_output/yuv.c b/modules/video_output/yuv.c<br>index e7460a1d2f..9b39fbf99d 100644<br>--- a/modules/video_output/yuv.c<br>+++ b/modules/video_output/yuv.c<br>@@ -87,7 +87,7 @@ struct vout_display_sys_t {<br> };<br> <br> static const struct vlc_display_operations ops = {<br>-    Close, NULL, Display, Control, NULL, NULL,<br>+    Close, NULL, Display, Control, NULL, NULL, NULL,<br> };<br> <br> /* */<br>diff --git a/src/video_output/display.c b/src/video_output/display.c<br>index 1d304e2b32..2d9d212924 100644<br>--- a/src/video_output/display.c<br>+++ b/src/video_output/display.c<br>@@ -587,6 +587,16 @@ void vout_UpdateDisplaySourceProperties(vout_display_t *vd, const video_format_t<br>         vout_display_Reset(vd);<br> }<br> <br>+int<br>+VoutUpdateFormat(vout_display_t *vd, video_format_t *fmt,<br>+                 vlc_video_context *ctx)<br>+{<br>+    if (!vd->ops->update_format)<br>+        return VLC_EGENERIC;<br>+    return vd->ops->update_format(vd, fmt, ctx);<br>+}<br>+<br>+<br> void vout_display_SetSize(vout_display_t *vd, unsigned width, unsigned height)<br> {<br>     vout_display_priv_t *osys = container_of(vd, vout_display_priv_t, display);<br>diff --git a/src/video_output/display.h b/src/video_output/display.h<br>index de1c631dc8..fe17e033a9 100644<br>--- a/src/video_output/display.h<br>+++ b/src/video_output/display.h<br>@@ -24,3 +24,5 @@<br> <br> void vout_UpdateDisplaySourceProperties(vout_display_t *vd, const video_format_t *, const vlc_rational_t *forced_dar);<br> void VoutFixFormatAR(video_format_t *);<br>+int VoutUpdateFormat(vout_display_t *vd, video_format_t *fmt,<br>+                     vlc_video_context *ctx);<br>diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c<br>index 57ee54e6e8..15c1f0e3ee 100644<br>--- a/src/video_output/video_output.c<br>+++ b/src/video_output/video_output.c<br>@@ -950,6 +950,34 @@ typedef struct {<br>     config_chain_t *cfg;<br> } vout_filter_t;<br> <br>+static int<br>+ThreadRequestVoutFormatChange(vout_thread_sys_t *sys, const video_format_t *fmt,<br>+                              vlc_video_context *vctx, video_format_t *target)<br>+{<br>+    vout_display_t *vd = sys->display;<br>+<br>+    video_format_t vout_fmt;<br>+    int ret = video_format_Copy(&vout_fmt, fmt);<br>+    if (ret != VLC_SUCCESS)<br>+        return ret;<br>+<br>+    vlc_mutex_lock(&sys->display_lock);<br>+    ret = VoutUpdateFormat(vd, &vout_fmt, vctx);<br>+    vlc_mutex_unlock(&sys->display_lock);<br>+<br>+    if (ret != VLC_SUCCESS)<br>+    {<br>+        video_format_Clean(&vout_fmt);<br>+        return ret;<br>+    }<br>+<br>+    /* Move vout_fmt to *target */<br>+    video_format_Clean(target);<br>+    memcpy(target, &vout_fmt, sizeof(*target));<br>+<br>+    return ret;<br>+}<br>+<br> static void ThreadChangeFilters(vout_thread_sys_t *vout)<br> {<br>     vout_thread_sys_t *sys = vout;<br>@@ -1043,13 +1071,28 @@ static void ThreadChangeFilters(vout_thread_sys_t *vout)<br>     }<br> <br>     if (!es_format_IsSimilar(p_fmt_current, &fmt_target)) {<br>-        msg_Dbg(&vout->obj, "Adding a filter to compensate for format changes");<br>-        if (filter_chain_AppendConverter(sys->filter.chain_interactive,<br>-                                         &fmt_target) != 0) {<br>-            msg_Err(&vout->obj, "Failed to compensate for the format changes, removing all filters");<br>-            ThreadDelAllFilterCallbacks(vout);<br>-            filter_chain_Reset(sys->filter.chain_static,      &fmt_target, vctx_target, &fmt_target);<br>-            filter_chain_Reset(sys->filter.chain_interactive, &fmt_target, vctx_target, &fmt_target);<br>+        msg_Dbg(&vout->obj, "Changing vout format to %4.4s",<br>+                            (const char *) &p_fmt_current->video.i_chroma);<br>+<br>+        int ret = ThreadRequestVoutFormatChange(vout, &p_fmt_current->video,<br>+                                                vctx_current,<br>+                                                &fmt_target.video);<br>+        if (ret == VLC_SUCCESS)<br>+            fmt_target.i_codec = fmt_target.video.i_chroma;<br>+        else<br>+            msg_Dbg(&vout->obj, "Changing vout format to %4.4s failed",<br>+                                (const char *) &p_fmt_current->video.i_chroma);<br>+<br>+        if (!es_format_IsSimilar(p_fmt_current, &fmt_target))<br>+        {<br>+            msg_Dbg(&vout->obj, "Adding a filter to compensate for format changes");<br>+            if (filter_chain_AppendConverter(sys->filter.chain_interactive,<br>+                                             &fmt_target) != 0) {<br>+                msg_Err(&vout->obj, "Failed to compensate for the format changes, removing all filters");<br>+                ThreadDelAllFilterCallbacks(vout);<br>+                filter_chain_Reset(sys->filter.chain_static,      &fmt_target, vctx_target, &fmt_target);<br>+                filter_chain_Reset(sys->filter.chain_interactive, &fmt_target, vctx_target, &fmt_target);<br>+            }<br>         }<br>     }<br> </pre></blockquote></div><br>-- <br>Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez excuser ma brièveté.</body></html>