[vlc-devel] [PATCH 17/27] opengl: pass picture PTS to filters
Romain Vimont
rom1v at videolabs.io
Thu Jun 25 14:23:04 CEST 2020
The filters may depend on the PTS. Pass a metadata structure to their
draw() callback.
Co-authored-by: Alexandre Janniaux <ajanni at videolabs.io>
---
modules/video_output/opengl/filter.h | 9 ++++++++-
modules/video_output/opengl/filter_draw.c | 4 +++-
modules/video_output/opengl/filters.c | 16 ++++++++++++++--
modules/video_output/opengl/filters.h | 1 +
modules/video_output/opengl/renderer.c | 6 ++++--
5 files changed, 30 insertions(+), 6 deletions(-)
diff --git a/modules/video_output/opengl/filter.h b/modules/video_output/opengl/filter.h
index 94c9fc3320..88b4f572b0 100644
--- a/modules/video_output/opengl/filter.h
+++ b/modules/video_output/opengl/filter.h
@@ -22,6 +22,8 @@
#ifndef VLC_GL_FILTER_H
#define VLC_GL_FILTER_H
+#include <vlc_tick.h>
+
#include "sampler.h"
struct vlc_gl_filter;
@@ -31,6 +33,10 @@ struct vlc_gl_tex_size {
unsigned height;
};
+struct vlc_gl_input_meta {
+ vlc_tick_t pts;
+};
+
typedef int
vlc_gl_filter_open_fn(struct vlc_gl_filter *filter,
const config_chain_t *config,
@@ -40,7 +46,8 @@ struct vlc_gl_filter_ops {
/**
* Draw the result of the filter to the current framebuffer
*/
- int (*draw)(struct vlc_gl_filter *filter);
+ int (*draw)(struct vlc_gl_filter *filter,
+ const struct vlc_gl_input_meta *meta);
/**
* Free filter resources
diff --git a/modules/video_output/opengl/filter_draw.c b/modules/video_output/opengl/filter_draw.c
index d5b969e24b..885ae957b3 100644
--- a/modules/video_output/opengl/filter_draw.c
+++ b/modules/video_output/opengl/filter_draw.c
@@ -46,8 +46,10 @@ struct sys {
};
static int
-Draw(struct vlc_gl_filter *filter)
+Draw(struct vlc_gl_filter *filter, const struct vlc_gl_input_meta *meta)
{
+ (void) meta;
+
struct sys *sys = filter->sys;
const opengl_vtable_t *vt = &filter->api->vt;
diff --git a/modules/video_output/opengl/filters.c b/modules/video_output/opengl/filters.c
index 18beb06715..f1a793c096 100644
--- a/modules/video_output/opengl/filters.c
+++ b/modules/video_output/opengl/filters.c
@@ -50,6 +50,11 @@ struct vlc_gl_filters {
unsigned width;
unsigned height;
} viewport;
+
+ struct {
+ /** Last updated picture PTS */
+ vlc_tick_t pts;
+ } pic;
};
struct vlc_gl_filters *
@@ -66,6 +71,7 @@ vlc_gl_filters_New(struct vlc_gl_t *gl, const struct vlc_gl_api *api,
vlc_list_init(&filters->list);
memset(&filters->viewport, 0, sizeof(filters->viewport));
+ filters->pic.pts = 0;
return filters;
}
@@ -273,6 +279,8 @@ vlc_gl_filters_UpdatePicture(struct vlc_gl_filters *filters,
assert(first_filter);
+ filters->pic.pts = picture->date;
+
return vlc_gl_sampler_UpdatePicture(first_filter->sampler, picture);
}
@@ -285,6 +293,10 @@ vlc_gl_filters_Draw(struct vlc_gl_filters *filters)
vt->GetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &value);
GLuint draw_framebuffer = value; /* as GLuint */
+ struct vlc_gl_input_meta meta = {
+ .pts = filters->pic.pts,
+ };
+
struct vlc_gl_filter_priv *priv;
vlc_list_foreach(priv, &filters->list, node)
{
@@ -320,7 +332,7 @@ vlc_gl_filters_Draw(struct vlc_gl_filters *filters)
vt->Viewport(0, 0, priv->size_out.width, priv->size_out.height);
struct vlc_gl_filter *filter = &priv->filter;
- int ret = filter->ops->draw(filter);
+ int ret = filter->ops->draw(filter, &meta);
if (ret != VLC_SUCCESS)
return ret;
@@ -333,7 +345,7 @@ vlc_gl_filters_Draw(struct vlc_gl_filters *filters)
vt->BindFramebuffer(GL_DRAW_FRAMEBUFFER, draw_fb);
struct vlc_gl_filter *subfilter = &subfilter_priv->filter;
- ret = subfilter->ops->draw(subfilter);
+ ret = subfilter->ops->draw(subfilter, &meta);
if (ret != VLC_SUCCESS)
return ret;
}
diff --git a/modules/video_output/opengl/filters.h b/modules/video_output/opengl/filters.h
index 3541bf0076..c7b8ec3942 100644
--- a/modules/video_output/opengl/filters.h
+++ b/modules/video_output/opengl/filters.h
@@ -25,6 +25,7 @@
#include <vlc_common.h>
#include <vlc_list.h>
#include <vlc_opengl.h>
+#include <vlc_tick.h>
#include "filter.h"
#include "gl_api.h"
diff --git a/modules/video_output/opengl/renderer.c b/modules/video_output/opengl/renderer.c
index 10b79e7742..74bafcd6ef 100644
--- a/modules/video_output/opengl/renderer.c
+++ b/modules/video_output/opengl/renderer.c
@@ -328,7 +328,7 @@ Close(struct vlc_gl_filter *filter)
static int SetupCoords(struct vlc_gl_renderer *renderer);
static int
-Draw(struct vlc_gl_filter *filter);
+Draw(struct vlc_gl_filter *filter, const struct vlc_gl_input_meta *meta);
int
vlc_gl_renderer_Open(struct vlc_gl_filter *filter,
@@ -756,8 +756,10 @@ static int SetupCoords(struct vlc_gl_renderer *renderer)
}
static int
-Draw(struct vlc_gl_filter *filter)
+Draw(struct vlc_gl_filter *filter, const struct vlc_gl_input_meta *meta)
{
+ (void) meta;
+
struct vlc_gl_renderer *renderer = filter->sys;
const opengl_vtable_t *vt = renderer->vt;
--
2.27.0
More information about the vlc-devel
mailing list