/* These metadata will get set by the upstream framepositionner element,
   added in the video sources' bin */
static GstPadProbeReturn
parse_metadata (GstPad * mixer_pad, GstPadProbeInfo * info,
    GESSmartMixer * self)
{
  GstFramePositionnerMeta *meta;

  meta =
      (GstFramePositionnerMeta *) gst_buffer_get_meta ((GstBuffer *) info->data,
      gst_frame_positionner_meta_api_get_type ());

  if (!meta) {
    GST_WARNING ("The current source should use a framepositionner");
    return GST_PAD_PROBE_OK;
  }

  if (!self->disable_zorder_alpha) {
    g_object_set (mixer_pad, "alpha", meta->alpha,
        "zorder", meta->zorder, NULL);
  }

  g_object_set (mixer_pad, "xpos", meta->posx, "ypos",
      meta->posy, "width", meta->width, "height", meta->height, NULL);

  return GST_PAD_PROBE_OK;
}
CVPixelBufferRef
gst_core_media_buffer_get_pixel_buffer (GstBuffer * buf)
{
  GstCoreMediaMeta *meta = (GstCoreMediaMeta *) gst_buffer_get_meta (buf,
      GST_CORE_MEDIA_META_API_TYPE);
  g_return_val_if_fail (meta != NULL, NULL);

  return meta->ctx->cv->CVPixelBufferRetain (meta->pixel_buf);
}
GstStructure *
kms_serializable_meta_get_metadata (GstBuffer * buffer)
{
  KmsSerializableMeta *meta;

  g_return_val_if_fail (GST_IS_BUFFER (buffer), NULL);

  meta = (KmsSerializableMeta *) gst_buffer_get_meta (buffer,
      KMS_SERIALIZABLE_META_API_TYPE);

  if (meta == NULL) {
    return NULL;
  }

  return meta->data;
}
GstVaapiVideoMeta *
gst_buffer_get_vaapi_video_meta (GstBuffer * buffer)
{
  GstVaapiVideoMeta *meta;
  GstMeta *m;

  g_return_val_if_fail (GST_IS_BUFFER (buffer), NULL);

  m = gst_buffer_get_meta (buffer, GST_VAAPI_VIDEO_META_API_TYPE);
  if (!m)
    return NULL;

  meta = GST_VAAPI_VIDEO_META_HOLDER (m)->meta;
  if (meta)
    meta->buffer = buffer;
  return meta;
}
/* These metadata will get set by the upstream framepositionner element,
   added in the video sources' bin */
static GstPadProbeReturn
parse_metadata (GstPad * mixer_pad, GstPadProbeInfo * info, gpointer unused)
{
  GstFramePositionnerMeta *meta;

  meta =
      (GstFramePositionnerMeta *) gst_buffer_get_meta ((GstBuffer *) info->data,
      gst_frame_positionner_meta_api_get_type ());

  if (!meta) {
    GST_WARNING ("The current source should use a framepositionner");
    return GST_PAD_PROBE_OK;
  }

  g_object_set (mixer_pad, "alpha", meta->alpha, "xpos", meta->posx, "ypos",
      meta->posy, "zorder", meta->zorder, NULL);

  return GST_PAD_PROBE_OK;
}
KmsSerializableMeta *
kms_buffer_add_serializable_meta (GstBuffer * buffer, GstStructure * data)
{
  KmsSerializableMeta *meta;

  g_return_val_if_fail (GST_IS_BUFFER (buffer), NULL);

  meta = (KmsSerializableMeta *) gst_buffer_get_meta (buffer,
      KMS_SERIALIZABLE_META_API_TYPE);

  if (meta != NULL) {
    gst_structure_foreach (data, add_fields_to_structure, meta->data);
    gst_structure_free (data);

  } else {
    meta = (KmsSerializableMeta *) gst_buffer_add_meta (buffer,
        KMS_SERIALIZABLE_META_INFO, NULL);

    meta->data = data;
  }

  return meta;
}
KmsSerializableMeta *
kms_buffer_get_serializable_meta (GstBuffer * b)
{
  return ((KmsSerializableMeta *) gst_buffer_get_meta ((b),
          KMS_SERIALIZABLE_META_API_TYPE));
}