+ const video_format_t *source = &vout->p->original;
+
+ if (num > 0 && den > 0) {
+ num *= source->i_visible_height;
+ den *= source->i_visible_width;
+ vlc_ureduce(&num, &den, num, den, 0);
+ }
+ vout_SetDisplayAspect(vout->p->display.vd, num, den);
+}
+
+
+static void ThreadExecuteCropWindow(vout_thread_t *vout,
+ unsigned crop_num, unsigned crop_den,
+ unsigned x, unsigned y,
+ unsigned width, unsigned height)
+{
+ const video_format_t *source = &vout->p->original;
+
+ vout_SetDisplayCrop(vout->p->display.vd,
+ crop_num, crop_den,
+ source->i_x_offset + x,
+ source->i_y_offset + y,
+ width, height);
+}
+static void ThreadExecuteCropBorder(vout_thread_t *vout,
+ unsigned left, unsigned top,
+ unsigned right, unsigned bottom)
+{
+ const video_format_t *source = &vout->p->original;
+ ThreadExecuteCropWindow(vout, 0, 0,
+ left,
+ top,
+ /* At worst, it becomes < 0 (but unsigned) and will be rejected */
+ source->i_visible_width - (left + right),
+ source->i_visible_height - (top + bottom));
+}
+
+static void ThreadExecuteCropRatio(vout_thread_t *vout,
+ unsigned num, unsigned den)
+{
+ const video_format_t *source = &vout->p->original;
+ ThreadExecuteCropWindow(vout, num, den,
+ 0, 0,
+ source->i_visible_width,
+ source->i_visible_height);
+}
+
+static int ThreadStart(vout_thread_t *vout, const vout_display_state_t *state)
+{
+ vlc_mouse_Init(&vout->p->mouse);
+ vout->p->decoder_fifo = picture_fifo_New();
+ vout->p->decoder_pool = NULL;
+ vout->p->display_pool = NULL;
+ vout->p->private_pool = NULL;
+
+ vout->p->vfilter_chain =
+ filter_chain_New( vout, "video filter2", false,
+ VoutVideoFilterAllocationSetup, NULL, vout);
+
+ vout_display_state_t state_default;
+ if (!state) {
+ VoutGetDisplayCfg(vout, &state_default.cfg, vout->p->display.title);
+ state_default.wm_state = var_CreateGetBool(vout, "video-on-top") ? VOUT_WINDOW_STATE_ABOVE :
+ VOUT_WINDOW_STATE_NORMAL;
+ state_default.sar.num = 0;
+ state_default.sar.den = 0;
+
+ state = &state_default;
+ }
+
+ if (vout_OpenWrapper(vout, vout->p->splitter_name, state))
+ return VLC_EGENERIC;
+ if (vout_InitWrapper(vout))
+ return VLC_EGENERIC;
+ assert(vout->p->decoder_pool);
+
+ vout->p->displayed.decoded = NULL;
+ vout->p->displayed.date = VLC_TS_INVALID;
+ vout->p->displayed.decoded = NULL;
+ vout->p->displayed.timestamp = VLC_TS_INVALID;
+ vout->p->displayed.qtype = QTYPE_NONE;
+ vout->p->displayed.is_interlaced = false;
+
+ vout->p->step.last = VLC_TS_INVALID;
+ vout->p->step.timestamp = VLC_TS_INVALID;
+
+ video_format_Print(VLC_OBJECT(vout), "original format", &vout->p->original);
+ return VLC_SUCCESS;
+}
+
+static void ThreadStop(vout_thread_t *vout, vout_display_state_t *state)
+{
+ /* Destroy the video filters2 */
+ filter_chain_Delete(vout->p->vfilter_chain);
+