static gboolean gst_video_gl_texture_upload_meta_transform (GstBuffer * dest, GstMeta * meta, GstBuffer * buffer, GQuark type, gpointer data) { GstVideoGLTextureUploadMeta *dmeta, *smeta; smeta = (GstVideoGLTextureUploadMeta *) meta; if (GST_META_TRANSFORM_IS_COPY (type)) { GstMetaTransformCopy *copy = data; if (!copy->region) { /* only copy if the complete data is copied as well */ dmeta = (GstVideoGLTextureUploadMeta *) gst_buffer_add_meta (dest, GST_VIDEO_GL_TEXTURE_UPLOAD_META_INFO, NULL); if (!dmeta) return FALSE; dmeta->texture_orientation = smeta->texture_orientation; dmeta->n_textures = smeta->n_textures; memcpy (dmeta->texture_type, smeta->texture_type, sizeof (smeta->texture_type[0]) * 4); dmeta->buffer = dest; dmeta->upload = smeta->upload; dmeta->user_data = smeta->user_data; dmeta->user_data_copy = smeta->user_data_copy; dmeta->user_data_free = smeta->user_data_free; if (dmeta->user_data_copy) dmeta->user_data = dmeta->user_data_copy (dmeta->user_data); } } return TRUE; }
static gboolean gst_audio_clipping_meta_transform (GstBuffer * dest, GstMeta * meta, GstBuffer * buffer, GQuark type, gpointer data) { GstAudioClippingMeta *smeta, *dmeta; smeta = (GstAudioClippingMeta *) meta; if (GST_META_TRANSFORM_IS_COPY (type)) { GstMetaTransformCopy *copy = data; if (copy->region) return FALSE; dmeta = gst_buffer_add_audio_clipping_meta (dest, smeta->format, smeta->start, smeta->end); if (!dmeta) return FALSE; } else { /* TODO: Could implement an automatic transform for resampling */ /* return FALSE, if transform type is not supported */ return FALSE; } return TRUE; }
static gboolean _gst_gl_sync_meta_transform (GstBuffer * dest, GstMeta * meta, GstBuffer * buffer, GQuark type, gpointer data) { GstGLSyncMeta *dmeta, *smeta; smeta = (GstGLSyncMeta *) meta; if (GST_META_TRANSFORM_IS_COPY (type)) { GstMetaTransformCopy *copy = data; if (!copy->region) { /* only copy if the complete data is copied as well */ dmeta = gst_buffer_add_gl_sync_meta (smeta->context, dest); if (!dmeta) return FALSE; GST_LOG ("copy sync object %p from meta %p to %p", smeta->glsync, smeta, dmeta); /* Setting a sync point here relies on GstBuffer copying * metas after data */ gst_gl_sync_meta_set_sync_point (dmeta, smeta->context); } } else { /* return FALSE, if transform type is not supported */ return FALSE; } return TRUE; }
static gboolean gst_vaapi_video_meta_holder_transform (GstBuffer * dst_buffer, GstMeta * meta, GstBuffer * src_buffer, GQuark type, gpointer data) { GstVaapiVideoMetaHolder *const src_meta = GST_VAAPI_VIDEO_META_HOLDER (meta); if (GST_META_TRANSFORM_IS_COPY (type)) { GstVaapiVideoMeta *const dst_meta = gst_vaapi_video_meta_copy (src_meta->meta); gst_buffer_set_vaapi_video_meta (dst_buffer, dst_meta); gst_vaapi_video_meta_unref (dst_meta); return TRUE; } return FALSE; }
static gboolean kms_buffer_latency_meta_transform (GstBuffer * transbuf, GstMeta * meta, GstBuffer * buffer, GQuark type, gpointer data) { KmsBufferLatencyMeta *lmeta; /* we always copy no matter what transform */ if (GST_META_TRANSFORM_IS_COPY (type)) { lmeta = (KmsBufferLatencyMeta *) meta; GST_DEBUG ("copy latency metadata"); kms_buffer_add_buffer_latency_meta (transbuf, lmeta->ts, lmeta->valid, lmeta->type); } return TRUE; }
static gboolean gst_video_affine_transformation_meta_transform (GstBuffer * dest, GstMeta * meta, GstBuffer * buffer, GQuark type, gpointer data) { GstVideoAffineTransformationMeta *dmeta, *smeta; smeta = (GstVideoAffineTransformationMeta *) meta; if (GST_META_TRANSFORM_IS_COPY (type)) { dmeta = (GstVideoAffineTransformationMeta *) gst_buffer_add_meta (dest, GST_VIDEO_AFFINE_TRANSFORMATION_META_INFO, NULL); if (!dmeta) return FALSE; memcpy (dmeta->matrix, smeta->matrix, sizeof (dmeta->matrix[0]) * 16); } return TRUE; }
static gboolean gst_video_meta_transform (GstBuffer * dest, GstMeta * meta, GstBuffer * buffer, GQuark type, gpointer data) { GstVideoMeta *dmeta, *smeta; guint i; smeta = (GstVideoMeta *) meta; if (GST_META_TRANSFORM_IS_COPY (type)) { GstMetaTransformCopy *copy = data; if (!copy->region) { /* only copy if the complete data is copied as well */ dmeta = (GstVideoMeta *) gst_buffer_add_meta (dest, GST_VIDEO_META_INFO, NULL); if (!dmeta) return FALSE; dmeta->buffer = dest; GST_DEBUG ("copy video metadata"); dmeta->flags = smeta->flags; dmeta->format = smeta->format; dmeta->id = smeta->id; dmeta->width = smeta->width; dmeta->height = smeta->height; dmeta->n_planes = smeta->n_planes; for (i = 0; i < dmeta->n_planes; i++) { dmeta->offset[i] = smeta->offset[i]; dmeta->stride[i] = smeta->stride[i]; } dmeta->map = smeta->map; dmeta->unmap = smeta->unmap; } } return TRUE; }
static gboolean gst_audio_downmix_meta_transform (GstBuffer * dest, GstMeta * meta, GstBuffer * buffer, GQuark type, gpointer data) { GstAudioDownmixMeta *smeta, *dmeta; smeta = (GstAudioDownmixMeta *) meta; if (GST_META_TRANSFORM_IS_COPY (type)) { dmeta = gst_buffer_add_audio_downmix_meta (dest, smeta->from_position, smeta->from_channels, smeta->to_position, smeta->to_channels, (const gfloat **) smeta->matrix); if (!dmeta) return FALSE; } else { /* return FALSE, if transform type is not supported */ return FALSE; } return TRUE; }
static gboolean kms_serializable_meta_transform (GstBuffer * transbuf, GstMeta * meta, GstBuffer * buffer, GQuark type, gpointer data) { KmsSerializableMeta *smeta; if (GST_META_TRANSFORM_IS_COPY (type)) { GstStructure *copy = NULL; smeta = (KmsSerializableMeta *) meta; if (smeta->data != NULL) { copy = gst_structure_copy (smeta->data); } GST_DEBUG ("copy serializable metadata"); kms_buffer_add_serializable_meta (transbuf, copy); } return TRUE; }
static gboolean gst_frame_positionner_meta_transform (GstBuffer * dest, GstMeta * meta, GstBuffer * buffer, GQuark type, gpointer data) { GstFramePositionnerMeta *dmeta, *smeta; smeta = (GstFramePositionnerMeta *) meta; if (GST_META_TRANSFORM_IS_COPY (type)) { /* only copy if the complete data is copied as well */ dmeta = (GstFramePositionnerMeta *) gst_buffer_add_meta (dest, gst_frame_positionner_get_info (), NULL); dmeta->alpha = smeta->alpha; dmeta->posx = smeta->posx; dmeta->posy = smeta->posy; dmeta->zorder = smeta->zorder; } return TRUE; }
static gboolean gst_protection_meta_transform (GstBuffer * transbuf, GstMeta * meta, GstBuffer * buffer, GQuark type, gpointer data) { GstProtectionMeta *protection_meta = (GstProtectionMeta *) meta; if (GST_META_TRANSFORM_IS_COPY (type)) { GstMetaTransformCopy *copy = data; if (!copy->region) { /* only copy if the complete data is copied as well */ gst_buffer_add_protection_meta (transbuf, gst_structure_copy (protection_meta->info)); } else { return FALSE; } } else { /* transform type not supported */ return FALSE; } return TRUE; }
static gboolean gst_video_region_of_interest_meta_transform (GstBuffer * dest, GstMeta * meta, GstBuffer * buffer, GQuark type, gpointer data) { GstVideoRegionOfInterestMeta *dmeta, *smeta; if (GST_META_TRANSFORM_IS_COPY (type)) { smeta = (GstVideoRegionOfInterestMeta *) meta; GST_DEBUG ("copy region of interest metadata"); dmeta = gst_buffer_add_video_region_of_interest_meta_id (dest, smeta->roi_type, smeta->x, smeta->y, smeta->w, smeta->h); dmeta->id = smeta->id; dmeta->parent_id = smeta->parent_id; } else if (GST_VIDEO_META_TRANSFORM_IS_SCALE (type)) { GstVideoMetaTransform *trans = data; gint ow, oh, nw, nh; ow = GST_VIDEO_INFO_WIDTH (trans->in_info); nw = GST_VIDEO_INFO_WIDTH (trans->out_info); oh = GST_VIDEO_INFO_HEIGHT (trans->in_info); nh = GST_VIDEO_INFO_HEIGHT (trans->out_info); GST_DEBUG ("scaling region of interest metadata %dx%d -> %dx%d", ow, oh, nw, nh); smeta = (GstVideoRegionOfInterestMeta *) meta; dmeta = gst_buffer_add_video_region_of_interest_meta_id (dest, smeta->roi_type, (smeta->x * nw) / ow, (smeta->y * nh) / oh, (smeta->w * nw) / ow, (smeta->h * nh) / oh); dmeta->id = smeta->id; dmeta->parent_id = smeta->parent_id; GST_DEBUG ("region of interest (id:%d, parent id:%d) offset %dx%d -> %dx%d", smeta->id, smeta->parent_id, smeta->x, smeta->y, dmeta->x, dmeta->y); GST_DEBUG ("region of interest size %dx%d -> %dx%d", smeta->w, smeta->h, dmeta->w, dmeta->h); } return TRUE; }
static gboolean gst_video_crop_meta_transform (GstBuffer * dest, GstMeta * meta, GstBuffer * buffer, GQuark type, gpointer data) { GstVideoCropMeta *dmeta, *smeta; if (GST_META_TRANSFORM_IS_COPY (type)) { smeta = (GstVideoCropMeta *) meta; dmeta = gst_buffer_add_video_crop_meta (dest); GST_DEBUG ("copy crop metadata"); dmeta->x = smeta->x; dmeta->y = smeta->y; dmeta->width = smeta->width; dmeta->height = smeta->height; } else if (GST_VIDEO_META_TRANSFORM_IS_SCALE (type)) { GstVideoMetaTransform *trans = data; gint ow, oh, nw, nh; smeta = (GstVideoCropMeta *) meta; dmeta = gst_buffer_add_video_crop_meta (dest); ow = GST_VIDEO_INFO_WIDTH (trans->in_info); nw = GST_VIDEO_INFO_WIDTH (trans->out_info); oh = GST_VIDEO_INFO_HEIGHT (trans->in_info); nh = GST_VIDEO_INFO_HEIGHT (trans->out_info); GST_DEBUG ("scaling crop metadata %dx%d -> %dx%d", ow, oh, nw, nh); dmeta->x = (smeta->x * nw) / ow; dmeta->y = (smeta->y * nh) / oh; dmeta->width = (smeta->width * nw) / ow; dmeta->height = (smeta->height * nh) / oh; GST_DEBUG ("crop offset %dx%d -> %dx%d", smeta->x, smeta->y, dmeta->x, dmeta->y); GST_DEBUG ("crop size %dx%d -> %dx%d", smeta->width, smeta->height, dmeta->width, dmeta->height); } return TRUE; }
static gboolean _gst_gl_sync_meta_transform (GstBuffer * dest, GstMeta * meta, GstBuffer * buffer, GQuark type, gpointer data) { GstGLSyncMeta *dmeta, *smeta; smeta = (GstGLSyncMeta *) meta; if (GST_META_TRANSFORM_IS_COPY (type)) { GstMetaTransformCopy *copy = data; g_assert (smeta->copy != NULL); if (!copy->region) { /* only copy if the complete data is copied as well */ dmeta = gst_buffer_add_gl_sync_meta_full (smeta->context, dest, NULL); if (!dmeta) return FALSE; dmeta->set_sync = smeta->set_sync; dmeta->set_sync_gl = smeta->set_sync_gl; dmeta->wait = smeta->wait; dmeta->wait_gl = smeta->wait_gl; dmeta->wait_cpu = smeta->wait_cpu; dmeta->wait_cpu_gl = smeta->wait_cpu_gl; dmeta->copy = smeta->copy; dmeta->free = smeta->free; dmeta->free_gl = smeta->free_gl; GST_LOG ("copying sync meta %p into %p", smeta, dmeta); smeta->copy (smeta, buffer, dmeta, dest); } } else { /* return FALSE, if transform type is not supported */ return FALSE; } return TRUE; }
static gboolean gst_imx_phys_meta_transform(GstBuffer *dest, GstMeta *meta, GstBuffer *buffer, GQuark type, gpointer data) { GstImxPhysMemMeta *dmeta, *smeta; smeta = (GstImxPhysMemMeta *)meta; if (GST_META_TRANSFORM_IS_COPY(type)) { GstMetaTransformCopy *copy = data; gboolean do_copy = FALSE; if (!(copy->region)) { GST_LOG("not copying metadata: only a region is being copied (not the entire block)"); } else { guint n_mem_buffer, n_mem_dest; n_mem_buffer = gst_buffer_n_memory(buffer); n_mem_dest = gst_buffer_n_memory(dest); /* only copy if both buffers have 1 identical memory */ if ((n_mem_buffer == n_mem_dest) && (n_mem_dest == 1)) { GstMemory *mem1, *mem2; mem1 = gst_buffer_get_memory(dest, 0); mem2 = gst_buffer_get_memory(buffer, 0); if (mem1 == mem2) { GST_LOG("copying physmem metadata: memory blocks identical"); do_copy = TRUE; } else GST_LOG("not copying physmem metadata: memory blocks not identical"); gst_memory_unref(mem1); gst_memory_unref(mem2); } else GST_LOG("not copying physmem metadata: num memory blocks in source/dest: %u/%u", n_mem_buffer, n_mem_dest); } if (do_copy) { /* only copy if the complete data is copied as well */ dmeta = (GstImxPhysMemMeta *)gst_buffer_add_meta(dest, gst_imx_phys_mem_meta_get_info(), NULL); if (!dmeta) { GST_ERROR("could not add physmem metadata to the dest buffer"); return FALSE; } dmeta->phys_addr = smeta->phys_addr; dmeta->x_padding = smeta->x_padding; dmeta->y_padding = smeta->y_padding; if (smeta->parent) dmeta->parent = gst_buffer_ref(smeta->parent); else dmeta->parent = gst_buffer_ref(buffer); } } return TRUE; }