mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-28 04:31:06 +00:00
glmemory: use GstVideoInfo everywhere
Simplifies a lot of the calling code https://bugzilla.gnome.org/show_bug.cgi?id=733717
This commit is contained in:
parent
bd3cefeecc
commit
89636392fa
6 changed files with 137 additions and 106 deletions
|
@ -1204,21 +1204,30 @@ _do_convert (GstGLContext * context, GstGLColorConvert * convert)
|
||||||
for (j = 0; j < c_info->out_n_textures; j++) {
|
for (j = 0; j < c_info->out_n_textures; j++) {
|
||||||
GstGLMemory *out_tex =
|
GstGLMemory *out_tex =
|
||||||
(GstGLMemory *) gst_buffer_peek_memory (convert->outbuf, j);
|
(GstGLMemory *) gst_buffer_peek_memory (convert->outbuf, j);
|
||||||
|
gint mem_width, mem_height;
|
||||||
|
|
||||||
if (!gst_is_gl_memory ((GstMemory *) out_tex)) {
|
if (!gst_is_gl_memory ((GstMemory *) out_tex)) {
|
||||||
res = FALSE;
|
res = FALSE;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mem_width = gst_gl_memory_get_texture_width (out_tex);
|
||||||
|
mem_height = gst_gl_memory_get_texture_height (out_tex);
|
||||||
|
|
||||||
if (out_tex->tex_type == GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE
|
if (out_tex->tex_type == GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE
|
||||||
|| out_tex->tex_type == GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE_ALPHA
|
|| out_tex->tex_type == GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE_ALPHA
|
||||||
|| out_width != out_tex->width || out_height != out_tex->height) {
|
|| out_width != mem_width || out_height != mem_height) {
|
||||||
/* Luminance formats are not color renderable */
|
/* Luminance formats are not color renderable */
|
||||||
/* renderering to a framebuffer only renders the intersection of all
|
/* renderering to a framebuffer only renders the intersection of all
|
||||||
* the attachments i.e. the smallest attachment size */
|
* the attachments i.e. the smallest attachment size */
|
||||||
|
GstVideoInfo temp_info;
|
||||||
|
|
||||||
|
gst_video_info_set_format (&temp_info, GST_VIDEO_FORMAT_RGBA, out_width,
|
||||||
|
out_height);
|
||||||
|
|
||||||
if (!convert->priv->out_tex[j])
|
if (!convert->priv->out_tex[j])
|
||||||
convert->priv->out_tex[j] =
|
convert->priv->out_tex[j] =
|
||||||
(GstGLMemory *) gst_gl_memory_alloc (context,
|
(GstGLMemory *) gst_gl_memory_alloc (context, &temp_info, 0);
|
||||||
GST_VIDEO_GL_TEXTURE_TYPE_RGBA, out_width, out_height, out_width);
|
|
||||||
} else {
|
} else {
|
||||||
convert->priv->out_tex[j] = out_tex;
|
convert->priv->out_tex[j] = out_tex;
|
||||||
}
|
}
|
||||||
|
@ -1244,11 +1253,16 @@ out:
|
||||||
for (j--; j >= 0; j--) {
|
for (j--; j >= 0; j--) {
|
||||||
GstGLMemory *out_tex =
|
GstGLMemory *out_tex =
|
||||||
(GstGLMemory *) gst_buffer_peek_memory (convert->outbuf, j);
|
(GstGLMemory *) gst_buffer_peek_memory (convert->outbuf, j);
|
||||||
|
gint mem_width, mem_height;
|
||||||
|
|
||||||
gst_memory_unmap ((GstMemory *) convert->priv->out_tex[j], &out_info[j]);
|
gst_memory_unmap ((GstMemory *) convert->priv->out_tex[j], &out_info[j]);
|
||||||
|
|
||||||
|
mem_width = gst_gl_memory_get_texture_width (out_tex);
|
||||||
|
mem_height = gst_gl_memory_get_texture_height (out_tex);
|
||||||
|
|
||||||
if (out_tex->tex_type == GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE
|
if (out_tex->tex_type == GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE
|
||||||
|| out_tex->tex_type == GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE_ALPHA
|
|| out_tex->tex_type == GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE_ALPHA
|
||||||
|| out_width != out_tex->width || out_height != out_tex->height) {
|
|| out_width != mem_width || out_height != mem_height) {
|
||||||
GstMapInfo to_info, from_info;
|
GstMapInfo to_info, from_info;
|
||||||
|
|
||||||
if (!gst_memory_map ((GstMemory *) convert->priv->out_tex[j], &from_info,
|
if (!gst_memory_map ((GstMemory *) convert->priv->out_tex[j], &from_info,
|
||||||
|
@ -1266,8 +1280,8 @@ out:
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
gst_gl_memory_copy_into_texture (convert->priv->out_tex[j],
|
gst_gl_memory_copy_into_texture (convert->priv->out_tex[j],
|
||||||
out_tex->tex_id, out_tex->tex_type, out_tex->width, out_tex->height,
|
out_tex->tex_id, out_tex->tex_type, mem_width, mem_height,
|
||||||
out_tex->stride, FALSE);
|
GST_VIDEO_INFO_PLANE_STRIDE (&out_tex->info, out_tex->plane), FALSE);
|
||||||
gst_memory_unmap ((GstMemory *) convert->priv->out_tex[j], &from_info);
|
gst_memory_unmap ((GstMemory *) convert->priv->out_tex[j], &from_info);
|
||||||
gst_memory_unmap ((GstMemory *) out_tex, &to_info);
|
gst_memory_unmap ((GstMemory *) out_tex, &to_info);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -223,11 +223,17 @@ _gst_gl_download_perform_with_data_unlocked (GstGLDownload * download,
|
||||||
g_return_val_if_fail (data[i] != NULL, FALSE);
|
g_return_val_if_fail (data[i] != NULL, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!download->priv->in_tex[0])
|
if (!download->priv->in_tex[0]) {
|
||||||
|
GstVideoInfo temp_info;
|
||||||
|
|
||||||
|
gst_video_info_set_format (&temp_info, GST_VIDEO_FORMAT_RGBA,
|
||||||
|
GST_VIDEO_INFO_WIDTH (&download->info),
|
||||||
|
GST_VIDEO_INFO_HEIGHT (&download->info));
|
||||||
|
|
||||||
download->priv->in_tex[0] =
|
download->priv->in_tex[0] =
|
||||||
gst_gl_memory_wrapped_texture (download->context, texture_id,
|
gst_gl_memory_wrapped_texture (download->context, texture_id,
|
||||||
GST_VIDEO_GL_TEXTURE_TYPE_RGBA, GST_VIDEO_INFO_WIDTH (&download->info),
|
&temp_info, 0, NULL, NULL);
|
||||||
GST_VIDEO_INFO_HEIGHT (&download->info), NULL, NULL);
|
}
|
||||||
|
|
||||||
download->priv->in_tex[0]->tex_id = texture_id;
|
download->priv->in_tex[0]->tex_id = texture_id;
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,10 @@
|
||||||
#define USING_GLES2(context) (gst_gl_context_check_gl_version (context, GST_GL_API_GLES2, 2, 0))
|
#define USING_GLES2(context) (gst_gl_context_check_gl_version (context, GST_GL_API_GLES2, 2, 0))
|
||||||
#define USING_GLES3(context) (gst_gl_context_check_gl_version (context, GST_GL_API_GLES2, 3, 0))
|
#define USING_GLES3(context) (gst_gl_context_check_gl_version (context, GST_GL_API_GLES2, 3, 0))
|
||||||
|
|
||||||
|
#define GL_MEM_WIDTH(gl_mem) _get_plane_width (&gl_mem->info, gl_mem->plane)
|
||||||
|
#define GL_MEM_HEIGHT(gl_mem) _get_plane_height (&gl_mem->info, gl_mem->plane)
|
||||||
|
#define GL_MEM_STRIDE(gl_mem) GST_VIDEO_INFO_PLANE_STRIDE (&gl_mem->info, gl_mem->plane)
|
||||||
|
|
||||||
GST_DEBUG_CATEGORY_STATIC (GST_CAT_GL_MEMORY);
|
GST_DEBUG_CATEGORY_STATIC (GST_CAT_GL_MEMORY);
|
||||||
#define GST_CAT_DEFUALT GST_CAT_GL_MEMORY
|
#define GST_CAT_DEFUALT GST_CAT_GL_MEMORY
|
||||||
|
|
||||||
|
@ -400,11 +404,11 @@ _upload_memory (GstGLContext * context, GstGLMemory * gl_mem)
|
||||||
}
|
}
|
||||||
|
|
||||||
GST_CAT_LOG (GST_CAT_GL_MEMORY, "upload for texture id:%u, %ux%u",
|
GST_CAT_LOG (GST_CAT_GL_MEMORY, "upload for texture id:%u, %ux%u",
|
||||||
gl_mem->tex_id, gl_mem->width, gl_mem->height);
|
gl_mem->tex_id, gl_mem->tex_width, GL_MEM_HEIGHT (gl_mem));
|
||||||
|
|
||||||
gl->BindTexture (GL_TEXTURE_2D, gl_mem->tex_id);
|
gl->BindTexture (GL_TEXTURE_2D, gl_mem->tex_id);
|
||||||
gl->TexSubImage2D (GL_TEXTURE_2D, 0, 0, 0, gl_mem->width, gl_mem->height,
|
gl->TexSubImage2D (GL_TEXTURE_2D, 0, 0, 0, gl_mem->tex_width,
|
||||||
gl_format, gl_type, gl_mem->data);
|
GL_MEM_HEIGHT (gl_mem), gl_format, gl_type, gl_mem->data);
|
||||||
|
|
||||||
/* Reset to default values */
|
/* Reset to default values */
|
||||||
if (USING_OPENGL (context) || USING_GLES3 (context)) {
|
if (USING_OPENGL (context) || USING_GLES3 (context)) {
|
||||||
|
@ -426,6 +430,7 @@ _calculate_unpack_length (GstGLMemory * gl_mem)
|
||||||
gl_mem->tex_scaling[0] = 1.0f;
|
gl_mem->tex_scaling[0] = 1.0f;
|
||||||
gl_mem->tex_scaling[1] = 1.0f;
|
gl_mem->tex_scaling[1] = 1.0f;
|
||||||
gl_mem->unpack_length = 1;
|
gl_mem->unpack_length = 1;
|
||||||
|
gl_mem->tex_width = GL_MEM_WIDTH (gl_mem);
|
||||||
|
|
||||||
n_gl_bytes = _gl_texture_type_n_bytes (gl_mem->tex_type);
|
n_gl_bytes = _gl_texture_type_n_bytes (gl_mem->tex_type);
|
||||||
if (n_gl_bytes == 0) {
|
if (n_gl_bytes == 0) {
|
||||||
|
@ -435,19 +440,21 @@ _calculate_unpack_length (GstGLMemory * gl_mem)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (USING_OPENGL (gl_mem->context) || USING_GLES3 (gl_mem->context)) {
|
if (USING_OPENGL (gl_mem->context) || USING_GLES3 (gl_mem->context)) {
|
||||||
gl_mem->unpack_length = gl_mem->stride / n_gl_bytes;
|
gl_mem->unpack_length = GL_MEM_STRIDE (gl_mem) / n_gl_bytes;
|
||||||
} else if (USING_GLES2 (gl_mem->context)) {
|
} else if (USING_GLES2 (gl_mem->context)) {
|
||||||
guint j = 8;
|
guint j = 8;
|
||||||
|
|
||||||
while (j >= n_gl_bytes) {
|
while (j >= n_gl_bytes) {
|
||||||
/* GST_ROUND_UP_j(gl_mem->width * n_gl_bytes) */
|
/* GST_ROUND_UP_j(GL_MEM_WIDTH (gl_mem) * n_gl_bytes) */
|
||||||
guint round_up_j = ((gl_mem->width * n_gl_bytes) + j - 1) & ~(j - 1);
|
guint round_up_j =
|
||||||
|
((GL_MEM_WIDTH (gl_mem) * n_gl_bytes) + j - 1) & ~(j - 1);
|
||||||
|
|
||||||
if (round_up_j == gl_mem->stride) {
|
if (round_up_j == GL_MEM_STRIDE (gl_mem)) {
|
||||||
GST_CAT_LOG (GST_CAT_GL_MEMORY, "Found alignment of %u based on width "
|
GST_CAT_LOG (GST_CAT_GL_MEMORY, "Found alignment of %u based on width "
|
||||||
"(with plane width:%u, plane stride:%u and pixel stride:%u. "
|
"(with plane width:%u, plane stride:%u and pixel stride:%u. "
|
||||||
"RU%u(%u*%u) = %u)", j, gl_mem->width, gl_mem->stride, n_gl_bytes,
|
"RU%u(%u*%u) = %u)", j, GL_MEM_WIDTH (gl_mem),
|
||||||
j, gl_mem->width, n_gl_bytes, round_up_j);
|
GL_MEM_STRIDE (gl_mem), n_gl_bytes, j, GL_MEM_WIDTH (gl_mem),
|
||||||
|
n_gl_bytes, round_up_j);
|
||||||
|
|
||||||
gl_mem->unpack_length = j;
|
gl_mem->unpack_length = j;
|
||||||
break;
|
break;
|
||||||
|
@ -462,19 +469,20 @@ _calculate_unpack_length (GstGLMemory * gl_mem)
|
||||||
j = 8;
|
j = 8;
|
||||||
|
|
||||||
while (j >= n_gl_bytes) {
|
while (j >= n_gl_bytes) {
|
||||||
/* GST_ROUND_UP_j(gl_mem->stride) */
|
/* GST_ROUND_UP_j((GL_MEM_STRIDE (gl_mem)) */
|
||||||
guint round_up_j = ((gl_mem->stride) + j - 1) & ~(j - 1);
|
guint round_up_j = ((GL_MEM_STRIDE (gl_mem)) + j - 1) & ~(j - 1);
|
||||||
|
|
||||||
if (round_up_j == gl_mem->stride) {
|
if (round_up_j == (GL_MEM_STRIDE (gl_mem))) {
|
||||||
GST_CAT_LOG (GST_CAT_GL_MEMORY, "Found alignment of %u based on "
|
GST_CAT_LOG (GST_CAT_GL_MEMORY, "Found alignment of %u based on "
|
||||||
"stride (with plane stride:%u and pixel stride:%u. "
|
"stride (with plane stride:%u and pixel stride:%u. "
|
||||||
"RU%u(%u) = %u)", j, gl_mem->stride, n_gl_bytes, j,
|
"RU%u(%u) = %u)", j, GL_MEM_STRIDE (gl_mem), n_gl_bytes, j,
|
||||||
gl_mem->stride, round_up_j);
|
GL_MEM_STRIDE (gl_mem), round_up_j);
|
||||||
|
|
||||||
gl_mem->unpack_length = j;
|
gl_mem->unpack_length = j;
|
||||||
gl_mem->tex_scaling[0] =
|
gl_mem->tex_scaling[0] =
|
||||||
(gfloat) (gl_mem->width * n_gl_bytes) / (gfloat) gl_mem->stride;
|
(gfloat) (GL_MEM_WIDTH (gl_mem) * n_gl_bytes) /
|
||||||
gl_mem->width = gl_mem->stride / n_gl_bytes;
|
(gfloat) GL_MEM_STRIDE (gl_mem);
|
||||||
|
gl_mem->tex_width = GL_MEM_STRIDE (gl_mem) / n_gl_bytes;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
j >>= 1;
|
j >>= 1;
|
||||||
|
@ -484,7 +492,8 @@ _calculate_unpack_length (GstGLMemory * gl_mem)
|
||||||
GST_CAT_ERROR
|
GST_CAT_ERROR
|
||||||
(GST_CAT_GL_MEMORY, "Failed to find matching alignment. Image may "
|
(GST_CAT_GL_MEMORY, "Failed to find matching alignment. Image may "
|
||||||
"look corrupted. plane width:%u, plane stride:%u and pixel "
|
"look corrupted. plane width:%u, plane stride:%u and pixel "
|
||||||
"stride:%u", gl_mem->width, gl_mem->stride, n_gl_bytes);
|
"stride:%u", GL_MEM_WIDTH (gl_mem), GL_MEM_STRIDE (gl_mem),
|
||||||
|
n_gl_bytes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -537,8 +546,8 @@ _download_memory (GstGLContext * context, GstGLMemory * gl_mem)
|
||||||
if (!gst_gl_context_check_framebuffer_status (context))
|
if (!gst_gl_context_check_framebuffer_status (context))
|
||||||
goto fbo_error;
|
goto fbo_error;
|
||||||
|
|
||||||
gl->ReadPixels (0, 0, gl_mem->width, gl_mem->height, format, type,
|
gl->ReadPixels (0, 0, gl_mem->tex_width, GL_MEM_HEIGHT (gl_mem), format,
|
||||||
gl_mem->data);
|
type, gl_mem->data);
|
||||||
|
|
||||||
gl->BindFramebuffer (GL_FRAMEBUFFER, 0);
|
gl->BindFramebuffer (GL_FRAMEBUFFER, 0);
|
||||||
|
|
||||||
|
@ -552,21 +561,24 @@ error:
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_gl_mem_init (GstGLMemory * mem, GstAllocator * allocator, GstMemory * parent,
|
_gl_mem_init (GstGLMemory * mem, GstAllocator * allocator, GstMemory * parent,
|
||||||
GstGLContext * context, GstVideoGLTextureType tex_type, gint width,
|
GstGLContext * context, GstVideoInfo * info, guint plane,
|
||||||
gint height, gint stride, gpointer user_data, GDestroyNotify notify)
|
gpointer user_data, GDestroyNotify notify)
|
||||||
{
|
{
|
||||||
gsize maxsize;
|
gsize maxsize;
|
||||||
|
|
||||||
maxsize = stride * height;
|
maxsize =
|
||||||
|
GST_VIDEO_INFO_PLANE_STRIDE (info, plane) * _get_plane_height (info,
|
||||||
|
plane);
|
||||||
|
|
||||||
gst_memory_init (GST_MEMORY_CAST (mem), GST_MEMORY_FLAG_NO_SHARE,
|
gst_memory_init (GST_MEMORY_CAST (mem), GST_MEMORY_FLAG_NO_SHARE,
|
||||||
allocator, parent, maxsize, 0, 0, maxsize);
|
allocator, parent, maxsize, 0, 0, maxsize);
|
||||||
|
|
||||||
mem->context = gst_object_ref (context);
|
mem->context = gst_object_ref (context);
|
||||||
mem->tex_type = tex_type;
|
mem->tex_type =
|
||||||
mem->width = width;
|
gst_gl_texture_type_from_format (context, GST_VIDEO_INFO_FORMAT (info),
|
||||||
mem->height = height;
|
plane);
|
||||||
mem->stride = stride;
|
mem->info = *info;
|
||||||
|
mem->plane = plane;
|
||||||
mem->notify = notify;
|
mem->notify = notify;
|
||||||
mem->user_data = user_data;
|
mem->user_data = user_data;
|
||||||
mem->data_wrapped = FALSE;
|
mem->data_wrapped = FALSE;
|
||||||
|
@ -575,25 +587,26 @@ _gl_mem_init (GstGLMemory * mem, GstAllocator * allocator, GstMemory * parent,
|
||||||
_calculate_unpack_length (mem);
|
_calculate_unpack_length (mem);
|
||||||
|
|
||||||
GST_CAT_DEBUG (GST_CAT_GL_MEMORY, "new GL texture memory:%p format:%u "
|
GST_CAT_DEBUG (GST_CAT_GL_MEMORY, "new GL texture memory:%p format:%u "
|
||||||
"dimensions:%ux%u", mem, tex_type, width, height);
|
"dimensions:%ux%u", mem, mem->tex_type, mem->tex_width,
|
||||||
|
GL_MEM_HEIGHT (mem));
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstGLMemory *
|
static GstGLMemory *
|
||||||
_gl_mem_new (GstAllocator * allocator, GstMemory * parent,
|
_gl_mem_new (GstAllocator * allocator, GstMemory * parent,
|
||||||
GstGLContext * context, GstVideoGLTextureType tex_type, gint width,
|
GstGLContext * context, GstVideoInfo * info, guint plane,
|
||||||
gint height, gint stride, gpointer user_data, GDestroyNotify notify)
|
gpointer user_data, GDestroyNotify notify)
|
||||||
{
|
{
|
||||||
GstGLMemory *mem;
|
GstGLMemory *mem;
|
||||||
GenTexture data = { 0, };
|
GenTexture data = { 0, };
|
||||||
mem = g_slice_new0 (GstGLMemory);
|
mem = g_slice_new0 (GstGLMemory);
|
||||||
_gl_mem_init (mem, allocator, parent, context, tex_type, width, height,
|
_gl_mem_init (mem, allocator, parent, context, info, plane, user_data,
|
||||||
stride, user_data, notify);
|
notify);
|
||||||
|
|
||||||
data.width = mem->width;
|
data.width = mem->tex_width;
|
||||||
data.height = mem->height;
|
data.height = GL_MEM_HEIGHT (mem);
|
||||||
data.gl_format = _gst_gl_format_from_gl_texture_type (tex_type);
|
data.gl_format = _gst_gl_format_from_gl_texture_type (mem->tex_type);
|
||||||
data.gl_type = GL_UNSIGNED_BYTE;
|
data.gl_type = GL_UNSIGNED_BYTE;
|
||||||
if (tex_type == GST_VIDEO_GL_TEXTURE_TYPE_RGB16)
|
if (mem->tex_type == GST_VIDEO_GL_TEXTURE_TYPE_RGB16)
|
||||||
data.gl_type = GL_UNSIGNED_SHORT_5_6_5;
|
data.gl_type = GL_UNSIGNED_SHORT_5_6_5;
|
||||||
|
|
||||||
gst_gl_context_thread_add (context,
|
gst_gl_context_thread_add (context,
|
||||||
|
@ -705,7 +718,7 @@ _gl_mem_copy_thread (GstGLContext * context, gpointer data)
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
in_size = src->height * src->stride;
|
in_size = GL_MEM_HEIGHT (src) * GL_MEM_STRIDE (src);
|
||||||
out_size = out_height * out_stride;
|
out_size = out_height * out_stride;
|
||||||
|
|
||||||
if (copy_params->respecify) {
|
if (copy_params->respecify) {
|
||||||
|
@ -770,13 +783,14 @@ _gl_mem_copy_thread (GstGLContext * context, gpointer data)
|
||||||
gl->GenBuffers (1, &src->pbo);
|
gl->GenBuffers (1, &src->pbo);
|
||||||
|
|
||||||
GST_TRACE ("copying texture data with size of %u*%u*%u",
|
GST_TRACE ("copying texture data with size of %u*%u*%u",
|
||||||
_gl_format_type_n_bytes (in_gl_format, in_gl_type), src->width,
|
_gl_format_type_n_bytes (in_gl_format, in_gl_type), src->tex_width,
|
||||||
src->height);
|
GL_MEM_HEIGHT (src));
|
||||||
|
|
||||||
/* copy tex */
|
/* copy tex */
|
||||||
gl->BindBuffer (GL_PIXEL_PACK_BUFFER, src->pbo);
|
gl->BindBuffer (GL_PIXEL_PACK_BUFFER, src->pbo);
|
||||||
gl->BufferData (GL_PIXEL_PACK_BUFFER, in_size, NULL, GL_STREAM_COPY);
|
gl->BufferData (GL_PIXEL_PACK_BUFFER, in_size, NULL, GL_STREAM_COPY);
|
||||||
gl->ReadPixels (0, 0, src->width, src->height, in_gl_format, in_gl_type, 0);
|
gl->ReadPixels (0, 0, src->tex_width, GL_MEM_HEIGHT (src), in_gl_format,
|
||||||
|
in_gl_type, 0);
|
||||||
gl->BindBuffer (GL_PIXEL_PACK_BUFFER, 0);
|
gl->BindBuffer (GL_PIXEL_PACK_BUFFER, 0);
|
||||||
|
|
||||||
gl->BindBuffer (GL_PIXEL_UNPACK_BUFFER, src->pbo);
|
gl->BindBuffer (GL_PIXEL_UNPACK_BUFFER, src->pbo);
|
||||||
|
@ -822,8 +836,8 @@ _gl_mem_copy (GstGLMemory * src, gssize offset, gssize size)
|
||||||
GstGLMemory *dest;
|
GstGLMemory *dest;
|
||||||
|
|
||||||
if (GST_GL_MEMORY_FLAG_IS_SET (src, GST_GL_MEMORY_FLAG_NEED_UPLOAD)) {
|
if (GST_GL_MEMORY_FLAG_IS_SET (src, GST_GL_MEMORY_FLAG_NEED_UPLOAD)) {
|
||||||
dest = _gl_mem_new (src->mem.allocator, NULL, src->context, src->tex_type,
|
dest = _gl_mem_new (src->mem.allocator, NULL, src->context, &src->info,
|
||||||
src->width, src->height, src->stride, NULL, NULL);
|
src->plane, NULL, NULL);
|
||||||
dest->data = g_malloc (src->mem.maxsize);
|
dest->data = g_malloc (src->mem.maxsize);
|
||||||
memcpy (dest->data, src->data, src->mem.maxsize);
|
memcpy (dest->data, src->data, src->mem.maxsize);
|
||||||
GST_GL_MEMORY_FLAG_SET (dest, GST_GL_MEMORY_FLAG_NEED_UPLOAD);
|
GST_GL_MEMORY_FLAG_SET (dest, GST_GL_MEMORY_FLAG_NEED_UPLOAD);
|
||||||
|
@ -833,16 +847,16 @@ _gl_mem_copy (GstGLMemory * src, gssize offset, gssize size)
|
||||||
copy_params.src = src;
|
copy_params.src = src;
|
||||||
copy_params.tex_id = 0;
|
copy_params.tex_id = 0;
|
||||||
copy_params.out_format = src->tex_type;
|
copy_params.out_format = src->tex_type;
|
||||||
copy_params.out_width = src->width;
|
copy_params.out_width = src->tex_width;
|
||||||
copy_params.out_height = src->height;
|
copy_params.out_height = GL_MEM_HEIGHT (src);
|
||||||
copy_params.out_stride = src->height;
|
copy_params.out_stride = GL_MEM_STRIDE (src);
|
||||||
copy_params.respecify = FALSE;
|
copy_params.respecify = FALSE;
|
||||||
|
|
||||||
gst_gl_context_thread_add (src->context, _gl_mem_copy_thread, ©_params);
|
gst_gl_context_thread_add (src->context, _gl_mem_copy_thread, ©_params);
|
||||||
|
|
||||||
dest = g_slice_new0 (GstGLMemory);
|
dest = g_slice_new0 (GstGLMemory);
|
||||||
_gl_mem_init (dest, src->mem.allocator, NULL, src->context, src->tex_type,
|
_gl_mem_init (dest, src->mem.allocator, NULL, src->context, &src->info,
|
||||||
src->width, src->height, src->stride, NULL, NULL);
|
src->plane, NULL, NULL);
|
||||||
|
|
||||||
if (!copy_params.result) {
|
if (!copy_params.result) {
|
||||||
GST_CAT_WARNING (GST_CAT_GL_MEMORY, "Could not copy GL Memory");
|
GST_CAT_WARNING (GST_CAT_GL_MEMORY, "Could not copy GL Memory");
|
||||||
|
@ -966,15 +980,12 @@ gst_gl_memory_copy_into_texture (GstGLMemory * gl_mem, guint tex_id,
|
||||||
|
|
||||||
GstGLMemory *
|
GstGLMemory *
|
||||||
gst_gl_memory_wrapped_texture (GstGLContext * context, guint texture_id,
|
gst_gl_memory_wrapped_texture (GstGLContext * context, guint texture_id,
|
||||||
GstVideoGLTextureType tex_type, gint width, gint height, gpointer user_data,
|
GstVideoInfo * info, guint plane, gpointer user_data, GDestroyNotify notify)
|
||||||
GDestroyNotify notify)
|
|
||||||
{
|
{
|
||||||
GstGLMemory *mem;
|
GstGLMemory *mem;
|
||||||
guint n_gl_bytes = _gl_texture_type_n_bytes (tex_type);
|
|
||||||
|
|
||||||
mem = g_slice_new0 (GstGLMemory);
|
mem = g_slice_new0 (GstGLMemory);
|
||||||
_gl_mem_init (mem, _gl_allocator, NULL, context, tex_type, width, height,
|
_gl_mem_init (mem, _gl_allocator, NULL, context, info, plane, NULL, NULL);
|
||||||
width * n_gl_bytes, NULL, NULL);
|
|
||||||
|
|
||||||
mem->tex_id = texture_id;
|
mem->tex_id = texture_id;
|
||||||
mem->texture_wrapped = TRUE;
|
mem->texture_wrapped = TRUE;
|
||||||
|
@ -998,13 +1009,11 @@ gst_gl_memory_wrapped_texture (GstGLContext * context, guint texture_id,
|
||||||
* from @context
|
* from @context
|
||||||
*/
|
*/
|
||||||
GstMemory *
|
GstMemory *
|
||||||
gst_gl_memory_alloc (GstGLContext * context, GstVideoGLTextureType tex_type,
|
gst_gl_memory_alloc (GstGLContext * context, GstVideoInfo * info, guint plane)
|
||||||
gint width, gint height, gint stride)
|
|
||||||
{
|
{
|
||||||
GstGLMemory *mem;
|
GstGLMemory *mem;
|
||||||
|
|
||||||
mem = _gl_mem_new (_gl_allocator, NULL, context, tex_type, width, height,
|
mem = _gl_mem_new (_gl_allocator, NULL, context, info, plane, NULL, NULL);
|
||||||
stride, NULL, NULL);
|
|
||||||
|
|
||||||
mem->data = g_malloc (mem->mem.maxsize);
|
mem->data = g_malloc (mem->mem.maxsize);
|
||||||
if (mem->data == NULL) {
|
if (mem->data == NULL) {
|
||||||
|
@ -1027,14 +1036,14 @@ gst_gl_memory_alloc (GstGLContext * context, GstVideoGLTextureType tex_type,
|
||||||
* from @context and contents specified by @data
|
* from @context and contents specified by @data
|
||||||
*/
|
*/
|
||||||
GstGLMemory *
|
GstGLMemory *
|
||||||
gst_gl_memory_wrapped (GstGLContext * context, GstVideoGLTextureType tex_type,
|
gst_gl_memory_wrapped (GstGLContext * context, GstVideoInfo * info, guint plane,
|
||||||
gint width, gint height, gint stride, gpointer data, gpointer user_data,
|
gpointer data, gpointer user_data, GDestroyNotify notify)
|
||||||
GDestroyNotify notify)
|
|
||||||
{
|
{
|
||||||
GstGLMemory *mem;
|
GstGLMemory *mem;
|
||||||
|
|
||||||
mem = _gl_mem_new (_gl_allocator, NULL, context, tex_type, width, height,
|
mem =
|
||||||
stride, user_data, notify);
|
_gl_mem_new (_gl_allocator, NULL, context, info, plane, user_data,
|
||||||
|
notify);
|
||||||
|
|
||||||
mem->data = data;
|
mem->data = data;
|
||||||
mem->data_wrapped = TRUE;
|
mem->data_wrapped = TRUE;
|
||||||
|
@ -1044,6 +1053,22 @@ gst_gl_memory_wrapped (GstGLContext * context, GstVideoGLTextureType tex_type,
|
||||||
return mem;
|
return mem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gint
|
||||||
|
gst_gl_memory_get_texture_width (GstGLMemory * gl_mem)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (gst_is_gl_memory ((GstMemory *) gl_mem), 0);
|
||||||
|
|
||||||
|
return gl_mem->tex_width;
|
||||||
|
}
|
||||||
|
|
||||||
|
gint
|
||||||
|
gst_gl_memory_get_texture_height (GstGLMemory * gl_mem)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (gst_is_gl_memory ((GstMemory *) gl_mem), 0);
|
||||||
|
|
||||||
|
return _get_plane_height (&gl_mem->info, gl_mem->plane);
|
||||||
|
}
|
||||||
|
|
||||||
G_DEFINE_TYPE (GstGLAllocator, gst_gl_allocator, GST_TYPE_ALLOCATOR);
|
G_DEFINE_TYPE (GstGLAllocator, gst_gl_allocator, GST_TYPE_ALLOCATOR);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1120,19 +1145,12 @@ gst_gl_memory_setup_buffer (GstGLContext * context, GstVideoInfo * info,
|
||||||
GstBuffer * buffer)
|
GstBuffer * buffer)
|
||||||
{
|
{
|
||||||
GstGLMemory *gl_mem[GST_VIDEO_MAX_PLANES] = { NULL, };
|
GstGLMemory *gl_mem[GST_VIDEO_MAX_PLANES] = { NULL, };
|
||||||
GstVideoGLTextureType tex_type;
|
|
||||||
guint n_mem, i;
|
guint n_mem, i;
|
||||||
|
|
||||||
n_mem = GST_VIDEO_INFO_N_PLANES (info);
|
n_mem = GST_VIDEO_INFO_N_PLANES (info);
|
||||||
|
|
||||||
for (i = 0; i < n_mem; i++) {
|
for (i = 0; i < n_mem; i++) {
|
||||||
tex_type =
|
gl_mem[i] = (GstGLMemory *) gst_gl_memory_alloc (context, info, i);
|
||||||
gst_gl_texture_type_from_format (context, GST_VIDEO_INFO_FORMAT (info),
|
|
||||||
i);
|
|
||||||
gl_mem[i] =
|
|
||||||
(GstGLMemory *) gst_gl_memory_alloc (context, tex_type,
|
|
||||||
_get_plane_width (info, i), _get_plane_height (info, i),
|
|
||||||
GST_VIDEO_INFO_PLANE_STRIDE (info, i));
|
|
||||||
|
|
||||||
gst_buffer_append_memory (buffer, (GstMemory *) gl_mem[i]);
|
gst_buffer_append_memory (buffer, (GstMemory *) gl_mem[i]);
|
||||||
}
|
}
|
||||||
|
@ -1161,17 +1179,11 @@ gst_gl_memory_setup_wrapped (GstGLContext * context, GstVideoInfo * info,
|
||||||
gpointer data[GST_VIDEO_MAX_PLANES],
|
gpointer data[GST_VIDEO_MAX_PLANES],
|
||||||
GstGLMemory * textures[GST_VIDEO_MAX_PLANES])
|
GstGLMemory * textures[GST_VIDEO_MAX_PLANES])
|
||||||
{
|
{
|
||||||
GstVideoGLTextureType tex_type;
|
|
||||||
gint i;
|
gint i;
|
||||||
|
|
||||||
for (i = 0; i < GST_VIDEO_INFO_N_PLANES (info); i++) {
|
for (i = 0; i < GST_VIDEO_INFO_N_PLANES (info); i++) {
|
||||||
tex_type =
|
textures[i] = (GstGLMemory *) gst_gl_memory_wrapped (context, info, i,
|
||||||
gst_gl_texture_type_from_format (context, GST_VIDEO_INFO_FORMAT (info),
|
data[i], NULL, NULL);
|
||||||
i);
|
|
||||||
|
|
||||||
textures[i] = (GstGLMemory *) gst_gl_memory_wrapped (context, tex_type,
|
|
||||||
_get_plane_width (info, i), _get_plane_height (info, i),
|
|
||||||
GST_VIDEO_INFO_PLANE_STRIDE (info, i), data[i], NULL, NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
|
@ -85,9 +85,8 @@ struct _GstGLMemory
|
||||||
GstGLContext *context;
|
GstGLContext *context;
|
||||||
guint tex_id;
|
guint tex_id;
|
||||||
GstVideoGLTextureType tex_type;
|
GstVideoGLTextureType tex_type;
|
||||||
gint width;
|
GstVideoInfo info;
|
||||||
gint height;
|
guint plane;
|
||||||
gint stride;
|
|
||||||
gfloat tex_scaling[2];
|
gfloat tex_scaling[2];
|
||||||
|
|
||||||
/* <private> */
|
/* <private> */
|
||||||
|
@ -100,6 +99,7 @@ struct _GstGLMemory
|
||||||
gpointer user_data;
|
gpointer user_data;
|
||||||
guint pbo;
|
guint pbo;
|
||||||
guint unpack_length;
|
guint unpack_length;
|
||||||
|
guint tex_width;
|
||||||
|
|
||||||
gpointer _gst_reserved[GST_PADDING];
|
gpointer _gst_reserved[GST_PADDING];
|
||||||
};
|
};
|
||||||
|
@ -151,19 +151,15 @@ struct _GstGLMemory
|
||||||
void gst_gl_memory_init (void);
|
void gst_gl_memory_init (void);
|
||||||
gboolean gst_is_gl_memory (GstMemory * mem);
|
gboolean gst_is_gl_memory (GstMemory * mem);
|
||||||
|
|
||||||
GstMemory * gst_gl_memory_alloc (GstGLContext * context, GstVideoGLTextureType tex_type,
|
GstMemory * gst_gl_memory_alloc (GstGLContext * context, GstVideoInfo * info, guint plane);
|
||||||
gint width, gint height, gint stride);
|
GstGLMemory * gst_gl_memory_wrapped (GstGLContext * context, GstVideoInfo * info, guint plane,
|
||||||
GstGLMemory * gst_gl_memory_wrapped (GstGLContext * context, GstVideoGLTextureType tex_type,
|
gpointer data, gpointer user_data, GDestroyNotify notify);
|
||||||
gint width, gint height, gint stride,
|
|
||||||
gpointer data, gpointer user_data,
|
|
||||||
GDestroyNotify notify);
|
|
||||||
GstGLMemory * gst_gl_memory_wrapped_texture (GstGLContext * context, guint texture_id,
|
GstGLMemory * gst_gl_memory_wrapped_texture (GstGLContext * context, guint texture_id,
|
||||||
GstVideoGLTextureType tex_type,
|
GstVideoInfo * info, guint plane,
|
||||||
gint width, gint height,
|
|
||||||
gpointer user_data, GDestroyNotify notify);
|
gpointer user_data, GDestroyNotify notify);
|
||||||
|
|
||||||
gboolean gst_gl_memory_copy_into_texture (GstGLMemory *gl_mem, guint tex_id,
|
gboolean gst_gl_memory_copy_into_texture (GstGLMemory *gl_mem, guint tex_id,
|
||||||
GstVideoGLTextureType tex_type,
|
GstVideoGLTextureType tex_type,
|
||||||
gint width, gint height, gint stride,
|
gint width, gint height, gint stride,
|
||||||
gboolean respecify);
|
gboolean respecify);
|
||||||
|
|
||||||
|
@ -173,6 +169,9 @@ gboolean gst_gl_memory_setup_wrapped (GstGLContext * context, GstVideoInfo
|
||||||
gpointer data[GST_VIDEO_MAX_PLANES],
|
gpointer data[GST_VIDEO_MAX_PLANES],
|
||||||
GstGLMemory *textures[GST_VIDEO_MAX_PLANES]);
|
GstGLMemory *textures[GST_VIDEO_MAX_PLANES]);
|
||||||
|
|
||||||
|
gint gst_gl_memory_get_texture_width (GstGLMemory * gl_mem);
|
||||||
|
gint gst_gl_memory_get_texture_height (GstGLMemory * gl_mem);
|
||||||
|
|
||||||
GstVideoGLTextureType gst_gl_texture_type_from_format (GstGLContext *context, GstVideoFormat v_format, guint plane);
|
GstVideoGLTextureType gst_gl_texture_type_from_format (GstGLContext *context, GstVideoFormat v_format, guint plane);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -491,8 +491,7 @@ _init_upload (GstGLUpload * upload)
|
||||||
&out_info);
|
&out_info);
|
||||||
|
|
||||||
upload->out_tex = gst_gl_memory_wrapped_texture (upload->context, 0,
|
upload->out_tex = gst_gl_memory_wrapped_texture (upload->context, 0,
|
||||||
GST_VIDEO_GL_TEXTURE_TYPE_RGBA, GST_VIDEO_INFO_WIDTH (&upload->in_info),
|
&out_info, 0, NULL, NULL);
|
||||||
GST_VIDEO_INFO_HEIGHT (&upload->in_info), NULL, NULL);
|
|
||||||
|
|
||||||
upload->initted = TRUE;
|
upload->initted = TRUE;
|
||||||
|
|
||||||
|
|
|
@ -219,12 +219,11 @@ _perform_with_gl_memory (GstGLUploadMeta * upload, GstVideoGLTextureUploadMeta *
|
||||||
GST_GL_MEMORY_FLAG_SET (in_mem, GST_GL_MEMORY_FLAG_NEED_UPLOAD);
|
GST_GL_MEMORY_FLAG_SET (in_mem, GST_GL_MEMORY_FLAG_NEED_UPLOAD);
|
||||||
} else {
|
} else {
|
||||||
GstGLMemory *out_mem;
|
GstGLMemory *out_mem;
|
||||||
|
gint mem_width, mem_height;
|
||||||
|
|
||||||
if (!upload->priv->out_tex[i])
|
if (!upload->priv->out_tex[i])
|
||||||
upload->priv->out_tex[i] = gst_gl_memory_wrapped_texture (upload->context,
|
upload->priv->out_tex[i] = gst_gl_memory_wrapped_texture (upload->context,
|
||||||
texture_id[i], meta->texture_type[i],
|
texture_id[i], &upload->info, i, NULL, NULL);
|
||||||
GST_VIDEO_INFO_WIDTH (&upload->info),
|
|
||||||
GST_VIDEO_INFO_HEIGHT (&upload->info), NULL, NULL);
|
|
||||||
|
|
||||||
out_mem = upload->priv->out_tex[i];
|
out_mem = upload->priv->out_tex[i];
|
||||||
|
|
||||||
|
@ -233,8 +232,12 @@ _perform_with_gl_memory (GstGLUploadMeta * upload, GstVideoGLTextureUploadMeta *
|
||||||
GST_GL_MEMORY_FLAG_SET (out_mem, GST_GL_MEMORY_FLAG_NEED_DOWNLOAD);
|
GST_GL_MEMORY_FLAG_SET (out_mem, GST_GL_MEMORY_FLAG_NEED_DOWNLOAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mem_width = gst_gl_memory_get_texture_width (out_mem);
|
||||||
|
mem_height = gst_gl_memory_get_texture_height (out_mem);
|
||||||
|
|
||||||
if (!(res = gst_gl_memory_copy_into_texture (in_mem, out_mem->tex_id,
|
if (!(res = gst_gl_memory_copy_into_texture (in_mem, out_mem->tex_id,
|
||||||
out_mem->tex_type, out_mem->width, out_mem->height, out_mem->stride,
|
out_mem->tex_type, mem_width, mem_height,
|
||||||
|
GST_VIDEO_INFO_PLANE_STRIDE (&out_mem->info, out_mem->plane),
|
||||||
FALSE)))
|
FALSE)))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -253,9 +256,7 @@ _perform_with_data_unlocked (GstGLUploadMeta * upload,
|
||||||
for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&upload->info); i++) {
|
for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&upload->info); i++) {
|
||||||
if (!upload->priv->in_tex[i])
|
if (!upload->priv->in_tex[i])
|
||||||
upload->priv->in_tex[i] = gst_gl_memory_wrapped (upload->context,
|
upload->priv->in_tex[i] = gst_gl_memory_wrapped (upload->context,
|
||||||
meta->texture_type[i], GST_VIDEO_INFO_WIDTH (&upload->info),
|
&upload->info, i, data[i], NULL, NULL);
|
||||||
GST_VIDEO_INFO_HEIGHT (&upload->info),
|
|
||||||
GST_VIDEO_INFO_PLANE_STRIDE (&upload->info, i), data[i], NULL, NULL);
|
|
||||||
|
|
||||||
upload->priv->in_tex[i]->data = data[i];
|
upload->priv->in_tex[i]->data = data[i];
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue