summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHyunjun Ko <zzoon@igalia.com>2016-08-02 17:21:20 +0900
committerMatthew Waters <matthew@centricular.com>2016-08-03 21:16:47 +1000
commit2bb3baa8c9677685215f8ff3d7204f43d750a472 (patch)
tree22c9031f508f83b140975214a7c3dd7eb82cb637
parenta46d4f3b57fad525e577dfe1bda91980b7ff6f62 (diff)
glupload: Use bufferpool to allocate new buffer in GLTextureUploadMeta
To improve performace of upload with GLTextureUploadMeta, use bufferpool instead of allocating new buffer every time. https://bugzilla.gnome.org/show_bug.cgi?id=769293
-rw-r--r--gst-libs/gst/gl/gstglupload.c41
1 files changed, 23 insertions, 18 deletions
diff --git a/gst-libs/gst/gl/gstglupload.c b/gst-libs/gst/gl/gstglupload.c
index e94195b92..58107c564 100644
--- a/gst-libs/gst/gl/gstglupload.c
+++ b/gst-libs/gst/gl/gstglupload.c
@@ -705,7 +705,7 @@ struct GLUploadMeta
gboolean result;
GstVideoGLTextureUploadMeta *meta;
guint texture_ids[GST_GL_UPLOAD_MAX_PLANES];
- GstGLVideoAllocationParams *params;
+ GstBufferPool *pool;
};
static gpointer
@@ -714,6 +714,7 @@ _upload_meta_upload_new (GstGLUpload * upload)
struct GLUploadMeta *meta = g_new0 (struct GLUploadMeta, 1);
meta->upload = upload;
+ meta->pool = gst_gl_buffer_pool_new (upload->context);
return meta;
}
@@ -766,6 +767,8 @@ _upload_meta_upload_accept (gpointer impl, GstBuffer * buffer,
GstCapsFeatures *features;
GstVideoGLTextureUploadMeta *meta;
gboolean ret = TRUE;
+ GstStructure *config;
+ gsize size;
features = gst_caps_get_features (in_caps, 0);
@@ -780,13 +783,18 @@ _upload_meta_upload_accept (gpointer impl, GstBuffer * buffer,
if (!ret)
return ret;
- if (upload->params)
- gst_gl_allocation_params_free ((GstGLAllocationParams *) upload->params);
- if (!(upload->params =
- gst_gl_video_allocation_params_new (upload->upload->context, NULL,
- &upload->upload->priv->in_info, -1, NULL,
- GST_GL_TEXTURE_TARGET_2D, 0)))
- return FALSE;
+ if (!gst_buffer_pool_is_active (upload->pool)) {
+ config = gst_buffer_pool_get_config (upload->pool);
+
+ size = upload->upload->priv->in_info.size;
+ gst_buffer_pool_config_set_params (config, in_caps, size, 0, 0);
+
+ if (!gst_buffer_pool_set_config (upload->pool, config)) {
+ GST_WARNING_OBJECT (upload->upload, "failed to set bufferpool config");
+ return FALSE;
+ }
+ gst_buffer_pool_set_active (upload->pool, TRUE);
+ }
if (buffer) {
if ((meta = gst_buffer_get_video_gl_texture_upload_meta (buffer)) == NULL)
@@ -861,9 +869,6 @@ _upload_meta_upload_perform (gpointer impl, GstBuffer * buffer,
int i;
GstVideoInfo *in_info = &upload->upload->priv->in_info;
guint max_planes = GST_VIDEO_INFO_N_PLANES (in_info);
- GstGLMemoryAllocator *allocator;
-
- allocator = gst_gl_memory_allocator_get_default (upload->upload->context);
/* Support stereo views for separated multiview mode */
if (GST_VIDEO_INFO_MULTIVIEW_MODE (in_info) ==
@@ -874,11 +879,11 @@ _upload_meta_upload_perform (gpointer impl, GstBuffer * buffer,
upload->meta = gst_buffer_get_video_gl_texture_upload_meta (buffer);
- /* FIXME: buffer pool */
- *outbuf = gst_buffer_new ();
- gst_gl_memory_setup_buffer (allocator, *outbuf, upload->params, NULL, NULL,
- 0);
- gst_object_unref (allocator);
+ if (gst_buffer_pool_acquire_buffer (upload->pool, outbuf,
+ NULL) != GST_FLOW_OK) {
+ GST_WARNING_OBJECT (upload, "failed to acquire buffer from bufferpool");
+ return GST_GL_UPLOAD_ERROR;
+ }
for (i = 0; i < GST_GL_UPLOAD_MAX_PLANES; i++) {
guint tex_id = 0;
@@ -914,8 +919,8 @@ _upload_meta_upload_free (gpointer impl)
g_return_if_fail (impl != NULL);
- if (upload->params)
- gst_gl_allocation_params_free ((GstGLAllocationParams *) upload->params);
+ if (upload->pool)
+ gst_object_unref (upload->pool);
g_free (upload);
}