Blame ext/gl/gstgldownloadelement.c

Packit 0652a1
/*
Packit 0652a1
 * GStreamer
Packit 0652a1
 * Copyright (C) 2012 Matthew Waters <ystree00@gmail.com>
Packit 0652a1
 *
Packit 0652a1
 * This library is free software; you can redistribute it and/or
Packit 0652a1
 * modify it under the terms of the GNU Library General Public
Packit 0652a1
 * License as published by the Free Software Foundation; either
Packit 0652a1
 * version 2 of the License, or (at your option) any later version.
Packit 0652a1
 *
Packit 0652a1
 * This library is distributed in the hope that it will be useful,
Packit 0652a1
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 0652a1
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 0652a1
 * Library General Public License for more details.
Packit 0652a1
 *
Packit 0652a1
 * You should have received a copy of the GNU Library General Public
Packit 0652a1
 * License along with this library; if not, write to the
Packit 0652a1
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
Packit 0652a1
 * Boston, MA 02110-1301, USA.
Packit 0652a1
 */
Packit 0652a1
Packit 0652a1
#ifdef HAVE_CONFIG_H
Packit 0652a1
#include "config.h"
Packit 0652a1
#endif
Packit 0652a1
Packit 0652a1
#include <gst/gl/gl.h>
Packit 0652a1
#if GST_GL_HAVE_PLATFORM_EGL && GST_GL_HAVE_DMABUF
Packit 0652a1
#include <gst/gl/egl/gsteglimage.h>
Packit 0652a1
#include <gst/allocators/gstdmabuf.h>
Packit 0652a1
#endif
Packit 0652a1
Packit 0652a1
#include "gstgldownloadelement.h"
Packit 0652a1
Packit 0652a1
GST_DEBUG_CATEGORY_STATIC (gst_gl_download_element_debug);
Packit 0652a1
#define GST_CAT_DEFAULT gst_gl_download_element_debug
Packit 0652a1
Packit 0652a1
#define gst_gl_download_element_parent_class parent_class
Packit 0652a1
G_DEFINE_TYPE_WITH_CODE (GstGLDownloadElement, gst_gl_download_element,
Packit 0652a1
    GST_TYPE_GL_BASE_FILTER,
Packit 0652a1
    GST_DEBUG_CATEGORY_INIT (gst_gl_download_element_debug, "gldownloadelement",
Packit 0652a1
        0, "download element"););
Packit 0652a1
Packit 0652a1
static gboolean gst_gl_download_element_get_unit_size (GstBaseTransform * trans,
Packit 0652a1
    GstCaps * caps, gsize * size);
Packit 0652a1
static GstCaps *gst_gl_download_element_transform_caps (GstBaseTransform * bt,
Packit 0652a1
    GstPadDirection direction, GstCaps * caps, GstCaps * filter);
Packit 0652a1
static gboolean gst_gl_download_element_set_caps (GstBaseTransform * bt,
Packit 0652a1
    GstCaps * in_caps, GstCaps * out_caps);
Packit 0652a1
static GstFlowReturn
Packit 0652a1
gst_gl_download_element_prepare_output_buffer (GstBaseTransform * bt,
Packit 0652a1
    GstBuffer * buffer, GstBuffer ** outbuf);
Packit 0652a1
static GstFlowReturn gst_gl_download_element_transform (GstBaseTransform * bt,
Packit 0652a1
    GstBuffer * buffer, GstBuffer * outbuf);
Packit 0652a1
static gboolean gst_gl_download_element_decide_allocation (GstBaseTransform *
Packit 0652a1
    trans, GstQuery * query);
Packit 0652a1
static void gst_gl_download_element_finalize (GObject * object);
Packit 0652a1
Packit 0652a1
#if GST_GL_HAVE_PLATFORM_EGL && GST_GL_HAVE_DMABUF
Packit 0652a1
#define EXTRA_CAPS_TEMPLATE "video/x-raw(" GST_CAPS_FEATURE_MEMORY_DMABUF "); "
Packit 0652a1
#else
Packit 0652a1
#define EXTRA_CAPS_TEMPLATE
Packit 0652a1
#endif
Packit 0652a1
Packit 0652a1
static GstStaticPadTemplate gst_gl_download_element_src_pad_template =
Packit 0652a1
    GST_STATIC_PAD_TEMPLATE ("src",
Packit 0652a1
    GST_PAD_SRC,
Packit 0652a1
    GST_PAD_ALWAYS,
Packit 0652a1
    GST_STATIC_CAPS (EXTRA_CAPS_TEMPLATE
Packit 0652a1
        "video/x-raw; video/x-raw(memory:GLMemory)"));
Packit 0652a1
Packit 0652a1
static GstStaticPadTemplate gst_gl_download_element_sink_pad_template =
Packit 0652a1
    GST_STATIC_PAD_TEMPLATE ("sink",
Packit 0652a1
    GST_PAD_SINK,
Packit 0652a1
    GST_PAD_ALWAYS,
Packit 0652a1
    GST_STATIC_CAPS ("video/x-raw(memory:GLMemory); video/x-raw"));
Packit 0652a1
Packit 0652a1
static void
Packit 0652a1
gst_gl_download_element_class_init (GstGLDownloadElementClass * klass)
Packit 0652a1
{
Packit 0652a1
  GstBaseTransformClass *bt_class = GST_BASE_TRANSFORM_CLASS (klass);
Packit 0652a1
  GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
Packit 0652a1
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
Packit 0652a1
Packit 0652a1
  bt_class->transform_caps = gst_gl_download_element_transform_caps;
Packit 0652a1
  bt_class->set_caps = gst_gl_download_element_set_caps;
Packit 0652a1
  bt_class->get_unit_size = gst_gl_download_element_get_unit_size;
Packit 0652a1
  bt_class->prepare_output_buffer =
Packit 0652a1
      gst_gl_download_element_prepare_output_buffer;
Packit 0652a1
  bt_class->transform = gst_gl_download_element_transform;
Packit 0652a1
  bt_class->decide_allocation = gst_gl_download_element_decide_allocation;
Packit 0652a1
Packit 0652a1
  bt_class->passthrough_on_same_caps = TRUE;
Packit 0652a1
Packit 0652a1
  gst_element_class_add_static_pad_template (element_class,
Packit 0652a1
      &gst_gl_download_element_src_pad_template);
Packit 0652a1
  gst_element_class_add_static_pad_template (element_class,
Packit 0652a1
      &gst_gl_download_element_sink_pad_template);
Packit 0652a1
Packit 0652a1
  gst_element_class_set_metadata (element_class,
Packit 0652a1
      "OpenGL downloader", "Filter/Video",
Packit 0652a1
      "Downloads data from OpenGL", "Matthew Waters <matthew@centricular.com>");
Packit 0652a1
Packit 0652a1
  object_class->finalize = gst_gl_download_element_finalize;
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
static void
Packit 0652a1
gst_gl_download_element_init (GstGLDownloadElement * download)
Packit 0652a1
{
Packit 0652a1
  gst_base_transform_set_prefer_passthrough (GST_BASE_TRANSFORM (download),
Packit 0652a1
      TRUE);
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
static gboolean
Packit 0652a1
gst_gl_download_element_set_caps (GstBaseTransform * bt, GstCaps * in_caps,
Packit 0652a1
    GstCaps * out_caps)
Packit 0652a1
{
Packit 0652a1
  GstGLDownloadElement *dl = GST_GL_DOWNLOAD_ELEMENT (bt);
Packit 0652a1
  GstVideoInfo out_info;
Packit 0652a1
  GstCapsFeatures *features = NULL;
Packit 0652a1
Packit 0652a1
  if (!gst_video_info_from_caps (&out_info, out_caps))
Packit 0652a1
    return FALSE;
Packit 0652a1
Packit 0652a1
  features = gst_caps_get_features (out_caps, 0);
Packit 0652a1
Packit 0652a1
  dl->do_pbo_transfers = FALSE;
Packit 0652a1
  if (dl->dmabuf_allocator) {
Packit 0652a1
    gst_object_unref (GST_OBJECT (dl->dmabuf_allocator));
Packit 0652a1
    dl->dmabuf_allocator = NULL;
Packit 0652a1
  }
Packit 0652a1
Packit 0652a1
  if (!features) {
Packit 0652a1
    dl->do_pbo_transfers = TRUE;
Packit 0652a1
    return TRUE;
Packit 0652a1
  }
Packit 0652a1
Packit 0652a1
  if (gst_caps_features_contains (features, GST_CAPS_FEATURE_MEMORY_GL_MEMORY)) {
Packit 0652a1
    /* do nothing with the buffer */
Packit 0652a1
#if GST_GL_HAVE_PLATFORM_EGL && GST_GL_HAVE_DMABUF
Packit 0652a1
  } else if (gst_caps_features_contains (features,
Packit 0652a1
          GST_CAPS_FEATURE_MEMORY_DMABUF)) {
Packit 0652a1
    dl->dmabuf_allocator = gst_dmabuf_allocator_new ();
Packit 0652a1
#endif
Packit 0652a1
  } else if (gst_caps_features_contains (features,
Packit 0652a1
          GST_CAPS_FEATURE_MEMORY_SYSTEM_MEMORY)) {
Packit 0652a1
    dl->do_pbo_transfers = TRUE;
Packit 0652a1
  }
Packit 0652a1
Packit 0652a1
  return TRUE;
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
static GstCaps *
Packit 0652a1
_set_caps_features (const GstCaps * caps, const gchar * feature_name)
Packit 0652a1
{
Packit 0652a1
  GstCaps *tmp = gst_caps_copy (caps);
Packit 0652a1
  guint n = gst_caps_get_size (tmp);
Packit 0652a1
  guint i = 0;
Packit 0652a1
Packit 0652a1
  for (i = 0; i < n; i++)
Packit 0652a1
    gst_caps_set_features (tmp, i,
Packit 0652a1
        gst_caps_features_from_string (feature_name));
Packit 0652a1
Packit 0652a1
  return tmp;
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
static void
Packit 0652a1
_remove_field (GstCaps * caps, const gchar * field)
Packit 0652a1
{
Packit 0652a1
  guint n = gst_caps_get_size (caps);
Packit 0652a1
  guint i = 0;
Packit 0652a1
Packit 0652a1
  for (i = 0; i < n; i++) {
Packit 0652a1
    GstStructure *s = gst_caps_get_structure (caps, i);
Packit 0652a1
    gst_structure_remove_field (s, field);
Packit 0652a1
  }
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
static GstCaps *
Packit 0652a1
gst_gl_download_element_transform_caps (GstBaseTransform * bt,
Packit 0652a1
    GstPadDirection direction, GstCaps * caps, GstCaps * filter)
Packit 0652a1
{
Packit 0652a1
  GstCaps *result, *tmp;
Packit 0652a1
Packit 0652a1
  if (direction == GST_PAD_SRC) {
Packit 0652a1
    tmp = _set_caps_features (caps, GST_CAPS_FEATURE_MEMORY_GL_MEMORY);
Packit 0652a1
    tmp = gst_caps_merge (gst_caps_ref (caps), tmp);
Packit 0652a1
  } else {
Packit 0652a1
    GstCaps *newcaps;
Packit 0652a1
    tmp = gst_caps_ref (caps);
Packit 0652a1
Packit 0652a1
#if GST_GL_HAVE_PLATFORM_EGL && GST_GL_HAVE_DMABUF
Packit 0652a1
    newcaps = _set_caps_features (caps, GST_CAPS_FEATURE_MEMORY_DMABUF);
Packit 0652a1
    _remove_field (newcaps, "texture-target");
Packit 0652a1
    tmp = gst_caps_merge (tmp, newcaps);
Packit 0652a1
#endif
Packit 0652a1
Packit 0652a1
    newcaps = _set_caps_features (caps, GST_CAPS_FEATURE_MEMORY_SYSTEM_MEMORY);
Packit 0652a1
    _remove_field (newcaps, "texture-target");
Packit 0652a1
    tmp = gst_caps_merge (tmp, newcaps);
Packit 0652a1
  }
Packit 0652a1
Packit 0652a1
  if (filter) {
Packit 0652a1
    result = gst_caps_intersect_full (filter, tmp, GST_CAPS_INTERSECT_FIRST);
Packit 0652a1
    gst_caps_unref (tmp);
Packit 0652a1
  } else {
Packit 0652a1
    result = tmp;
Packit 0652a1
  }
Packit 0652a1
Packit 0652a1
  GST_DEBUG_OBJECT (bt, "returning caps %" GST_PTR_FORMAT, result);
Packit 0652a1
Packit 0652a1
  return result;
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
static gboolean
Packit 0652a1
gst_gl_download_element_get_unit_size (GstBaseTransform * trans, GstCaps * caps,
Packit 0652a1
    gsize * size)
Packit 0652a1
{
Packit 0652a1
  gboolean ret = FALSE;
Packit 0652a1
  GstVideoInfo info;
Packit 0652a1
Packit 0652a1
  ret = gst_video_info_from_caps (&info, caps);
Packit 0652a1
  if (ret)
Packit 0652a1
    *size = GST_VIDEO_INFO_SIZE (&info;;
Packit 0652a1
Packit 0652a1
  return TRUE;
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
#if GST_GL_HAVE_PLATFORM_EGL && GST_GL_HAVE_DMABUF
Packit 0652a1
Packit 0652a1
struct DmabufInfo
Packit 0652a1
{
Packit 0652a1
  GstMemory *dmabuf;
Packit 0652a1
  gint stride;
Packit 0652a1
  gsize offset;
Packit 0652a1
};
Packit 0652a1
Packit 0652a1
static void
Packit 0652a1
_free_dmabuf_info (struct DmabufInfo *info)
Packit 0652a1
{
Packit 0652a1
  gst_memory_unref (info->dmabuf);
Packit 0652a1
  g_free (info);
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
static GQuark
Packit 0652a1
_dmabuf_info_quark (void)
Packit 0652a1
{
Packit 0652a1
  static GQuark quark = 0;
Packit 0652a1
Packit 0652a1
  if (!quark)
Packit 0652a1
    quark = g_quark_from_static_string ("GstGLDownloadDmabufInfo");
Packit 0652a1
  return quark;
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
static struct DmabufInfo *
Packit 0652a1
_get_cached_dmabuf_info (GstGLMemory * mem)
Packit 0652a1
{
Packit 0652a1
  return gst_mini_object_get_qdata (GST_MINI_OBJECT (mem),
Packit 0652a1
      _dmabuf_info_quark ());
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
static void
Packit 0652a1
_set_cached_dmabuf_info (GstGLMemory * mem, struct DmabufInfo *info)
Packit 0652a1
{
Packit 0652a1
  return gst_mini_object_set_qdata (GST_MINI_OBJECT (mem),
Packit 0652a1
      _dmabuf_info_quark (), info, (GDestroyNotify) _free_dmabuf_info);
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
struct DmabufTransfer
Packit 0652a1
{
Packit 0652a1
  GstGLDownloadElement *download;
Packit 0652a1
  GstGLMemory *glmem;
Packit 0652a1
  struct DmabufInfo *info;
Packit 0652a1
};
Packit 0652a1
Packit 0652a1
static void
Packit 0652a1
_create_cached_dmabuf_info (GstGLContext * context, gpointer data)
Packit 0652a1
{
Packit 0652a1
  struct DmabufTransfer *transfer = (struct DmabufTransfer *) data;
Packit 0652a1
  GstEGLImage *image;
Packit 0652a1
Packit 0652a1
  image = gst_egl_image_from_texture (context, transfer->glmem, NULL);
Packit 0652a1
  if (image) {
Packit 0652a1
    int fd;
Packit 0652a1
    gint stride;
Packit 0652a1
    gsize offset;
Packit 0652a1
Packit 0652a1
    if (gst_egl_image_export_dmabuf (image, &fd, &stride, &offset)) {
Packit 0652a1
      GstGLDownloadElement *download = transfer->download;
Packit 0652a1
      struct DmabufInfo *info;
Packit 0652a1
      gsize maxsize;
Packit 0652a1
Packit 0652a1
      gst_memory_get_sizes (GST_MEMORY_CAST (transfer->glmem), NULL, &maxsize);
Packit 0652a1
Packit 0652a1
      info = g_new0 (struct DmabufInfo, 1);
Packit 0652a1
      info->dmabuf =
Packit 0652a1
          gst_dmabuf_allocator_alloc (download->dmabuf_allocator, fd, maxsize);
Packit 0652a1
      info->stride = stride;
Packit 0652a1
      info->offset = offset;
Packit 0652a1
Packit 0652a1
      transfer->info = info;
Packit 0652a1
    }
Packit 0652a1
Packit 0652a1
    gst_egl_image_unref (image);
Packit 0652a1
  }
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
static GstBuffer *
Packit 0652a1
_try_export_dmabuf (GstGLDownloadElement * download, GstBuffer * inbuf)
Packit 0652a1
{
Packit 0652a1
  GstGLMemory *glmem;
Packit 0652a1
  GstBuffer *buffer = NULL;
Packit 0652a1
  int i;
Packit 0652a1
  gsize offset[GST_VIDEO_MAX_PLANES];
Packit 0652a1
  gint stride[GST_VIDEO_MAX_PLANES];
Packit 0652a1
  GstCaps *src_caps;
Packit 0652a1
  GstVideoInfo out_info;
Packit 0652a1
  gsize total_offset;
Packit 0652a1
Packit 0652a1
  glmem = GST_GL_MEMORY_CAST (gst_buffer_peek_memory (inbuf, 0));
Packit 0652a1
  if (glmem) {
Packit 0652a1
    GstGLContext *context = GST_GL_BASE_MEMORY_CAST (glmem)->context;
Packit 0652a1
    if (gst_gl_context_get_gl_platform (context) != GST_GL_PLATFORM_EGL)
Packit 0652a1
      return NULL;
Packit 0652a1
  }
Packit 0652a1
Packit 0652a1
  buffer = gst_buffer_new ();
Packit 0652a1
  total_offset = 0;
Packit 0652a1
Packit 0652a1
  for (i = 0; i < gst_buffer_n_memory (inbuf); i++) {
Packit 0652a1
    struct DmabufInfo *info;
Packit 0652a1
Packit 0652a1
    glmem = GST_GL_MEMORY_CAST (gst_buffer_peek_memory (inbuf, i));
Packit 0652a1
    info = _get_cached_dmabuf_info (glmem);
Packit 0652a1
    if (!info) {
Packit 0652a1
      GstGLContext *context = GST_GL_BASE_MEMORY_CAST (glmem)->context;
Packit 0652a1
      struct DmabufTransfer transfer;
Packit 0652a1
Packit 0652a1
      transfer.download = download;
Packit 0652a1
      transfer.glmem = glmem;
Packit 0652a1
      transfer.info = NULL;
Packit 0652a1
      gst_gl_context_thread_add (context, _create_cached_dmabuf_info,
Packit 0652a1
          &transfer);
Packit 0652a1
      info = transfer.info;
Packit 0652a1
Packit 0652a1
      if (info)
Packit 0652a1
        _set_cached_dmabuf_info (glmem, info);
Packit 0652a1
    }
Packit 0652a1
Packit 0652a1
    if (info) {
Packit 0652a1
      offset[i] = total_offset + info->offset;
Packit 0652a1
      stride[i] = info->stride;
Packit 0652a1
      total_offset += gst_memory_get_sizes (info->dmabuf, NULL, NULL);
Packit 0652a1
      gst_buffer_insert_memory (buffer, -1, gst_memory_ref (info->dmabuf));
Packit 0652a1
    } else {
Packit 0652a1
      gst_buffer_unref (buffer);
Packit 0652a1
      buffer = NULL;
Packit 0652a1
      goto export_complete;
Packit 0652a1
    }
Packit 0652a1
  }
Packit 0652a1
Packit 0652a1
  src_caps = gst_pad_get_current_caps (GST_BASE_TRANSFORM (download)->srcpad);
Packit 0652a1
  gst_video_info_from_caps (&out_info, src_caps);
Packit 0652a1
Packit 0652a1
  if (download->add_videometa) {
Packit 0652a1
    gst_buffer_add_video_meta_full (buffer, GST_VIDEO_FRAME_FLAG_NONE,
Packit 0652a1
        out_info.finfo->format, out_info.width, out_info.height,
Packit 0652a1
        out_info.finfo->n_planes, offset, stride);
Packit 0652a1
  } else {
Packit 0652a1
    int i;
Packit 0652a1
    gboolean match = TRUE;
Packit 0652a1
    for (i = 0; i < gst_buffer_n_memory (inbuf); i++) {
Packit 0652a1
      if (offset[i] != out_info.offset[i] || stride[i] != out_info.stride[i]) {
Packit 0652a1
        match = FALSE;
Packit 0652a1
        break;
Packit 0652a1
      }
Packit 0652a1
    }
Packit 0652a1
Packit 0652a1
    if (!match) {
Packit 0652a1
      gst_buffer_unref (buffer);
Packit 0652a1
      buffer = NULL;
Packit 0652a1
    }
Packit 0652a1
  }
Packit 0652a1
Packit 0652a1
export_complete:
Packit 0652a1
Packit 0652a1
  return buffer;
Packit 0652a1
}
Packit 0652a1
#endif /* GST_GL_HAVE_PLATFORM_EGL && GST_GL_HAVE_DMABUF */
Packit 0652a1
Packit 0652a1
static GstFlowReturn
Packit 0652a1
gst_gl_download_element_prepare_output_buffer (GstBaseTransform * bt,
Packit 0652a1
    GstBuffer * inbuf, GstBuffer ** outbuf)
Packit 0652a1
{
Packit 0652a1
  GstGLDownloadElement *dl = GST_GL_DOWNLOAD_ELEMENT (bt);
Packit 0652a1
  gint i, n;
Packit 0652a1
Packit 0652a1
  *outbuf = inbuf;
Packit 0652a1
Packit 0652a1
  if (dl->do_pbo_transfers) {
Packit 0652a1
    n = gst_buffer_n_memory (*outbuf);
Packit 0652a1
    for (i = 0; i < n; i++) {
Packit 0652a1
      GstMemory *mem = gst_buffer_peek_memory (*outbuf, i);
Packit 0652a1
Packit 0652a1
      if (gst_is_gl_memory_pbo (mem))
Packit 0652a1
        gst_gl_memory_pbo_download_transfer ((GstGLMemoryPBO *) mem);
Packit 0652a1
    }
Packit 0652a1
  }
Packit 0652a1
#if GST_GL_HAVE_PLATFORM_EGL && GST_GL_HAVE_DMABUF
Packit 0652a1
  else if (dl->dmabuf_allocator) {
Packit 0652a1
    GstBuffer *buffer = _try_export_dmabuf (dl, inbuf);
Packit 0652a1
    if (buffer) {
Packit 0652a1
      if (GST_BASE_TRANSFORM_GET_CLASS (bt)->copy_metadata)
Packit 0652a1
        if (!GST_BASE_TRANSFORM_GET_CLASS (bt)->copy_metadata (bt, inbuf,
Packit 0652a1
                buffer)) {
Packit 0652a1
          GST_ELEMENT_WARNING (GST_ELEMENT (bt), STREAM, NOT_IMPLEMENTED,
Packit 0652a1
              ("could not copy metadata"), (NULL));
Packit 0652a1
        }
Packit 0652a1
Packit 0652a1
      *outbuf = buffer;
Packit 0652a1
    } else {
Packit 0652a1
      GstCaps *src_caps;
Packit 0652a1
      GstCapsFeatures *features;
Packit 0652a1
Packit 0652a1
      gst_object_unref (dl->dmabuf_allocator);
Packit 0652a1
      dl->dmabuf_allocator = NULL;
Packit 0652a1
Packit 0652a1
      src_caps = gst_pad_get_current_caps (bt->srcpad);
Packit 0652a1
      src_caps = gst_caps_make_writable (src_caps);
Packit 0652a1
      features = gst_caps_get_features (src_caps, 0);
Packit 0652a1
      gst_caps_features_remove (features, GST_CAPS_FEATURE_MEMORY_DMABUF);
Packit 0652a1
Packit 0652a1
      if (!gst_base_transform_update_src_caps (bt, src_caps)) {
Packit 0652a1
        GST_ERROR_OBJECT (bt, "DMABuf exportation didn't work and system "
Packit 0652a1
            "memory is not supported.");
Packit 0652a1
        return GST_FLOW_NOT_NEGOTIATED;
Packit 0652a1
      }
Packit 0652a1
    }
Packit 0652a1
  }
Packit 0652a1
#endif
Packit 0652a1
Packit 0652a1
  return GST_FLOW_OK;
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
static GstFlowReturn
Packit 0652a1
gst_gl_download_element_transform (GstBaseTransform * bt,
Packit 0652a1
    GstBuffer * inbuf, GstBuffer * outbuf)
Packit 0652a1
{
Packit 0652a1
  return GST_FLOW_OK;
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
static gboolean
Packit 0652a1
gst_gl_download_element_decide_allocation (GstBaseTransform * trans,
Packit 0652a1
    GstQuery * query)
Packit 0652a1
{
Packit 0652a1
  GstGLDownloadElement *download = GST_GL_DOWNLOAD_ELEMENT_CAST (trans);
Packit 0652a1
Packit 0652a1
  if (gst_query_find_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL)) {
Packit 0652a1
    download->add_videometa = TRUE;
Packit 0652a1
  } else {
Packit 0652a1
    download->add_videometa = FALSE;
Packit 0652a1
  }
Packit 0652a1
Packit 0652a1
  return GST_BASE_TRANSFORM_CLASS (parent_class)->decide_allocation (trans,
Packit 0652a1
      query);
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
static void
Packit 0652a1
gst_gl_download_element_finalize (GObject * object)
Packit 0652a1
{
Packit 0652a1
  GstGLDownloadElement *download = GST_GL_DOWNLOAD_ELEMENT_CAST (object);
Packit 0652a1
Packit 0652a1
  if (download->dmabuf_allocator) {
Packit 0652a1
    gst_object_unref (GST_OBJECT (download->dmabuf_allocator));
Packit 0652a1
    download->dmabuf_allocator = NULL;
Packit 0652a1
  }
Packit 0652a1
Packit 0652a1
  G_OBJECT_CLASS (parent_class)->finalize (object);
Packit 0652a1
}