]> git.sesse.net Git - vlc/blobdiff - modules/misc/dummy/vout.c
vod_rtsp: do not unpause stream on PAUSE request
[vlc] / modules / misc / dummy / vout.c
index 9bc06ab5ced892f9113b3d33b59655d5e9fca246..02c492264364535f7434b3fa061b397181f04a97 100644 (file)
 /*****************************************************************************
  * Local prototypes
  *****************************************************************************/
-static picture_t *Get(vout_display_t *);
-static void       Display(vout_display_t *, picture_t *);
-static int        Control(vout_display_t *, int, va_list);
-static void       Manage(vout_display_t *);
+struct vout_display_sys_t {
+    picture_pool_t *pool;
+};
+static picture_pool_t *Pool(vout_display_t *, unsigned count);
+static void            Display(vout_display_t *, picture_t *);
+static void            DisplayStat(vout_display_t *, picture_t *);
+static int             Control(vout_display_t *, int, va_list);
+static void            Manage (vout_display_t *);
 
 /*****************************************************************************
  * OpenVideo: activates dummy vout display method
  *****************************************************************************/
-int OpenVideo(vlc_object_t *object)
+static int OpenVideoCommon(vlc_object_t *object, bool display_stat)
 {
     vout_display_t *vd = (vout_display_t *)object;
+    vout_display_sys_t *sys;
+
+    vd->sys = sys = calloc(1, sizeof(*sys));
+    if (!sys)
+        return VLC_EGENERIC;
+    sys->pool = NULL;
 
     /* p_vd->info is not modified */
 
@@ -59,25 +69,59 @@ int OpenVideo(vlc_object_t *object)
         }
         free(chroma);
     }
-    vd->get = Get;
+    vd->pool    = Pool;
     vd->prepare = NULL;
-    vd->display = Display;
+    vd->display = display_stat ? DisplayStat : Display;
     vd->control = Control;
-    vd->manage = Manage;
+    vd->manage  = Manage;
 
     return VLC_SUCCESS;
 }
+int OpenVideo(vlc_object_t *object)
+{
+    return OpenVideoCommon(object, false);
+}
+int OpenVideoStat(vlc_object_t *object)
+{
+    return OpenVideoCommon(object, true);
+}
 
-static picture_t *Get(vout_display_t *vd)
+void CloseVideo(vlc_object_t *object)
 {
-    VLC_UNUSED(vd);
-    return picture_NewFromFormat(&vd->fmt);
+    vout_display_t *vd = (vout_display_t *)object;
+    vout_display_sys_t *sys = vd->sys;
+
+    if (sys->pool)
+        picture_pool_Delete(sys->pool);
+    free(sys);
+}
+
+static picture_pool_t *Pool(vout_display_t *vd, unsigned count)
+{
+    vout_display_sys_t *sys = vd->sys;
+    if (!sys->pool)
+        sys->pool = picture_pool_NewFromFormat(&vd->fmt, count);
+    return sys->pool;
 }
+
 static void Display(vout_display_t *vd, picture_t *picture)
 {
     VLC_UNUSED(vd);
     picture_Release(picture);
 }
+
+static void DisplayStat(vout_display_t *vd, picture_t *picture)
+{
+    VLC_UNUSED(vd);
+    if (vd->fmt.i_width*vd->fmt.i_height >= sizeof(mtime_t)) {
+        mtime_t date;
+        memcpy(&date, picture->p->p_pixels, sizeof(date));
+        msg_Dbg(vd, "VOUT got %"PRIu64" ms offset",
+                (mdate() - date) / 1000 );
+    }
+    picture_Release(picture);
+}
+
 static int Control(vout_display_t *vd, int query, va_list args)
 {
     VLC_UNUSED(vd);
@@ -85,6 +129,7 @@ static int Control(vout_display_t *vd, int query, va_list args)
     VLC_UNUSED(args);
     return VLC_SUCCESS;
 }
+
 static void Manage(vout_display_t *vd)
 {
     VLC_UNUSED(vd);