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 buffer_meta->pixelFormat = 0;
33 buffer_meta->width = 0;
34 buffer_meta->height = 0;
35 buffer_meta->invalidpts = FALSE;
36
37 return TRUE;
38 }
39
gst_buffer_type_meta_api_get_type(void)40 GType gst_buffer_type_meta_api_get_type(void)
41 {
42 static volatile GType type = 0;
43 static const gchar *tags[] = { GST_META_TAG_MEMORY_STR, NULL };
44 if (g_once_init_enter(&type)) {
45 GType _type = gst_meta_api_type_register("GstBufferTypeMetaAPI", tags);
46 g_once_init_leave(&type, _type);
47 }
48 return type;
49 }
50
gst_buffer_type_meta_transform(GstBuffer * dest,GstMeta * meta,GstBuffer * buffer,GQuark type,gpointer data)51 static gboolean gst_buffer_type_meta_transform(GstBuffer *dest, GstMeta *meta,
52 GstBuffer *buffer, GQuark type, gpointer data)
53 {
54 g_return_val_if_fail(dest != NULL, FALSE);
55 g_return_val_if_fail(meta != NULL, FALSE);
56 g_return_val_if_fail(data != NULL, FALSE);
57 g_return_val_if_fail(buffer != NULL, FALSE);
58 GstBufferTypeMeta *sMeta = (GstBufferTypeMeta *)meta;
59
60 if (GST_META_TRANSFORM_IS_COPY(type)) {
61 GstMetaTransformCopy *copy = data;
62
63 if (!copy->region) {
64 GstBufferTypeMeta *dMeta = (GstBufferTypeMeta *)gst_buffer_add_meta(dest, GST_BUFFER_TYPE_META_INFO, NULL);
65 if (!dMeta) {
66 return FALSE;
67 }
68 dMeta->type = sMeta->type;
69 dMeta->buf = sMeta->buf;
70 dMeta->offset = sMeta->offset;
71 dMeta->length = sMeta->length;
72 dMeta->totalSize = sMeta->totalSize;
73 dMeta->fenceFd = sMeta->fenceFd;
74 dMeta->memFlag = sMeta->memFlag;
75 dMeta->bufferFlag = sMeta->bufferFlag;
76 dMeta->pixelFormat = sMeta->pixelFormat;
77 dMeta->width = sMeta->width;
78 dMeta->height = sMeta->height;
79 dMeta->invalidpts = sMeta->invalidpts;
80 }
81 } else {
82 return FALSE;
83 }
84 return TRUE;
85 }
86
gst_buffer_type_meta_get_info(void)87 const GstMetaInfo *gst_buffer_type_meta_get_info(void)
88 {
89 static const GstMetaInfo *buffer_type_meta_info = NULL;
90
91 if (g_once_init_enter((GstMetaInfo **)&buffer_type_meta_info)) {
92 const GstMetaInfo *meta = gst_meta_register(GST_BUFFER_TYPE_META_API_TYPE, "GstBufferTypeMeta",
93 sizeof(GstBufferTypeMeta), (GstMetaInitFunction)gst_buffer_type_meta_init,
94 (GstMetaFreeFunction)NULL, gst_buffer_type_meta_transform);
95 g_once_init_leave((GstMetaInfo **)&buffer_type_meta_info, (GstMetaInfo *)meta);
96 }
97 return buffer_type_meta_info;
98 }
99
gst_buffer_get_buffer_type_meta(GstBuffer * buffer)100 GstBufferTypeMeta *gst_buffer_get_buffer_type_meta(GstBuffer *buffer)
101 {
102 g_return_val_if_fail(buffer != NULL, NULL);
103 gpointer state = NULL;
104 GstBufferTypeMeta *buffer_meta = NULL;
105 GstMeta *meta;
106 const GstMetaInfo *info = GST_BUFFER_TYPE_META_INFO;
107
108 while ((meta = gst_buffer_iterate_meta(buffer, &state))) {
109 if (meta->info->api == info->api) {
110 buffer_meta = (GstBufferTypeMeta *)meta;
111 return buffer_meta;
112 }
113 }
114 return buffer_meta;
115 }
116
gst_buffer_add_buffer_vir_meta(GstBuffer * buffer,intptr_t buf,uint32_t bufferFlag)117 GstBufferTypeMeta *gst_buffer_add_buffer_vir_meta(GstBuffer *buffer, intptr_t buf, uint32_t bufferFlag)
118 {
119 g_return_val_if_fail(buffer != NULL, NULL);
120 GstBufferTypeMeta *buffer_meta = NULL;
121
122 buffer_meta = (GstBufferTypeMeta *)gst_buffer_add_meta(buffer, GST_BUFFER_TYPE_META_INFO, NULL);
123 g_return_val_if_fail(buffer_meta != NULL, buffer_meta);
124
125 buffer_meta->type = BUFFER_TYPE_VIR;
126 buffer_meta->buf = buf;
127 buffer_meta->bufferFlag = bufferFlag;
128 return buffer_meta;
129 }
130
gst_buffer_add_buffer_handle_meta(GstBuffer * buffer,intptr_t buf,GstBufferHandleConfig config)131 GstBufferTypeMeta *gst_buffer_add_buffer_handle_meta(GstBuffer *buffer, intptr_t buf,
132 GstBufferHandleConfig config)
133 {
134 g_return_val_if_fail(buffer != NULL, NULL);
135 GstBufferTypeMeta *buffer_meta = NULL;
136
137 buffer_meta = (GstBufferTypeMeta *)gst_buffer_add_meta(buffer, GST_BUFFER_TYPE_META_INFO, NULL);
138 g_return_val_if_fail(buffer_meta != NULL, buffer_meta);
139
140 buffer_meta->type = BUFFER_TYPE_HANDLE;
141 buffer_meta->buf = buf;
142 buffer_meta->bufLen = config.bufLen;
143 buffer_meta->fenceFd = config.fenceFd;
144 buffer_meta->bufferFlag = config.bufferFlag;
145 buffer_meta->pixelFormat = config.pixelFormat;
146 buffer_meta->length = config.length;
147 buffer_meta->width = config.width;
148 buffer_meta->height = config.height;
149 return buffer_meta;
150 }
151
gst_buffer_add_buffer_fd_meta(GstBuffer * buffer,intptr_t buf,GstBufferFdConfig config)152 GstBufferTypeMeta *gst_buffer_add_buffer_fd_meta(GstBuffer *buffer, intptr_t buf, GstBufferFdConfig config)
153 {
154 g_return_val_if_fail(buffer != NULL, NULL);
155 GstBufferTypeMeta *buffer_meta = NULL;
156
157 buffer_meta = (GstBufferTypeMeta *)gst_buffer_add_meta(buffer, GST_BUFFER_TYPE_META_INFO, NULL);
158 g_return_val_if_fail(buffer_meta != NULL, buffer_meta);
159
160 buffer_meta->type = BUFFER_TYPE_AVSHMEM;
161 buffer_meta->buf = buf;
162 buffer_meta->bufLen = config.bufLen;
163 buffer_meta->offset = config.offset;
164 buffer_meta->length = config.length;
165 buffer_meta->totalSize = config.totalSize;
166 buffer_meta->memFlag = config.memFlag;
167 buffer_meta->bufferFlag = config.bufferFlag;
168 return buffer_meta;
169 }