1 /*
2 * Copyright (C) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "buffer_type_meta.h"
17
gst_buffer_type_meta_init(GstMeta * meta,gpointer params,GstBuffer * buffer)18 static gboolean gst_buffer_type_meta_init(GstMeta *meta, gpointer params, GstBuffer *buffer)
19 {
20 (void)params;
21 (void)buffer;
22 g_return_val_if_fail(meta != NULL, FALSE);
23 GstBufferTypeMeta *buffer_meta = (GstBufferTypeMeta *)meta;
24 buffer_meta->type = BUFFER_TYPE_VIR;
25 buffer_meta->buf = (intptr_t)0;
26 buffer_meta->offset = 0;
27 buffer_meta->length = 0;
28 buffer_meta->totalSize = 0;
29 buffer_meta->fenceFd = -1;
30 buffer_meta->memFlag = 0;
31 buffer_meta->bufferFlag = 0;
32
33 return TRUE;
34 }
35
gst_buffer_type_meta_api_get_type(void)36 GType gst_buffer_type_meta_api_get_type(void)
37 {
38 static volatile GType type = 0;
39 static const gchar *tags[] = { GST_META_TAG_MEMORY_STR, NULL };
40 if (g_once_init_enter (&type)) {
41 GType _type = gst_meta_api_type_register ("GstBufferTypeMetaAPI", tags);
42 g_once_init_leave (&type, _type);
43 }
44 return type;
45 }
46
gst_buffer_type_meta_transform(GstBuffer * dest,GstMeta * meta,GstBuffer * buffer,GQuark type,gpointer data)47 static gboolean gst_buffer_type_meta_transform(GstBuffer *dest, GstMeta *meta,
48 GstBuffer *buffer, GQuark type, gpointer data)
49 {
50 g_return_val_if_fail(dest != NULL, FALSE);
51 g_return_val_if_fail(meta != NULL, FALSE);
52 g_return_val_if_fail(data != NULL, FALSE);
53 g_return_val_if_fail(buffer != NULL, FALSE);
54 GstBufferTypeMeta *dMeta, *sMeta;
55 sMeta = (GstBufferTypeMeta *)meta;
56
57 if (GST_META_TRANSFORM_IS_COPY (type)) {
58 GstMetaTransformCopy *copy = data;
59
60 if (!copy->region) {
61 dMeta = (GstBufferTypeMeta *)gst_buffer_add_meta(dest, GST_BUFFER_TYPE_META_INFO, NULL);
62 if (!dMeta) {
63 return FALSE;
64 }
65 dMeta->type = sMeta->type;
66 dMeta->buf = sMeta->buf;
67 dMeta->offset = sMeta->offset;
68 dMeta->length = sMeta->length;
69 dMeta->totalSize = sMeta->totalSize;
70 dMeta->fenceFd = sMeta->fenceFd;
71 dMeta->memFlag = sMeta->memFlag;
72 dMeta->bufferFlag = sMeta->bufferFlag;
73 }
74 } else {
75 return FALSE;
76 }
77 return TRUE;
78 }
79
gst_buffer_type_meta_get_info(void)80 const GstMetaInfo *gst_buffer_type_meta_get_info(void)
81 {
82 static const GstMetaInfo *buffer_type_meta_info = NULL;
83
84 if (g_once_init_enter ((GstMetaInfo **)&buffer_type_meta_info)) {
85 const GstMetaInfo *meta = gst_meta_register(GST_BUFFER_TYPE_META_API_TYPE, "GstBufferTypeMeta",
86 sizeof(GstBufferTypeMeta), (GstMetaInitFunction)gst_buffer_type_meta_init,
87 (GstMetaFreeFunction)NULL, gst_buffer_type_meta_transform);
88 g_once_init_leave ((GstMetaInfo **)&buffer_type_meta_info, (GstMetaInfo *)meta);
89 }
90 return buffer_type_meta_info;
91 }
92
gst_buffer_get_buffer_type_meta(GstBuffer * buffer)93 GstBufferTypeMeta *gst_buffer_get_buffer_type_meta(GstBuffer *buffer)
94 {
95 g_return_val_if_fail(buffer != NULL, FALSE);
96 gpointer state = NULL;
97 GstBufferTypeMeta *buffer_meta = NULL;
98 GstMeta *meta;
99 const GstMetaInfo *info = GST_BUFFER_TYPE_META_INFO;
100
101 while ((meta = gst_buffer_iterate_meta(buffer, &state))) {
102 if (meta->info->api == info->api) {
103 buffer_meta = (GstBufferTypeMeta *)meta;
104 return buffer_meta;
105 }
106 }
107 return buffer_meta;
108 }
109
gst_buffer_add_buffer_vir_meta(GstBuffer * buffer,intptr_t buf,uint32_t bufferFlag)110 GstBufferTypeMeta *gst_buffer_add_buffer_vir_meta(GstBuffer *buffer, intptr_t buf, uint32_t bufferFlag)
111 {
112 g_return_val_if_fail(buffer != NULL, FALSE);
113 GstBufferTypeMeta *buffer_meta = NULL;
114
115 buffer_meta = (GstBufferTypeMeta *)gst_buffer_add_meta(buffer, GST_BUFFER_TYPE_META_INFO, NULL);
116 g_return_val_if_fail(buffer_meta != NULL, buffer_meta);
117
118 buffer_meta->type = BUFFER_TYPE_VIR;
119 buffer_meta->buf = buf;
120 buffer_meta->bufferFlag = bufferFlag;
121 return buffer_meta;
122 }
123
gst_buffer_add_buffer_handle_meta(GstBuffer * buffer,intptr_t buf,int32_t fenceFd,uint32_t bufferFlag)124 GstBufferTypeMeta *gst_buffer_add_buffer_handle_meta(GstBuffer *buffer, intptr_t buf,
125 int32_t fenceFd, uint32_t bufferFlag)
126 {
127 g_return_val_if_fail(buffer != NULL, FALSE);
128 GstBufferTypeMeta *buffer_meta = NULL;
129
130 buffer_meta = (GstBufferTypeMeta *)gst_buffer_add_meta(buffer, GST_BUFFER_TYPE_META_INFO, NULL);
131 g_return_val_if_fail(buffer_meta != NULL, buffer_meta);
132
133 buffer_meta->type = BUFFER_TYPE_HANDLE;
134 buffer_meta->buf = buf;
135 buffer_meta->fenceFd = fenceFd;
136 buffer_meta->bufferFlag = bufferFlag;
137 return buffer_meta;
138 }
139
gst_buffer_add_buffer_fd_meta(GstBuffer * buffer,intptr_t buf,GstBufferFdConfig config)140 GstBufferTypeMeta *gst_buffer_add_buffer_fd_meta(GstBuffer *buffer, intptr_t buf, GstBufferFdConfig config)
141 {
142 g_return_val_if_fail(buffer != NULL, FALSE);
143 GstBufferTypeMeta *buffer_meta = NULL;
144
145 buffer_meta = (GstBufferTypeMeta *)gst_buffer_add_meta(buffer, GST_BUFFER_TYPE_META_INFO, NULL);
146 g_return_val_if_fail(buffer_meta != NULL, buffer_meta);
147
148 buffer_meta->type = BUFFER_TYPE_AVSHMEM;
149 buffer_meta->buf = buf;
150 buffer_meta->offset = config.offset;
151 buffer_meta->length = config.length;
152 buffer_meta->totalSize = config.totalSize;
153 buffer_meta->memFlag = config.memFlag;
154 buffer_meta->bufferFlag = config.bufferFlag;
155 return buffer_meta;
156 }