[vlc-devel] [PATCH] add a secondary video_format_t to the vout to handle format cropping

Steve Lhomme robUx4 at videolabs.io
Wed Mar 4 17:10:37 CET 2015


Fixes #13982

The format cropping/display size is not applied to the codec output,
which may have it's own crop values but on the vout.
---
 include/vlc_aout.h                    |  3 ++-
 include/vlc_vout.h                    |  3 ++-
 include/vlc_vout_wrapper.h            |  2 +-
 modules/visualization/goom.c          |  6 +++---
 modules/visualization/visual/visual.c |  8 +++----
 src/audio_output/aout_internal.h      |  2 +-
 src/audio_output/filters.c            |  4 ++--
 src/input/decoder.c                   | 11 +++++-----
 src/input/resource.c                  | 22 ++++++++++---------
 src/input/resource.h                  |  3 ++-
 src/video_output/display.c            | 40 +++++++++++++++++++++--------------
 src/video_output/display.h            |  1 +
 src/video_output/video_output.c       | 22 ++++++++++++++-----
 src/video_output/vout_internal.h      |  1 +
 src/video_output/vout_wrapper.c       |  6 ++++--
 15 files changed, 82 insertions(+), 52 deletions(-)

diff --git a/include/vlc_aout.h b/include/vlc_aout.h
index 032157f..50a7ac9 100644
--- a/include/vlc_aout.h
+++ b/include/vlc_aout.h
@@ -334,6 +334,7 @@ VLC_API void aout_FiltersDelete(vlc_object_t *, aout_filters_t *);
 VLC_API bool aout_FiltersAdjustResampling(aout_filters_t *, int);
 VLC_API block_t *aout_FiltersPlay(aout_filters_t *, block_t *, int rate);
 
-VLC_API vout_thread_t * aout_filter_RequestVout( filter_t *, vout_thread_t *p_vout, video_format_t *p_fmt );
+VLC_API vout_thread_t * aout_filter_RequestVout( filter_t *, vout_thread_t *p_vout,
+                                                 video_format_t *p_fmt_in, video_format_t *p_fmt_out );
 
 #endif /* VLC_AOUT_H */
diff --git a/include/vlc_vout.h b/include/vlc_vout.h
index 15f321d..e38c412 100644
--- a/include/vlc_vout.h
+++ b/include/vlc_vout.h
@@ -54,7 +54,8 @@ typedef struct {
     vout_thread_t        *vout;
     vlc_object_t         *input;
     bool                 change_fmt;
-    const video_format_t *fmt;
+    const video_format_t *p_fmt_in;
+    const video_format_t *p_fmt_out;
     unsigned             dpb_size;
 } vout_configuration_t;
 
diff --git a/include/vlc_vout_wrapper.h b/include/vlc_vout_wrapper.h
index 419bfc8..3562817 100644
--- a/include/vlc_vout_wrapper.h
+++ b/include/vlc_vout_wrapper.h
@@ -74,7 +74,7 @@ typedef struct {
 /**
  * It creates a vout managed display.
  */
-vout_display_t *vout_NewDisplay( vout_thread_t *, const video_format_t *,
+vout_display_t *vout_NewDisplay( vout_thread_t *, const video_format_t *, const video_format_t *,
     const vout_display_state_t *, const char *module,
     mtime_t double_click_timeout, mtime_t hide_timeout );
 /**
diff --git a/modules/visualization/goom.c b/modules/visualization/goom.c
index a57da5b..1b58147 100644
--- a/modules/visualization/goom.c
+++ b/modules/visualization/goom.c
@@ -135,7 +135,7 @@ static int Open( vlc_object_t *p_this )
     fmt.i_chroma = VLC_CODEC_RGB32;
     fmt.i_sar_num = fmt.i_sar_den = 1;
 
-    p_thread->p_vout = aout_filter_RequestVout( p_filter, NULL, &fmt );
+    p_thread->p_vout = aout_filter_RequestVout( p_filter, NULL, &fmt, &fmt );
     if( p_thread->p_vout == NULL )
     {
         msg_Err( p_filter, "no suitable vout module" );
@@ -162,7 +162,7 @@ static int Open( vlc_object_t *p_this )
         msg_Err( p_filter, "cannot lauch goom thread" );
         vlc_mutex_destroy( &p_thread->lock );
         vlc_cond_destroy( &p_thread->wait );
-        aout_filter_RequestVout( p_filter, p_thread->p_vout, NULL );
+        aout_filter_RequestVout( p_filter, p_thread->p_vout, NULL, NULL );
         free( p_thread );
         free( p_sys );
         return VLC_EGENERIC;
@@ -366,7 +366,7 @@ static void Close( vlc_object_t *p_this )
     vlc_join( p_sys->p_thread->thread, NULL );
 
     /* Free data */
-    aout_filter_RequestVout( p_filter, p_sys->p_thread->p_vout, NULL );
+    aout_filter_RequestVout( p_filter, p_sys->p_thread->p_vout, NULL, NULL );
     vlc_mutex_destroy( &p_sys->p_thread->lock );
     vlc_cond_destroy( &p_sys->p_thread->wait );
 
diff --git a/modules/visualization/visual/visual.c b/modules/visualization/visual/visual.c
index 5ce328d..9bd2e27 100644
--- a/modules/visualization/visual/visual.c
+++ b/modules/visualization/visual/visual.c
@@ -299,7 +299,7 @@ static int Open( vlc_object_t *p_this )
         .i_sar_num = 1,
         .i_sar_den = 1,
     };
-    p_sys->p_vout = aout_filter_RequestVout( p_filter, NULL, &fmt );
+    p_sys->p_vout = aout_filter_RequestVout( p_filter, NULL, &fmt, &fmt );
     if( p_sys->p_vout == NULL )
     {
         msg_Err( p_filter, "no suitable vout module" );
@@ -309,7 +309,7 @@ static int Open( vlc_object_t *p_this )
     p_sys->fifo = block_FifoNew();
     if( unlikely( p_sys->fifo == NULL ) )
     {
-        aout_filter_RequestVout( p_filter, p_sys->p_vout, NULL );
+        aout_filter_RequestVout( p_filter, p_sys->p_vout, NULL, NULL );
         goto error;
     }
 
@@ -317,7 +317,7 @@ static int Open( vlc_object_t *p_this )
                    VLC_THREAD_PRIORITY_VIDEO ) )
     {
         block_FifoRelease( p_sys->fifo );
-        aout_filter_RequestVout( p_filter, p_sys->p_vout, NULL );
+        aout_filter_RequestVout( p_filter, p_sys->p_vout, NULL, NULL );
         goto error;
     }
 
@@ -403,7 +403,7 @@ static void Close( vlc_object_t *p_this )
     vlc_cancel( p_sys->thread );
     vlc_join( p_sys->thread, NULL );
     block_FifoRelease( p_sys->fifo );
-    aout_filter_RequestVout( p_filter, p_filter->p_sys->p_vout, NULL );
+    aout_filter_RequestVout( p_filter, p_filter->p_sys->p_vout, NULL, NULL );
 
     /* Free the list */
     for( int i = 0; i < p_sys->i_effect; i++ )
diff --git a/src/audio_output/aout_internal.h b/src/audio_output/aout_internal.h
index 10c790b..ce219dc 100644
--- a/src/audio_output/aout_internal.h
+++ b/src/audio_output/aout_internal.h
@@ -38,7 +38,7 @@ enum {
 struct aout_request_vout
 {
     struct vout_thread_t  *(*pf_request_vout)( void *, struct vout_thread_t *,
-                                               video_format_t *, bool );
+                                               video_format_t *, video_format_t *, bool );
     void *p_private;
 };
 
diff --git a/src/audio_output/filters.c b/src/audio_output/filters.c
index 74c5a6a..a9d97ea 100644
--- a/src/audio_output/filters.c
+++ b/src/audio_output/filters.c
@@ -311,7 +311,7 @@ static int VisualizationCallback (vlc_object_t *obj, const char *var,
 }
 
 vout_thread_t *aout_filter_RequestVout (filter_t *filter, vout_thread_t *vout,
-                                        video_format_t *fmt)
+                                        video_format_t *p_fmt_in, video_format_t *p_fmt_out)
 {
     /* NOTE: This only works from aout_filters_t.
      * If you want to use visualization filters from another place, you will
@@ -324,7 +324,7 @@ vout_thread_t *aout_filter_RequestVout (filter_t *filter, vout_thread_t *vout,
     bool recycle = false;
     free (visual);
 
-    return req->pf_request_vout (req->p_private, vout, fmt, recycle);
+    return req->pf_request_vout (req->p_private, vout, p_fmt_in, p_fmt_out, recycle);
 }
 
 static int AppendFilter(vlc_object_t *obj, const char *type, const char *name,
diff --git a/src/input/decoder.c b/src/input/decoder.c
index 451024b..caac42a 100644
--- a/src/input/decoder.c
+++ b/src/input/decoder.c
@@ -1828,7 +1828,7 @@ static void DeleteDecoder( decoder_t * p_dec )
         vout_Reset( p_owner->p_vout );
 
         /* */
-        input_resource_RequestVout( p_owner->p_resource, p_owner->p_vout, NULL,
+        input_resource_RequestVout( p_owner->p_resource, p_owner->p_vout, NULL, NULL,
                                     0, true );
         if( p_owner->p_input != NULL )
             input_SendEventVout( p_owner->p_input );
@@ -1898,14 +1898,15 @@ static void DecoderUpdateFormatLocked( decoder_t *p_dec )
     p_dec->p_description = NULL;
 }
 static vout_thread_t *aout_request_vout( void *p_private,
-                                         vout_thread_t *p_vout, video_format_t *p_fmt, bool b_recyle )
+                                         vout_thread_t *p_vout, video_format_t *p_fmt_in,
+                                         video_format_t *p_fmt_out, bool b_recyle )
 {
     decoder_t *p_dec = p_private;
     decoder_owner_sys_t *p_owner = p_dec->p_owner;
     input_thread_t *p_input = p_owner->p_input;
 
-    p_vout = input_resource_RequestVout( p_owner->p_resource, p_vout, p_fmt, 1,
-                                         b_recyle );
+    p_vout = input_resource_RequestVout( p_owner->p_resource, p_vout, p_fmt_in, p_fmt_out,
+                                         1, b_recyle );
     if( p_input != NULL )
         input_SendEventVout( p_input );
 
@@ -2112,7 +2113,7 @@ static int vout_update_format( decoder_t *p_dec )
             break;
         }
         p_vout = input_resource_RequestVout( p_owner->p_resource,
-                                             p_vout, &fmt,
+                                             p_vout, &fmt, &p_dec->fmt_in.video,
                                              dpb_size +
                                              p_dec->i_extra_picture_buffers + 1,
                                              true );
diff --git a/src/input/resource.c b/src/input/resource.c
index 3440288..4306075 100644
--- a/src/input/resource.c
+++ b/src/input/resource.c
@@ -193,12 +193,12 @@ static void DisplayVoutTitle( input_resource_t *p_resource,
 }
 static vout_thread_t *RequestVout( input_resource_t *p_resource,
                                    vout_thread_t *p_vout,
-                                   video_format_t *p_fmt, unsigned dpb_size,
-                                   bool b_recycle )
+                                   video_format_t *p_fmt_in, video_format_t *p_fmt_out,
+                                   unsigned dpb_size, bool b_recycle )
 {
     vlc_assert_locked( &p_resource->lock );
 
-    if( !p_vout && !p_fmt )
+    if( !p_vout && !p_fmt_in )
     {
         if( p_resource->p_vout_free )
         {
@@ -209,7 +209,7 @@ static vout_thread_t *RequestVout( input_resource_t *p_resource,
         return NULL;
     }
 
-    if( p_fmt )
+    if( p_fmt_in )
     {
         /* */
         if( !p_vout && p_resource->p_vout_free )
@@ -233,7 +233,8 @@ static vout_thread_t *RequestVout( input_resource_t *p_resource,
             .vout       = p_vout,
             .input      = VLC_OBJECT(p_resource->p_input),
             .change_fmt = true,
-            .fmt        = p_fmt,
+            .p_fmt_in   = p_fmt_in,
+            .p_fmt_out  = p_fmt_out,
             .dpb_size   = dpb_size,
         };
         p_vout = vout_Request( p_resource->p_parent, &cfg );
@@ -273,7 +274,8 @@ static vout_thread_t *RequestVout( input_resource_t *p_resource,
                 .vout       = p_vout,
                 .input      = NULL,
                 .change_fmt = false,
-                .fmt        = NULL,
+                .p_fmt_in   = NULL,
+                .p_fmt_out  = NULL,
                 .dpb_size   = 0,
             };
             p_resource->p_vout_free = vout_Request( p_resource->p_parent, &cfg );
@@ -458,11 +460,11 @@ void input_resource_SetInput( input_resource_t *p_resource, input_thread_t *p_in
 
 vout_thread_t *input_resource_RequestVout( input_resource_t *p_resource,
                                             vout_thread_t *p_vout,
-                                            video_format_t *p_fmt, unsigned dpb_size,
-                                            bool b_recycle )
+                                            video_format_t *p_fmt_in, video_format_t *p_fmt_out,
+                                            unsigned dpb_size, bool b_recycle )
 {
     vlc_mutex_lock( &p_resource->lock );
-    vout_thread_t *p_ret = RequestVout( p_resource, p_vout, p_fmt, dpb_size, b_recycle );
+    vout_thread_t *p_ret = RequestVout( p_resource, p_vout, p_fmt_in, p_fmt_out, dpb_size, b_recycle );
     vlc_mutex_unlock( &p_resource->lock );
 
     return p_ret;
@@ -480,7 +482,7 @@ void input_resource_HoldVouts( input_resource_t *p_resource, vout_thread_t ***pp
 
 void input_resource_TerminateVout( input_resource_t *p_resource )
 {
-    input_resource_RequestVout( p_resource, NULL, NULL, 0, false );
+    input_resource_RequestVout( p_resource, NULL, NULL, NULL, 0, false );
 }
 bool input_resource_HasVout( input_resource_t *p_resource )
 {
diff --git a/src/input/resource.h b/src/input/resource.h
index 4c24c74..3d31e1a 100644
--- a/src/input/resource.h
+++ b/src/input/resource.h
@@ -39,7 +39,8 @@ sout_instance_t *input_resource_RequestSout( input_resource_t *, sout_instance_t
 /**
  * This function handles vout request.
  */
-vout_thread_t *input_resource_RequestVout( input_resource_t *, vout_thread_t *, video_format_t *, unsigned dpb_size, bool b_recycle );
+vout_thread_t *input_resource_RequestVout( input_resource_t *, vout_thread_t *, video_format_t *,
+                                           video_format_t *, unsigned dpb_size, bool b_recycle );
 
 /**
  * This function returns one of the current vout if any.
diff --git a/src/video_output/display.c b/src/video_output/display.c
index 3e3a3d5..d55ee29 100644
--- a/src/video_output/display.c
+++ b/src/video_output/display.c
@@ -361,6 +361,7 @@ struct vout_display_owner_sys_t {
         unsigned den;
     } sar;
 
+    /* set when the crop values changed */
     bool ch_crop;
     struct {
         int      left;
@@ -373,6 +374,7 @@ struct vout_display_owner_sys_t {
 
     /* */
     video_format_t source;
+    video_format_t format;
     filter_chain_t *filters;
 
     /* Lock protecting the variables used by
@@ -968,29 +970,29 @@ bool vout_ManageDisplay(vout_display_t *vd, bool allow_reset_pictures)
             unsigned crop_num = osys->crop.num;
             unsigned crop_den = osys->crop.den;
             if (crop_num > 0 && crop_den > 0) {
-                video_format_t fmt = osys->source;
+                video_format_t fmt = osys->format;
                 fmt.i_sar_num = source.i_sar_num;
                 fmt.i_sar_den = source.i_sar_den;
                 VoutDisplayCropRatio(&osys->crop.left,  &osys->crop.top,
                                      &osys->crop.right, &osys->crop.bottom,
                                      &fmt, crop_num, crop_den);
             }
-            const int right_max  = osys->source.i_x_offset + osys->source.i_visible_width;
-            const int bottom_max = osys->source.i_y_offset + osys->source.i_visible_height;
-            int left   = VLC_CLIP((int)osys->source.i_x_offset + osys->crop.left,
+            const int right_max  = osys->format.i_x_offset + osys->format.i_visible_width;
+            const int bottom_max = osys->format.i_y_offset + osys->format.i_visible_height;
+            int left   = VLC_CLIP((int)osys->format.i_x_offset + osys->crop.left,
                                 0, right_max - 1);
-            int top    = VLC_CLIP((int)osys->source.i_y_offset + osys->crop.top,
+            int top    = VLC_CLIP((int)osys->format.i_y_offset + osys->crop.top,
                                 0, bottom_max - 1);
             int right, bottom;
             if (osys->crop.right <= 0)
-                right = (int)(osys->source.i_x_offset + osys->source.i_visible_width) + osys->crop.right;
+                right = (int)(osys->format.i_x_offset + osys->format.i_visible_width) + osys->crop.right;
             else
-                right = (int)osys->source.i_x_offset + osys->crop.right;
+                right = (int)osys->format.i_x_offset + osys->crop.right;
             right = VLC_CLIP(right, left + 1, right_max);
             if (osys->crop.bottom <= 0)
-                bottom = (int)(osys->source.i_y_offset + osys->source.i_visible_height) + osys->crop.bottom;
+                bottom = (int)(osys->format.i_y_offset + osys->format.i_visible_height) + osys->crop.bottom;
             else
-                bottom = (int)osys->source.i_y_offset + osys->crop.bottom;
+                bottom = (int)osys->format.i_y_offset + osys->crop.bottom;
             bottom = VLC_CLIP(bottom, top + 1, bottom_max);
 
             source.i_x_offset       = left;
@@ -998,6 +1000,7 @@ bool vout_ManageDisplay(vout_display_t *vd, bool allow_reset_pictures)
             source.i_visible_width  = right - left;
             source.i_visible_height = bottom - top;
             video_format_Print(VLC_OBJECT(vd), "SOURCE ", &osys->source);
+            video_format_Print(VLC_OBJECT(vd), "FORMAT ", &osys->format);
             video_format_Print(VLC_OBJECT(vd), "CROPPED", &source);
             if (vout_display_Control(vd, VOUT_DISPLAY_CHANGE_SOURCE_CROP, &source)) {
                 msg_Err(vd, "Failed to change source crop TODO implement crop at core");
@@ -1012,13 +1015,13 @@ bool vout_ManageDisplay(vout_display_t *vd, bool allow_reset_pictures)
                 osys->fit_window = 1;
             }
             vd->source = source;
-            osys->crop.left   = source.i_x_offset - osys->source.i_x_offset;
-            osys->crop.top    = source.i_y_offset - osys->source.i_y_offset;
+            osys->crop.left   = source.i_x_offset - osys->format.i_x_offset;
+            osys->crop.top    = source.i_y_offset - osys->format.i_y_offset;
             /* FIXME for right/bottom we should keep the 'type' border vs window */
             osys->crop.right  = (source.i_x_offset + source.i_visible_width) -
-                                (osys->source.i_x_offset + osys->source.i_visible_width);
+                                (osys->format.i_x_offset + osys->format.i_visible_width);
             osys->crop.bottom = (source.i_y_offset + source.i_visible_height) -
-                                (osys->source.i_y_offset + osys->source.i_visible_height);
+                                (osys->format.i_y_offset + osys->format.i_visible_height);
             osys->crop.num    = crop_num;
             osys->crop.den    = crop_den;
             osys->ch_crop = false;
@@ -1184,6 +1187,7 @@ void vout_SetDisplayCrop(vout_display_t *vd,
 
 static vout_display_t *DisplayNew(vout_thread_t *vout,
                                   const video_format_t *source,
+                                  const video_format_t *output,
                                   const vout_display_state_t *state,
                                   const char *module,
                                   bool is_wrapper, vout_display_t *wrapper,
@@ -1238,6 +1242,8 @@ static vout_display_t *DisplayNew(vout_thread_t *vout,
     osys->event.fifo = NULL;
 
     osys->source = *source;
+    osys->format = *output;
+    osys->ch_crop = true;
     osys->crop.left   = 0;
     osys->crop.top    = 0;
     osys->crop.right  = 0;
@@ -1310,12 +1316,13 @@ void vout_DeleteDisplay(vout_display_t *vd, vout_display_state_t *state)
  *****************************************************************************/
 vout_display_t *vout_NewDisplay(vout_thread_t *vout,
                                 const video_format_t *source,
+                                const video_format_t *output,
                                 const vout_display_state_t *state,
                                 const char *module,
                                 mtime_t double_click_timeout,
                                 mtime_t hide_timeout)
 {
-    return DisplayNew(vout, source, state, module, false, NULL,
+    return DisplayNew(vout, source, output, state, module, false, NULL,
                       double_click_timeout, hide_timeout, NULL);
 }
 
@@ -1495,6 +1502,7 @@ static void SplitterClose(vout_display_t *vd)
 
 vout_display_t *vout_NewSplitter(vout_thread_t *vout,
                                  const video_format_t *source,
+                                 const video_format_t *p_output,
                                  const vout_display_state_t *state,
                                  const char *module,
                                  const char *splitter_module,
@@ -1508,7 +1516,7 @@ vout_display_t *vout_NewSplitter(vout_thread_t *vout,
 
     /* */
     vout_display_t *wrapper =
-        DisplayNew(vout, source, state, module, true, NULL,
+        DisplayNew(vout, source, p_output, state, module, true, NULL,
                     double_click_timeout, hide_timeout, NULL);
     if (!wrapper) {
         video_splitter_Delete(splitter);
@@ -1557,7 +1565,7 @@ vout_display_t *vout_NewSplitter(vout_thread_t *vout,
         ostate.cfg.zoom.num = 1;
         ostate.cfg.zoom.den = 1;
 
-        vout_display_t *vd = DisplayNew(vout, &output->fmt, &ostate,
+        vout_display_t *vd = DisplayNew(vout, &output->fmt, p_output, &ostate,
                                         output->psz_module ? output->psz_module : module,
                                         false, wrapper,
                                         double_click_timeout, hide_timeout, &vdo);
diff --git a/src/video_output/display.h b/src/video_output/display.h
index ce20111..b7ce263 100644
--- a/src/video_output/display.h
+++ b/src/video_output/display.h
@@ -25,6 +25,7 @@
 
 vout_display_t *vout_NewSplitter(vout_thread_t *vout,
                                  const video_format_t *source,
+                                 const video_format_t *output,
                                  const vout_display_state_t *state,
                                  const char *module,
                                  const char *splitter_module,
diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
index 40701b7..5e8f9ef 100644
--- a/src/video_output/video_output.c
+++ b/src/video_output/video_output.c
@@ -114,7 +114,7 @@ static vout_thread_t *VoutCreate(vlc_object_t *object,
                                  const vout_configuration_t *cfg)
 {
     video_format_t original;
-    if (VoutValidateFormat(&original, cfg->fmt))
+    if (VoutValidateFormat(&original, cfg->p_fmt_in))
         return NULL;
 
     /* Allocate descriptor */
@@ -130,6 +130,12 @@ static vout_thread_t *VoutCreate(vlc_object_t *object,
     vout->p = (vout_thread_sys_t*)&vout[1];
 
     vout->p->original = original;
+    vout->p->cropped = *cfg->p_fmt_out;
+    if ( !vout->p->cropped.i_visible_height || !vout->p->cropped.i_visible_width )
+    {
+        vout->p->cropped.i_visible_height = vout->p->original.i_visible_height;
+        vout->p->cropped.i_visible_width = vout->p->original.i_visible_width;
+    }
     vout->p->dpb_size = cfg->dpb_size;
 
     vout_control_Init(&vout->p->control);
@@ -169,8 +175,8 @@ static vout_thread_t *VoutCreate(vlc_object_t *object,
             .x = var_InheritInteger(vout, "video-x"),
             .y = var_InheritInteger(vout, "video-y"),
 #endif
-            .width = cfg->fmt->i_visible_width,
-            .height = cfg->fmt->i_visible_height,
+            .width = cfg->p_fmt_in->i_visible_width,
+            .height = cfg->p_fmt_in->i_visible_height,
         };
 
         vout_window_t *window = vout_display_window_New(vout, &wcfg);
@@ -218,7 +224,7 @@ vout_thread_t *vout_Request(vlc_object_t *object,
                               const vout_configuration_t *cfg)
 {
     vout_thread_t *vout = cfg->vout;
-    if (cfg->change_fmt && !cfg->fmt) {
+    if (cfg->change_fmt && !cfg->p_fmt_in) {
         if (vout)
             vout_CloseAndRelease(vout);
         return NULL;
@@ -1409,7 +1415,7 @@ static int ThreadReinit(vout_thread_t *vout,
                         const vout_configuration_t *cfg)
 {
     video_format_t original;
-    if (VoutValidateFormat(&original, cfg->fmt)) {
+    if (VoutValidateFormat(&original, cfg->p_fmt_in)) {
         ThreadStop(vout, NULL);
         ThreadClean(vout);
         return VLC_EGENERIC;
@@ -1448,6 +1454,12 @@ static int ThreadReinit(vout_thread_t *vout,
     }
 
     vout->p->original = original;
+    vout->p->cropped = *cfg->p_fmt_out;
+    if ( !vout->p->cropped.i_visible_height || !vout->p->cropped.i_visible_width )
+    {
+        vout->p->cropped.i_visible_height = vout->p->original.i_visible_height;
+        vout->p->cropped.i_visible_width = vout->p->original.i_visible_width;
+    }
     vout->p->dpb_size = cfg->dpb_size;
     if (ThreadStart(vout, &state)) {
         ThreadClean(vout);
diff --git a/src/video_output/vout_internal.h b/src/video_output/vout_internal.h
index 3b01567..1238683 100644
--- a/src/video_output/vout_internal.h
+++ b/src/video_output/vout_internal.h
@@ -54,6 +54,7 @@ struct vout_thread_sys_t
 
     /* */
     video_format_t  original;   /* Original format ie coming from the decoder */
+    video_format_t  cropped;    /* Original format ie coming from the demuxer */
     unsigned        dpb_size;
 
     /* Snapshot interface */
diff --git a/src/video_output/vout_wrapper.c b/src/video_output/vout_wrapper.c
index d172bcc..cb7cc01 100644
--- a/src/video_output/vout_wrapper.c
+++ b/src/video_output/vout_wrapper.c
@@ -61,10 +61,12 @@ int vout_OpenWrapper(vout_thread_t *vout,
     const mtime_t hide_timeout = var_CreateGetInteger(vout, "mouse-hide-timeout") * 1000;
 
     if (splitter_name) {
-        sys->display.vd = vout_NewSplitter(vout, &vout->p->original, state, "$vout", splitter_name,
+        sys->display.vd = vout_NewSplitter(vout, &vout->p->original, &vout->p->cropped,
+                                           state, "$vout", splitter_name,
                                            double_click_timeout, hide_timeout);
     } else {
-        sys->display.vd = vout_NewDisplay(vout, &vout->p->original, state, "$vout",
+        sys->display.vd = vout_NewDisplay(vout, &vout->p->original, &vout->p->cropped,
+                                          state, "$vout",
                                           double_click_timeout, hide_timeout);
     }
     if (!sys->display.vd) {
-- 
2.2.2




More information about the vlc-devel mailing list