#include <libvlc.h>
#include <vlc_input.h>
-#include "vout_pictures.h"
#include "vout_internal.h"
#include "interlacing.h"
#include "postprocessing.h"
+#include "display.h"
/*****************************************************************************
* Local prototypes
#warning "FIXME: Check RGB masks in vout_Request"
/* FIXME: check RGB masks */
- if( p_vout->fmt_render.i_chroma != vlc_fourcc_GetCodec( VIDEO_ES, p_fmt->i_chroma ) ||
- p_vout->fmt_render.i_width != p_fmt->i_width ||
- p_vout->fmt_render.i_height != p_fmt->i_height ||
+ if( p_vout->p->fmt_render.i_chroma != vlc_fourcc_GetCodec( VIDEO_ES, p_fmt->i_chroma ) ||
+ p_vout->p->fmt_render.i_width != p_fmt->i_width ||
+ p_vout->p->fmt_render.i_height != p_fmt->i_height ||
p_vout->p->b_filter_change )
{
vlc_mutex_unlock( &p_vout->p->change_lock );
#endif
if( i_sar_num > 0 && i_sar_den > 0 &&
- ( i_sar_num != p_vout->fmt_render.i_sar_num ||
- i_sar_den != p_vout->fmt_render.i_sar_den ) )
+ ( i_sar_num != p_vout->p->fmt_render.i_sar_num ||
+ i_sar_den != p_vout->p->fmt_render.i_sar_den ) )
{
- p_vout->fmt_in.i_sar_num = i_sar_num;
- p_vout->fmt_in.i_sar_den = i_sar_den;
+ p_vout->p->fmt_in.i_sar_num = i_sar_num;
+ p_vout->p->fmt_in.i_sar_den = i_sar_den;
- p_vout->fmt_render.i_sar_num = i_sar_num;
- p_vout->fmt_render.i_sar_den = i_sar_den;
+ p_vout->p->fmt_render.i_sar_num = i_sar_num;
+ p_vout->p->fmt_render.i_sar_den = i_sar_den;
p_vout->p->i_changes |= VOUT_ASPECT_CHANGE;
}
vlc_mutex_unlock( &p_vout->p->change_lock );
}
/* */
- p_vout->fmt_render = *p_fmt; /* FIXME palette */
- p_vout->fmt_in = *p_fmt; /* FIXME palette */
+ p_vout->p->fmt_render = *p_fmt; /* FIXME palette */
+ p_vout->p->fmt_in = *p_fmt; /* FIXME palette */
- p_vout->fmt_render.i_chroma =
- p_vout->fmt_in.i_chroma = i_chroma;
- video_format_FixRgb( &p_vout->fmt_render );
- video_format_FixRgb( &p_vout->fmt_in );
+ p_vout->p->fmt_render.i_chroma =
+ p_vout->p->fmt_in.i_chroma = i_chroma;
+ video_format_FixRgb( &p_vout->p->fmt_render );
+ video_format_FixRgb( &p_vout->p->fmt_in );
/* Initialize misc stuff */
vout_control_Init( &p_vout->p->control );
p_vout->p->i_changes = 0;
- p_vout->p->b_fullscreen = 0;
vout_chrono_Init( &p_vout->p->render, 5, 10000 ); /* Arbitrary initial time */
vout_statistic_Init( &p_vout->p->statistic );
p_vout->p->b_filter_change = 0;
vout_control_WaitEmpty(&vout->p->control);
}
+bool vout_IsEmpty(vout_thread_t *vout)
+{
+ vlc_mutex_lock(&vout->p->picture_lock);
+
+ picture_t *picture = picture_fifo_Peek(vout->p->decoder_fifo);
+ if (picture)
+ picture_Release(picture);
+
+ vlc_mutex_unlock(&vout->p->picture_lock);
+
+ return !picture;
+}
+
void vout_FixLeaks( vout_thread_t *vout )
{
vlc_mutex_lock(&vout->p->picture_lock);
return p_vout->p->p_spu;
}
+/* vout_Control* are usable by anyone at anytime */
+void vout_ControlChangeFullscreen(vout_thread_t *vout, bool fullscreen)
+{
+ vout_control_PushBool(&vout->p->control, VOUT_CONTROL_FULLSCREEN,
+ fullscreen);
+}
+void vout_ControlChangeOnTop(vout_thread_t *vout, bool is_on_top)
+{
+ vout_control_PushBool(&vout->p->control, VOUT_CONTROL_ON_TOP,
+ is_on_top);
+}
+void vout_ControlChangeDisplayFilled(vout_thread_t *vout, bool is_filled)
+{
+ vout_control_PushBool(&vout->p->control, VOUT_CONTROL_DISPLAY_FILLED,
+ is_filled);
+}
+void vout_ControlChangeZoom(vout_thread_t *vout, int num, int den)
+{
+ vout_control_PushPair(&vout->p->control, VOUT_CONTROL_ZOOM,
+ num, den);
+}
+
/*****************************************************************************
* InitThread: initialize video output thread
*****************************************************************************
/* print some usefull debug info about different vout formats
*/
- PrintVideoFormat(vout, "pic render", &vout->fmt_render);
- PrintVideoFormat(vout, "pic in", &vout->fmt_in);
- PrintVideoFormat(vout, "pic out", &vout->fmt_out);
+ PrintVideoFormat(vout, "pic render", &vout->p->fmt_render);
+ PrintVideoFormat(vout, "pic in", &vout->p->fmt_in);
+ PrintVideoFormat(vout, "pic out", &vout->p->fmt_out);
- assert(vout->fmt_out.i_width == vout->fmt_render.i_width &&
- vout->fmt_out.i_height == vout->fmt_render.i_height &&
- vout->fmt_out.i_chroma == vout->fmt_render.i_chroma);
+ assert(vout->p->fmt_out.i_width == vout->p->fmt_render.i_width &&
+ vout->p->fmt_out.i_height == vout->p->fmt_render.i_height &&
+ vout->p->fmt_out.i_chroma == vout->p->fmt_render.i_chroma);
return VLC_SUCCESS;
}
-/*****************************************************************************
- * CleanThread: clean up after InitThread
- *****************************************************************************
- * This function is called after a sucessful
- * initialization. It frees all resources allocated by InitThread.
- * XXX You have to enter it with change_lock taken.
- *****************************************************************************/
-static void ThreadClean(vout_thread_t *vout)
-{
- /* Destroy translation tables */
- if (!vout->p->b_error) {
- picture_fifo_Flush(vout->p->decoder_fifo, INT64_MAX, false);
- vout_EndWrapper(vout);
- }
-}
-
static int ThreadDisplayPicture(vout_thread_t *vout,
bool now, mtime_t *deadline)
{
(vout->p->decoder_pool != vout->p->display_pool || subpic)) {
picture_t *render;
if (vout->p->is_decoder_pool_slow)
- render = picture_NewFromFormat(&vout->fmt_out);
+ render = picture_NewFromFormat(&vout->p->fmt_out);
else if (vout->p->decoder_pool != vout->p->display_pool)
render = picture_pool_Get(vout->p->display_pool);
else
picture_Copy(render, filtered);
spu_RenderSubpictures(vout->p->p_spu,
- render, &vout->fmt_out,
- subpic, &vout->fmt_in, spu_render_time);
+ render, &vout->p->fmt_out,
+ subpic, &vout->p->fmt_in, spu_render_time);
}
if (vout->p->is_decoder_pool_slow) {
direct = picture_pool_Get(vout->p->display_pool);
* Take a snapshot if requested
*/
if (direct && do_snapshot)
- vout_snapshot_Set(&vout->p->snapshot, &vout->fmt_out, direct);
+ vout_snapshot_Set(&vout->p->snapshot, &vout->p->fmt_out, direct);
/* Render the direct buffer returned by vout_RenderPicture */
if (direct) {
INT64_C(1000) * vout->p->title.timeout;
if (stop > start)
- vout_ShowTextAbsolute(vout, DEFAULT_CHAN,
+ vout_ShowTextAbsolute(vout, SPU_DEFAULT_CHANNEL,
string, NULL,
vout->p->title.position,
- 30 + vout->fmt_in.i_width
- - vout->fmt_in.i_visible_width
- - vout->fmt_in.i_x_offset,
- 20 + vout->fmt_in.i_y_offset,
+ 30 + vout->p->fmt_in.i_width
+ - vout->p->fmt_in.i_visible_width
+ - vout->p->fmt_in.i_x_offset,
+ 20 + vout->p->fmt_in.i_y_offset,
start, stop);
}
static void ThreadChangeFilters(vout_thread_t *vout, const char *filters)
{
es_format_t fmt;
- es_format_Init(&fmt, VIDEO_ES, vout->fmt_render.i_chroma);
- fmt.video = vout->fmt_render;
+ es_format_Init(&fmt, VIDEO_ES, vout->p->fmt_render.i_chroma);
+ fmt.video = vout->p->fmt_render;
vlc_mutex_lock(&vout->p->vfilter_lock);
}
}
+static void ThreadChangeFullscreen(vout_thread_t *vout, bool fullscreen)
+{
+ /* FIXME not sure setting "fullscreen" is good ... */
+ var_SetBool(vout, "fullscreen", fullscreen);
+ vout_SetDisplayFullscreen(vout->p->display.vd, fullscreen);
+}
+
+static void ThreadChangeOnTop(vout_thread_t *vout, bool is_on_top)
+{
+ vout_SetWindowState(vout->p->display.vd,
+ is_on_top ? VOUT_WINDOW_STATE_ABOVE :
+ VOUT_WINDOW_STATE_NORMAL);
+}
+
+static void ThreadChangeDisplayFilled(vout_thread_t *vout, bool is_filled)
+{
+ vout_SetDisplayFilled(vout->p->display.vd, is_filled);
+}
+
+static void ThreadChangeZoom(vout_thread_t *vout, int num, int den)
+{
+ if (num * 10 < den) {
+ num = den;
+ den *= 10;
+ } else if (num > den * 10) {
+ num = den * 10;
+ }
+
+ vout_SetDisplayZoom(vout->p->display.vd, num, den);
+}
+
+static void ThreadClean(vout_thread_t *vout)
+{
+ /* Destroy translation tables */
+ if (!vout->p->b_error) {
+ ThreadFlush(vout, true, INT64_MAX);
+ vout_EndWrapper(vout);
+ }
+}
/*****************************************************************************
* Thread: video output thread
*/
while (!vout_control_Pop(&vout->p->control, &cmd, deadline, 100000)) {
/* TODO remove the lock when possible (ie when
- * vout->fmt_* are not protected by it anymore) */
+ * vout->p->fmt_* are not protected by it anymore) */
vlc_mutex_lock(&vout->p->change_lock);
switch(cmd.type) {
case VOUT_CONTROL_OSD_TITLE:
case VOUT_CONTROL_STEP:
ThreadStep(vout, cmd.u.time_ptr);
break;
+ case VOUT_CONTROL_FULLSCREEN:
+ ThreadChangeFullscreen(vout, cmd.u.boolean);
+ break;
+ case VOUT_CONTROL_ON_TOP:
+ ThreadChangeOnTop(vout, cmd.u.boolean);
+ break;
+ case VOUT_CONTROL_DISPLAY_FILLED:
+ ThreadChangeDisplayFilled(vout, cmd.u.boolean);
+ break;
+ case VOUT_CONTROL_ZOOM:
+ ThreadChangeZoom(vout, cmd.u.pair.a, cmd.u.pair.b);
+ break;
default:
break;
}
return VLC_EGENERIC;
}
- var_SetBool( p_vout, "intf-change", true );
-
/* Modify input as well because the vout might have to be restarted */
var_Create( p_input, "vout-filter", VLC_VAR_STRING );
var_SetString( p_input, "vout-filter", newval.psz_string );