From 76f71bac058c135ebba449d5e79177ad32e21ca7 Mon Sep 17 00:00:00 2001 From: Jaeyun Date: Mon, 29 Oct 2018 20:52:23 +0900 Subject: [PATCH] [Filter] remove nnfw callbacks from nnfw property structure refactor code to remove dependancy of nnfw callbacks Signed-off-by: Jaeyun Jung --- gst/tensor_filter/tensor_filter.c | 68 +++++++++++++++++++++------------------ gst/tensor_filter/tensor_filter.h | 2 ++ include/tensor_typedef.h | 4 --- 3 files changed, 38 insertions(+), 36 deletions(-) diff --git a/gst/tensor_filter/tensor_filter.c b/gst/tensor_filter/tensor_filter.c index 834e352..e8c8548 100644 --- a/gst/tensor_filter/tensor_filter.c +++ b/gst/tensor_filter/tensor_filter.c @@ -199,28 +199,35 @@ static gboolean gst_tensor_filter_start (GstBaseTransform * trans); static gboolean gst_tensor_filter_stop (GstBaseTransform * trans); /** - * @brief Invoke callbacks of filter->prop.fw. Guarantees calling open for the first call. + * @brief Open nn framework. */ -#define gst_tensor_filter_call(filter,ret,funcname,...) do { \ +#define gst_tensor_filter_open_fw(filter) do { \ if (filter->prop.fw_opened == FALSE) { \ - if (filter->prop.fw->open != NULL) \ - filter->prop.fw->open (filter, &filter->privateData); \ + if (filter->fw->open != NULL) \ + filter->fw->open (filter, &filter->privateData); \ filter->prop.fw_opened = TRUE; \ } \ - ret = filter->prop.fw->funcname (filter, &filter->privateData, __VA_ARGS__); \ - } while(0) + } while (0) /** * @brief Close nn framework. */ -#define gst_tensor_filter_close(filter) do { \ +#define gst_tensor_filter_close_fw(filter) do { \ g_assert (filter->prop.fw_opened); \ - if (filter->prop.fw->close) \ - filter->prop.fw->close (filter, &filter->privateData); \ + if (filter->fw->close) \ + filter->fw->close (filter, &filter->privateData); \ filter->prop.fw_opened = FALSE; \ } while (0) /** + * @brief Invoke callbacks of nn framework. Guarantees calling open for the first call. + */ +#define gst_tensor_filter_call(filter,ret,funcname,...) do { \ + gst_tensor_filter_open_fw (filter); \ + ret = filter->fw->funcname (filter, &filter->privateData, __VA_ARGS__); \ + } while (0) + +/** * @brief initialize the tensor_filter's class */ static void @@ -318,7 +325,6 @@ gst_tensor_filter_init (GstTensorFilter * self) /* init NNFW properties */ prop->nnfw = _T_F_UNDEFINED; - prop->fw = NULL; prop->fw_opened = FALSE; prop->input_configured = FALSE; prop->output_configured = FALSE; @@ -328,6 +334,7 @@ gst_tensor_filter_init (GstTensorFilter * self) gst_tensors_info_init (&prop->output_meta); /* init internal properties */ + self->fw = NULL; self->privateData = NULL; self->silent = TRUE; self->configured = FALSE; @@ -394,13 +401,13 @@ gst_tensor_filter_set_property (GObject * object, guint prop_id, g_assert (prop->nnfw != -1); g_assert (prop->nnfw != _T_F_UNDEFINED); g_assert (tensor_filter_supported[prop->nnfw] != NULL); - prop->fw = tensor_filter_supported[prop->nnfw]; - g_assert (prop->fw != NULL); + self->fw = tensor_filter_supported[prop->nnfw]; + g_assert (self->fw != NULL); /* See if mandatory methods are filled in */ - g_assert (prop->fw->invoke_NN); - g_assert ((prop->fw->getInputDimension && prop->fw->getOutputDimension) - || prop->fw->setInputDimension); + g_assert (self->fw->invoke_NN); + g_assert ((self->fw->getInputDimension && self->fw->getOutputDimension) + || self->fw->setInputDimension); break; case PROP_MODEL: g_assert (prop->model_file == NULL && value); @@ -645,15 +652,15 @@ gst_tensor_filter_transform (GstBaseTransform * trans, if (G_UNLIKELY (!self->configured)) goto unknown_format; - if (G_UNLIKELY (!prop->fw)) + if (G_UNLIKELY (!self->fw)) goto unknown_framework; if (G_UNLIKELY (!prop->model_file)) goto unknown_model; - if (G_UNLIKELY (!prop->fw->invoke_NN)) + if (G_UNLIKELY (!self->fw->invoke_NN)) goto unknown_invoke; /* 0. Check all properties. */ - silent_debug ("Invoking %s with %s model\n", prop->fw->name, + silent_debug ("Invoking %s with %s model\n", self->fw->name, prop->model_file); /* 1. Set input tensors from inbuf. */ @@ -678,7 +685,7 @@ gst_tensor_filter_transform (GstBaseTransform * trans, out_tensors[i].type = prop->output_meta.info[i].type; /* allocate memory if allocate_in_invoke is FALSE */ - if (prop->fw->allocate_in_invoke == FALSE) { + if (self->fw->allocate_in_invoke == FALSE) { out_mem[i] = gst_allocator_alloc (NULL, out_tensors[i].size, NULL); g_assert (gst_memory_map (out_mem[i], &out_info[i], GST_MAP_WRITE)); @@ -692,7 +699,7 @@ gst_tensor_filter_transform (GstBaseTransform * trans, /* 4. Update result and free map info. */ for (i = 0; i < prop->output_meta.num_tensors; i++) { - if (prop->fw->allocate_in_invoke) { + if (self->fw->allocate_in_invoke) { /* filter-subplugin allocated new memory, update this */ out_mem[i] = gst_memory_new_wrapped (0, out_tensors[i].data, out_tensors[i].size, @@ -760,7 +767,7 @@ gst_tensor_filter_load_tensor_info (GstTensorFilter * self) * supposed fixed in-tensor info if getInputDimension is defined. */ if (!prop->input_configured) { - if (prop->fw->getInputDimension) { + if (self->fw->getInputDimension) { GstTensorsInfo in_info; gst_tensors_info_init (&in_info); @@ -786,7 +793,7 @@ gst_tensor_filter_load_tensor_info (GstTensorFilter * self) * supposed fixed out-tensor info if getOutputDimension is defined. */ if (!prop->output_configured) { - if (prop->fw->getOutputDimension) { + if (self->fw->getOutputDimension) { GstTensorsInfo out_info; gst_tensors_info_init (&out_info); @@ -856,7 +863,7 @@ gst_tensor_filter_configure_tensor (GstTensorFilter * self, /** call setInputDimension if output tensor is not configured */ if (!prop->output_configured) { - if (prop->fw->setInputDimension) { + if (self->fw->setInputDimension) { GstTensorsInfo out_info; int res; @@ -996,7 +1003,7 @@ gst_tensor_filter_transform_caps (GstBaseTransform * trans, int res = -1; /* call setInputDimension with given input tensor */ - if (self->prop.fw->setInputDimension) { + if (self->fw->setInputDimension) { gst_tensor_filter_call (self, res, setInputDimension, &in_info, &config.info); } @@ -1145,16 +1152,11 @@ static gboolean gst_tensor_filter_start (GstBaseTransform * trans) { GstTensorFilter *self; - GstTensorFilterProperties *prop; self = GST_TENSOR_FILTER_CAST (trans); - prop = &self->prop; - - if (!prop->fw_opened && prop->fw->open) { - prop->fw->open (self, &self->privateData); - } - prop->fw_opened = TRUE; + g_assert (self->fw != NULL); + gst_tensor_filter_open_fw (self); return TRUE; } @@ -1170,9 +1172,11 @@ gst_tensor_filter_stop (GstBaseTransform * trans) GstTensorFilterProperties *prop; self = GST_TENSOR_FILTER_CAST (trans); + g_assert (self->fw != NULL); + prop = &self->prop; - gst_tensor_filter_close (self); + gst_tensor_filter_close_fw (self); if (prop->model_file) { g_free ((void *) prop->model_file); diff --git a/gst/tensor_filter/tensor_filter.h b/gst/tensor_filter/tensor_filter.h index 3663e37..0d01b18 100644 --- a/gst/tensor_filter/tensor_filter.h +++ b/gst/tensor_filter/tensor_filter.h @@ -50,6 +50,7 @@ G_BEGIN_DECLS typedef struct _GstTensorFilter GstTensorFilter; typedef struct _GstTensorFilterClass GstTensorFilterClass; +typedef struct _GstTensorFilterFramework GstTensorFilterFramework; extern const char *nnfw_names[]; @@ -62,6 +63,7 @@ struct _GstTensorFilter void *privateData; /**< NNFW plugin's private data is stored here */ GstTensorFilterProperties prop; /**< NNFW plugin's properties */ + GstTensorFilterFramework *fw; /**< The implementation core of the NNFW. NULL if not configured */ /** internal properties for tensor-filter */ int silent; /**< Verbose mode if FALSE. int instead of gboolean for non-glib custom plugins */ diff --git a/include/tensor_typedef.h b/include/tensor_typedef.h index 2a2fc8c..cc11d71 100644 --- a/include/tensor_typedef.h +++ b/include/tensor_typedef.h @@ -87,9 +87,6 @@ typedef enum _nnfw_type _T_F_NNFW_END, } nnfw_type; -struct _GstTensorFilterFramework; -typedef struct _GstTensorFilterFramework GstTensorFilterFramework; - typedef uint32_t tensor_dim[NNS_TENSOR_RANK_LIMIT]; /** @@ -129,7 +126,6 @@ typedef struct typedef struct _GstTensorFilterProperties { nnfw_type nnfw; /**< The enum value of corresponding NNFW. _T_F_UNDEFINED if not configured */ - GstTensorFilterFramework *fw; /**< The implementation core of the NNFW. NULL if not configured */ int fw_opened; /**< TRUE IF open() is called or tried. Use int instead of gboolean because this is refered by custom plugins. */ const char *model_file; /**< Filepath to the model file (as an argument for NNFW). char instead of gchar for non-glib custom plugins */ -- 2.7.4