From 092caa0ae718816abecf4fb7807977585bd403d1 Mon Sep 17 00:00:00 2001 From: gichan-jang Date: Wed, 10 Jun 2020 19:23:41 +0900 Subject: [PATCH] [Converter] Change find external converter function Change to search for sub-plugins according to the mime type regardless of the name of the library Signed-off-by: gichan-jang --- .../include/nnstreamer_plugin_api_converter.h | 47 ++++++++-------- gst/nnstreamer/nnstreamer_conf.c | 2 +- gst/nnstreamer/tensor_converter/tensor_converter.c | 62 +++++++++++++--------- 3 files changed, 61 insertions(+), 50 deletions(-) diff --git a/gst/nnstreamer/include/nnstreamer_plugin_api_converter.h b/gst/nnstreamer/include/nnstreamer_plugin_api_converter.h index d0bfe53..b752066 100644 --- a/gst/nnstreamer/include/nnstreamer_plugin_api_converter.h +++ b/gst/nnstreamer/include/nnstreamer_plugin_api_converter.h @@ -40,35 +40,36 @@ extern "C" { */ typedef struct _NNStreamerExternalConverter { - const char *media_type_name; + const char *name; - /** 1. chain func, data handling. */ +/** 1. chain func, data handling. */ GstBuffer *(*convert) (GstBuffer * in_buf, gsize * frame_size, guint * frames_in, GstTensorsConfig * config); - /** Convert the given input stream to tensor/tensors stream. - * @param[in] buf The input stream buffer - * @param[out] frame_size The size of each frame (output buffer) - * @param[out] frames_in The number of frames in the given input buffer. - * @param[out] config tensors config structure to be filled - * @retval Return input buffer(in_buf) if the data is to be kept untouched. - * @retval Return a new GstBuf if the data is to be modified. - */ +/** Convert the given input stream to tensor/tensors stream. + * @param[in] buf The input stream buffer + * @param[out] frame_size The size of each frame (output buffer) + * @param[out] frames_in The number of frames in the given input buffer. + * @param[out] config tensors config structure to be filled + * @retval Return input buffer(in_buf) if the data is to be kept untouched. + * @retval Return a new GstBuf if the data is to be modified. + */ - /** 2. get_out_config (type conf, input(media) to output(tensor)) */ - gboolean (*get_out_config) (const GstCaps * in_caps, GstTensorsConfig * config); - /** Set the tensor config structure from the given stream frame - * @param[in] in_caps The input (original/media data) stream's metadata - * @param[out] config The output (tensor/tensors) metadata - * @retval Return True if get caps successfully, FALSE if not. - */ +/** 2. get_out_config (type conf, input(media) to output(tensor)) */ + gboolean (*get_out_config) (const GstCaps * in_caps, + GstTensorsConfig * config); +/** Set the tensor config structure from the given stream frame + * @param[in] in_caps The input (original/media data) stream's metadata + * @param[out] config The output (tensor/tensors) metadata + * @retval Return True if get caps successfully, FALSE if not. + */ - /** 3. query_caps (tpye conf, output(tensor) to input(media)) */ +/** 3. query_caps (tpye conf, output(tensor) to input(media)) */ GstCaps *(*query_caps) (const GstTensorsConfig * config); - /** Filters (narrows down) the GstCap (st) with the given config. - * @param[in] config The config of output tensor/tensors - * @retval Return subplugin caps (if config is NULL, return default caps) - */ - } NNStreamerExternalConverter; +/** Filters (narrows down) the GstCap (st) with the given config. + * @param[in] config The config of output tensor/tensors + * @retval Return subplugin caps (if config is NULL, return default caps) + */ +} NNStreamerExternalConverter; /** * @brief Converter's sub-plugin should call this function to register itself. diff --git a/gst/nnstreamer/nnstreamer_conf.c b/gst/nnstreamer/nnstreamer_conf.c index 076eeb2..48dc022 100644 --- a/gst/nnstreamer/nnstreamer_conf.c +++ b/gst/nnstreamer/nnstreamer_conf.c @@ -37,7 +37,7 @@ #define NNSTREAMER_PREFIX_DECODER "libnnstreamer_decoder_" #define NNSTREAMER_PREFIX_FILTER "libnnstreamer_filter_" #define NNSTREAMER_PREFIX_CUSTOMFILTERS "" -#define NNSTREAMER_PREFIX_CONVERTER "libnnstreamer_converter_" +#define NNSTREAMER_PREFIX_CONVERTER "" /* Custom filter does not have prefix */ /* Env-var names */ diff --git a/gst/nnstreamer/tensor_converter/tensor_converter.c b/gst/nnstreamer/tensor_converter/tensor_converter.c index 05dc4d7..03d179e 100644 --- a/gst/nnstreamer/tensor_converter/tensor_converter.c +++ b/gst/nnstreamer/tensor_converter/tensor_converter.c @@ -180,7 +180,6 @@ static gboolean gst_tensor_converter_update_caps (GstTensorConverter * self, GstPad * pad, GstTensorsConfig * config); static const NNStreamerExternalConverter *findExternalConverter (const char *media_type_name); -static const gchar *getExternalConverterName (const char *name); /** * @brief Initialize the tensor_converter's class. @@ -287,7 +286,7 @@ gst_tensor_converter_class_init (GstTensorConverterClass * klass) /* append sub-plugin template caps */ total = nnsconf_get_subplugin_info (NNSCONF_PATH_CONVERTERS, &info); for (i = 0; i < total; i++) { - ex = findExternalConverter (info.names[i]); + ex = get_subplugin (NNS_SUBPLUGIN_CONVERTER, info.names[i]); if (ex && ex->query_caps) gst_caps_append (pad_caps, ex->query_caps (NULL)); } @@ -1600,15 +1599,14 @@ gst_tensor_converter_parse_caps (GstTensorConverter * self, default: { /* if found, configure in_mdeia_type = _NNS_MEDIA_PLUGINS */ - const gchar *struct_name, *ext_conv_name; + const gchar *struct_name; struct_name = gst_structure_get_name (structure); if (struct_name != NULL) { const NNStreamerExternalConverter *ex; - ext_conv_name = getExternalConverterName (struct_name); - ex = findExternalConverter (ext_conv_name); + ex = findExternalConverter (struct_name); if (ex != NULL && self->externalConverter == NULL) { in_type = _NNS_MEDIA_PLUGINS; @@ -1617,7 +1615,7 @@ gst_tensor_converter_parse_caps (GstTensorConverter * self, if (NULL == ex->get_out_config || !ex->get_out_config (caps, &config)) { GST_ERROR_OBJECT (self, "Failed to get tensors info from %s. Check the given options.", - ext_conv_name); + struct_name); ml_loge ("Please set the options property correctly.\n"); self->externalConverter = NULL; return FALSE; @@ -1707,43 +1705,55 @@ gst_tensor_converter_update_caps (GstTensorConverter * self, } /** - * @brief Get converter's subplugins name - */ -static const gchar * -getExternalConverterName (const char *name) -{ - /** @todo: Change to not hardcoded */ - if (g_strcmp0 (name, "other/flatbuf-tensor") == 0) { - return "flatbuf"; - } else if (g_strcmp0 (name, "other/protobuf-tensor") == 0) { - return "protobuf"; - } - return "Not_supported"; -} - -/** * @brief Converter's external subplugins should call this at init. */ int registerExternalConverter (NNStreamerExternalConverter * ex) { - return register_subplugin (NNS_SUBPLUGIN_CONVERTER, ex->media_type_name, ex); + return register_subplugin (NNS_SUBPLUGIN_CONVERTER, ex->name, ex); } /** * @brief Converter's external subplugins should call this at exit. */ void -unregisterExternalConverter (const char *media_type_name) +unregisterExternalConverter (const char *name) { - unregister_subplugin (NNS_SUBPLUGIN_CONVERTER, media_type_name); + unregister_subplugin (NNS_SUBPLUGIN_CONVERTER, name); } /** * @brief Internal static function to find registered subplugins. */ static const NNStreamerExternalConverter * -findExternalConverter (const char *media_type_name) +findExternalConverter (const char *media_type) { - return get_subplugin (NNS_SUBPLUGIN_CONVERTER, media_type_name); + guint total, i, caps_size, caps_idx; + subplugin_info_s info; + GstCaps *temp_cap; + GstStructure *temp_struct; + const gchar *caps_string; + const NNStreamerExternalConverter *ex = NULL; + + total = nnsconf_get_subplugin_info (NNSCONF_PATH_CONVERTERS, &info); + for (i = 0; i < total; i++) { + const NNStreamerExternalConverter *temp_ex + = get_subplugin (NNS_SUBPLUGIN_CONVERTER, info.names[i]); + + if (temp_ex && temp_ex->query_caps) { + temp_cap = temp_ex->query_caps (NULL); + caps_size = gst_caps_get_size (temp_cap); + for (caps_idx = 0; caps_idx < caps_size; caps_idx++) { + temp_struct = gst_caps_get_structure (temp_cap, caps_idx); + caps_string = gst_structure_get_name (temp_struct); + if (g_strcmp0 (media_type, caps_string) == 0) { + ex = temp_ex; + break; + } + } + gst_caps_unref (temp_cap); + } + } + + return ex; } -- 2.7.4