mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-17 11:45:25 +00:00
[573/906] add upload and download library objects
allows multiple upload pipelines that previously wasn't possible (i.e. upload RGB and I420 and ... on the same GstGLDisplay)
This commit is contained in:
parent
d163ecce23
commit
88cb7e3060
6 changed files with 2749 additions and 2364 deletions
File diff suppressed because it is too large
Load diff
|
@ -27,6 +27,8 @@
|
||||||
|
|
||||||
#include "gstglwindow.h"
|
#include "gstglwindow.h"
|
||||||
#include "gstglshader.h"
|
#include "gstglshader.h"
|
||||||
|
#include "gstglupload.h"
|
||||||
|
#include "gstgldownload.h"
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
@ -125,20 +127,10 @@ struct _GstGLDisplay
|
||||||
CDCB clientDrawCallback;
|
CDCB clientDrawCallback;
|
||||||
gpointer client_data;
|
gpointer client_data;
|
||||||
|
|
||||||
//upload
|
GstGLDisplayConversion colorspace_conversion;
|
||||||
GLuint upload_fbo;
|
|
||||||
GLuint upload_depth_buffer;
|
GHashTable *uploads;
|
||||||
GLuint upload_outtex;
|
GHashTable *downloads;
|
||||||
GLuint upload_intex;
|
|
||||||
GLuint upload_intex_u;
|
|
||||||
GLuint upload_intex_v;
|
|
||||||
GLuint upload_width;
|
|
||||||
GLuint upload_height;
|
|
||||||
GstVideoFormat upload_video_format;
|
|
||||||
GstGLDisplayConversion upload_colorspace_conversion;
|
|
||||||
gint upload_data_width;
|
|
||||||
gint upload_data_height;
|
|
||||||
GstVideoFrame *upload_frame;
|
|
||||||
|
|
||||||
//foreign gl context
|
//foreign gl context
|
||||||
gulong external_gl_context;
|
gulong external_gl_context;
|
||||||
|
@ -171,21 +163,6 @@ struct _GstGLDisplay
|
||||||
GLuint del_fbo;
|
GLuint del_fbo;
|
||||||
GLuint del_depth_buffer;
|
GLuint del_depth_buffer;
|
||||||
|
|
||||||
//download
|
|
||||||
GLuint download_fbo;
|
|
||||||
GLuint download_depth_buffer;
|
|
||||||
GLuint download_texture;
|
|
||||||
GLuint download_texture_u;
|
|
||||||
GLuint download_texture_v;
|
|
||||||
gint download_width;
|
|
||||||
gint download_height;
|
|
||||||
GstVideoFormat download_video_format;
|
|
||||||
GstVideoFrame *download_frame;
|
|
||||||
GLenum multipleRT[3];
|
|
||||||
GLuint ouput_texture;
|
|
||||||
GLuint ouput_texture_width;
|
|
||||||
GLuint ouput_texture_height;
|
|
||||||
|
|
||||||
//action gen and del shader
|
//action gen and del shader
|
||||||
const gchar *gen_shader_fragment_source;
|
const gchar *gen_shader_fragment_source;
|
||||||
const gchar *gen_shader_vertex_source;
|
const gchar *gen_shader_vertex_source;
|
||||||
|
@ -209,25 +186,6 @@ struct _GstGLDisplay
|
||||||
GLint shader_upload_attr_texture_loc;
|
GLint shader_upload_attr_texture_loc;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//fragement shader download
|
|
||||||
gchar *text_shader_download_YUY2_UYVY;
|
|
||||||
GstGLShader *shader_download_YUY2;
|
|
||||||
GstGLShader *shader_download_UYVY;
|
|
||||||
|
|
||||||
gchar *text_shader_download_I420_YV12;
|
|
||||||
GstGLShader *shader_download_I420_YV12;
|
|
||||||
|
|
||||||
gchar *text_shader_download_AYUV;
|
|
||||||
GstGLShader *shader_download_AYUV;
|
|
||||||
|
|
||||||
#ifdef OPENGL_ES2
|
|
||||||
gchar *text_vertex_shader_download;
|
|
||||||
GLint shader_download_attr_position_loc;
|
|
||||||
GLint shader_download_attr_texture_loc;
|
|
||||||
gchar *text_fragment_shader_download_RGB;
|
|
||||||
GstGLShader *shader_download_RGB;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
gchar *error_message;
|
gchar *error_message;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -266,10 +224,6 @@ gboolean gst_gl_display_init_upload (GstGLDisplay * display,
|
||||||
gint video_width, gint video_height);
|
gint video_width, gint video_height);
|
||||||
gboolean gst_gl_display_do_upload (GstGLDisplay * display, GLuint texture,
|
gboolean gst_gl_display_do_upload (GstGLDisplay * display, GLuint texture,
|
||||||
GstVideoFrame * frame);
|
GstVideoFrame * frame);
|
||||||
gboolean gst_gl_display_init_download (GstGLDisplay * display,
|
|
||||||
GstVideoFormat video_format, gint width, gint height);
|
|
||||||
gboolean gst_gl_display_do_download (GstGLDisplay * display, GLuint texture,
|
|
||||||
GstVideoFrame *frame);
|
|
||||||
|
|
||||||
gboolean gst_gl_display_gen_fbo (GstGLDisplay * display, gint width, gint height,
|
gboolean gst_gl_display_gen_fbo (GstGLDisplay * display, gint width, gint height,
|
||||||
GLuint * fbo, GLuint * depthbuffer);
|
GLuint * fbo, GLuint * depthbuffer);
|
||||||
|
@ -301,6 +255,10 @@ void gst_gl_display_activate_gl_context (GstGLDisplay * display, gboolean activa
|
||||||
|
|
||||||
/* Must be called inside a lock/unlock on display, or within the glthread */
|
/* Must be called inside a lock/unlock on display, or within the glthread */
|
||||||
void gst_gl_display_set_error (GstGLDisplay * display, const char * format, ...);
|
void gst_gl_display_set_error (GstGLDisplay * display, const char * format, ...);
|
||||||
|
void gst_gl_display_check_framebuffer_status (void);
|
||||||
|
|
||||||
|
void gst_gl_display_lock (GstGLDisplay * display);
|
||||||
|
void gst_gl_display_unlock (GstGLDisplay * display);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
|
1136
gst-libs/gst/gl/gstgldownload.c
Normal file
1136
gst-libs/gst/gl/gstgldownload.c
Normal file
File diff suppressed because it is too large
Load diff
93
gst-libs/gst/gl/gstgldownload.h
Normal file
93
gst-libs/gst/gl/gstgldownload.h
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
/*
|
||||||
|
* GStreamer
|
||||||
|
* Copyright (C) 2012 Matthew Waters <ystree00@gmail.com>
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Library General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Library General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Library General Public
|
||||||
|
* License along with this library; if not, write to the
|
||||||
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
* Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __GST_GL_DOWNLOAD_H__
|
||||||
|
#define __GST_GL_DOWNLOAD_H__
|
||||||
|
|
||||||
|
#include <gst/video/video.h>
|
||||||
|
#include <gst/gstmemory.h>
|
||||||
|
|
||||||
|
#include "gstglshader.h"
|
||||||
|
#include "gstgldisplay.h"
|
||||||
|
|
||||||
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
/* forward declare */
|
||||||
|
typedef struct _GstGLMemory GstGLMemory;
|
||||||
|
typedef struct _GstGLDisplay GstGLDisplay;
|
||||||
|
|
||||||
|
GType gst_gl_download_get_type (void);
|
||||||
|
#define GST_TYPE_GL_DOWNLOAD (gst_gl_download_get_type())
|
||||||
|
#define GST_GL_DOWNLOAD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_GL_DOWNLOAD,GstGLDownload))
|
||||||
|
#define GST_GL_DOWNLOAD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_GL_DISPLAY,GstGLDownloadClass))
|
||||||
|
#define GST_IS_GL_DOWNLOAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_GL_DOWNLOAD))
|
||||||
|
#define GST_IS_GL_DOWNLOAD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_GL_DOWNLOAD))
|
||||||
|
#define GST_GL_DOWNLOAD_CAST(obj) ((GstGLDownload*)(obj))
|
||||||
|
|
||||||
|
typedef struct _GstGLDownload GstGLDownload;
|
||||||
|
typedef struct _GstGLDownloadClass GstGLDownloadClass;
|
||||||
|
|
||||||
|
struct _GstGLDownload
|
||||||
|
{
|
||||||
|
GObject parent;
|
||||||
|
|
||||||
|
GMutex lock;
|
||||||
|
|
||||||
|
GstGLDisplay *display;
|
||||||
|
|
||||||
|
gpointer data[GST_VIDEO_MAX_PLANES];
|
||||||
|
|
||||||
|
/* used for the conversion */
|
||||||
|
GLuint fbo;
|
||||||
|
GLuint depth_buffer;
|
||||||
|
GLuint in_texture;
|
||||||
|
GLuint out_texture[GST_VIDEO_MAX_PLANES];
|
||||||
|
GstGLShader *shader;
|
||||||
|
#ifdef OPENGL_ES2
|
||||||
|
GLint shader_attr_position_loc;
|
||||||
|
GLint shader_attr_texture_loc;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* output data */
|
||||||
|
GstVideoInfo info;
|
||||||
|
|
||||||
|
/* <private> */
|
||||||
|
gpointer _reserved[GST_PADDING];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _GstGLDownloadClass
|
||||||
|
{
|
||||||
|
GObjectClass object_class;
|
||||||
|
};
|
||||||
|
|
||||||
|
GstGLDownload * gst_gl_download_new (GstGLDisplay * display);
|
||||||
|
|
||||||
|
gboolean gst_gl_download_init_format (GstGLDownload * download, GstVideoFormat v_format,
|
||||||
|
guint width, guint height);
|
||||||
|
gboolean gst_gl_download_perform_with_memory (GstGLDownload * download, GstGLMemory * gl_mem);
|
||||||
|
gboolean gst_gl_download_perform_with_data (GstGLDownload * download, GLuint texture_id,
|
||||||
|
gpointer data[GST_VIDEO_MAX_PLANES]);
|
||||||
|
|
||||||
|
GstGLDownload * gst_gl_display_find_download (GstGLDisplay * display, GstVideoFormat v_format,
|
||||||
|
guint width, guint height);
|
||||||
|
|
||||||
|
G_END_DECLS
|
||||||
|
|
||||||
|
#endif /* __GST_GL_DOWNLOAD_H__ */
|
1365
gst-libs/gst/gl/gstglupload.c
Normal file
1365
gst-libs/gst/gl/gstglupload.c
Normal file
File diff suppressed because it is too large
Load diff
95
gst-libs/gst/gl/gstglupload.h
Normal file
95
gst-libs/gst/gl/gstglupload.h
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
/*
|
||||||
|
* GStreamer
|
||||||
|
* Copyright (C) 2012 Matthew Waters <ystree00@gmail.com>
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Library General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Library General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Library General Public
|
||||||
|
* License along with this library; if not, write to the
|
||||||
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
* Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __GST_GL_UPLOAD_H__
|
||||||
|
#define __GST_GL_UPLOAD_H__
|
||||||
|
|
||||||
|
#include <gst/video/video.h>
|
||||||
|
#include <gst/gstmemory.h>
|
||||||
|
|
||||||
|
#include "gstglshader.h"
|
||||||
|
#include "gstgldisplay.h"
|
||||||
|
|
||||||
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
/* forward declare */
|
||||||
|
typedef struct _GstGLMemory GstGLMemory;
|
||||||
|
typedef struct _GstGLDisplay GstGLDisplay;
|
||||||
|
|
||||||
|
GType gst_gl_upload_get_type (void);
|
||||||
|
#define GST_TYPE_GL_UPLOAD (gst_gl_upload_get_type())
|
||||||
|
#define GST_GL_UPLOAD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_GL_UPLOAD,GstGLUpload))
|
||||||
|
#define GST_GL_UPLOAD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_GL_DISPLAY,GstGLUploadClass))
|
||||||
|
#define GST_IS_GL_UPLOAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_GL_UPLOAD))
|
||||||
|
#define GST_IS_GL_UPLOAD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_GL_UPLOAD))
|
||||||
|
#define GST_GL_UPLOAD_CAST(obj) ((GstGLUpload*)(obj))
|
||||||
|
|
||||||
|
typedef struct _GstGLUpload GstGLUpload;
|
||||||
|
typedef struct _GstGLUploadClass GstGLUploadClass;
|
||||||
|
|
||||||
|
struct _GstGLUpload
|
||||||
|
{
|
||||||
|
GObject parent;
|
||||||
|
|
||||||
|
GMutex lock;
|
||||||
|
|
||||||
|
GstGLDisplay *display;
|
||||||
|
|
||||||
|
gpointer data[GST_VIDEO_MAX_PLANES];
|
||||||
|
gboolean initted;
|
||||||
|
|
||||||
|
/* used for the conversion */
|
||||||
|
GLuint fbo;
|
||||||
|
GLuint depth_buffer;
|
||||||
|
GLuint out_texture;
|
||||||
|
GLuint in_texture[GST_VIDEO_MAX_PLANES];
|
||||||
|
GstGLShader *shader;
|
||||||
|
#ifdef OPENGL_ES2
|
||||||
|
GLint shader_attr_position_loc;
|
||||||
|
GLint shader_attr_texture_loc;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* output data */
|
||||||
|
GstVideoInfo info;
|
||||||
|
|
||||||
|
/* <private> */
|
||||||
|
gpointer _reserved[GST_PADDING];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _GstGLUploadClass
|
||||||
|
{
|
||||||
|
GObjectClass object_class;
|
||||||
|
};
|
||||||
|
|
||||||
|
GstGLUpload * gst_gl_upload_new (GstGLDisplay * display);
|
||||||
|
|
||||||
|
gboolean gst_gl_upload_init_format (GstGLUpload * upload, GstVideoFormat v_format,
|
||||||
|
guint width, guint height);
|
||||||
|
|
||||||
|
gboolean gst_gl_upload_perform_with_memory (GstGLUpload * upload, GstGLMemory * gl_mem);
|
||||||
|
gboolean gst_gl_upload_perform_with_data (GstGLUpload * upload, GLuint texture_id,
|
||||||
|
gpointer data[GST_VIDEO_MAX_PLANES]);
|
||||||
|
|
||||||
|
GstGLUpload * gst_gl_display_find_upload (GstGLDisplay * display, GstVideoFormat v_format,
|
||||||
|
guint width, guint height);
|
||||||
|
|
||||||
|
G_END_DECLS
|
||||||
|
|
||||||
|
#endif /* __GST_GL_UPLOAD_H__ */
|
Loading…
Reference in a new issue