mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-22 09:41:07 +00:00
tensormeta: Add APIs to create and access GstTensorMeta contents
Also document those APIs better. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6000>
This commit is contained in:
parent
5e73e8e1b3
commit
d934ea3f7a
4 changed files with 89 additions and 11 deletions
|
@ -174,8 +174,6 @@ GstTensorDim * gst_tensor_get_dims (GstTensor * tensor, gsize * num_dims);
|
||||||
GST_ANALYTICS_META_API
|
GST_ANALYTICS_META_API
|
||||||
GType gst_tensor_get_type (void);
|
GType gst_tensor_get_type (void);
|
||||||
|
|
||||||
#define GST_TENSOR_MISSING_ID -1
|
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* __GST_TENSOR_H__ */
|
#endif /* __GST_TENSOR_H__ */
|
||||||
|
|
|
@ -44,6 +44,11 @@ gst_tensor_meta_free (GstMeta * meta, GstBuffer * buffer)
|
||||||
g_free (tmeta->tensors);
|
g_free (tmeta->tensors);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_tensor_meta_api_get_type: (skip)
|
||||||
|
*
|
||||||
|
* Since: 1.26
|
||||||
|
*/
|
||||||
GType
|
GType
|
||||||
gst_tensor_meta_api_get_type (void)
|
gst_tensor_meta_api_get_type (void)
|
||||||
{
|
{
|
||||||
|
@ -123,6 +128,64 @@ gst_buffer_get_tensor_meta (GstBuffer * buffer)
|
||||||
GST_TENSOR_META_API_TYPE);
|
GST_TENSOR_META_API_TYPE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_tensor_meta_set:
|
||||||
|
* @tmeta: a #GstTensorMeta
|
||||||
|
* @num_tensors: The number of tensors in the @tensors array
|
||||||
|
* @tensors: (in) (array length=num_tensors) (transfer full): An array of poiners to #GstTensor
|
||||||
|
*
|
||||||
|
* Sets tensors into the #GstTensorMeta
|
||||||
|
*
|
||||||
|
* Since: 1.26
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
gst_tensor_meta_set (GstTensorMeta * tmeta, guint num_tensors,
|
||||||
|
GstTensor ** tensors)
|
||||||
|
{
|
||||||
|
guint i;
|
||||||
|
|
||||||
|
for (i = 0; i < tmeta->num_tensors; i++) {
|
||||||
|
gst_tensor_free (tmeta->tensors[i]);
|
||||||
|
}
|
||||||
|
g_free (tmeta->tensors);
|
||||||
|
|
||||||
|
tmeta->num_tensors = num_tensors;
|
||||||
|
tmeta->tensors = tensors;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_tensor_meta_get:
|
||||||
|
* @tmeta: A #GstTensorMeta
|
||||||
|
* @index: The number of the tensor to get
|
||||||
|
*
|
||||||
|
* Retrieves a tensor from the #GstTensorMeta, the index must be
|
||||||
|
* smaller than #GstTensorMeta.num_tensors
|
||||||
|
*
|
||||||
|
* Return: (transfer none): a GstTensor
|
||||||
|
*
|
||||||
|
* Since: 1.26
|
||||||
|
*/
|
||||||
|
const GstTensor *
|
||||||
|
gst_tensor_meta_get (GstTensorMeta * tmeta, gsize index)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (tmeta->tensors, NULL);
|
||||||
|
g_return_val_if_fail (index < tmeta->num_tensors, NULL);
|
||||||
|
|
||||||
|
return tmeta->tensors[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_tensor_meta_get_index_from_id:
|
||||||
|
* @meta: a #GstTensorMeta
|
||||||
|
* @id: The tensor id to look for
|
||||||
|
*
|
||||||
|
* Finds the first tensor with the requsted ID in the meta
|
||||||
|
*
|
||||||
|
* Return: The index of the tensor inthe meta, or -1 if
|
||||||
|
* its not found.
|
||||||
|
*
|
||||||
|
* Since: 1.26
|
||||||
|
*/
|
||||||
gint
|
gint
|
||||||
gst_tensor_meta_get_index_from_id (GstTensorMeta * meta, GQuark id)
|
gst_tensor_meta_get_index_from_id (GstTensorMeta * meta, GQuark id)
|
||||||
{
|
{
|
||||||
|
@ -131,5 +194,5 @@ gst_tensor_meta_get_index_from_id (GstTensorMeta * meta, GQuark id)
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
return GST_TENSOR_MISSING_ID;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,9 +49,23 @@ typedef struct _GstTensorMeta
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GST_TENSOR_META_API_TYPE:
|
||||||
|
*
|
||||||
|
* The Tensor Meta API type
|
||||||
|
*
|
||||||
|
* Since: 1.26
|
||||||
|
*/
|
||||||
#define GST_TENSOR_META_API_TYPE \
|
#define GST_TENSOR_META_API_TYPE \
|
||||||
(gst_tensor_meta_api_get_type())
|
(gst_tensor_meta_api_get_type())
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GST_TENSOR_META_INFO: (skip)
|
||||||
|
*
|
||||||
|
* The Tensor Meta API Info
|
||||||
|
*
|
||||||
|
* Since: 1.26
|
||||||
|
*/
|
||||||
#define GST_TENSOR_META_INFO \
|
#define GST_TENSOR_META_INFO \
|
||||||
(gst_tensor_meta_get_info())
|
(gst_tensor_meta_get_info())
|
||||||
|
|
||||||
|
@ -61,6 +75,13 @@ GType gst_tensor_meta_api_get_type (void);
|
||||||
GST_ANALYTICS_META_API
|
GST_ANALYTICS_META_API
|
||||||
const GstMetaInfo *gst_tensor_meta_get_info (void);
|
const GstMetaInfo *gst_tensor_meta_get_info (void);
|
||||||
|
|
||||||
|
GST_ANALYTICS_META_API
|
||||||
|
void gst_tensor_meta_set (GstTensorMeta *tmeta, guint num_tensors,
|
||||||
|
GstTensor **tensors);
|
||||||
|
|
||||||
|
GST_ANALYTICS_META_API
|
||||||
|
const GstTensor *gst_tensor_meta_get (GstTensorMeta *tmeta, gsize index);
|
||||||
|
|
||||||
GST_ANALYTICS_META_API
|
GST_ANALYTICS_META_API
|
||||||
gint gst_tensor_meta_get_index_from_id(GstTensorMeta *meta, GQuark id);
|
gint gst_tensor_meta_get_index_from_id(GstTensorMeta *meta, GQuark id);
|
||||||
|
|
||||||
|
|
|
@ -338,12 +338,10 @@ gst_ssd_object_detector_get_tensor_meta (GstSsdObjectDetector * object_detector,
|
||||||
gint clasesIndex = gst_tensor_meta_get_index_from_id (tensor_meta,
|
gint clasesIndex = gst_tensor_meta_get_index_from_id (tensor_meta,
|
||||||
g_quark_from_static_string (GST_MODEL_OBJECT_DETECTOR_CLASSES));
|
g_quark_from_static_string (GST_MODEL_OBJECT_DETECTOR_CLASSES));
|
||||||
|
|
||||||
if (boxesIndex == GST_TENSOR_MISSING_ID
|
if (boxesIndex == -1 || scoresIndex == -1 || numDetectionsIndex == -1)
|
||||||
|| scoresIndex == GST_TENSOR_MISSING_ID
|
|
||||||
|| numDetectionsIndex == GST_TENSOR_MISSING_ID)
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (tensor_meta->num_tensors == 4 && clasesIndex == GST_TENSOR_MISSING_ID)
|
if (tensor_meta->num_tensors == 4 && clasesIndex == -1)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
return tensor_meta;
|
return tensor_meta;
|
||||||
|
@ -435,9 +433,7 @@ DEFINE_GET_FUNC (guint32, UINT32_MAX)
|
||||||
boxes_index = gst_tensor_meta_get_index_from_id (tmeta,
|
boxes_index = gst_tensor_meta_get_index_from_id (tmeta,
|
||||||
g_quark_from_static_string (GST_MODEL_OBJECT_DETECTOR_BOXES));
|
g_quark_from_static_string (GST_MODEL_OBJECT_DETECTOR_BOXES));
|
||||||
|
|
||||||
if (numdetect_index == GST_TENSOR_MISSING_ID
|
if (numdetect_index == -1 || scores_index == -1 || numdetect_index == -1) {
|
||||||
|| scores_index == GST_TENSOR_MISSING_ID
|
|
||||||
|| numdetect_index == GST_TENSOR_MISSING_ID) {
|
|
||||||
GST_WARNING ("Missing tensor data expected for SSD model");
|
GST_WARNING ("Missing tensor data expected for SSD model");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -463,7 +459,7 @@ DEFINE_GET_FUNC (guint32, UINT32_MAX)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (classes_index != GST_TENSOR_MISSING_ID &&
|
if (classes_index != -1 &&
|
||||||
!gst_buffer_map (tmeta->tensors[classes_index]->data, &classes_map,
|
!gst_buffer_map (tmeta->tensors[classes_index]->data, &classes_map,
|
||||||
GST_MAP_READ)) {
|
GST_MAP_READ)) {
|
||||||
GST_DEBUG_OBJECT (self, "Failed to map tensor memory for index %d",
|
GST_DEBUG_OBJECT (self, "Failed to map tensor memory for index %d",
|
||||||
|
|
Loading…
Reference in a new issue