• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }