• 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 
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 }