Rémi Denis-Courmont
2018-12-09 19:46:01 UTC
vlc | branch: master | Rémi Denis-Courmont <***@remlab.net> | Sun Dec 9 16:35:38 2018 +0200| [a202b0391ea2ad43ebb6d2b196adc731007b7a0a] | committer: Rémi Denis-Courmont
vout: privatize vout_snapshot_t
src/video_output/snapshot.c | 39 +++++++++++++++++++++++++++++++++++----
src/video_output/snapshot.h | 14 +++-----------
src/video_output/video_output.c | 13 +++++++------
src/video_output/vout_internal.h | 5 +++--
src/video_output/vout_intf.c | 1 +
5 files changed, 49 insertions(+), 23 deletions(-)
diff --git a/src/video_output/snapshot.c b/src/video_output/snapshot.c
index 8d32ddad95..5dfde71261 100644
--- a/src/video_output/snapshot.c
+++ b/src/video_output/snapshot.c
@@ -41,18 +41,36 @@
#include "snapshot.h"
#include "vout_internal.h"
-/* */
-void vout_snapshot_Init(vout_snapshot_t *snap)
+struct vout_snapshot {
+ vlc_mutex_t lock;
+ vlc_cond_t wait;
+
+ bool is_available;
+ int request_count;
+ picture_t *picture;
+
+};
+
+vout_snapshot_t *vout_snapshot_New(void)
{
+ vout_snapshot_t *snap = malloc(sizeof (*snap));
+ if (unlikely(snap == NULL))
+ return NULL;
+
vlc_mutex_init(&snap->lock);
vlc_cond_init(&snap->wait);
snap->is_available = true;
snap->request_count = 0;
snap->picture = NULL;
+ return snap;
}
-void vout_snapshot_Clean(vout_snapshot_t *snap)
+
+void vout_snapshot_Destroy(vout_snapshot_t *snap)
{
+ if (snap == NULL)
+ return;
+
picture_t *picture = snap->picture;
while (picture) {
picture_t *next = picture->p_next;
@@ -62,10 +80,14 @@ void vout_snapshot_Clean(vout_snapshot_t *snap)
vlc_cond_destroy(&snap->wait);
vlc_mutex_destroy(&snap->lock);
+ free(snap);
}
void vout_snapshot_End(vout_snapshot_t *snap)
{
+ if (snap == NULL)
+ return;
+
vlc_mutex_lock(&snap->lock);
snap->is_available = false;
@@ -77,6 +99,9 @@ void vout_snapshot_End(vout_snapshot_t *snap)
/* */
picture_t *vout_snapshot_Get(vout_snapshot_t *snap, vlc_tick_t timeout)
{
+ if (snap == NULL)
+ return NULL;
+
const vlc_tick_t deadline = vlc_tick_now() + timeout;
vlc_mutex_lock(&snap->lock);
@@ -100,9 +125,11 @@ picture_t *vout_snapshot_Get(vout_snapshot_t *snap, vlc_tick_t timeout)
return picture;
}
-/* */
bool vout_snapshot_IsRequested(vout_snapshot_t *snap)
{
+ if (snap == NULL)
+ return false;
+
bool has_request = false;
if (!vlc_mutex_trylock(&snap->lock)) {
has_request = snap->request_count > 0;
@@ -110,10 +137,14 @@ bool vout_snapshot_IsRequested(vout_snapshot_t *snap)
}
return has_request;
}
+
void vout_snapshot_Set(vout_snapshot_t *snap,
const video_format_t *fmt,
picture_t *picture)
{
+ if (snap == NULL)
+ return;
+
if (!fmt)
fmt = &picture->format;
diff --git a/src/video_output/snapshot.h b/src/video_output/snapshot.h
index 9b928d6cf0..cc16b7f29b 100644
--- a/src/video_output/snapshot.h
+++ b/src/video_output/snapshot.h
@@ -26,19 +26,11 @@
#include <vlc_picture.h>
-typedef struct {
- vlc_mutex_t lock;
- vlc_cond_t wait;
-
- bool is_available;
- int request_count;
- picture_t *picture;
-
-} vout_snapshot_t;
+typedef struct vout_snapshot vout_snapshot_t;
/* */
-void vout_snapshot_Init(vout_snapshot_t *);
-void vout_snapshot_Clean(vout_snapshot_t *);
+vout_snapshot_t *vout_snapshot_New(void);
+void vout_snapshot_Destroy(vout_snapshot_t *);
void vout_snapshot_End(vout_snapshot_t *);
diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
index d00a7e2b71..2216bf78b8 100644
--- a/src/video_output/video_output.c
+++ b/src/video_output/video_output.c
@@ -52,6 +52,7 @@
#include "vout_internal.h"
#include "interlacing.h"
#include "display.h"
+#include "snapshot.h"
#include "window.h"
#include "../misc/variables.h"
@@ -144,7 +145,7 @@ static vout_thread_t *VoutCreate(vlc_object_t *object,
vout_control_Init(&vout->p->control);
vout_statistic_Init(&vout->p->statistic);
- vout_snapshot_Init(&vout->p->snapshot);
+ vout->p->snapshot = vout_snapshot_New();
vout_chrono_Init(&vout->p->render, 5, VLC_TICK_FROM_MS(10)); /* Arbitrary initial time */
/* Initialize locks */
@@ -270,7 +271,7 @@ void vout_Close(vout_thread_t *vout)
if (vout->p->input)
spu_Detach(vout->p->spu);
- vout_snapshot_End(&vout->p->snapshot);
+ vout_snapshot_End(vout->p->snapshot);
vout_control_PushVoid(&vout->p->control, VOUT_CONTROL_CLEAN);
vlc_join(vout->p->thread, NULL);
@@ -310,7 +311,7 @@ static void VoutDestructor(vlc_object_t *object)
vout_statistic_Clean(&vout->p->statistic);
/* */
- vout_snapshot_Clean(&vout->p->snapshot);
+ vout_snapshot_Destroy(vout->p->snapshot);
video_format_Clean(&vout->p->original);
}
@@ -469,7 +470,7 @@ int vout_GetSnapshot(vout_thread_t *vout,
video_format_t *fmt,
const char *type, vlc_tick_t timeout)
{
- picture_t *picture = vout_snapshot_Get(&vout->p->snapshot, timeout);
+ picture_t *picture = vout_snapshot_Get(vout->p->snapshot, timeout);
if (!picture) {
msg_Err(vout, "Failed to grab a snapshot");
return VLC_EGENERIC;
@@ -1042,7 +1043,7 @@ static int ThreadDisplayRenderPicture(vout_thread_t *vout, bool is_forced)
/*
* Get the subpicture to be displayed
*/
- const bool do_snapshot = vout_snapshot_IsRequested(&sys->snapshot);
+ const bool do_snapshot = vout_snapshot_IsRequested(sys->snapshot);
vlc_tick_t render_subtitle_date;
if (sys->pause.is_on)
render_subtitle_date = sys->pause.date;
@@ -1182,7 +1183,7 @@ static int ThreadDisplayRenderPicture(vout_thread_t *vout, bool is_forced)
if (do_snapshot)
{
assert(snap_pic);
- vout_snapshot_Set(&sys->snapshot, &vd->source, snap_pic);
+ vout_snapshot_Set(sys->snapshot, &vd->source, snap_pic);
if (snap_pic != todisplay)
picture_Release(snap_pic);
}
diff --git a/src/video_output/vout_internal.h b/src/video_output/vout_internal.h
index b5b11c40f8..41f3e76484 100644
--- a/src/video_output/vout_internal.h
+++ b/src/video_output/vout_internal.h
@@ -29,7 +29,6 @@
#include <vlc_picture_pool.h>
#include <vlc_vout_display.h>
#include "vout_wrapper.h"
-#include "snapshot.h"
#include "statistic.h"
#include "chrono.h"
@@ -53,6 +52,8 @@ typedef struct {
} vout_configuration_t;
#include "control.h"
+struct vout_snapshot;
+
/* */
struct vout_thread_sys_t
{
@@ -67,7 +68,7 @@ struct vout_thread_sys_t
unsigned dpb_size;
/* Snapshot interface */
- vout_snapshot_t snapshot;
+ struct vout_snapshot *snapshot;
/* Statistics */
vout_statistic_t statistic;
diff --git a/src/video_output/vout_intf.c b/src/video_output/vout_intf.c
index e059030f8a..d41dff7063 100644
--- a/src/video_output/vout_intf.c
+++ b/src/video_output/vout_intf.c
@@ -42,6 +42,7 @@
#include <vlc_strings.h>
#include <vlc_charset.h>
#include "vout_internal.h"
+#include "snapshot.h"
/*****************************************************************************
* Local prototypes
vout: privatize vout_snapshot_t
http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=a202b0391ea2ad43ebb6d2b196adc731007b7a0a
---src/video_output/snapshot.c | 39 +++++++++++++++++++++++++++++++++++----
src/video_output/snapshot.h | 14 +++-----------
src/video_output/video_output.c | 13 +++++++------
src/video_output/vout_internal.h | 5 +++--
src/video_output/vout_intf.c | 1 +
5 files changed, 49 insertions(+), 23 deletions(-)
diff --git a/src/video_output/snapshot.c b/src/video_output/snapshot.c
index 8d32ddad95..5dfde71261 100644
--- a/src/video_output/snapshot.c
+++ b/src/video_output/snapshot.c
@@ -41,18 +41,36 @@
#include "snapshot.h"
#include "vout_internal.h"
-/* */
-void vout_snapshot_Init(vout_snapshot_t *snap)
+struct vout_snapshot {
+ vlc_mutex_t lock;
+ vlc_cond_t wait;
+
+ bool is_available;
+ int request_count;
+ picture_t *picture;
+
+};
+
+vout_snapshot_t *vout_snapshot_New(void)
{
+ vout_snapshot_t *snap = malloc(sizeof (*snap));
+ if (unlikely(snap == NULL))
+ return NULL;
+
vlc_mutex_init(&snap->lock);
vlc_cond_init(&snap->wait);
snap->is_available = true;
snap->request_count = 0;
snap->picture = NULL;
+ return snap;
}
-void vout_snapshot_Clean(vout_snapshot_t *snap)
+
+void vout_snapshot_Destroy(vout_snapshot_t *snap)
{
+ if (snap == NULL)
+ return;
+
picture_t *picture = snap->picture;
while (picture) {
picture_t *next = picture->p_next;
@@ -62,10 +80,14 @@ void vout_snapshot_Clean(vout_snapshot_t *snap)
vlc_cond_destroy(&snap->wait);
vlc_mutex_destroy(&snap->lock);
+ free(snap);
}
void vout_snapshot_End(vout_snapshot_t *snap)
{
+ if (snap == NULL)
+ return;
+
vlc_mutex_lock(&snap->lock);
snap->is_available = false;
@@ -77,6 +99,9 @@ void vout_snapshot_End(vout_snapshot_t *snap)
/* */
picture_t *vout_snapshot_Get(vout_snapshot_t *snap, vlc_tick_t timeout)
{
+ if (snap == NULL)
+ return NULL;
+
const vlc_tick_t deadline = vlc_tick_now() + timeout;
vlc_mutex_lock(&snap->lock);
@@ -100,9 +125,11 @@ picture_t *vout_snapshot_Get(vout_snapshot_t *snap, vlc_tick_t timeout)
return picture;
}
-/* */
bool vout_snapshot_IsRequested(vout_snapshot_t *snap)
{
+ if (snap == NULL)
+ return false;
+
bool has_request = false;
if (!vlc_mutex_trylock(&snap->lock)) {
has_request = snap->request_count > 0;
@@ -110,10 +137,14 @@ bool vout_snapshot_IsRequested(vout_snapshot_t *snap)
}
return has_request;
}
+
void vout_snapshot_Set(vout_snapshot_t *snap,
const video_format_t *fmt,
picture_t *picture)
{
+ if (snap == NULL)
+ return;
+
if (!fmt)
fmt = &picture->format;
diff --git a/src/video_output/snapshot.h b/src/video_output/snapshot.h
index 9b928d6cf0..cc16b7f29b 100644
--- a/src/video_output/snapshot.h
+++ b/src/video_output/snapshot.h
@@ -26,19 +26,11 @@
#include <vlc_picture.h>
-typedef struct {
- vlc_mutex_t lock;
- vlc_cond_t wait;
-
- bool is_available;
- int request_count;
- picture_t *picture;
-
-} vout_snapshot_t;
+typedef struct vout_snapshot vout_snapshot_t;
/* */
-void vout_snapshot_Init(vout_snapshot_t *);
-void vout_snapshot_Clean(vout_snapshot_t *);
+vout_snapshot_t *vout_snapshot_New(void);
+void vout_snapshot_Destroy(vout_snapshot_t *);
void vout_snapshot_End(vout_snapshot_t *);
diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
index d00a7e2b71..2216bf78b8 100644
--- a/src/video_output/video_output.c
+++ b/src/video_output/video_output.c
@@ -52,6 +52,7 @@
#include "vout_internal.h"
#include "interlacing.h"
#include "display.h"
+#include "snapshot.h"
#include "window.h"
#include "../misc/variables.h"
@@ -144,7 +145,7 @@ static vout_thread_t *VoutCreate(vlc_object_t *object,
vout_control_Init(&vout->p->control);
vout_statistic_Init(&vout->p->statistic);
- vout_snapshot_Init(&vout->p->snapshot);
+ vout->p->snapshot = vout_snapshot_New();
vout_chrono_Init(&vout->p->render, 5, VLC_TICK_FROM_MS(10)); /* Arbitrary initial time */
/* Initialize locks */
@@ -270,7 +271,7 @@ void vout_Close(vout_thread_t *vout)
if (vout->p->input)
spu_Detach(vout->p->spu);
- vout_snapshot_End(&vout->p->snapshot);
+ vout_snapshot_End(vout->p->snapshot);
vout_control_PushVoid(&vout->p->control, VOUT_CONTROL_CLEAN);
vlc_join(vout->p->thread, NULL);
@@ -310,7 +311,7 @@ static void VoutDestructor(vlc_object_t *object)
vout_statistic_Clean(&vout->p->statistic);
/* */
- vout_snapshot_Clean(&vout->p->snapshot);
+ vout_snapshot_Destroy(vout->p->snapshot);
video_format_Clean(&vout->p->original);
}
@@ -469,7 +470,7 @@ int vout_GetSnapshot(vout_thread_t *vout,
video_format_t *fmt,
const char *type, vlc_tick_t timeout)
{
- picture_t *picture = vout_snapshot_Get(&vout->p->snapshot, timeout);
+ picture_t *picture = vout_snapshot_Get(vout->p->snapshot, timeout);
if (!picture) {
msg_Err(vout, "Failed to grab a snapshot");
return VLC_EGENERIC;
@@ -1042,7 +1043,7 @@ static int ThreadDisplayRenderPicture(vout_thread_t *vout, bool is_forced)
/*
* Get the subpicture to be displayed
*/
- const bool do_snapshot = vout_snapshot_IsRequested(&sys->snapshot);
+ const bool do_snapshot = vout_snapshot_IsRequested(sys->snapshot);
vlc_tick_t render_subtitle_date;
if (sys->pause.is_on)
render_subtitle_date = sys->pause.date;
@@ -1182,7 +1183,7 @@ static int ThreadDisplayRenderPicture(vout_thread_t *vout, bool is_forced)
if (do_snapshot)
{
assert(snap_pic);
- vout_snapshot_Set(&sys->snapshot, &vd->source, snap_pic);
+ vout_snapshot_Set(sys->snapshot, &vd->source, snap_pic);
if (snap_pic != todisplay)
picture_Release(snap_pic);
}
diff --git a/src/video_output/vout_internal.h b/src/video_output/vout_internal.h
index b5b11c40f8..41f3e76484 100644
--- a/src/video_output/vout_internal.h
+++ b/src/video_output/vout_internal.h
@@ -29,7 +29,6 @@
#include <vlc_picture_pool.h>
#include <vlc_vout_display.h>
#include "vout_wrapper.h"
-#include "snapshot.h"
#include "statistic.h"
#include "chrono.h"
@@ -53,6 +52,8 @@ typedef struct {
} vout_configuration_t;
#include "control.h"
+struct vout_snapshot;
+
/* */
struct vout_thread_sys_t
{
@@ -67,7 +68,7 @@ struct vout_thread_sys_t
unsigned dpb_size;
/* Snapshot interface */
- vout_snapshot_t snapshot;
+ struct vout_snapshot *snapshot;
/* Statistics */
vout_statistic_t statistic;
diff --git a/src/video_output/vout_intf.c b/src/video_output/vout_intf.c
index e059030f8a..d41dff7063 100644
--- a/src/video_output/vout_intf.c
+++ b/src/video_output/vout_intf.c
@@ -42,6 +42,7 @@
#include <vlc_strings.h>
#include <vlc_charset.h>
#include "vout_internal.h"
+#include "snapshot.h"
/*****************************************************************************
* Local prototypes