]> git.sesse.net Git - vlc/blobdiff - src/video_output/video_output.c
Made vlc_memalign public.
[vlc] / src / video_output / video_output.c
index c7b248a44ea0a3eb6b1bfdf6e50657bf3c58c76e..362e9e31b9bbfb35a19809ceca94e44938df3dbe 100644 (file)
 
 #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
@@ -163,9 +163,9 @@ vout_thread_t *vout_Request( vlc_object_t *p_this, vout_thread_t *p_vout,
 
 #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 );
@@ -194,14 +194,14 @@ vout_thread_t *vout_Request( vlc_object_t *p_this, vout_thread_t *p_vout,
 #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 );
@@ -272,18 +272,17 @@ vout_thread_t * (vout_Create)( vlc_object_t *p_parent, video_format_t *p_fmt )
     }
 
     /* */
-    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;
@@ -513,6 +512,19 @@ void vout_Reset(vout_thread_t *vout)
     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);
@@ -560,6 +572,28 @@ spu_t *vout_GetSpu( vout_thread_t *p_vout )
     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
  *****************************************************************************
@@ -579,32 +613,16 @@ static int ThreadInit(vout_thread_t *vout)
 
     /* 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)
 {
@@ -725,7 +743,7 @@ static int ThreadDisplayPicture(vout_thread_t *vout,
             (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
@@ -735,8 +753,8 @@ static int ThreadDisplayPicture(vout_thread_t *vout,
                 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);
@@ -757,7 +775,7 @@ static int ThreadDisplayPicture(vout_thread_t *vout,
          * 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) {
@@ -838,21 +856,21 @@ static void ThreadDisplayOsdTitle(vout_thread_t *vout, const char *string)
                          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);
 
@@ -938,6 +956,45 @@ static void ThreadStep(vout_thread_t *vout, mtime_t *duration)
     }
 }
 
+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
@@ -992,7 +1049,7 @@ static void *Thread(void *object)
          */
         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:
@@ -1013,6 +1070,18 @@ static void *Thread(void *object)
             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;
             }
@@ -1077,8 +1146,6 @@ static int FilterCallback( vlc_object_t *p_this, char const *psz_cmd,
         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 );