From a447f98e54a36fcf66b35754391896001aa69cbb Mon Sep 17 00:00:00 2001 From: Eunhae Choi Date: Tue, 12 Sep 2017 20:47:31 +0900 Subject: [PATCH 01/16] [0.1.19] fix the wl bind ver current tizen_surface_interface ver is 1. if the ver is not matched, it can cause crash after. Change-Id: I2d03389ebb7fa3ccbc78ab6f5387c0e1ee7f97c9 --- packaging/capi-media-streamer.spec | 2 +- src/media_streamer_node.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packaging/capi-media-streamer.spec b/packaging/capi-media-streamer.spec index f777503..5a5793b 100644 --- a/packaging/capi-media-streamer.spec +++ b/packaging/capi-media-streamer.spec @@ -1,6 +1,6 @@ Name: capi-media-streamer Summary: A Media Streamer API -Version: 0.1.18 +Version: 0.1.19 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/media_streamer_node.c b/src/media_streamer_node.c index 0e2b2c3..bbeba0c 100644 --- a/src/media_streamer_node.c +++ b/src/media_streamer_node.c @@ -1283,7 +1283,7 @@ static void __global(void *data, struct wl_registry *registry, if (strcmp(interface, "tizen_surface") == 0) { LOGD("binding tizen surface for wayland"); - *tz_surface = wl_registry_bind(registry, name, &tizen_surface_interface, version); + *tz_surface = wl_registry_bind(registry, name, &tizen_surface_interface, 1); if (*tz_surface == NULL) LOGE("failed to bind"); -- 2.7.4 From c1003aa82ff58ba186a3b075c03c8cfb5dbc0f6d Mon Sep 17 00:00:00 2001 From: Eunhae Choi Date: Tue, 12 Sep 2017 20:47:31 +0900 Subject: [PATCH 02/16] [0.1.19] fix the wl bind ver current tizen_surface_interface ver is 1. if the ver is not matched, it can cause crash after. Change-Id: I2d03389ebb7fa3ccbc78ab6f5387c0e1ee7f97c9 (cherry picked from commit a447f98e54a36fcf66b35754391896001aa69cbb) --- packaging/capi-media-streamer.spec | 2 +- src/media_streamer_node.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packaging/capi-media-streamer.spec b/packaging/capi-media-streamer.spec index f777503..5a5793b 100644 --- a/packaging/capi-media-streamer.spec +++ b/packaging/capi-media-streamer.spec @@ -1,6 +1,6 @@ Name: capi-media-streamer Summary: A Media Streamer API -Version: 0.1.18 +Version: 0.1.19 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/media_streamer_node.c b/src/media_streamer_node.c index 0e2b2c3..bbeba0c 100644 --- a/src/media_streamer_node.c +++ b/src/media_streamer_node.c @@ -1283,7 +1283,7 @@ static void __global(void *data, struct wl_registry *registry, if (strcmp(interface, "tizen_surface") == 0) { LOGD("binding tizen surface for wayland"); - *tz_surface = wl_registry_bind(registry, name, &tizen_surface_interface, version); + *tz_surface = wl_registry_bind(registry, name, &tizen_surface_interface, 1); if (*tz_surface == NULL) LOGE("failed to bind"); -- 2.7.4 From bee6a3c40476db1a420e9823b723fb9231420259 Mon Sep 17 00:00:00 2001 From: Eunhae Choi Date: Tue, 19 Sep 2017 22:31:35 +0900 Subject: [PATCH 03/16] [0.1.19][ACR-1086] Add remark as security review Change-Id: I1f22ebe73aae6fb63e5b3e7828258ee6201ca878 --- include/media_streamer.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/media_streamer.h b/include/media_streamer.h index ca518ee..04ceb3f 100644 --- a/include/media_streamer.h +++ b/include/media_streamer.h @@ -944,6 +944,8 @@ int media_streamer_node_push_packet(media_streamer_node_h src, media_packet_h pa * @since_tizen 3.0 * @remarks The internet privilege(http://tizen.org/privilege/internet) should be added if any URIs are used to transmit the output data. * You can release @a sink node using media_streamer_node_destroy() + * @remarks If @a type is #MEDIA_STREAMER_NODE_SINK_TYPE_ADAPTIVE, the HTTP server will be started and the server will be able to transmit the output data to the other device. + * The application takes responsibility for server and client authentication because data transmission is not secure. * @param [in] type Type of sink node to be created * @param [out] sink Media streamer sink node handle * @return @c 0 on success, -- 2.7.4 From c8484b40c1184fa5f5ed7c24a5cc2e1ac88d04f9 Mon Sep 17 00:00:00 2001 From: Eunhae Choi Date: Tue, 19 Sep 2017 22:31:35 +0900 Subject: [PATCH 04/16] [0.1.19][ACR-1086] Add remark as security review Change-Id: I1f22ebe73aae6fb63e5b3e7828258ee6201ca878 (cherry picked from commit bee6a3c40476db1a420e9823b723fb9231420259) --- include/media_streamer.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/media_streamer.h b/include/media_streamer.h index ca518ee..04ceb3f 100644 --- a/include/media_streamer.h +++ b/include/media_streamer.h @@ -944,6 +944,8 @@ int media_streamer_node_push_packet(media_streamer_node_h src, media_packet_h pa * @since_tizen 3.0 * @remarks The internet privilege(http://tizen.org/privilege/internet) should be added if any URIs are used to transmit the output data. * You can release @a sink node using media_streamer_node_destroy() + * @remarks If @a type is #MEDIA_STREAMER_NODE_SINK_TYPE_ADAPTIVE, the HTTP server will be started and the server will be able to transmit the output data to the other device. + * The application takes responsibility for server and client authentication because data transmission is not secure. * @param [in] type Type of sink node to be created * @param [out] sink Media streamer sink node handle * @return @c 0 on success, -- 2.7.4 From 3d9c36f2ea7017774e8b10f581eac583a9de9a2d Mon Sep 17 00:00:00 2001 From: Volodymyr Brynza Date: Thu, 28 Sep 2017 10:19:41 +0300 Subject: [PATCH 05/16] Remove unused function and file Change-Id: I6537488b937bc2c242fd03c483830646a9b11a7b Signed-off-by: Volodymyr Brynza --- CMakeLists.txt | 4 ++-- include/media_streamer_net_util.h | 31 ------------------------ packaging/capi-media-streamer.spec | 1 - src/media_streamer_http_server.c | 1 - src/media_streamer_net_util.c | 49 -------------------------------------- src/media_streamer_node.c | 1 - 6 files changed, 2 insertions(+), 85 deletions(-) delete mode 100644 include/media_streamer_net_util.h delete mode 100644 src/media_streamer_net_util.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 2a05d39..649690e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,8 +10,8 @@ SET(PREFIX ${CMAKE_INSTALL_PREFIX}) SET(INC_DIR include) INCLUDE_DIRECTORIES(${INC_DIR}) -SET(dependents "dlog glib-2.0 mm-common capi-media-tool iniparser bundle libtbm gstreamer-1.0 gstreamer-plugins-base-1.0 gstreamer-app-1.0 gstreamer-video-1.0 cynara-client capi-system-info ecore elementary murphy-resource murphy-glib dpm capi-network-connection capi-content-mime-type libsoup-2.4") -SET(pc_dependents "capi-base-common capi-media-tool gstreamer-1.0 gstreamer-plugins-base-1.0 gstreamer-app-1.0 gstreamer-video-1.0 cynara-client capi-system-info ecore evas elementary murphy-resource murphy-glib dpm capi-system-info capi-network-connection capi-content-mime-type libsoup-2.4") +SET(dependents "dlog glib-2.0 mm-common capi-media-tool iniparser bundle libtbm gstreamer-1.0 gstreamer-plugins-base-1.0 gstreamer-app-1.0 gstreamer-video-1.0 cynara-client capi-system-info ecore elementary murphy-resource murphy-glib dpm capi-content-mime-type libsoup-2.4") +SET(pc_dependents "capi-base-common capi-media-tool gstreamer-1.0 gstreamer-plugins-base-1.0 gstreamer-app-1.0 gstreamer-video-1.0 cynara-client capi-system-info ecore evas elementary murphy-resource murphy-glib dpm capi-system-info capi-content-mime-type libsoup-2.4") INCLUDE(FindPkgConfig) pkg_check_modules(${fw_name} REQUIRED ${dependents}) diff --git a/include/media_streamer_net_util.h b/include/media_streamer_net_util.h deleted file mode 100644 index 76f72e9..0000000 --- a/include/media_streamer_net_util.h +++ /dev/null @@ -1,31 +0,0 @@ - -/* - * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __MEDIA_STREAMER_NET_UTIL_H__ -#define __MEDIA_STREAMER_NET_UTIL_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -int __ms_get_local_network_address(char **ip_address); - -#ifdef __cplusplus -} -#endif - -#endif /* __MEDIA_STREAMER_NET_UTIL_H__ */ diff --git a/packaging/capi-media-streamer.spec b/packaging/capi-media-streamer.spec index 5a5793b..bae1aab 100644 --- a/packaging/capi-media-streamer.spec +++ b/packaging/capi-media-streamer.spec @@ -32,7 +32,6 @@ BuildRequires: pkgconfig(appcore-efl) BuildRequires: pkgconfig(murphy-resource) BuildRequires: pkgconfig(murphy-glib) BuildRequires: pkgconfig(dpm) -BuildRequires: pkgconfig(capi-network-connection) BuildRequires: pkgconfig(libsoup-2.4) BuildRequires: pkgconfig(capi-content-mime-type) diff --git a/src/media_streamer_http_server.c b/src/media_streamer_http_server.c index 5d35bc2..fa60577 100644 --- a/src/media_streamer_http_server.c +++ b/src/media_streamer_http_server.c @@ -24,7 +24,6 @@ #include #include -#include #include diff --git a/src/media_streamer_net_util.c b/src/media_streamer_net_util.c deleted file mode 100644 index 71a92e0..0000000 --- a/src/media_streamer_net_util.c +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include - -#include - -int __ms_get_local_network_address(char **ip_address) -{ - connection_h conn = NULL; - connection_type_e conn_type = CONNECTION_TYPE_DISCONNECTED; - - if (CONNECTION_ERROR_NONE != connection_create(&conn)) { - ms_error("Failed to create connection"); - return MEDIA_STREAMER_ERROR_INVALID_OPERATION; - } - - if (CONNECTION_ERROR_NONE != connection_get_type(conn, &conn_type)) { - ms_error("Failed to acquire connection type"); - return MEDIA_STREAMER_ERROR_INVALID_OPERATION; - } - - if (conn_type != CONNECTION_TYPE_WIFI) { - ms_error("Wrong connection type"); - return MEDIA_STREAMER_ERROR_INVALID_OPERATION; - } - - if (CONNECTION_ERROR_NONE != connection_get_ip_address(conn, CONNECTION_ADDRESS_FAMILY_IPV4, ip_address)) { - ms_error("Failed to acquire connection ip address"); - return MEDIA_STREAMER_ERROR_INVALID_OPERATION; - } - - return MEDIA_STREAMER_ERROR_NONE; -} diff --git a/src/media_streamer_node.c b/src/media_streamer_node.c index bbeba0c..1c5a0fb 100644 --- a/src/media_streamer_node.c +++ b/src/media_streamer_node.c @@ -17,7 +17,6 @@ #include #include #include -#include #include #include #include -- 2.7.4 From 0affcd0a506c02c7c65ed35b5da8ef8a8df2828f Mon Sep 17 00:00:00 2001 From: Volodymyr Brynza Date: Thu, 28 Sep 2017 10:19:41 +0300 Subject: [PATCH 06/16] Remove unused function and file Change-Id: I6537488b937bc2c242fd03c483830646a9b11a7b Signed-off-by: Volodymyr Brynza (cherry picked from commit 3d9c36f2ea7017774e8b10f581eac583a9de9a2d) --- CMakeLists.txt | 4 ++-- include/media_streamer_net_util.h | 31 ------------------------ packaging/capi-media-streamer.spec | 1 - src/media_streamer_http_server.c | 1 - src/media_streamer_net_util.c | 49 -------------------------------------- src/media_streamer_node.c | 1 - 6 files changed, 2 insertions(+), 85 deletions(-) delete mode 100644 include/media_streamer_net_util.h delete mode 100644 src/media_streamer_net_util.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 2a05d39..649690e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,8 +10,8 @@ SET(PREFIX ${CMAKE_INSTALL_PREFIX}) SET(INC_DIR include) INCLUDE_DIRECTORIES(${INC_DIR}) -SET(dependents "dlog glib-2.0 mm-common capi-media-tool iniparser bundle libtbm gstreamer-1.0 gstreamer-plugins-base-1.0 gstreamer-app-1.0 gstreamer-video-1.0 cynara-client capi-system-info ecore elementary murphy-resource murphy-glib dpm capi-network-connection capi-content-mime-type libsoup-2.4") -SET(pc_dependents "capi-base-common capi-media-tool gstreamer-1.0 gstreamer-plugins-base-1.0 gstreamer-app-1.0 gstreamer-video-1.0 cynara-client capi-system-info ecore evas elementary murphy-resource murphy-glib dpm capi-system-info capi-network-connection capi-content-mime-type libsoup-2.4") +SET(dependents "dlog glib-2.0 mm-common capi-media-tool iniparser bundle libtbm gstreamer-1.0 gstreamer-plugins-base-1.0 gstreamer-app-1.0 gstreamer-video-1.0 cynara-client capi-system-info ecore elementary murphy-resource murphy-glib dpm capi-content-mime-type libsoup-2.4") +SET(pc_dependents "capi-base-common capi-media-tool gstreamer-1.0 gstreamer-plugins-base-1.0 gstreamer-app-1.0 gstreamer-video-1.0 cynara-client capi-system-info ecore evas elementary murphy-resource murphy-glib dpm capi-system-info capi-content-mime-type libsoup-2.4") INCLUDE(FindPkgConfig) pkg_check_modules(${fw_name} REQUIRED ${dependents}) diff --git a/include/media_streamer_net_util.h b/include/media_streamer_net_util.h deleted file mode 100644 index 76f72e9..0000000 --- a/include/media_streamer_net_util.h +++ /dev/null @@ -1,31 +0,0 @@ - -/* - * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __MEDIA_STREAMER_NET_UTIL_H__ -#define __MEDIA_STREAMER_NET_UTIL_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -int __ms_get_local_network_address(char **ip_address); - -#ifdef __cplusplus -} -#endif - -#endif /* __MEDIA_STREAMER_NET_UTIL_H__ */ diff --git a/packaging/capi-media-streamer.spec b/packaging/capi-media-streamer.spec index 5a5793b..bae1aab 100644 --- a/packaging/capi-media-streamer.spec +++ b/packaging/capi-media-streamer.spec @@ -32,7 +32,6 @@ BuildRequires: pkgconfig(appcore-efl) BuildRequires: pkgconfig(murphy-resource) BuildRequires: pkgconfig(murphy-glib) BuildRequires: pkgconfig(dpm) -BuildRequires: pkgconfig(capi-network-connection) BuildRequires: pkgconfig(libsoup-2.4) BuildRequires: pkgconfig(capi-content-mime-type) diff --git a/src/media_streamer_http_server.c b/src/media_streamer_http_server.c index 5d35bc2..fa60577 100644 --- a/src/media_streamer_http_server.c +++ b/src/media_streamer_http_server.c @@ -24,7 +24,6 @@ #include #include -#include #include diff --git a/src/media_streamer_net_util.c b/src/media_streamer_net_util.c deleted file mode 100644 index 71a92e0..0000000 --- a/src/media_streamer_net_util.c +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include - -#include - -int __ms_get_local_network_address(char **ip_address) -{ - connection_h conn = NULL; - connection_type_e conn_type = CONNECTION_TYPE_DISCONNECTED; - - if (CONNECTION_ERROR_NONE != connection_create(&conn)) { - ms_error("Failed to create connection"); - return MEDIA_STREAMER_ERROR_INVALID_OPERATION; - } - - if (CONNECTION_ERROR_NONE != connection_get_type(conn, &conn_type)) { - ms_error("Failed to acquire connection type"); - return MEDIA_STREAMER_ERROR_INVALID_OPERATION; - } - - if (conn_type != CONNECTION_TYPE_WIFI) { - ms_error("Wrong connection type"); - return MEDIA_STREAMER_ERROR_INVALID_OPERATION; - } - - if (CONNECTION_ERROR_NONE != connection_get_ip_address(conn, CONNECTION_ADDRESS_FAMILY_IPV4, ip_address)) { - ms_error("Failed to acquire connection ip address"); - return MEDIA_STREAMER_ERROR_INVALID_OPERATION; - } - - return MEDIA_STREAMER_ERROR_NONE; -} diff --git a/src/media_streamer_node.c b/src/media_streamer_node.c index bbeba0c..1c5a0fb 100644 --- a/src/media_streamer_node.c +++ b/src/media_streamer_node.c @@ -17,7 +17,6 @@ #include #include #include -#include #include #include #include -- 2.7.4 From 4ef72050d6f02ebbe7e1a2f273d752c1f3e7e5d8 Mon Sep 17 00:00:00 2001 From: Eunhae Choi Date: Thu, 28 Sep 2017 19:57:53 +0900 Subject: [PATCH 07/16] [0.1.20] resolve coverity issue Change-Id: I133bd3fa78feaa2c694af04eb7f730497340b270 --- packaging/capi-media-streamer.spec | 2 +- src/media_streamer_gst.c | 242 ++++++++++++++++++++++++++++--------- 2 files changed, 186 insertions(+), 58 deletions(-) diff --git a/packaging/capi-media-streamer.spec b/packaging/capi-media-streamer.spec index bae1aab..3a73e2b 100644 --- a/packaging/capi-media-streamer.spec +++ b/packaging/capi-media-streamer.spec @@ -1,6 +1,6 @@ Name: capi-media-streamer Summary: A Media Streamer API -Version: 0.1.19 +Version: 0.1.20 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/media_streamer_gst.c b/src/media_streamer_gst.c index 5171d3d..b61fbda 100644 --- a/src/media_streamer_gst.c +++ b/src/media_streamer_gst.c @@ -1055,6 +1055,18 @@ GstElement *__ms_node_element_create(node_plug_s *plug_info, media_streamer_node GstElement *__ms_video_encoder_element_create(node_plug_s *plug_info, media_streamer_node_type_e type) { + GstElement *video_scale = NULL; + GstElement *video_convert = NULL; + GstElement *encoder_elem = NULL; + GstElement *encoder_parser = NULL; + GstElement *encoder_bin = NULL; + gboolean gst_ret = FALSE; + const gchar *src_type = NULL; + node_plug_s encoder_info = {0,}; + node_plug_s parser_info = {0,}; + node_info_s node_info = {MEDIA_STREAMER_PARSER_KLASS, DEFAULT_VIDEO_PARSER}; + media_format_mimetype_e encoder_type = MEDIA_FORMAT_MAX; + GstCaps *enc_caps = plug_info->src_caps; if (!enc_caps) { enc_caps = gst_caps_from_string(MEDIA_STREAMER_DEFAULT_VIDEO_FORMAT); @@ -1062,32 +1074,40 @@ GstElement *__ms_video_encoder_element_create(node_plug_s *plug_info, media_stre } /* Creating Scaler, Converter */ - GstElement *video_scale = __ms_element_create(DEFAULT_VIDEO_SCALE, NULL); - GstElement *video_convert = __ms_element_create(DEFAULT_VIDEO_CONVERT, NULL); + video_scale = __ms_element_create(DEFAULT_VIDEO_SCALE, NULL); + video_convert = __ms_element_create(DEFAULT_VIDEO_CONVERT, NULL); /* Creating Video Encoder */ - node_info_s *node_klass_type = __ms_node_get_klass_by_its_type(type); - node_plug_s encoder_info = {node_klass_type, enc_caps, plug_info->sink_caps, NULL}; - GstElement *encoder_elem = __ms_element_create_from_ini(&encoder_info, type); + encoder_info.info = __ms_node_get_klass_by_its_type(type); + encoder_info.src_caps = enc_caps; + encoder_info.sink_caps = plug_info->sink_caps; + encoder_info.exclude_names = NULL; + + encoder_elem = __ms_element_create_from_ini(&encoder_info, type); if (!encoder_elem) encoder_elem = __ms_element_create_by_registry(&encoder_info, type); /* Creating Video Parser */ - node_info_s node_info = {MEDIA_STREAMER_PARSER_KLASS, DEFAULT_VIDEO_PARSER}; - node_plug_s parser_info = {&node_info, enc_caps, enc_caps, NULL}; - GstElement *encoder_parser = __ms_element_create_from_ini(&parser_info, MEDIA_STREAMER_NODE_TYPE_PARSER); + parser_info.info = &node_info; + parser_info.src_caps = enc_caps; + parser_info.sink_caps = enc_caps; + parser_info.exclude_names = NULL; + + encoder_parser = __ms_element_create_from_ini(&parser_info, MEDIA_STREAMER_NODE_TYPE_PARSER); if (!encoder_parser) encoder_parser = __ms_element_create_by_registry(&parser_info, MEDIA_STREAMER_NODE_TYPE_PARSER); /* Creating bin - Video Encoder */ - gboolean gst_ret = FALSE; - GstElement *encoder_bin = gst_bin_new("video_encoder"); - ms_retvm_if(!video_convert || !video_scale || !encoder_elem || !encoder_bin || !encoder_parser, (GstElement *) NULL, "Error: creating elements for video encoder bin"); + encoder_bin = gst_bin_new("video_encoder"); + + if (!video_convert || !video_scale || !encoder_elem || !encoder_parser || !encoder_bin) { + ms_error("Error: creating elements for video encoder bin"); + goto ERROR; + } /* Settings if H264 format is set*/ - const gchar *src_type; MS_GET_CAPS_TYPE(enc_caps, src_type); - media_format_mimetype_e encoder_type = __ms_convert_string_format_to_media_format(src_type); + encoder_type = __ms_convert_string_format_to_media_format(src_type); if (encoder_type == MEDIA_FORMAT_H264_SP) { g_object_set(GST_OBJECT(encoder_parser), "config-interval", H264_PARSER_CONFIG_INTERVAL, NULL); g_object_set(G_OBJECT(encoder_elem), "tune", H264_ENCODER_ZEROLATENCY, NULL); @@ -1102,43 +1122,71 @@ GstElement *__ms_video_encoder_element_create(node_plug_s *plug_info, media_stre if (gst_ret != TRUE) { ms_error("Failed to link elements into encoder_bin"); MS_SAFE_UNREF(encoder_bin); + return NULL; } __ms_add_ghostpad(encoder_parser, "src", encoder_bin, "src"); __ms_add_ghostpad(video_convert, "sink", encoder_bin, "sink"); return encoder_bin; + +ERROR: + + MS_SAFE_UNREF(video_convert); + MS_SAFE_UNREF(video_scale); + MS_SAFE_UNREF(encoder_elem); + MS_SAFE_UNREF(encoder_parser); + MS_SAFE_UNREF(encoder_bin); + + return NULL; } GstElement *__ms_video_decoder_element_create(node_plug_s *plug_info, media_streamer_node_type_e type) { + gboolean is_hw_codec = FALSE; + GstElement *last_elem = NULL; + GstElement *decoder_elem = NULL; + GstElement *decoder_parser = NULL; + GstElement *decoder_queue = NULL; + GstElement *video_conv = NULL; + GstElement *video_scale = NULL; + GstElement *decoder_bin = NULL; + node_plug_s decoder_info = {0,}; + node_plug_s parser_info = {0,}; + node_info_s nodes_info = {MEDIA_STREAMER_PARSER_KLASS, DEFAULT_VIDEO_PARSER}; + media_format_mimetype_e decoder_type = MEDIA_FORMAT_MAX; + gboolean gst_ret = FALSE; + const gchar *sink_type = NULL; + GstCaps *dec_caps = plug_info->sink_caps; if (!dec_caps) { dec_caps = gst_caps_from_string(MEDIA_STREAMER_DEFAULT_VIDEO_FORMAT); ms_debug("No Video decoding format is set! Deafault will be: [%s]", MEDIA_STREAMER_DEFAULT_VIDEO_FORMAT); } - gboolean is_hw_codec = FALSE; - GstElement *last_elem = NULL; - /* Creating Video Decoder */ - node_info_s *node_klass_type = __ms_node_get_klass_by_its_type(type); - node_plug_s decoder_info = {node_klass_type, plug_info->src_caps, dec_caps, NULL}; - GstElement *decoder_elem = __ms_element_create_from_ini(&decoder_info, MEDIA_STREAMER_NODE_TYPE_VIDEO_DECODER); + decoder_info.info = __ms_node_get_klass_by_its_type(type);; + decoder_info.src_caps = plug_info->src_caps; + decoder_info.sink_caps = dec_caps; + decoder_info.exclude_names = NULL; + + decoder_elem = __ms_element_create_from_ini(&decoder_info, MEDIA_STREAMER_NODE_TYPE_VIDEO_DECODER); if (!decoder_elem) decoder_elem = __ms_element_create_by_registry(&decoder_info, MEDIA_STREAMER_NODE_TYPE_VIDEO_DECODER); /* Creating Video Parser */ - node_info_s nodes_info = {MEDIA_STREAMER_PARSER_KLASS, DEFAULT_VIDEO_PARSER}; - node_plug_s parser_info = {&nodes_info, dec_caps, dec_caps, NULL}; - GstElement *decoder_parser = __ms_element_create_from_ini(&parser_info, MEDIA_STREAMER_NODE_TYPE_PARSER); + parser_info.info = &nodes_info; + parser_info.src_caps = dec_caps; + parser_info.sink_caps = dec_caps; + parser_info.exclude_names = NULL; + + decoder_parser = __ms_element_create_from_ini(&parser_info, MEDIA_STREAMER_NODE_TYPE_PARSER); if (!decoder_parser) decoder_parser = __ms_element_create_by_registry(&parser_info, MEDIA_STREAMER_NODE_TYPE_PARSER); /* Settings if H264 format is set*/ - const gchar *sink_type; MS_GET_CAPS_TYPE(dec_caps, sink_type); - media_format_mimetype_e decoder_type = __ms_convert_string_format_to_media_format(sink_type); + decoder_type = __ms_convert_string_format_to_media_format(sink_type); if (decoder_type == MEDIA_FORMAT_H264_SP) g_object_set(G_OBJECT(decoder_parser), "config-interval", H264_PARSER_CONFIG_INTERVAL, NULL); @@ -1146,10 +1194,13 @@ GstElement *__ms_video_decoder_element_create(node_plug_s *plug_info, media_stre is_hw_codec = TRUE; /* Creating bin - Video Decoder */ - gboolean gst_ret = FALSE; - GstElement *decoder_bin = gst_bin_new("video_decoder"); - GstElement *decoder_queue = __ms_element_create("queue", NULL); - ms_retvm_if(!decoder_elem || !decoder_queue || !decoder_bin || !decoder_parser, (GstElement *) NULL, "Error: creating elements for video decoder bin"); + decoder_queue = __ms_element_create("queue", NULL); + decoder_bin = gst_bin_new("video_decoder"); + + if (!decoder_elem || !decoder_queue || !decoder_parser || !decoder_bin) { + ms_error("Error: creating elements for video decoder bin"); + goto ERROR; + } /* Adding elements to bin Audio Encoder */ gst_bin_add_many(GST_BIN(decoder_bin), decoder_queue, decoder_elem, decoder_parser, NULL); @@ -1162,9 +1213,13 @@ GstElement *__ms_video_decoder_element_create(node_plug_s *plug_info, media_stre last_elem = decoder_elem; if (!is_hw_codec) { - GstElement *video_conv = __ms_element_create("videoconvert", NULL); - GstElement *video_scale = __ms_element_create("videoscale", NULL); - ms_retvm_if(!video_conv || !video_scale, (GstElement *) NULL, "Error: creating elements for video decoder bin"); + video_conv = __ms_element_create("videoconvert", NULL); + video_scale = __ms_element_create("videoscale", NULL); + if (!video_conv || !video_scale) { + ms_error("Error: creating elements for video decoder bin"); + goto ERROR; + } + gst_bin_add_many(GST_BIN(decoder_bin), video_conv, video_scale, NULL); gst_ret = gst_element_link_many(decoder_elem, video_conv, video_scale, NULL); if (gst_ret != TRUE) { @@ -1179,29 +1234,51 @@ GstElement *__ms_video_decoder_element_create(node_plug_s *plug_info, media_stre __ms_add_ghostpad(decoder_queue, "sink", decoder_bin, "sink"); return decoder_bin; + +ERROR: + + MS_SAFE_UNREF(decoder_elem); + MS_SAFE_UNREF(decoder_queue); + MS_SAFE_UNREF(decoder_parser); + MS_SAFE_UNREF(video_conv); + MS_SAFE_UNREF(video_scale); + MS_SAFE_UNREF(decoder_bin); + + return NULL; } GstElement *__ms_audio_encoder_element_create(node_plug_s *plug_info, media_streamer_node_type_e type) { - GstCaps *enc_caps = plug_info->src_caps; + gboolean gst_ret = FALSE; + GstElement *audio_convert = NULL; + GstElement *audio_resample = NULL; + GstElement *audio_filter = NULL; + GstElement *audio_postenc_convert = NULL; + GstElement *audio_encoder = NULL; + GstElement *audio_enc_bin = NULL; + node_plug_s plug_info_encoder = {0,}; gchar *encoder_name = NULL; + GstCaps *audioCaps = NULL; + + GstCaps *enc_caps = plug_info->src_caps; if (!enc_caps) { enc_caps = gst_caps_from_string(MEDIA_STREAMER_DEFAULT_AUDIO_FORMAT); ms_debug("No Audio encoding format is set! Deafault will be: [%s]", MEDIA_STREAMER_DEFAULT_AUDIO_FORMAT); } - gboolean gst_ret = FALSE; - /* Creating Converter, Resampler, Filter */ - GstElement *audio_convert = __ms_element_create(DEFAULT_AUDIO_CONVERT, NULL); - GstElement *audio_resample = __ms_element_create(DEFAULT_AUDIO_RESAMPLE, NULL); - GstElement *audio_filter = __ms_element_create(DEFAULT_FILTER, NULL); - GstElement *audio_postenc_convert = __ms_element_create(DEFAULT_AUDIO_CONVERT, NULL); + audio_convert = __ms_element_create(DEFAULT_AUDIO_CONVERT, NULL); + audio_resample = __ms_element_create(DEFAULT_AUDIO_RESAMPLE, NULL); + audio_filter = __ms_element_create(DEFAULT_FILTER, NULL); + audio_postenc_convert = __ms_element_create(DEFAULT_AUDIO_CONVERT, NULL); /* Creating Audio Encoder */ - node_info_s *node_klass_type = __ms_node_get_klass_by_its_type(type); - node_plug_s plug_info_encoder = {node_klass_type, enc_caps, plug_info->sink_caps, NULL}; - GstElement *audio_encoder = __ms_element_create_from_ini(&plug_info_encoder, type); + plug_info_encoder.info = __ms_node_get_klass_by_its_type(type); + plug_info_encoder.src_caps = enc_caps; + plug_info_encoder.sink_caps = plug_info->sink_caps; + plug_info_encoder.exclude_names = NULL; + + audio_encoder = __ms_element_create_from_ini(&plug_info_encoder, type); if (!audio_encoder) audio_encoder = __ms_element_create_by_registry(&plug_info_encoder, type); @@ -1211,10 +1288,13 @@ GstElement *__ms_audio_encoder_element_create(node_plug_s *plug_info, media_stre MS_SAFE_GFREE(encoder_name); /* Creating bin - Audio Encoder */ - GstElement *audio_enc_bin = gst_bin_new("audio_encoder"); - ms_retvm_if(!audio_convert || !audio_postenc_convert || !audio_filter || !audio_encoder || !audio_enc_bin, (GstElement *) NULL, "Error: creating elements for encoder bin"); + audio_enc_bin = gst_bin_new("audio_encoder"); + if (!audio_convert || !audio_postenc_convert || !audio_filter || !audio_resample || !audio_encoder || !audio_enc_bin) { + ms_error("Error: creating elements for audio encoder bin"); + goto ERROR; + } - GstCaps *audioCaps = gst_caps_from_string(MEDIA_STREAMER_DEFAULT_AUDIO_RAW_FORMAT); + audioCaps = gst_caps_from_string(MEDIA_STREAMER_DEFAULT_AUDIO_RAW_FORMAT); g_object_set(G_OBJECT(audio_filter), "caps", audioCaps, NULL); gst_caps_unref(audioCaps); @@ -1230,10 +1310,32 @@ GstElement *__ms_audio_encoder_element_create(node_plug_s *plug_info, media_stre __ms_add_ghostpad(audio_convert, "sink", audio_enc_bin, "sink"); return audio_enc_bin; +ERROR: + + MS_SAFE_UNREF(audio_convert); + MS_SAFE_UNREF(audio_resample); + MS_SAFE_UNREF(audio_postenc_convert); + MS_SAFE_UNREF(audio_filter); + MS_SAFE_UNREF(audio_encoder); + MS_SAFE_UNREF(audio_enc_bin); + + return NULL; + } GstElement *__ms_audio_decoder_element_create(node_plug_s *plug_info, media_streamer_node_type_e type) { + gboolean gst_ret = FALSE; + GstElement *decoder_bin = NULL; + GstElement *decoder_elem = NULL; + GstElement *decoder_parser = NULL; + GstElement *decoder_queue = NULL; + GstElement *audio_conv = NULL; + GstElement *audio_resample = NULL; + node_plug_s decoder_info = {0,}; + node_plug_s parser_info = {0,}; + node_info_s nodes_info = {MEDIA_STREAMER_PARSER_KLASS, DEFAULT_AUDIO_PARSER}; + GstCaps *dec_caps = plug_info->sink_caps; if (!dec_caps) { dec_caps = gst_caps_from_string(MEDIA_STREAMER_DEFAULT_AUDIO_FORMAT); @@ -1241,24 +1343,32 @@ GstElement *__ms_audio_decoder_element_create(node_plug_s *plug_info, media_stre } /* Creating Audio Decoder */ - node_info_s *node_klass_type = __ms_node_get_klass_by_its_type(type); - node_plug_s decoder_info = {node_klass_type, plug_info->src_caps, dec_caps, NULL}; - GstElement *decoder_elem = __ms_element_create_from_ini(&decoder_info, MEDIA_STREAMER_NODE_TYPE_AUDIO_DECODER); + decoder_info.info = __ms_node_get_klass_by_its_type(type); + decoder_info.src_caps = plug_info->src_caps; + decoder_info.sink_caps = dec_caps; + decoder_info.exclude_names = NULL; + + decoder_elem = __ms_element_create_from_ini(&decoder_info, MEDIA_STREAMER_NODE_TYPE_AUDIO_DECODER); if (!decoder_elem) decoder_elem = __ms_element_create_by_registry(&decoder_info, MEDIA_STREAMER_NODE_TYPE_AUDIO_DECODER); /* Creating Audio Parser */ - node_info_s nodes_info = {MEDIA_STREAMER_PARSER_KLASS, DEFAULT_AUDIO_PARSER}; - node_plug_s parser_info = {&nodes_info, dec_caps, dec_caps, NULL}; - GstElement *decoder_parser = __ms_element_create_from_ini(&parser_info, MEDIA_STREAMER_NODE_TYPE_PARSER); + parser_info.info = &nodes_info; + parser_info.src_caps = dec_caps; + parser_info.sink_caps = dec_caps; + parser_info.exclude_names = NULL; + + decoder_parser = __ms_element_create_from_ini(&parser_info, MEDIA_STREAMER_NODE_TYPE_PARSER); if (!decoder_parser) decoder_parser = __ms_element_create_by_registry(&parser_info, MEDIA_STREAMER_NODE_TYPE_PARSER); /* Creating bin - Audio Decoder */ - gboolean gst_ret = FALSE; - GstElement *decoder_bin = gst_bin_new("audio_decoder"); - GstElement *decoder_queue = __ms_element_create("queue", NULL); - ms_retvm_if(!decoder_elem || !decoder_queue || !decoder_bin || !decoder_parser, (GstElement *) NULL, "Error: creating elements for audio decoder bin"); + decoder_bin = gst_bin_new("audio_decoder"); + decoder_queue = __ms_element_create("queue", NULL); + if (!decoder_elem || !decoder_queue || !decoder_parser || !decoder_bin) { + ms_error("Error: creating elements for audio decoder bin"); + goto ERROR; + } /* Adding elements to bin Audio Encoder */ gst_bin_add_many(GST_BIN(decoder_bin), decoder_queue, decoder_elem, decoder_parser, NULL); @@ -1269,9 +1379,13 @@ GstElement *__ms_audio_decoder_element_create(node_plug_s *plug_info, media_stre return NULL; } - GstElement *audio_conv = __ms_element_create("audioconvert", NULL); - GstElement *audio_resample = __ms_element_create("audioresample", NULL); - ms_retvm_if(!audio_conv || !audio_resample, (GstElement *) NULL, "Error: creating elements for audio decoder bin"); + audio_conv = __ms_element_create("audioconvert", NULL); + audio_resample = __ms_element_create("audioresample", NULL); + if (!audio_conv || !audio_resample) { + ms_error("Error: creating elements for audio decoder bin"); + goto ERROR; + } + gst_bin_add_many(GST_BIN(decoder_bin), audio_conv, audio_resample, NULL); gst_ret = gst_element_link_many(decoder_elem, audio_conv, audio_resample, NULL); if (gst_ret != TRUE) { @@ -1284,6 +1398,16 @@ GstElement *__ms_audio_decoder_element_create(node_plug_s *plug_info, media_stre __ms_add_ghostpad(decoder_queue, "sink", decoder_bin, "sink"); return decoder_bin; +ERROR: + + MS_SAFE_UNREF(decoder_elem); + MS_SAFE_UNREF(decoder_queue); + MS_SAFE_UNREF(decoder_parser); + MS_SAFE_UNREF(audio_conv); + MS_SAFE_UNREF(audio_resample); + MS_SAFE_UNREF(decoder_bin); + + return NULL; } GstElement *__ms_rtp_element_create(void) @@ -1692,6 +1816,10 @@ int __ms_pipeline_create(media_streamer_s *ms_streamer) if (ms_streamer->ini.gst_args) { int i = 0; for ( ; ms_streamer->ini.gst_args[i]; ++i) { + if (*argc <= i+1) { + ms_error("need to check, prevent overrun"); + break; + } argv[i+1] = ms_streamer->ini.gst_args[i]; ms_debug("Add [%s] gstreamer parameter.", argv[i+1]); } -- 2.7.4 From 1ad35c543d215820e438f013ca7a4ee044b3fa3b Mon Sep 17 00:00:00 2001 From: Eunhae Choi Date: Thu, 28 Sep 2017 19:57:53 +0900 Subject: [PATCH 08/16] [0.1.20] resolve coverity issue Change-Id: I133bd3fa78feaa2c694af04eb7f730497340b270 (cherry picked from commit 4ef72050d6f02ebbe7e1a2f273d752c1f3e7e5d8) --- packaging/capi-media-streamer.spec | 2 +- src/media_streamer_gst.c | 242 ++++++++++++++++++++++++++++--------- 2 files changed, 186 insertions(+), 58 deletions(-) diff --git a/packaging/capi-media-streamer.spec b/packaging/capi-media-streamer.spec index bae1aab..3a73e2b 100644 --- a/packaging/capi-media-streamer.spec +++ b/packaging/capi-media-streamer.spec @@ -1,6 +1,6 @@ Name: capi-media-streamer Summary: A Media Streamer API -Version: 0.1.19 +Version: 0.1.20 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/media_streamer_gst.c b/src/media_streamer_gst.c index 5171d3d..b61fbda 100644 --- a/src/media_streamer_gst.c +++ b/src/media_streamer_gst.c @@ -1055,6 +1055,18 @@ GstElement *__ms_node_element_create(node_plug_s *plug_info, media_streamer_node GstElement *__ms_video_encoder_element_create(node_plug_s *plug_info, media_streamer_node_type_e type) { + GstElement *video_scale = NULL; + GstElement *video_convert = NULL; + GstElement *encoder_elem = NULL; + GstElement *encoder_parser = NULL; + GstElement *encoder_bin = NULL; + gboolean gst_ret = FALSE; + const gchar *src_type = NULL; + node_plug_s encoder_info = {0,}; + node_plug_s parser_info = {0,}; + node_info_s node_info = {MEDIA_STREAMER_PARSER_KLASS, DEFAULT_VIDEO_PARSER}; + media_format_mimetype_e encoder_type = MEDIA_FORMAT_MAX; + GstCaps *enc_caps = plug_info->src_caps; if (!enc_caps) { enc_caps = gst_caps_from_string(MEDIA_STREAMER_DEFAULT_VIDEO_FORMAT); @@ -1062,32 +1074,40 @@ GstElement *__ms_video_encoder_element_create(node_plug_s *plug_info, media_stre } /* Creating Scaler, Converter */ - GstElement *video_scale = __ms_element_create(DEFAULT_VIDEO_SCALE, NULL); - GstElement *video_convert = __ms_element_create(DEFAULT_VIDEO_CONVERT, NULL); + video_scale = __ms_element_create(DEFAULT_VIDEO_SCALE, NULL); + video_convert = __ms_element_create(DEFAULT_VIDEO_CONVERT, NULL); /* Creating Video Encoder */ - node_info_s *node_klass_type = __ms_node_get_klass_by_its_type(type); - node_plug_s encoder_info = {node_klass_type, enc_caps, plug_info->sink_caps, NULL}; - GstElement *encoder_elem = __ms_element_create_from_ini(&encoder_info, type); + encoder_info.info = __ms_node_get_klass_by_its_type(type); + encoder_info.src_caps = enc_caps; + encoder_info.sink_caps = plug_info->sink_caps; + encoder_info.exclude_names = NULL; + + encoder_elem = __ms_element_create_from_ini(&encoder_info, type); if (!encoder_elem) encoder_elem = __ms_element_create_by_registry(&encoder_info, type); /* Creating Video Parser */ - node_info_s node_info = {MEDIA_STREAMER_PARSER_KLASS, DEFAULT_VIDEO_PARSER}; - node_plug_s parser_info = {&node_info, enc_caps, enc_caps, NULL}; - GstElement *encoder_parser = __ms_element_create_from_ini(&parser_info, MEDIA_STREAMER_NODE_TYPE_PARSER); + parser_info.info = &node_info; + parser_info.src_caps = enc_caps; + parser_info.sink_caps = enc_caps; + parser_info.exclude_names = NULL; + + encoder_parser = __ms_element_create_from_ini(&parser_info, MEDIA_STREAMER_NODE_TYPE_PARSER); if (!encoder_parser) encoder_parser = __ms_element_create_by_registry(&parser_info, MEDIA_STREAMER_NODE_TYPE_PARSER); /* Creating bin - Video Encoder */ - gboolean gst_ret = FALSE; - GstElement *encoder_bin = gst_bin_new("video_encoder"); - ms_retvm_if(!video_convert || !video_scale || !encoder_elem || !encoder_bin || !encoder_parser, (GstElement *) NULL, "Error: creating elements for video encoder bin"); + encoder_bin = gst_bin_new("video_encoder"); + + if (!video_convert || !video_scale || !encoder_elem || !encoder_parser || !encoder_bin) { + ms_error("Error: creating elements for video encoder bin"); + goto ERROR; + } /* Settings if H264 format is set*/ - const gchar *src_type; MS_GET_CAPS_TYPE(enc_caps, src_type); - media_format_mimetype_e encoder_type = __ms_convert_string_format_to_media_format(src_type); + encoder_type = __ms_convert_string_format_to_media_format(src_type); if (encoder_type == MEDIA_FORMAT_H264_SP) { g_object_set(GST_OBJECT(encoder_parser), "config-interval", H264_PARSER_CONFIG_INTERVAL, NULL); g_object_set(G_OBJECT(encoder_elem), "tune", H264_ENCODER_ZEROLATENCY, NULL); @@ -1102,43 +1122,71 @@ GstElement *__ms_video_encoder_element_create(node_plug_s *plug_info, media_stre if (gst_ret != TRUE) { ms_error("Failed to link elements into encoder_bin"); MS_SAFE_UNREF(encoder_bin); + return NULL; } __ms_add_ghostpad(encoder_parser, "src", encoder_bin, "src"); __ms_add_ghostpad(video_convert, "sink", encoder_bin, "sink"); return encoder_bin; + +ERROR: + + MS_SAFE_UNREF(video_convert); + MS_SAFE_UNREF(video_scale); + MS_SAFE_UNREF(encoder_elem); + MS_SAFE_UNREF(encoder_parser); + MS_SAFE_UNREF(encoder_bin); + + return NULL; } GstElement *__ms_video_decoder_element_create(node_plug_s *plug_info, media_streamer_node_type_e type) { + gboolean is_hw_codec = FALSE; + GstElement *last_elem = NULL; + GstElement *decoder_elem = NULL; + GstElement *decoder_parser = NULL; + GstElement *decoder_queue = NULL; + GstElement *video_conv = NULL; + GstElement *video_scale = NULL; + GstElement *decoder_bin = NULL; + node_plug_s decoder_info = {0,}; + node_plug_s parser_info = {0,}; + node_info_s nodes_info = {MEDIA_STREAMER_PARSER_KLASS, DEFAULT_VIDEO_PARSER}; + media_format_mimetype_e decoder_type = MEDIA_FORMAT_MAX; + gboolean gst_ret = FALSE; + const gchar *sink_type = NULL; + GstCaps *dec_caps = plug_info->sink_caps; if (!dec_caps) { dec_caps = gst_caps_from_string(MEDIA_STREAMER_DEFAULT_VIDEO_FORMAT); ms_debug("No Video decoding format is set! Deafault will be: [%s]", MEDIA_STREAMER_DEFAULT_VIDEO_FORMAT); } - gboolean is_hw_codec = FALSE; - GstElement *last_elem = NULL; - /* Creating Video Decoder */ - node_info_s *node_klass_type = __ms_node_get_klass_by_its_type(type); - node_plug_s decoder_info = {node_klass_type, plug_info->src_caps, dec_caps, NULL}; - GstElement *decoder_elem = __ms_element_create_from_ini(&decoder_info, MEDIA_STREAMER_NODE_TYPE_VIDEO_DECODER); + decoder_info.info = __ms_node_get_klass_by_its_type(type);; + decoder_info.src_caps = plug_info->src_caps; + decoder_info.sink_caps = dec_caps; + decoder_info.exclude_names = NULL; + + decoder_elem = __ms_element_create_from_ini(&decoder_info, MEDIA_STREAMER_NODE_TYPE_VIDEO_DECODER); if (!decoder_elem) decoder_elem = __ms_element_create_by_registry(&decoder_info, MEDIA_STREAMER_NODE_TYPE_VIDEO_DECODER); /* Creating Video Parser */ - node_info_s nodes_info = {MEDIA_STREAMER_PARSER_KLASS, DEFAULT_VIDEO_PARSER}; - node_plug_s parser_info = {&nodes_info, dec_caps, dec_caps, NULL}; - GstElement *decoder_parser = __ms_element_create_from_ini(&parser_info, MEDIA_STREAMER_NODE_TYPE_PARSER); + parser_info.info = &nodes_info; + parser_info.src_caps = dec_caps; + parser_info.sink_caps = dec_caps; + parser_info.exclude_names = NULL; + + decoder_parser = __ms_element_create_from_ini(&parser_info, MEDIA_STREAMER_NODE_TYPE_PARSER); if (!decoder_parser) decoder_parser = __ms_element_create_by_registry(&parser_info, MEDIA_STREAMER_NODE_TYPE_PARSER); /* Settings if H264 format is set*/ - const gchar *sink_type; MS_GET_CAPS_TYPE(dec_caps, sink_type); - media_format_mimetype_e decoder_type = __ms_convert_string_format_to_media_format(sink_type); + decoder_type = __ms_convert_string_format_to_media_format(sink_type); if (decoder_type == MEDIA_FORMAT_H264_SP) g_object_set(G_OBJECT(decoder_parser), "config-interval", H264_PARSER_CONFIG_INTERVAL, NULL); @@ -1146,10 +1194,13 @@ GstElement *__ms_video_decoder_element_create(node_plug_s *plug_info, media_stre is_hw_codec = TRUE; /* Creating bin - Video Decoder */ - gboolean gst_ret = FALSE; - GstElement *decoder_bin = gst_bin_new("video_decoder"); - GstElement *decoder_queue = __ms_element_create("queue", NULL); - ms_retvm_if(!decoder_elem || !decoder_queue || !decoder_bin || !decoder_parser, (GstElement *) NULL, "Error: creating elements for video decoder bin"); + decoder_queue = __ms_element_create("queue", NULL); + decoder_bin = gst_bin_new("video_decoder"); + + if (!decoder_elem || !decoder_queue || !decoder_parser || !decoder_bin) { + ms_error("Error: creating elements for video decoder bin"); + goto ERROR; + } /* Adding elements to bin Audio Encoder */ gst_bin_add_many(GST_BIN(decoder_bin), decoder_queue, decoder_elem, decoder_parser, NULL); @@ -1162,9 +1213,13 @@ GstElement *__ms_video_decoder_element_create(node_plug_s *plug_info, media_stre last_elem = decoder_elem; if (!is_hw_codec) { - GstElement *video_conv = __ms_element_create("videoconvert", NULL); - GstElement *video_scale = __ms_element_create("videoscale", NULL); - ms_retvm_if(!video_conv || !video_scale, (GstElement *) NULL, "Error: creating elements for video decoder bin"); + video_conv = __ms_element_create("videoconvert", NULL); + video_scale = __ms_element_create("videoscale", NULL); + if (!video_conv || !video_scale) { + ms_error("Error: creating elements for video decoder bin"); + goto ERROR; + } + gst_bin_add_many(GST_BIN(decoder_bin), video_conv, video_scale, NULL); gst_ret = gst_element_link_many(decoder_elem, video_conv, video_scale, NULL); if (gst_ret != TRUE) { @@ -1179,29 +1234,51 @@ GstElement *__ms_video_decoder_element_create(node_plug_s *plug_info, media_stre __ms_add_ghostpad(decoder_queue, "sink", decoder_bin, "sink"); return decoder_bin; + +ERROR: + + MS_SAFE_UNREF(decoder_elem); + MS_SAFE_UNREF(decoder_queue); + MS_SAFE_UNREF(decoder_parser); + MS_SAFE_UNREF(video_conv); + MS_SAFE_UNREF(video_scale); + MS_SAFE_UNREF(decoder_bin); + + return NULL; } GstElement *__ms_audio_encoder_element_create(node_plug_s *plug_info, media_streamer_node_type_e type) { - GstCaps *enc_caps = plug_info->src_caps; + gboolean gst_ret = FALSE; + GstElement *audio_convert = NULL; + GstElement *audio_resample = NULL; + GstElement *audio_filter = NULL; + GstElement *audio_postenc_convert = NULL; + GstElement *audio_encoder = NULL; + GstElement *audio_enc_bin = NULL; + node_plug_s plug_info_encoder = {0,}; gchar *encoder_name = NULL; + GstCaps *audioCaps = NULL; + + GstCaps *enc_caps = plug_info->src_caps; if (!enc_caps) { enc_caps = gst_caps_from_string(MEDIA_STREAMER_DEFAULT_AUDIO_FORMAT); ms_debug("No Audio encoding format is set! Deafault will be: [%s]", MEDIA_STREAMER_DEFAULT_AUDIO_FORMAT); } - gboolean gst_ret = FALSE; - /* Creating Converter, Resampler, Filter */ - GstElement *audio_convert = __ms_element_create(DEFAULT_AUDIO_CONVERT, NULL); - GstElement *audio_resample = __ms_element_create(DEFAULT_AUDIO_RESAMPLE, NULL); - GstElement *audio_filter = __ms_element_create(DEFAULT_FILTER, NULL); - GstElement *audio_postenc_convert = __ms_element_create(DEFAULT_AUDIO_CONVERT, NULL); + audio_convert = __ms_element_create(DEFAULT_AUDIO_CONVERT, NULL); + audio_resample = __ms_element_create(DEFAULT_AUDIO_RESAMPLE, NULL); + audio_filter = __ms_element_create(DEFAULT_FILTER, NULL); + audio_postenc_convert = __ms_element_create(DEFAULT_AUDIO_CONVERT, NULL); /* Creating Audio Encoder */ - node_info_s *node_klass_type = __ms_node_get_klass_by_its_type(type); - node_plug_s plug_info_encoder = {node_klass_type, enc_caps, plug_info->sink_caps, NULL}; - GstElement *audio_encoder = __ms_element_create_from_ini(&plug_info_encoder, type); + plug_info_encoder.info = __ms_node_get_klass_by_its_type(type); + plug_info_encoder.src_caps = enc_caps; + plug_info_encoder.sink_caps = plug_info->sink_caps; + plug_info_encoder.exclude_names = NULL; + + audio_encoder = __ms_element_create_from_ini(&plug_info_encoder, type); if (!audio_encoder) audio_encoder = __ms_element_create_by_registry(&plug_info_encoder, type); @@ -1211,10 +1288,13 @@ GstElement *__ms_audio_encoder_element_create(node_plug_s *plug_info, media_stre MS_SAFE_GFREE(encoder_name); /* Creating bin - Audio Encoder */ - GstElement *audio_enc_bin = gst_bin_new("audio_encoder"); - ms_retvm_if(!audio_convert || !audio_postenc_convert || !audio_filter || !audio_encoder || !audio_enc_bin, (GstElement *) NULL, "Error: creating elements for encoder bin"); + audio_enc_bin = gst_bin_new("audio_encoder"); + if (!audio_convert || !audio_postenc_convert || !audio_filter || !audio_resample || !audio_encoder || !audio_enc_bin) { + ms_error("Error: creating elements for audio encoder bin"); + goto ERROR; + } - GstCaps *audioCaps = gst_caps_from_string(MEDIA_STREAMER_DEFAULT_AUDIO_RAW_FORMAT); + audioCaps = gst_caps_from_string(MEDIA_STREAMER_DEFAULT_AUDIO_RAW_FORMAT); g_object_set(G_OBJECT(audio_filter), "caps", audioCaps, NULL); gst_caps_unref(audioCaps); @@ -1230,10 +1310,32 @@ GstElement *__ms_audio_encoder_element_create(node_plug_s *plug_info, media_stre __ms_add_ghostpad(audio_convert, "sink", audio_enc_bin, "sink"); return audio_enc_bin; +ERROR: + + MS_SAFE_UNREF(audio_convert); + MS_SAFE_UNREF(audio_resample); + MS_SAFE_UNREF(audio_postenc_convert); + MS_SAFE_UNREF(audio_filter); + MS_SAFE_UNREF(audio_encoder); + MS_SAFE_UNREF(audio_enc_bin); + + return NULL; + } GstElement *__ms_audio_decoder_element_create(node_plug_s *plug_info, media_streamer_node_type_e type) { + gboolean gst_ret = FALSE; + GstElement *decoder_bin = NULL; + GstElement *decoder_elem = NULL; + GstElement *decoder_parser = NULL; + GstElement *decoder_queue = NULL; + GstElement *audio_conv = NULL; + GstElement *audio_resample = NULL; + node_plug_s decoder_info = {0,}; + node_plug_s parser_info = {0,}; + node_info_s nodes_info = {MEDIA_STREAMER_PARSER_KLASS, DEFAULT_AUDIO_PARSER}; + GstCaps *dec_caps = plug_info->sink_caps; if (!dec_caps) { dec_caps = gst_caps_from_string(MEDIA_STREAMER_DEFAULT_AUDIO_FORMAT); @@ -1241,24 +1343,32 @@ GstElement *__ms_audio_decoder_element_create(node_plug_s *plug_info, media_stre } /* Creating Audio Decoder */ - node_info_s *node_klass_type = __ms_node_get_klass_by_its_type(type); - node_plug_s decoder_info = {node_klass_type, plug_info->src_caps, dec_caps, NULL}; - GstElement *decoder_elem = __ms_element_create_from_ini(&decoder_info, MEDIA_STREAMER_NODE_TYPE_AUDIO_DECODER); + decoder_info.info = __ms_node_get_klass_by_its_type(type); + decoder_info.src_caps = plug_info->src_caps; + decoder_info.sink_caps = dec_caps; + decoder_info.exclude_names = NULL; + + decoder_elem = __ms_element_create_from_ini(&decoder_info, MEDIA_STREAMER_NODE_TYPE_AUDIO_DECODER); if (!decoder_elem) decoder_elem = __ms_element_create_by_registry(&decoder_info, MEDIA_STREAMER_NODE_TYPE_AUDIO_DECODER); /* Creating Audio Parser */ - node_info_s nodes_info = {MEDIA_STREAMER_PARSER_KLASS, DEFAULT_AUDIO_PARSER}; - node_plug_s parser_info = {&nodes_info, dec_caps, dec_caps, NULL}; - GstElement *decoder_parser = __ms_element_create_from_ini(&parser_info, MEDIA_STREAMER_NODE_TYPE_PARSER); + parser_info.info = &nodes_info; + parser_info.src_caps = dec_caps; + parser_info.sink_caps = dec_caps; + parser_info.exclude_names = NULL; + + decoder_parser = __ms_element_create_from_ini(&parser_info, MEDIA_STREAMER_NODE_TYPE_PARSER); if (!decoder_parser) decoder_parser = __ms_element_create_by_registry(&parser_info, MEDIA_STREAMER_NODE_TYPE_PARSER); /* Creating bin - Audio Decoder */ - gboolean gst_ret = FALSE; - GstElement *decoder_bin = gst_bin_new("audio_decoder"); - GstElement *decoder_queue = __ms_element_create("queue", NULL); - ms_retvm_if(!decoder_elem || !decoder_queue || !decoder_bin || !decoder_parser, (GstElement *) NULL, "Error: creating elements for audio decoder bin"); + decoder_bin = gst_bin_new("audio_decoder"); + decoder_queue = __ms_element_create("queue", NULL); + if (!decoder_elem || !decoder_queue || !decoder_parser || !decoder_bin) { + ms_error("Error: creating elements for audio decoder bin"); + goto ERROR; + } /* Adding elements to bin Audio Encoder */ gst_bin_add_many(GST_BIN(decoder_bin), decoder_queue, decoder_elem, decoder_parser, NULL); @@ -1269,9 +1379,13 @@ GstElement *__ms_audio_decoder_element_create(node_plug_s *plug_info, media_stre return NULL; } - GstElement *audio_conv = __ms_element_create("audioconvert", NULL); - GstElement *audio_resample = __ms_element_create("audioresample", NULL); - ms_retvm_if(!audio_conv || !audio_resample, (GstElement *) NULL, "Error: creating elements for audio decoder bin"); + audio_conv = __ms_element_create("audioconvert", NULL); + audio_resample = __ms_element_create("audioresample", NULL); + if (!audio_conv || !audio_resample) { + ms_error("Error: creating elements for audio decoder bin"); + goto ERROR; + } + gst_bin_add_many(GST_BIN(decoder_bin), audio_conv, audio_resample, NULL); gst_ret = gst_element_link_many(decoder_elem, audio_conv, audio_resample, NULL); if (gst_ret != TRUE) { @@ -1284,6 +1398,16 @@ GstElement *__ms_audio_decoder_element_create(node_plug_s *plug_info, media_stre __ms_add_ghostpad(decoder_queue, "sink", decoder_bin, "sink"); return decoder_bin; +ERROR: + + MS_SAFE_UNREF(decoder_elem); + MS_SAFE_UNREF(decoder_queue); + MS_SAFE_UNREF(decoder_parser); + MS_SAFE_UNREF(audio_conv); + MS_SAFE_UNREF(audio_resample); + MS_SAFE_UNREF(decoder_bin); + + return NULL; } GstElement *__ms_rtp_element_create(void) @@ -1692,6 +1816,10 @@ int __ms_pipeline_create(media_streamer_s *ms_streamer) if (ms_streamer->ini.gst_args) { int i = 0; for ( ; ms_streamer->ini.gst_args[i]; ++i) { + if (*argc <= i+1) { + ms_error("need to check, prevent overrun"); + break; + } argv[i+1] = ms_streamer->ini.gst_args[i]; ms_debug("Add [%s] gstreamer parameter.", argv[i+1]); } -- 2.7.4 From 543e8529f3c2fa5bc2de6cbf2c949933bec1e153 Mon Sep 17 00:00:00 2001 From: Eunhae Choi Date: Tue, 24 Oct 2017 15:12:26 +0900 Subject: [PATCH 09/16] [0.1.20][ACR-1086] modify the API reference Change-Id: I652f28f1335cd196bce591940d263c3fa2b0e69d --- include/media_streamer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/media_streamer.h b/include/media_streamer.h index 04ceb3f..c4bff23 100644 --- a/include/media_streamer.h +++ b/include/media_streamer.h @@ -945,7 +945,7 @@ int media_streamer_node_push_packet(media_streamer_node_h src, media_packet_h pa * @remarks The internet privilege(http://tizen.org/privilege/internet) should be added if any URIs are used to transmit the output data. * You can release @a sink node using media_streamer_node_destroy() * @remarks If @a type is #MEDIA_STREAMER_NODE_SINK_TYPE_ADAPTIVE, the HTTP server will be started and the server will be able to transmit the output data to the other device. - * The application takes responsibility for server and client authentication because data transmission is not secure. + * The application must have an authentication responsibility between a server and client because the data transmission is not secure. * @param [in] type Type of sink node to be created * @param [out] sink Media streamer sink node handle * @return @c 0 on success, -- 2.7.4 From ea1adf1a24a5248ca6f0b625d180144b6feb44ab Mon Sep 17 00:00:00 2001 From: Hyunil Date: Fri, 10 Nov 2017 10:34:23 +0900 Subject: [PATCH 10/16] Replace videosink from waylandsink to tizenwlsink Change-Id: I391a1d10e24c752eca71bbe25193b78749a9b2ff Signed-off-by: Hyunil --- include/media_streamer_util.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/media_streamer_util.h b/include/media_streamer_util.h index 5c85853..22d09f0 100644 --- a/include/media_streamer_util.h +++ b/include/media_streamer_util.h @@ -153,7 +153,7 @@ typedef struct { #define DEFAULT_VIDEO_SOURCE "ximagesrc" #define DEFAULT_APP_SOURCE "appsrc" #define DEFAULT_AUDIO_SINK "pulsesink" -#define DEFAULT_VIDEO_SINK "waylandsink" +#define DEFAULT_VIDEO_SINK "tizenwlsink" #define DEFAULT_VIDEO_SCALE "videoscale" #define DEFAULT_VIDEO_CONVERT "videoconvert" #define DEFAULT_VIDEO_RATE "videorate" -- 2.7.4 From bbaeab91d1451fcc9895b481776f6b45d01e5a62 Mon Sep 17 00:00:00 2001 From: Vadym Sachenko Date: Wed, 8 Nov 2017 13:24:33 +0200 Subject: [PATCH 11/16] mm-resource-manager integration patch Change-Id: Ic87dc5efc00765e511b143d357a5550db8cb51c1 Signed-off-by: Vadym Sachenko --- CMakeLists.txt | 4 +- include/media_streamer_node_resources.h | 5 +- include/media_streamer_priv.h | 7 +- include/media_streamer_resource.h | 84 ----- packaging/capi-media-streamer.spec | 3 +- src/media_streamer_gst.c | 22 +- src/media_streamer_node.c | 56 +--- src/media_streamer_node_resources.c | 240 +++----------- src/media_streamer_priv.c | 62 ++-- src/media_streamer_resource.c | 557 -------------------------------- 10 files changed, 120 insertions(+), 920 deletions(-) delete mode 100644 include/media_streamer_resource.h delete mode 100644 src/media_streamer_resource.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 649690e..3867ff6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,8 +10,8 @@ SET(PREFIX ${CMAKE_INSTALL_PREFIX}) SET(INC_DIR include) INCLUDE_DIRECTORIES(${INC_DIR}) -SET(dependents "dlog glib-2.0 mm-common capi-media-tool iniparser bundle libtbm gstreamer-1.0 gstreamer-plugins-base-1.0 gstreamer-app-1.0 gstreamer-video-1.0 cynara-client capi-system-info ecore elementary murphy-resource murphy-glib dpm capi-content-mime-type libsoup-2.4") -SET(pc_dependents "capi-base-common capi-media-tool gstreamer-1.0 gstreamer-plugins-base-1.0 gstreamer-app-1.0 gstreamer-video-1.0 cynara-client capi-system-info ecore evas elementary murphy-resource murphy-glib dpm capi-system-info capi-content-mime-type libsoup-2.4") +SET(dependents "dlog glib-2.0 mm-common capi-media-tool iniparser bundle libtbm gstreamer-1.0 gstreamer-plugins-base-1.0 gstreamer-app-1.0 gstreamer-video-1.0 cynara-client capi-system-info ecore elementary mm-resource-manager dpm capi-content-mime-type libsoup-2.4") +SET(pc_dependents "capi-base-common capi-media-tool gstreamer-1.0 gstreamer-plugins-base-1.0 gstreamer-app-1.0 gstreamer-video-1.0 cynara-client capi-system-info ecore evas elementary mm-resource-manager dpm capi-system-info capi-content-mime-type libsoup-2.4") INCLUDE(FindPkgConfig) pkg_check_modules(${fw_name} REQUIRED ${dependents}) diff --git a/include/media_streamer_node_resources.h b/include/media_streamer_node_resources.h index 2f4dd12..e13aed3 100644 --- a/include/media_streamer_node_resources.h +++ b/include/media_streamer_node_resources.h @@ -18,15 +18,12 @@ #define __MEDIA_STREAMER_NODE_RESOURCE_H__ #include -#include #ifdef __cplusplus extern "C" { #endif -int __ms_node_resouces_init(media_streamer_node_s *node); -int __ms_node_resouces_deinit(media_streamer_node_s *node); -int _ms_node_resource_aquire(media_streamer_node_s *node); +int _ms_node_resource_acquire(media_streamer_node_s *node); int _ms_node_resource_release(media_streamer_node_s *node); #ifdef __cplusplus diff --git a/include/media_streamer_priv.h b/include/media_streamer_priv.h index 9ba66a0..6d2e889 100644 --- a/include/media_streamer_priv.h +++ b/include/media_streamer_priv.h @@ -28,7 +28,7 @@ extern "C" { #include #include -#include +#include #include struct media_streamer_node_s; @@ -116,7 +116,8 @@ typedef struct { media_streamer_callback_s interrupted_cb; gboolean is_interrupted; - media_streamer_resource_manager_s resource_manager; + mm_resource_manager_h resource_manager; + mm_resource_manager_res_h video_decoder_resource; media_streamer_http_server_h http_server; } media_streamer_s; @@ -140,7 +141,7 @@ typedef struct { void *callbacks_structure; - media_streamer_resource_manager_s resource_manager; + mm_resource_manager_res_h resource; device_policy_manager_h dpm_handle; int policy_changed_cb_id; } media_streamer_node_s; diff --git a/include/media_streamer_resource.h b/include/media_streamer_resource.h deleted file mode 100644 index 2cefdc8..0000000 --- a/include/media_streamer_resource.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (c) 2015-2016 Samsung Electronics Co., Ltd All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __MEDIA_STREAMER_RESOURCE_H__ -#define __MEDIA_STREAMER_RESOURCE_H__ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#define MEDIA_STREAMER_RESOURCE_TIMEOUT 5 - -#define MEDIA_STREAMER_GET_RESOURCE_LOCK(rm) (&((media_streamer_resource_manager_s *)rm)->lock) -#define MEDIA_STREAMER_RESOURCE_LOCK(rm) (g_mutex_lock(MEDIA_STREAMER_GET_RESOURCE_LOCK(rm))) -#define MEDIA_STREAMER_RESOURCE_UNLOCK(rm) (g_mutex_unlock(MEDIA_STREAMER_GET_RESOURCE_LOCK(rm))) - -#define MEDIA_STREAMER_GET_RESOURCE_COND(rm) (&((media_streamer_resource_manager_s *)rm)->cond) -#define MEDIA_STREAMER_RESOURCE_WAIT(rm) g_cond_wait(MEDIA_STREAMER_GET_RESOURCE_COND(rm), MEDIA_STREAMER_GET_RESOURCE_LOCK(rm) -#define MEDIA_STREAMER_RESOURCE_WAIT_UNTIL(rm, end_time) \ - g_cond_wait_until(MEDIA_STREAMER_GET_RESOURCE_COND(rm), MEDIA_STREAMER_GET_RESOURCE_LOCK(rm), end_time) -#define MEDIA_STREAMER_RESOURCE_SIGNAL(rm) g_cond_signal(MEDIA_STREAMER_GET_RESOURCE_COND(rm)); - -typedef enum { - RESOURCE_TYPE_NONE, - RESOURCE_TYPE_VIDEO_DECODER, - RESOURCE_TYPE_CAMERA, - RESOURCE_TYPE_VIDEO_OVERLAY, -} media_streamer_resource_type_e; - -typedef enum { - RESOURCE_STATE_ERROR = -1, - RESOURCE_STATE_NONE, - RESOURCE_STATE_INITIALIZED, - RESOURCE_STATE_PREPARED, - RESOURCE_STATE_ACQUIRED, - RESOURCE_STATE_MAX, -} media_streamer_resource_state_e; - -typedef struct _media_streamer_resource_manager_s media_streamer_resource_manager_s; -typedef gboolean (*resource_relese_cb)(media_streamer_resource_manager_s *resource_manager, void *user_data); - -struct _media_streamer_resource_manager_s { - mrp_mainloop_t *mloop; - mrp_res_context_t *context; - mrp_res_resource_set_t *rset; - media_streamer_resource_state_e state; - bool is_connected; - void *user_data; - bool by_rm_cb; - GCond cond; - GMutex lock; - - /* Release cb */ - resource_relese_cb release_cb; -}; - -int _ms_resource_manager_init(media_streamer_resource_manager_s *resource_manager, resource_relese_cb release_cb, void *user_data); -int _ms_resource_manager_prepare(media_streamer_resource_manager_s *resource_manager, media_streamer_resource_type_e resource_type); -int _ms_resource_manager_acquire(media_streamer_resource_manager_s *resource_manager); -int _ms_resource_manager_release(media_streamer_resource_manager_s *resource_manager); -int _ms_resource_manager_unprepare(media_streamer_resource_manager_s *resource_manager); -int _ms_resource_manager_deinit(media_streamer_resource_manager_s *resource_manager); -int _ms_resource_manager_get_state(media_streamer_resource_manager_s *resource_manager, media_streamer_resource_state_e *state); - -#ifdef __cplusplus -} -#endif - -#endif /* __MEDIA_STREAMER_RESOURCE_H__ */ diff --git a/packaging/capi-media-streamer.spec b/packaging/capi-media-streamer.spec index 3a73e2b..a562ad4 100644 --- a/packaging/capi-media-streamer.spec +++ b/packaging/capi-media-streamer.spec @@ -29,8 +29,7 @@ BuildRequires: pkgconfig(ecore) BuildRequires: pkgconfig(evas) BuildRequires: pkgconfig(ecore-wayland) BuildRequires: pkgconfig(appcore-efl) -BuildRequires: pkgconfig(murphy-resource) -BuildRequires: pkgconfig(murphy-glib) +BuildRequires: pkgconfig(mm-resource-manager) BuildRequires: pkgconfig(dpm) BuildRequires: pkgconfig(libsoup-2.4) BuildRequires: pkgconfig(capi-content-mime-type) diff --git a/src/media_streamer_gst.c b/src/media_streamer_gst.c index b61fbda..5a8c6ce 100644 --- a/src/media_streamer_gst.c +++ b/src/media_streamer_gst.c @@ -466,21 +466,31 @@ static gint __decodebin_autoplug_select_cb(GstElement * bin, GstPad * pad, GstCa } if (ms_streamer->ini.resource_required_elem_names) { - /* Try to acuire resources before adding element */ + /* Try to acquire resources before adding element */ int index = 0; for ( ; ms_streamer->ini.resource_required_elem_names[index]; ++index) { if (g_strrstr(factory_name, ms_streamer->ini.resource_required_elem_names[index])) { ms_debug("Decodebin: trying to acquire resource for [%s] element", factory_name); - if (MEDIA_STREAMER_ERROR_NONE != - _ms_resource_manager_prepare(&ms_streamer->resource_manager, RESOURCE_TYPE_VIDEO_DECODER)) { - ms_error("Failed to prepare resources for [%s] element", factory_name); + if (MM_RESOURCE_MANAGER_ERROR_NONE != + mm_resource_manager_mark_for_acquire(ms_streamer->resource_manager, + MM_RESOURCE_MANAGER_RES_TYPE_VIDEO_DECODER, + MM_RESOURCE_MANAGER_RES_VOLUME_FULL, + &ms_streamer->video_decoder_resource)) { + ms_error("Failed to mark resources for acquire in [%s] element", factory_name); return GST_AUTOPLUG_SELECT_SKIP; } - if (MEDIA_STREAMER_ERROR_NONE != - _ms_resource_manager_acquire(&ms_streamer->resource_manager)) { + if (MM_RESOURCE_MANAGER_ERROR_NONE != + mm_resource_manager_commit(ms_streamer->resource_manager)) { ms_error("Failed to acquire resources for [%s] element", factory_name); + + if (MM_RESOURCE_MANAGER_ERROR_NONE != + mm_resource_manager_mark_for_release( + ms_streamer->resource_manager, + ms_streamer->video_decoder_resource)) + ms_error("Failed to mark resources for release in [%s] element", factory_name); + return GST_AUTOPLUG_SELECT_SKIP; } } diff --git a/src/media_streamer_node.c b/src/media_streamer_node.c index 1c5a0fb..d7018b4 100644 --- a/src/media_streamer_node.c +++ b/src/media_streamer_node.c @@ -266,12 +266,6 @@ int __ms_node_create(media_streamer_node_s *node, media_format_h in_fmt, media_f if (sink_caps) gst_caps_unref(sink_caps); - ret = __ms_node_resouces_init(node); - if (MEDIA_STREAMER_ERROR_NONE != ret) { - ms_error("Failed to init resources for node [%s]", node->name); - return ret; - } - return ret; } @@ -582,12 +576,6 @@ int __ms_src_node_create(media_streamer_node_s *node) else node->name = gst_element_get_name(node->gst_element); - ret = __ms_node_resouces_init(node); - if (MEDIA_STREAMER_ERROR_NONE != ret) { - ms_error("Failed to init resources for node [%s]", node->name); - return ret; - } - ret = __ms_node_policy_init(node); if (MEDIA_STREAMER_ERROR_NONE != ret) { ms_error("Failed to init policy for node [%s]", node->name); @@ -702,12 +690,6 @@ int __ms_sink_node_create(media_streamer_node_s *node) else node->name = gst_element_get_name(node->gst_element); - ret = __ms_node_resouces_init(node); - if (MEDIA_STREAMER_ERROR_NONE != ret) { - ms_error("Failed to init resources for node [%s]", node->name); - return ret; - } - return ret; } @@ -722,10 +704,6 @@ void __ms_node_destroy(media_streamer_node_s *node) if (MEDIA_STREAMER_ERROR_NONE != __ms_node_policy_deinit(node)) ms_error("Failed to deinitialize policy manager"); - /* Deinitialize resource manager */ - if (MEDIA_STREAMER_ERROR_NONE != __ms_node_resouces_deinit(node)) - ms_error("Failed to deinitialize resource manager"); - MS_SAFE_UNREF(node->gst_element); MS_SAFE_FREE(node->name); MS_SAFE_FREE(node->callbacks_structure); @@ -1026,31 +1004,21 @@ int __ms_pipeline_unprepare(media_streamer_s *ms_streamer) ms_error("Failed to unprepare pipeline"); if (!ms_streamer->is_interrupted) { - media_streamer_resource_state_e res_state = RESOURCE_STATE_ERROR; - ret = _ms_resource_manager_get_state(&ms_streamer->resource_manager, - &res_state); - if (ret != MEDIA_STREAMER_ERROR_NONE) - ms_error("Failed to get state of resource manager"); - - if (RESOURCE_STATE_ACQUIRED == res_state) { - ret = _ms_resource_manager_release(&ms_streamer->resource_manager); - if (ret != MEDIA_STREAMER_ERROR_NONE) - ms_error("Failed to release resources"); - } + /* Unprepare resources in case of failure */ + __ms_release_resources(ms_streamer); - ret = _ms_resource_manager_get_state(&ms_streamer->resource_manager, - &res_state); - if (ret != MEDIA_STREAMER_ERROR_NONE) - ms_error("Failed to get state of resource manager"); + if (ms_streamer->video_decoder_resource != NULL) { + ret = mm_resource_manager_mark_for_release(ms_streamer->resource_manager, + ms_streamer->video_decoder_resource); + if (ret != MM_RESOURCE_MANAGER_ERROR_NONE) + ms_error("Failed to mark resources for release"); - if (RESOURCE_STATE_PREPARED == res_state) { - ret = _ms_resource_manager_unprepare(&ms_streamer->resource_manager); + ret = mm_resource_manager_commit(ms_streamer->resource_manager); if (ret != MEDIA_STREAMER_ERROR_NONE) - ms_error("Failed to unprepare resources"); + ms_error("Failed to release resources"); + else + ms_streamer->video_decoder_resource = NULL; } - - /* Unprepare resources in case of failure */ - __ms_release_resources(ms_streamer); } /* Disconnects and clean all autoplug signals */ @@ -1633,7 +1601,7 @@ gboolean _ms_node_resouces_acquire_iter(const GValue *item, GValue *ret, gpointe return TRUE; } - if (MEDIA_STREAMER_ERROR_NONE != _ms_node_resource_aquire(node)) { + if (MEDIA_STREAMER_ERROR_NONE != _ms_node_resource_acquire(node)) { ms_error("Failed to acquire resource for node [%s]", node->name); g_object_unref(element); return FALSE; diff --git a/src/media_streamer_node_resources.c b/src/media_streamer_node_resources.c index dbf8c54..98bdfdd 100644 --- a/src/media_streamer_node_resources.c +++ b/src/media_streamer_node_resources.c @@ -22,46 +22,7 @@ #include #include #include -#include - -static gboolean __ms_resource_relese_cb( - media_streamer_resource_manager_s *resource_manager, - void *user_data) -{ - ms_retvm_if(user_data == NULL, FALSE, "user_data is NULL"); - - media_streamer_node_s *node = (media_streamer_node_s *) user_data; - media_streamer_s *streamer = (media_streamer_s *) node->parent_streamer; - ms_info("Received resource_release_cb from node [%s]", node->name); - - /* Here we perform action to release resources relases that - were previoursly acquired. Basically what we need to do is - to unprepare media streamer. Whithout calling release function - on every acquired resource. */ - g_mutex_lock(&streamer->mutex_lock); - streamer->is_interrupted = TRUE; - if (MEDIA_STREAMER_ERROR_NONE != - __ms_pipeline_unprepare(streamer)) { - ms_error("Failed to unprepare streamer"); - streamer->is_interrupted = FALSE; - g_mutex_unlock(&streamer->mutex_lock); - return FALSE; - } - streamer->is_interrupted = FALSE; - - /* Call interrupted_cb with appropriate code */ - media_streamer_interrupted_cb interrupted_cb = - (media_streamer_interrupted_cb) streamer->interrupted_cb.callback; - if (interrupted_cb) { - interrupted_cb(MEDIA_STREAMER_INTERRUPTED_BY_RESOURCE_CONFLICT, - streamer->interrupted_cb.user_data); - } else { - ms_info("Interuption will not be handled because interrupted_cb is NULL"); - } - g_mutex_unlock(&streamer->mutex_lock); - - return TRUE; -} +#include static gboolean __ms_node_resources_is_needed_by_platform(media_streamer_node_s *node) { @@ -109,8 +70,8 @@ static gboolean __ms_node_resources_is_needed_by_platform(media_streamer_node_s return ret; } -static void __ms_node_get_resources_needed(media_streamer_node_s *node, - media_streamer_resource_type_e *resource) { +static gboolean __ms_node_get_resources_needed(media_streamer_node_s *node, + mm_resource_manager_res_type_e *resource) { media_streamer_node_type_e type = node->type; int subtype = node->subtype; @@ -121,138 +82,34 @@ static void __ms_node_get_resources_needed(media_streamer_node_s *node, case MEDIA_STREAMER_NODE_TYPE_VIDEO_ENCODER: break; case MEDIA_STREAMER_NODE_TYPE_VIDEO_DECODER: - *resource = RESOURCE_TYPE_VIDEO_DECODER; - break; + *resource = MM_RESOURCE_MANAGER_RES_TYPE_VIDEO_DECODER; + return TRUE; case MEDIA_STREAMER_NODE_TYPE_SRC: - if (MEDIA_STREAMER_NODE_SRC_TYPE_CAMERA == subtype) - *resource = RESOURCE_TYPE_CAMERA; + if (MEDIA_STREAMER_NODE_SRC_TYPE_CAMERA == subtype) { + *resource = MM_RESOURCE_MANAGER_RES_TYPE_CAMERA; + return TRUE; + } break; case MEDIA_STREAMER_NODE_TYPE_SINK: - if (MEDIA_STREAMER_NODE_SINK_TYPE_OVERLAY == subtype) - *resource = RESOURCE_TYPE_VIDEO_OVERLAY; + if (MEDIA_STREAMER_NODE_SINK_TYPE_OVERLAY == subtype) { + *resource = MM_RESOURCE_MANAGER_RES_TYPE_VIDEO_OVERLAY; + return TRUE; + } break; default: break; } -} - -int __ms_node_resouces_init(media_streamer_node_s *node) -{ - media_streamer_resource_type_e resource = RESOURCE_TYPE_NONE; - int ret = MEDIA_STREAMER_ERROR_NONE; - - /* Check if node require resource manager */ - __ms_node_get_resources_needed(node, &resource); - if (RESOURCE_TYPE_NONE == resource) { - ms_info("No resource is needed for %p node type [%d] subtype [%d]", - node, node->type, node->subtype); - return MEDIA_STREAMER_ERROR_NONE; - } - - /* Check if platform requires resource (e.g. Emulator) */ - if (!__ms_node_resources_is_needed_by_platform(node)) { - ms_info("Platform doesn't require resource for %p node type [%d] subtype [%d]", - node, node->type, node->subtype); - return MEDIA_STREAMER_ERROR_NONE; - } - - /* Initialize resource manager */ - ret = _ms_resource_manager_init(&node->resource_manager, - __ms_resource_relese_cb, node); - if (ret != MEDIA_STREAMER_ERROR_NONE) { - ms_error("Failed to initialize resource manager for Node"); - return ret; - } - - return ret; -} - -int __ms_node_resouces_deinit(media_streamer_node_s *node) -{ - media_streamer_resource_type_e resource = RESOURCE_TYPE_NONE; - int ret = MEDIA_STREAMER_ERROR_NONE; - - /* Check if node require resource manager */ - __ms_node_get_resources_needed(node, &resource); - if (RESOURCE_TYPE_NONE == resource) { - ms_info("No resource is needed for %p node type [%d] subtype [%d]", - node, node->type, node->subtype); - return MEDIA_STREAMER_ERROR_NONE; - } - - /* Check if platform requires resource (e.g. Emulator) */ - if (!__ms_node_resources_is_needed_by_platform(node)) { - ms_info("Platform doesn't require resource for %p node type [%d] subtype [%d]", - node, node->type, node->subtype); - return MEDIA_STREAMER_ERROR_NONE; - } - - /* Deinitialize resource manager */ - ret = _ms_resource_manager_deinit(&node->resource_manager); - if (ret != MEDIA_STREAMER_ERROR_NONE) { - ms_error("Failed to deinitialize resource manager for Src Node"); - return ret; - } - - return ret; -} - -int __ms_node_resouces_prepare(media_streamer_node_s *node, media_streamer_resource_type_e resource) -{ - media_streamer_resource_state_e resource_state = RESOURCE_STATE_NONE; - int ret = MEDIA_STREAMER_ERROR_NONE; - - ret = _ms_resource_manager_get_state(&node->resource_manager, &resource_state); - if (ret != MEDIA_STREAMER_ERROR_NONE) { - ms_error("Failed to get state from resource menager"); - return ret; - } else { - if (RESOURCE_STATE_NONE == resource_state || - RESOURCE_STATE_ERROR == resource_state) { - ms_error("Wrong resource manager state %d", resource_state); - return MEDIA_STREAMER_ERROR_INVALID_OPERATION; - } else if (RESOURCE_STATE_INITIALIZED == resource_state) { - /* For every node we should call resource manager function to resource */ - ret = _ms_resource_manager_prepare(&node->resource_manager, resource); - } else { - ms_info("Resource state is %d. No need to prepare", resource_state); - return MEDIA_STREAMER_ERROR_NONE; - } - } - - return ret; -} - -int __ms_node_resouces_unprepare(media_streamer_node_s *node, media_streamer_resource_type_e resource) -{ - media_streamer_resource_state_e resource_state = RESOURCE_STATE_NONE; - int ret = MEDIA_STREAMER_ERROR_NONE; - - ret = _ms_resource_manager_get_state(&node->resource_manager, &resource_state); - if (ret != MEDIA_STREAMER_ERROR_NONE) { - ms_error("Failed to get state from resource menager"); - return ret; - } else { - if (RESOURCE_STATE_PREPARED == resource_state) { - /* For every node we should call resource manager function to resource */ - ret = _ms_resource_manager_unprepare(&node->resource_manager); - } else { - ms_error("Wrong resource manager state %d", resource_state); - return MEDIA_STREAMER_ERROR_INVALID_OPERATION; - } - } - return ret; + return FALSE; } -int _ms_node_resource_aquire(media_streamer_node_s *node) +int _ms_node_resource_acquire(media_streamer_node_s *node) { - media_streamer_resource_state_e resource_state = RESOURCE_STATE_NONE; - media_streamer_resource_type_e resource = RESOURCE_TYPE_NONE; + mm_resource_manager_res_type_e resource; + mm_resource_manager_h resource_manager = node->parent_streamer->resource_manager; /* Check if node require resource manager */ - __ms_node_get_resources_needed(node, &resource); - if (RESOURCE_TYPE_NONE == resource) { + if (!__ms_node_get_resources_needed(node, &resource)) { ms_info("No resource is needed for %p node type [%d] subtype [%d]", node, node->type, node->subtype); return MEDIA_STREAMER_ERROR_NONE; @@ -265,29 +122,30 @@ int _ms_node_resource_aquire(media_streamer_node_s *node) return MEDIA_STREAMER_ERROR_NONE; } - if (MEDIA_STREAMER_ERROR_NONE != __ms_node_resouces_prepare(node, resource)) { - ms_error("Failed to prepare resources for Node [%p]", node); + if (node->resource != NULL) { + ms_error("Resource handle is not NULL for Node [%p]", node); return MEDIA_STREAMER_ERROR_INVALID_OPERATION; } - if (MEDIA_STREAMER_ERROR_NONE != - _ms_resource_manager_get_state(&node->resource_manager, &resource_state)) { - ms_error("Failed to get state from resource menager"); + if (MM_RESOURCE_MANAGER_ERROR_NONE != mm_resource_manager_mark_for_acquire( + resource_manager, resource, MM_RESOURCE_MANAGER_RES_VOLUME_FULL, + &node->resource)) { + ms_error("Failed to mark resources for acquire in Node [%p]", node); return MEDIA_STREAMER_ERROR_INVALID_OPERATION; - } else { - ms_debug("Resource manager state %d", resource_state); } ms_debug("Acquire resource for node [%s]", node->name); - if (RESOURCE_STATE_PREPARED != resource_state) { - ms_debug("Resources were not prepared %d. Skipping...", resource_state); - return MEDIA_STREAMER_ERROR_NONE; - } - - if (MEDIA_STREAMER_ERROR_NONE != - _ms_resource_manager_acquire(&node->resource_manager)) { + if (MM_RESOURCE_MANAGER_ERROR_NONE != + mm_resource_manager_commit(resource_manager)) { ms_error("Failed to acquire resources for node [%s]", node->name); + + if (MM_RESOURCE_MANAGER_ERROR_NONE != + mm_resource_manager_mark_for_release( + resource_manager, + node->resource)) + ms_error("Failed to mark resources for release in Node [%p]", node); + return MEDIA_STREAMER_ERROR_INVALID_OPERATION; } @@ -296,42 +154,28 @@ int _ms_node_resource_aquire(media_streamer_node_s *node) int _ms_node_resource_release(media_streamer_node_s *node) { - media_streamer_resource_state_e resource_state = RESOURCE_STATE_NONE; - media_streamer_resource_type_e resource = RESOURCE_TYPE_NONE; + mm_resource_manager_h resource_manager = node->parent_streamer->resource_manager; - /* Check if node require resource manager */ - __ms_node_get_resources_needed(node, &resource); - if (RESOURCE_TYPE_NONE == resource) { - ms_info("No resource is needed for %p node type [%d] subtype [%d]", - node, node->type, node->subtype); + if (node->resource == NULL) { + ms_error("Resources were not acquired for Node [%p]. Skipping...", node); return MEDIA_STREAMER_ERROR_NONE; } - if (MEDIA_STREAMER_ERROR_NONE != - _ms_resource_manager_get_state(&node->resource_manager, &resource_state)) { - ms_error("Failed to get state from resource menager"); - return MEDIA_STREAMER_ERROR_INVALID_OPERATION; - } else { - ms_debug("Resource manager state %d", resource_state); - } - ms_debug("Release resources for node [%s]", node->name); - if (RESOURCE_STATE_ACQUIRED != resource_state) { - ms_debug("Resources were not acquired %d. Skipping...", resource_state); - return MEDIA_STREAMER_ERROR_NONE; + if (MEDIA_STREAMER_ERROR_NONE != mm_resource_manager_mark_for_release( + resource_manager, node->resource)) { + ms_error("Failed to mark resources for release in Node [%p]", node); + return MEDIA_STREAMER_ERROR_INVALID_OPERATION; } if (MEDIA_STREAMER_ERROR_NONE != - _ms_resource_manager_release(&node->resource_manager)) { + mm_resource_manager_commit(resource_manager)) { ms_error("Failed to release resources for node [%s]", node->name); return MEDIA_STREAMER_ERROR_INVALID_OPERATION; } - if (MEDIA_STREAMER_ERROR_NONE != __ms_node_resouces_unprepare(node, resource)) { - ms_error("Failed to unprepare resources for Node [%p]", node); - return MEDIA_STREAMER_ERROR_INVALID_OPERATION; - } + node->resource = NULL; return MEDIA_STREAMER_ERROR_NONE; } diff --git a/src/media_streamer_priv.c b/src/media_streamer_priv.c index c3825dc..e0efc4e 100644 --- a/src/media_streamer_priv.c +++ b/src/media_streamer_priv.c @@ -18,13 +18,15 @@ #include "media_streamer_util.h" #include "media_streamer_node.h" #include "media_streamer_gst.h" -#include "media_streamer_resource.h" +#include #define GST_TIME_TO_MSEC(t) (t == GST_CLOCK_TIME_NONE ? t : (int)(((GstClockTime)(t)) / GST_MSECOND)) int __ms_change_resources_state(media_streamer_s *ms_streamer, media_streamer_state_e state); int __ms_change_policy_state(media_streamer_s *ms_streamer, media_streamer_state_e state); -static gboolean media_streamer_resource_relese_cb(media_streamer_resource_manager_s *resource_manager, void *user_data); +static gboolean __ms_resource_node_find(gpointer key, gpointer value, gpointer user_data); +static int __ms_resource_release_cb(mm_resource_manager_h rm, + mm_resource_manager_res_h resource_h, void *user_data); int __ms_state_change(media_streamer_s *ms_streamer, media_streamer_state_e state) { @@ -99,10 +101,11 @@ int __ms_create(media_streamer_s *ms_streamer) ret = __ms_pipeline_create(ms_streamer); - if (MEDIA_STREAMER_ERROR_NONE != _ms_resource_manager_init( - &ms_streamer->resource_manager, - media_streamer_resource_relese_cb, - ms_streamer)) { + if (MM_RESOURCE_MANAGER_ERROR_NONE != mm_resource_manager_create( + MM_RESOURCE_MANAGER_APP_CLASS_MEDIA, + __ms_resource_release_cb, + ms_streamer, + &ms_streamer->resource_manager)) { ms_error("Failed to init resource manager for media streamer"); return MEDIA_STREAMER_ERROR_INVALID_OPERATION; } @@ -189,8 +192,8 @@ int __ms_streamer_destroy(media_streamer_s *ms_streamer) if (ms_streamer->ini.resource_required_elem_names) g_strfreev(ms_streamer->ini.resource_required_elem_names); - if (MEDIA_STREAMER_ERROR_NONE != - _ms_resource_manager_deinit(&ms_streamer->resource_manager)) { + if (MM_RESOURCE_MANAGER_ERROR_NONE != + mm_resource_manager_destroy(ms_streamer->resource_manager)) { ms_error("Failed to deinit resource manager for media streamer"); g_mutex_unlock(&ms_streamer->mutex_lock); return MEDIA_STREAMER_ERROR_INVALID_OPERATION; @@ -203,7 +206,7 @@ int __ms_streamer_destroy(media_streamer_s *ms_streamer) return ret; } -int __ms_aquire_resources(media_streamer_s *ms_streamer) +int __ms_acquire_resources(media_streamer_s *ms_streamer) { int ret = MEDIA_STREAMER_ERROR_NONE; @@ -295,7 +298,7 @@ int __ms_change_resources_state(media_streamer_s *ms_streamer, media_streamer_st switch (ms_streamer->pend_state) { case MEDIA_STREAMER_STATE_IDLE: /* After prepare function */ - ret = __ms_aquire_resources(ms_streamer); + ret = __ms_acquire_resources(ms_streamer); break; case MEDIA_STREAMER_STATE_PAUSED: case MEDIA_STREAMER_STATE_PLAYING: @@ -311,20 +314,39 @@ int __ms_change_resources_state(media_streamer_s *ms_streamer, media_streamer_st return ret; } -static gboolean media_streamer_resource_relese_cb( - media_streamer_resource_manager_s *resource_manager, - void *user_data) +static gboolean __ms_resource_node_find(gpointer key, gpointer value, gpointer user_data) +{ + return ((media_streamer_node_s *)value)->resource == + (mm_resource_manager_res_h)user_data; +} + +static int __ms_resource_release_cb(mm_resource_manager_h rm, + mm_resource_manager_res_h resource_h, void *user_data) { ms_retvm_if(user_data == NULL, FALSE, "user_data is NULL"); media_streamer_s *streamer = (media_streamer_s *) user_data; - ms_info("Reseived release_cb for streamer %p", streamer); + media_streamer_node_s *node; + ms_info("Received release_cb for streamer %p", streamer); - /* Here we perform action to release resources relases that - were previoursly acquired (dynamically created case). - Basically what we need to do is to unprepare media streamer. - Whithout calling release function on every acquired resource. */ + /* Here we perform action to release resources that + were previously acquired (dynamically created case). + Basically what we need to do is to unprepare media streamer + without calling release function on every acquired resource. */ g_mutex_lock(&streamer->mutex_lock); + + /* Clear handle of released resource */ + if (resource_h == streamer->video_decoder_resource) { + streamer->video_decoder_resource = NULL; + } else { + node = (media_streamer_node_s *)g_hash_table_find(streamer->nodes_table, + (GHRFunc)__ms_resource_node_find, resource_h); + if (node == NULL) + ms_error("Failed to find released resource"); + else + node->resource = NULL; + } + streamer->is_interrupted = TRUE; if (MEDIA_STREAMER_ERROR_NONE != __ms_pipeline_unprepare(streamer)) { @@ -342,11 +364,11 @@ static gboolean media_streamer_resource_relese_cb( interrupted_cb(MEDIA_STREAMER_INTERRUPTED_BY_RESOURCE_CONFLICT, streamer->interrupted_cb.user_data); } else { - ms_info("Interuption will not be handled because interrupted_cb is NULL"); + ms_info("Interruption will not be handled because interrupted_cb is NULL"); } g_mutex_unlock(&streamer->mutex_lock); - return TRUE; + return FALSE; } int __ms_check_policy(media_streamer_s *ms_streamer) diff --git a/src/media_streamer_resource.c b/src/media_streamer_resource.c deleted file mode 100644 index bce054d..0000000 --- a/src/media_streamer_resource.c +++ /dev/null @@ -1,557 +0,0 @@ -/* - * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "media_streamer_util.h" -#include "media_streamer_resource.h" -#include "media_streamer_priv.h" -#include - -#define MRP_APP_CLASS_FOR_MSTREAMER "media" -#define MRP_RESOURCE_TYPE_MANDATORY TRUE -#define MRP_RESOURCE_TYPE_EXCLUSIVE FALSE - -enum { - MRP_RESOURCE_FOR_VIDEO_OVERLAY, - MRP_RESOURCE_FOR_CAMERA, - MRP_RESOURCE_FOR_VIDEO_DECODER, - MRP_RESOURCE_MAX, -}; -const char* resource_str[MRP_RESOURCE_MAX] = { - "video_overlay", - "camera", - "video_decoder", -}; - -#define MEDIA_STREAMER_WAIT_CONNECTION_TIMEOUT 5 - -#define MEDIA_STREAMER_CHECK_RESOURCE_MANAGER_INSTANCE(x_ms_resource_manager) \ -do { \ - if (!x_ms_resource_manager) { \ - ms_error("no resource manager instance");\ - return MEDIA_STREAMER_ERROR_INVALID_PARAMETER; \ - } \ -} while (0); - -static int __ms_resource_manager_wait_connection(media_streamer_resource_manager_s *resource_manager) -{ - MEDIA_STREAMER_CHECK_RESOURCE_MANAGER_INSTANCE(resource_manager); - - MEDIA_STREAMER_RESOURCE_LOCK(resource_manager); - - if (resource_manager->is_connected) { - ms_debug("Already connected to resource server"); - } else { - gint64 end_time = g_get_monotonic_time() + MEDIA_STREAMER_RESOURCE_TIMEOUT*G_TIME_SPAN_SECOND; - - ms_debug("Not connected to resource server yet. Waiting..."); - - if (!g_cond_wait_until(&resource_manager->cond, - &resource_manager->lock, end_time)) { - ms_error("Could not connect to resource server"); - MEDIA_STREAMER_RESOURCE_UNLOCK(resource_manager); - return MEDIA_STREAMER_ERROR_INVALID_OPERATION; - } else { - if (resource_manager->is_connected) { - ms_debug("Successfully connected to resource server!"); - } else { - ms_error("Failed to connect to resource server"); - MEDIA_STREAMER_RESOURCE_UNLOCK(resource_manager); - return MEDIA_STREAMER_ERROR_INVALID_OPERATION; - } - } - } - - MEDIA_STREAMER_RESOURCE_UNLOCK(resource_manager); - return MEDIA_STREAMER_ERROR_NONE; -} - -static char *state_to_str(mrp_res_resource_state_t st) -{ - char *state = "unknown"; - switch (st) { - case MRP_RES_RESOURCE_ACQUIRED: - state = "acquired"; - break; - case MRP_RES_RESOURCE_LOST: - state = "lost"; - break; - case MRP_RES_RESOURCE_AVAILABLE: - state = "available"; - break; - case MRP_RES_RESOURCE_PENDING: - state = "pending"; - break; - case MRP_RES_RESOURCE_ABOUT_TO_LOOSE: - state = "about to loose"; - break; - } - return state; -} - -static void mrp_state_callback(mrp_res_context_t *context, mrp_res_error_t err, void *user_data) -{ - int i = 0; - const mrp_res_resource_set_t *rset; - mrp_res_resource_t *resource; - media_streamer_resource_manager_s* resource_manager = NULL; - - if (user_data == NULL) { - ms_error(" - user data is null"); - return; - } - resource_manager = (media_streamer_resource_manager_s *) user_data; - - MEDIA_STREAMER_RESOURCE_LOCK(resource_manager); - - if (err != MRP_RES_ERROR_NONE) { - ms_error(" - error message received from Murphy, err(0x%x)", err); - g_cond_signal(&resource_manager->cond); - MEDIA_STREAMER_RESOURCE_UNLOCK(resource_manager); - return; - } - - switch (context->state) { - case MRP_RES_CONNECTED: - ms_debug(" - connected to Murphy"); - if ((rset = mrp_res_list_resources(context)) != NULL) { - mrp_res_string_array_t *resource_names; - resource_names = mrp_res_list_resource_names(rset); - if (!resource_names) { - ms_error(" - no resources available"); - MEDIA_STREAMER_RESOURCE_UNLOCK(resource_manager); - return; - } - for (i = 0; i < resource_names->num_strings; i++) { - resource = mrp_res_get_resource_by_name(rset, resource_names->strings[i]); - if (resource) - ms_debug(" - available resource: %s", resource->name); - } - mrp_res_free_string_array(resource_names); - } - resource_manager->is_connected = TRUE; - g_cond_signal(&resource_manager->cond); - break; - case MRP_RES_DISCONNECTED: - ms_debug(" - disconnected from Murphy"); - if (resource_manager->rset) { - mrp_res_delete_resource_set(resource_manager->rset); - resource_manager->rset = NULL; - } - mrp_res_destroy(resource_manager->context); - resource_manager->context = NULL; - resource_manager->is_connected = FALSE; - g_cond_signal(&resource_manager->cond); - break; - } - - MEDIA_STREAMER_RESOURCE_UNLOCK(resource_manager); - - return; -} - -static void mrp_rset_state_callback(mrp_res_context_t *cx, const mrp_res_resource_set_t *rs, void *user_data) -{ - int i = 0; - media_streamer_resource_manager_s *resource_manager = (media_streamer_resource_manager_s *)user_data; - mrp_res_resource_t *res; - - MEDIA_STREAMER_RESOURCE_LOCK(resource_manager); - - if (!mrp_res_equal_resource_set(rs, resource_manager->rset)) { - ms_info("- resource set(%p) is not same as this resource_manager handle's(%p)", rs, resource_manager->rset); - MEDIA_STREAMER_RESOURCE_UNLOCK(resource_manager); - return; - } - - ms_debug(" - resource set state of resource_manager(%p) is changed to [%s]", resource_manager, state_to_str(rs->state)); - for (i = 0; i < MRP_RESOURCE_MAX; i++) { - res = mrp_res_get_resource_by_name(rs, resource_str[i]); - if (res == NULL) - ms_info(" -- %s not present in resource set", resource_str[i]); - else - ms_info(" -- resource name [%s] -> [%s]'", res->name, state_to_str(res->state)); - } - - mrp_res_delete_resource_set(resource_manager->rset); - resource_manager->rset = mrp_res_copy_resource_set(rs); - - if (rs->state == MRP_RES_RESOURCE_ACQUIRED) { - ms_debug(" - resource set is acquired"); - resource_manager->state = RESOURCE_STATE_ACQUIRED; - MEDIA_STREAMER_RESOURCE_SIGNAL(resource_manager); - } else if ((resource_manager->state >= RESOURCE_STATE_ACQUIRED) && - (rs->state == MRP_RES_RESOURCE_AVAILABLE)) { - ms_debug(" - resource set is released"); - resource_manager->state = RESOURCE_STATE_PREPARED; - MEDIA_STREAMER_RESOURCE_SIGNAL(resource_manager); - } - - MEDIA_STREAMER_RESOURCE_UNLOCK(resource_manager); -} - - -static void mrp_resource_release_cb(mrp_res_context_t *cx, const mrp_res_resource_set_t *rs, void *user_data) -{ - int i = 0; - media_streamer_resource_manager_s *resource_manager = NULL; - mrp_res_resource_t *res; - - if (user_data == NULL) { - ms_error("- user_data is null"); - return; - } - resource_manager = (media_streamer_resource_manager_s *) user_data; - - MEDIA_STREAMER_RESOURCE_LOCK(resource_manager); - - if (!mrp_res_equal_resource_set(rs, resource_manager->rset)) { - ms_info("- resource set(%p) is not same as this resource_manager handle's(%p)", - rs, resource_manager->rset); - MEDIA_STREAMER_RESOURCE_UNLOCK(resource_manager); - return; - } - - ms_debug(" - resource set state of resource manager (%p) is changed to [%s]", - resource_manager, state_to_str(rs->state)); - for (i = 0; i < MRP_RESOURCE_MAX; i++) { - res = mrp_res_get_resource_by_name(rs, resource_str[i]); - if (res == NULL) - ms_info(" -- %s not present in resource set", resource_str[i]); - else - ms_debug(" -- resource name [%s] -> [%s] %d'", res->name, - state_to_str(res->state), res->state); - } - - if (resource_manager->release_cb) { - if (!resource_manager->release_cb(resource_manager, resource_manager->user_data)) - ms_error("release_cb failed"); - else - ms_info("release_cb is fine"); - } else { - ms_error("release cb is NULL. Something wrong happens..."); - } - - MEDIA_STREAMER_RESOURCE_UNLOCK(resource_manager); - - return; -} - -static int create_rset(media_streamer_resource_manager_s *resource_manager) -{ - if (resource_manager->rset) { - ms_error(" - resource set was already created"); - return MEDIA_STREAMER_ERROR_INVALID_STATE; - } - - resource_manager->rset = - mrp_res_create_resource_set(resource_manager->context, - MRP_APP_CLASS_FOR_MSTREAMER, - mrp_rset_state_callback, - (void*)resource_manager); - if (resource_manager->rset == NULL) { - ms_error(" - could not create resource set"); - return MEDIA_STREAMER_ERROR_INVALID_OPERATION; - } - - if (!mrp_res_set_autorelease(TRUE, resource_manager->rset)) - ms_info(" - could not set autorelease flag!"); - - return MEDIA_STREAMER_ERROR_NONE; -} - -static int include_resource(media_streamer_resource_manager_s *resource_manager, const char *resource_name) -{ - mrp_res_resource_t *resource = NULL; - resource = mrp_res_create_resource(resource_manager->rset, - resource_name, - MRP_RESOURCE_TYPE_MANDATORY, - MRP_RESOURCE_TYPE_EXCLUSIVE); - if (resource == NULL) { - ms_error(" - could not include resource[%s]", resource_name); - return MEDIA_STREAMER_ERROR_INVALID_OPERATION; - } - - ms_debug(" - include resource[%s]", resource_name); - - return MEDIA_STREAMER_ERROR_NONE; -} - -static int set_resource_release_cb(media_streamer_resource_manager_s *resource_manager) -{ - int ret = MEDIA_STREAMER_ERROR_NONE; - bool mrp_ret = FALSE; - - if (resource_manager->rset) { - if (MRP_RES_RESOURCE_PENDING == resource_manager->rset->state) { - /* FIXME: This workarond is only temporary solution. - When resource set is acquired again after lost the state is 'available' - and no 'pending'. Thus we skip setting reelease callback as it already - was set. */ - mrp_ret = mrp_res_set_release_callback(resource_manager->rset, mrp_resource_release_cb, resource_manager); - if (!mrp_ret) { - ms_error(" - could not set release callback"); - ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION; - } - } - } else { - ms_error(" - resource set is null"); - ret = MEDIA_STREAMER_ERROR_INVALID_STATE; - } - - return ret; -} - -int _ms_resource_manager_init(media_streamer_resource_manager_s *resource_manager, - resource_relese_cb release_cb, void *user_data) -{ - int ret = MEDIA_STREAMER_ERROR_NONE; - MEDIA_STREAMER_CHECK_RESOURCE_MANAGER_INSTANCE(resource_manager); - ms_retvm_if(release_cb == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, - "release_cb is NULL"); - - g_mutex_init(&resource_manager->lock); - g_cond_init(&resource_manager->cond); - - MEDIA_STREAMER_RESOURCE_LOCK(resource_manager); - - GMainContext *mrp_ctx = g_main_context_new(); - if (!mrp_ctx) { - ms_error("- could not create main context for resource manager"); - ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION; - goto EXIT; - } - - GMainLoop *mrp_loop = g_main_loop_new(mrp_ctx, TRUE); - g_main_context_unref(mrp_ctx); - if (!mrp_loop) { - ms_error("- could not create glib mainloop for resource manager"); - ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION; - goto EXIT; - } - - resource_manager->mloop = mrp_mainloop_glib_get(mrp_loop); - g_main_loop_unref(mrp_loop); - if (resource_manager->mloop) { - resource_manager->context = mrp_res_create(resource_manager->mloop, - mrp_state_callback, resource_manager); - - if (resource_manager->context == NULL) { - ms_error(" - could not get context for resource manager"); - mrp_mainloop_destroy(resource_manager->mloop); - resource_manager->mloop = NULL; - ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION; - goto EXIT; - } - resource_manager->user_data = user_data; - } else { - ms_error("- could not get mainloop for resource manager"); - ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION; - goto EXIT; - } - - resource_manager->release_cb = release_cb; - resource_manager->state = RESOURCE_STATE_INITIALIZED; - -EXIT: - MEDIA_STREAMER_RESOURCE_UNLOCK(resource_manager); - - return ret; -} - -int _ms_resource_manager_prepare(media_streamer_resource_manager_s *resource_manager, media_streamer_resource_type_e resource_type) -{ - int ret = MEDIA_STREAMER_ERROR_NONE; - MEDIA_STREAMER_CHECK_RESOURCE_MANAGER_INSTANCE(resource_manager); - __ms_resource_manager_wait_connection(resource_manager); - - if (!resource_manager->rset) - ret = create_rset(resource_manager); - - if (ret == MEDIA_STREAMER_ERROR_NONE) { - switch (resource_type) { - case RESOURCE_TYPE_VIDEO_OVERLAY: - ret = include_resource(resource_manager, resource_str[MRP_RESOURCE_FOR_VIDEO_OVERLAY]); - break; - case RESOURCE_TYPE_VIDEO_DECODER: - ret = include_resource(resource_manager, resource_str[MRP_RESOURCE_FOR_VIDEO_DECODER]); - break; - case RESOURCE_TYPE_CAMERA: - ret = include_resource(resource_manager, resource_str[MRP_RESOURCE_FOR_CAMERA]); - break; - case RESOURCE_TYPE_NONE: - default: - ms_error("Wrong resource type %d", resource_type); - ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION; - break; - } - } - - if (MEDIA_STREAMER_ERROR_NONE == ret) - resource_manager->state = RESOURCE_STATE_PREPARED; - else - resource_manager->state = RESOURCE_STATE_ERROR; - - return ret; -} - -int _ms_resource_manager_acquire(media_streamer_resource_manager_s *resource_manager) -{ - int ret = MEDIA_STREAMER_ERROR_NONE; - MEDIA_STREAMER_CHECK_RESOURCE_MANAGER_INSTANCE(resource_manager); - __ms_resource_manager_wait_connection(resource_manager); - - if (resource_manager->rset == NULL) { - ms_error("- could not acquire resource, resource set is null"); - ret = MEDIA_STREAMER_ERROR_INVALID_STATE; - } else { - ret = set_resource_release_cb(resource_manager); - if (ret) { - ms_error("- could not set resource release cb, ret(%d)", ret); - ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION; - } else { - MEDIA_STREAMER_RESOURCE_LOCK(resource_manager); - - ret = mrp_res_acquire_resource_set(resource_manager->rset); - if (ret) { - ms_error("- could not acquire resource, ret(%d)", ret); - ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION; - } else { - gint64 end_time = g_get_monotonic_time() + MEDIA_STREAMER_RESOURCE_TIMEOUT*G_TIME_SPAN_SECOND; - - ms_debug("- acquire resource waiting..%p till %lld", resource_manager, end_time); - if (!MEDIA_STREAMER_RESOURCE_WAIT_UNTIL(resource_manager, end_time)) { - ms_error("- could not acquire resource"); - ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION; - } else { - ms_debug("- resources are acquired"); - } - } - MEDIA_STREAMER_RESOURCE_UNLOCK(resource_manager); - } - } - - return ret; -} - -int _ms_resource_manager_release(media_streamer_resource_manager_s *resource_manager) -{ - int ret = MEDIA_STREAMER_ERROR_NONE; - MEDIA_STREAMER_CHECK_RESOURCE_MANAGER_INSTANCE(resource_manager); - __ms_resource_manager_wait_connection(resource_manager); - - if (resource_manager->rset == NULL) { - ms_error("- could not release resource, resource set is null"); - ret = MEDIA_STREAMER_ERROR_INVALID_STATE; - } else { - if (resource_manager->rset->state != MRP_RES_RESOURCE_ACQUIRED) { - ms_error("- could not release resource, resource set state is [%s]", state_to_str(resource_manager->rset->state)); - ret = MEDIA_STREAMER_ERROR_INVALID_STATE; - } else { - MEDIA_STREAMER_RESOURCE_LOCK(resource_manager); - ret = mrp_res_release_resource_set(resource_manager->rset); - if (ret) { - ms_error("- could not release resource, ret(%d)", ret); - ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION; - } else { - gint64 end_time = g_get_monotonic_time() + MEDIA_STREAMER_RESOURCE_TIMEOUT*G_TIME_SPAN_SECOND; - - ms_debug("- release resource waiting..%p till %lld", resource_manager, end_time); - if (!MEDIA_STREAMER_RESOURCE_WAIT_UNTIL(resource_manager, end_time)) { - ms_info("- could not release resource in time"); - ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION; - } else { - ms_debug("- resources are released"); - } - } - MEDIA_STREAMER_RESOURCE_UNLOCK(resource_manager); - } - } - - return ret; -} - -int _ms_resource_manager_unprepare(media_streamer_resource_manager_s *resource_manager) -{ - int ret = MEDIA_STREAMER_ERROR_NONE; - MEDIA_STREAMER_CHECK_RESOURCE_MANAGER_INSTANCE(resource_manager); - __ms_resource_manager_wait_connection(resource_manager); - - if (resource_manager->rset == NULL) { - ms_error("- could not unprepare for resource_manager, _ms_resource_manager_prepare() first"); - ret = MEDIA_STREAMER_ERROR_INVALID_STATE; - } else { - MEDIA_STREAMER_RESOURCE_LOCK(resource_manager); - mrp_res_delete_resource_set(resource_manager->rset); - resource_manager->rset = NULL; - MEDIA_STREAMER_RESOURCE_UNLOCK(resource_manager); - } - - resource_manager->state = RESOURCE_STATE_INITIALIZED; - - return ret; -} - -int _ms_resource_manager_deinit(media_streamer_resource_manager_s *resource_manager) -{ - MEDIA_STREAMER_CHECK_RESOURCE_MANAGER_INSTANCE(resource_manager); - __ms_resource_manager_wait_connection(resource_manager); - - MEDIA_STREAMER_RESOURCE_LOCK(resource_manager); - - if (resource_manager->rset) { - if (resource_manager->rset->state == MRP_RES_RESOURCE_ACQUIRED) { - if (mrp_res_release_resource_set(resource_manager->rset)) - ms_error("- could not release resource"); - } - mrp_res_delete_resource_set(resource_manager->rset); - resource_manager->rset = NULL; - } - - if (resource_manager->context) { - mrp_res_destroy(resource_manager->context); - resource_manager->context = NULL; - } - - if (resource_manager->mloop) { - mrp_mainloop_quit(resource_manager->mloop, 0); - mrp_mainloop_destroy(resource_manager->mloop); - resource_manager->mloop = NULL; - } - - resource_manager->release_cb = NULL; - - resource_manager->state = RESOURCE_STATE_NONE; - - MEDIA_STREAMER_RESOURCE_UNLOCK(resource_manager); - - g_mutex_clear(&resource_manager->lock); - g_cond_clear(&resource_manager->cond); - - return MEDIA_STREAMER_ERROR_NONE; -} - -int _ms_resource_manager_get_state(media_streamer_resource_manager_s *resource_manager, media_streamer_resource_state_e *state) -{ - MEDIA_STREAMER_CHECK_RESOURCE_MANAGER_INSTANCE(resource_manager); - ms_retvm_if(state == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, - "state is NULL"); - - ms_debug("resource_state is %d", resource_manager->state); - - *state = resource_manager->state; - - return MEDIA_STREAMER_ERROR_NONE; -} -- 2.7.4 From 6e3d29e30aa6d5fe5fbfd8017bbdebd6d5ab54f7 Mon Sep 17 00:00:00 2001 From: Volodymyr Brynza Date: Tue, 21 Nov 2017 13:41:50 +0200 Subject: [PATCH 12/16] Change obsolete ximagesrc to videotestsrc Change-Id: I6ee40a52e506c702315aa113eca4d7691d5bf40b Signed-off-by: Volodymyr Brynza --- include/media_streamer_util.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/media_streamer_util.h b/include/media_streamer_util.h index 22d09f0..1003fd0 100644 --- a/include/media_streamer_util.h +++ b/include/media_streamer_util.h @@ -150,7 +150,7 @@ typedef struct { #define DEFAULT_DECODEBIN "decodebin" #define DEFAULT_AUDIO_SOURCE "pulsesrc" #define DEFAULT_CAMERA_SOURCE "v4l2src" -#define DEFAULT_VIDEO_SOURCE "ximagesrc" +#define DEFAULT_VIDEO_SOURCE "videotestsrc" #define DEFAULT_APP_SOURCE "appsrc" #define DEFAULT_AUDIO_SINK "pulsesink" #define DEFAULT_VIDEO_SINK "tizenwlsink" -- 2.7.4 From fa95599b2dd63bce4cb03aa71b90d827d0927740 Mon Sep 17 00:00:00 2001 From: Hyunil Date: Tue, 30 Jan 2018 16:41:37 +0900 Subject: [PATCH 13/16] Fix doxygen error, note and question in Native API header file Change-Id: Ifbb38ed9830e7c824e75154a5ad58ebde1827586 Signed-off-by: Hyunil --- include/media_streamer.h | 358 +++++++++++++++++++------------------ packaging/capi-media-streamer.spec | 2 +- 2 files changed, 183 insertions(+), 177 deletions(-) diff --git a/include/media_streamer.h b/include/media_streamer.h index c4bff23..fa3d24b 100644 --- a/include/media_streamer.h +++ b/include/media_streamer.h @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef __TIZEN_MEDIASTREAMER_H__ -#define __TIZEN_MEDIASTREAMER_H__ +#ifndef __TIZEN_MULTIMEDIA_MEDIA_STREAMER_H__ +#define __TIZEN_MULTIMEDIA_MEDIA_STREAMER_H__ #include #include @@ -156,7 +156,7 @@ typedef enum { } media_streamer_error_e; /** - * @brief Enumeration of media streamer buffer status of custom src + * @brief Enumeration of media streamer buffer status of custom src. * * @since_tizen 3.0 */ @@ -176,7 +176,7 @@ typedef enum { } media_streamer_interrupted_code_e; /** - * @brief Definition for "camera-id" parameter of source node. + * @brief Definition for camera-id parameter of source node. * @details Index number of camera to activate. * Data type is integer and default value is 0. * @since_tizen 3.0 @@ -185,7 +185,7 @@ typedef enum { #define MEDIA_STREAMER_PARAM_CAMERA_ID "camera-id" /** - * @brief Definition for capture parameter of source node. + * @brief Definition for capture-width parameter of source node. * @details Width for camera size to capture. * Data type is integer and default value is 1600. * @since_tizen 3.0 @@ -194,7 +194,7 @@ typedef enum { #define MEDIA_STREAMER_PARAM_CAPTURE_WIDTH "capture-width" /** - * @brief Definition for capture parameter of source node. + * @brief Definition for capture-height parameter of source node. * @details Height for camera size to capture. * Data type is integer and default value is 1200. * @since_tizen 3.0 @@ -213,7 +213,7 @@ typedef enum { /** * @brief Definition for uri parameter of source node. - * @details Uri to read from + * @details URI to read from * Data type is string. * @since_tizen 3.0 * @see media_streamer_node_get_params @@ -221,7 +221,7 @@ typedef enum { #define MEDIA_STREAMER_PARAM_URI "uri" /** - * @brief Definition for user-agent parameter of source node + * @brief Definition for user-agent parameter of source node. * @details Value of the User-Agent HTTP request header field. * Data type is string. * @since_tizen 3.0 @@ -230,7 +230,7 @@ typedef enum { #define MEDIA_STREAMER_PARAM_USER_AGENT "user-agent" /** - * @brief Definition for stream type parameter of source node + * @brief Definition for stream type parameter of source node. * @details The type of the push data stream. * 0:stream, 1:seekable, 2:random-access (default:0) * @since_tizen 3.0 @@ -239,7 +239,7 @@ typedef enum { #define MEDIA_STREAMER_PARAM_STREAM_TYPE "stream-type" /** - * @brief Definition for port parameter of source or sink node + * @brief Definition for port parameter of source or sink node. * @details The port to receive the packets from. * Data type is integer and default value is 5004. * @since_tizen 3.0 @@ -248,7 +248,7 @@ typedef enum { #define MEDIA_STREAMER_PARAM_PORT "port" /** - * @brief Definition for video port parameter of source node + * @brief Definition for video port parameter of source node. * @details The port to receive the video packets from. * Data type is integer. * @since_tizen 3.0 @@ -257,7 +257,7 @@ typedef enum { #define MEDIA_STREAMER_PARAM_VIDEO_IN_PORT "video_in_port" /** - * @brief Definition for audio port parameter of source node + * @brief Definition for audio port parameter of source node. * @details The port to receive the audio packets from. * Data type is integer. * @since_tizen 3.0 @@ -266,7 +266,7 @@ typedef enum { #define MEDIA_STREAMER_PARAM_AUDIO_IN_PORT "audio_in_port" /** - * @brief Definition for video port parameter of sink node + * @brief Definition for video port parameter of sink node. * @details The port to send the video packets to. * Data type is integer. * @since_tizen 3.0 @@ -275,7 +275,7 @@ typedef enum { #define MEDIA_STREAMER_PARAM_VIDEO_OUT_PORT "video_out_port" /** - * @brief Definition for audio port parameter of sink node + * @brief Definition for audio port parameter of sink node. * @details The port to send the audio packets to. * Data type is integer. * @since_tizen 3.0 @@ -284,7 +284,7 @@ typedef enum { #define MEDIA_STREAMER_PARAM_AUDIO_OUT_PORT "audio_out_port" /** - * @brief Definition for IP address parameter of source node + * @brief Definition for IP address parameter of source node. * @details IP address to send/receive packets for. * Data type is string and default value is "0.0.0.0". * @since_tizen 3.0 @@ -293,7 +293,7 @@ typedef enum { #define MEDIA_STREAMER_PARAM_IP_ADDRESS "address" /** - * @brief Definition for audio device name parameter of source or sink node + * @brief Definition for audio device name parameter of source or sink node. * @details ALSA device, as defined in an asound configuration file. * ex) "hw:0,0", "hw:0,1" * Data type is string and default value is "default". @@ -303,7 +303,7 @@ typedef enum { #define MEDIA_STREAMER_PARAM_AUDIO_DEVICE "audio_device" /** - * @brief Definition for sync parameter of sink node + * @brief Definition for sync parameter of sink node. * @details Synchronize on the clock * Data type is boolean and default value is true. * @since_tizen 3.0 @@ -312,7 +312,7 @@ typedef enum { #define MEDIA_STREAMER_PARAM_CLOCK_SYNCHRONIZED "sync" /** - * @brief Definition for rotate parameter of sink node + * @brief Definition for rotate parameter of sink node. * @details Rotate angle of display output. * 0:none/1:rotate 90 degree/2:rotate 180 degree/3:rotate 270 degree * Default value is 3(rotate 270 degree). @@ -322,7 +322,7 @@ typedef enum { #define MEDIA_STREAMER_PARAM_ROTATE "rotate" /** - * @brief Definition for flip parameter of sink node + * @brief Definition for flip parameter of sink node. * @details Flip for display. * 0:none, 1:horizontal, 2:vertical, 3:both * Default value is 0. @@ -332,7 +332,7 @@ typedef enum { #define MEDIA_STREAMER_PARAM_FLIP "flip" /** - * @brief Definition for display geometry method parameter of sink node + * @brief Definition for display geometry method parameter of sink node. * @details Geometrical method for display. * 0:Letter box * 1:Original size @@ -357,7 +357,7 @@ typedef enum { #define MEDIA_STREAMER_PARAM_DISPLAY "display" /** - * @brief Definition for visible parameter of sink node + * @brief Definition for visible parameter of sink node. * @details Draws screen or blacks out. * Data type is boolean and default value is true(visible). * @since_tizen 3.0 @@ -366,7 +366,7 @@ typedef enum { #define MEDIA_STREAMER_PARAM_VISIBLE "visible" /** - * @brief Definition for host parameter of sink node + * @brief Definition for host parameter of sink node. * @details The host/IP/Multicast group to send the packets to. * Data type is string and default value is "localhost". * @since_tizen 3.0 @@ -393,18 +393,18 @@ typedef enum { /** * @brief Called when error occurs in media streamer. - * @details Following error codes can be delivered. + * @since_tizen 3.0 + * @remarks Following error codes can be delivered. * #MEDIA_STREAMER_ERROR_INVALID_OPERATION, * #MEDIA_STREAMER_ERROR_FILE_NO_SPACE_ON_DEVICE, * #MEDIA_STREAMER_ERROR_NOT_SUPPORTED, * #MEDIA_STREAMER_ERROR_CONNECTION_FAILED, * #MEDIA_STREAMER_ERROR_RESOURCE_CONFLICT - * @since_tizen 3.0 - * @param [in] streamer Media streamer handle - * @param [in] error The error that occurred in media steamer - * @param [in] user_data The user data passed from the code where - * media_streamer_set_error_cb() was invoked - * This data will be accessible from @a media_streamer_error_cb + * @param[in] streamer Media streamer handle + * @param[in] error The error that occurred in media steamer + * @param[in] user_data The user data passed from the code where + * media_streamer_set_error_cb() was invoked + * This data will be accessible from media_streamer_error_cb * @pre Create media streamer handle by calling media_streamer_create() function * @see media_streamer_set_error_cb() * @see media_streamer_unset_error_cb() @@ -415,12 +415,12 @@ typedef void (*media_streamer_error_cb)(media_streamer_h streamer, /** * @brief Called when media streamer state is changed. * @since_tizen 3.0 - * @param [in] streamer Media streamer handle - * @param [in] previous_state The previous state of the media streamer - * @param [in] current_state The current state of media streamer - * @param [in] user_data The user data passed from the code where - * media_streamer_set_state_changed_cb() was invoked - * This data will be accessible from @a media_streamer_state_changed_cb + * @param[in] streamer Media streamer handle + * @param[in] previous_state The previous state of the media streamer + * @param[in] current_state The current state of media streamer + * @param[in] user_data The user data passed from the code where + * media_streamer_set_state_changed_cb() was invoked + * This data will be accessible from media_streamer_state_changed_cb * @pre Create media streamer handle by calling media_streamer_create() function * @see media_streamer_set_state_change_cb() * @see media_streamer_unset_state_change_cb() @@ -434,8 +434,9 @@ typedef void (*media_streamer_state_changed_cb)(media_streamer_h streamer, * or no free space in custom source buffer. * @since_tizen 3.0 * @remarks Callback can be applied only for MEDIA_STREAMER_NODE_SRC_TYPE_CUSTOM source type - * @param [in] node Media streamer source node handle - * @param [in] user_data The user data passed from the callback registration function + * @param[in] node Media streamer source node handle + * @param[in] status Media streamer custom buffer status + * @param[in] user_data The user data passed from the callback registration function * @see media_streamer_src_set_buffer_status_cb() * @see media_streamer_node_get_param() * @see media_streamer_node_set_param() @@ -447,10 +448,10 @@ typedef void (*media_streamer_custom_buffer_status_cb)(media_streamer_node_h nod * @brief Called when new data is available from custom sink. * @details This callback can be applied only to MEDIA_STREAMER_NODE_SINK_TYPE_CUSTOM sink type * @since_tizen 3.0 - * @param [in] node Media streamer sink node handle - * @param [in] user_data The user data passed from the code where + * @param[in] node Media streamer sink node handle + * @param[in] user_data The user data passed from the code where * media_streamer_sink_set_data_ready_cb() was invoked - * This data will be accessible from @a media_streamer_sink_data_ready_cb + * This data will be accessible from media_streamer_sink_data_ready_cb * @pre media_streamer_sink_set_data_ready_cb() * @see MEDIA_STREAMER_NODE_SINK_TYPE_CUSTOM * @see media_streamer_sink_set_data_ready_cb() @@ -462,10 +463,10 @@ typedef void (*media_streamer_sink_data_ready_cb)(media_streamer_node_h node, vo * @brief Called when the end-of-stream has been reached. * @details This callback can be applied only to MEDIA_STREAMER_NODE_SINK_TYPE_CUSTOM sink type * @since_tizen 3.0 - * @param [in] node Media streamer sink node handle - * @param [in] user_data The user data passed from the code where + * @param[in] node Media streamer sink node handle + * @param[in] user_data The user data passed from the code where * media_streamer_sink_set_eos_cb() was invoked - * This data will be accessible from @a media_streamer_sink_eos_cb + * This data will be accessible from media_streamer_sink_eos_cb * @pre media_streamer_sink_set_eos_cb() * @see MEDIA_STREAMER_NODE_SINK_TYPE_CUSTOM * @see media_streamer_sink_set_eos_cb() @@ -484,15 +485,15 @@ typedef void (*media_streamer_position_changed_cb)(void *user_data); /** * @brief Called when the media streamer is interrupted. * @since_tizen 3.0 - * @param[in] error_code The interrupted error code - * @param[in] user_data The user data passed from the callback registration function + * @param[in] code The interrupted error code + * @param[in] user_data The user data passed from the callback registration function * @see media_streamer_set_interrupted_cb() * @see media_streamer_unset_interrupted_cb() */ typedef void (*media_streamer_interrupted_cb)(media_streamer_interrupted_code_e code, void *user_data); /** - * @brief Registers a error callback function to be invoked when an error occurs. + * @brief Sets a error callback function to be invoked when an error occurs. * @details Following error codes can be delivered by error callback. * #MEDIA_STREAMER_ERROR_INVALID_OPERATION, * #MEDIA_STREAMER_ERROR_FILE_NO_SPACE_ON_DEVICE, @@ -500,11 +501,11 @@ typedef void (*media_streamer_interrupted_cb)(media_streamer_interrupted_code_e * #MEDIA_STREAMER_ERROR_CONNECTION_FAILED, * #MEDIA_STREAMER_ERROR_RESOURCE_CONFLICT * @since_tizen 3.0 - * @param [in] streamer Media streamer handle - * @param [in] callback Callback function pointer - * @param [in] user_data The user data passed from the code where - * media_streamer_set_error_cb() was invoked - * This data will be accessible from @a media_streamer_error_cb + * @param[in] streamer Media streamer handle + * @param[in] callback Callback function pointer + * @param[in] user_data The user data passed from the code where + * media_streamer_set_error_cb() was invoked + * This data will be accessible from media_streamer_error_cb * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful @@ -518,9 +519,9 @@ typedef void (*media_streamer_interrupted_cb)(media_streamer_interrupted_code_e int media_streamer_set_error_cb(media_streamer_h streamer, media_streamer_error_cb callback, void *user_data); /** - * @brief Unregisters the error callback function. + * @brief Unsets the error callback function. * @since_tizen 3.0 - * @param [in] streamer Media streamer handle + * @param[in] streamer Media streamer handle * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful @@ -531,13 +532,13 @@ int media_streamer_set_error_cb(media_streamer_h streamer, media_streamer_error_ int media_streamer_unset_error_cb(media_streamer_h streamer); /** - * @brief Registers a callback that will be triggered after media streamer state is changed. + * @brief Sets a callback that will be triggered after media streamer state is changed. * @since_tizen 3.0 - * @param [in] streamer Media streamer handle - * @param [in] callback Callback function pointer - * @param [in] user_data The user data passed from the code - * where media_streamer_set_state_change_cb() was invoked - * This data will be accessible from @a media_streamer_state_changed_cb + * @param[in] streamer Media streamer handle + * @param[in] callback Callback function pointer + * @param[in] user_data The user data passed from the code + * where media_streamer_set_state_change_cb() was invoked + * This data will be accessible from media_streamer_state_changed_cb * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful @@ -551,9 +552,9 @@ int media_streamer_unset_error_cb(media_streamer_h streamer); int media_streamer_set_state_change_cb(media_streamer_h streamer, media_streamer_state_changed_cb callback, void *user_data); /** - * @brief Unregisters the state changed callback function. + * @brief Unsets the state changed callback function. * @since_tizen 3.0 - * @param [in] streamer Media streamer handle + * @param[in] streamer Media streamer handle * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful @@ -564,11 +565,11 @@ int media_streamer_set_state_change_cb(media_streamer_h streamer, media_streamer int media_streamer_unset_state_change_cb(media_streamer_h streamer); /** - * @brief Registers a callback function to be invoked when the media streamer is interrupted. + * @brief Sets a callback function to be invoked when the media streamer is interrupted. * @since_tizen 3.0 - * @param[in] streamer Media streamer handle - * @param[in] callback The callback function to register - * @param[in] user_data The user data to be passed to the callback function + * @param[in] streamer Media streamer handle + * @param[in] callback The callback function to register + * @param[in] user_data The user data to be passed to the callback function * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful @@ -581,7 +582,7 @@ int media_streamer_unset_state_change_cb(media_streamer_h streamer); int media_streamer_set_interrupted_cb(media_streamer_h streamer, media_streamer_interrupted_cb callback, void *user_data); /** - * @brief Unregisters the callback function. + * @brief Unsets the callback function. * @since_tizen 3.0 * @param[in] streamer Media streamer handle * @return @c 0 on success, @@ -594,17 +595,17 @@ int media_streamer_set_interrupted_cb(media_streamer_h streamer, media_streamer_ int media_streamer_unset_interrupted_cb(media_streamer_h streamer); /** - * @brief Registers a callback function to be invoked when buffer underrun or overflow is occurred. + * @brief Sets a callback function to be invoked when buffer underrun or overflow is occurred. * @details This function can be called only for MEDIA_STREAMER_NODE_SRC_TYPE_CUSTOM source type * @since_tizen 3.0 - * @remarks This API is used for media stream playback only. - * @param [in] source Media streamer source node handle - * @param [in] callback The buffer status callback function to register - * @param [in] user_data The user data passed from the code where + * @remarks This function is used for media stream playback only. + * @param[in] source Media streamer source node handle + * @param[in] callback The buffer status callback function to register + * @param[in] user_data The user data passed from the code where * media_streamer_src_set_buffer_status_cb() was invoked - * This data will be accessible from @a media_streamer_custom_buffer_status_cb() + * This data will be accessible from media_streamer_custom_buffer_status_cb() * @return @c 0 on success, - * otherwise a negative error value + * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful * @retval #MEDIA_STREAMER_ERROR_INVALID_PARAMETER Invalid parameter * @retval #MEDIA_STREAMER_ERROR_INVALID_OPERATION Invalid operation @@ -617,9 +618,9 @@ int media_streamer_unset_interrupted_cb(media_streamer_h streamer); int media_streamer_src_set_buffer_status_cb(media_streamer_node_h source, media_streamer_custom_buffer_status_cb callback, void *user_data); /** - * @brief Unregisters the src buffer status callback function. + * @brief Unsets the src buffer status callback function. * @since_tizen 3.0 - * @param [in] source Media streamer source node handle + * @param[in] source Media streamer source node handle * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful @@ -630,14 +631,14 @@ int media_streamer_src_set_buffer_status_cb(media_streamer_node_h source, media_ int media_streamer_src_unset_buffer_status_cb(media_streamer_node_h source); /** - * @brief Registers a callback function to be called when the custom sink is ready for data processing. + * @brief Sets a callback function to be called when the custom sink is ready for data processing. * @details This function can be called only for MEDIA_STREAMER_NODE_SINK_TYPE_CUSTOM sink type * @since_tizen 3.0 - * @param [in] sink Media streamer sink node handle - * @param [in] callback Callback function pointer - * @param [in] user_data The user data passed from the code where + * @param[in] sink Media streamer sink node handle + * @param[in] callback Callback function pointer + * @param[in] user_data The user data passed from the code where * media_streamer_sink_set_data_ready_cb() was invoked - * This data will be accessible from @a media_streamer_sink_data_ready_cb + * This data will be accessible from media_streamer_sink_data_ready_cb * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful @@ -652,9 +653,9 @@ int media_streamer_src_unset_buffer_status_cb(media_streamer_node_h source); int media_streamer_sink_set_data_ready_cb(media_streamer_node_h sink, media_streamer_sink_data_ready_cb callback, void *user_data); /** - * @brief Unregisters the sink data ready callback function. + * @brief Unsets the sink data ready callback function. * @since_tizen 3.0 - * @param [in] sink Media streamer sink node handle + * @param[in] sink Media streamer sink node handle * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful @@ -665,13 +666,13 @@ int media_streamer_sink_set_data_ready_cb(media_streamer_node_h sink, media_stre int media_streamer_sink_unset_data_ready_cb(media_streamer_node_h sink); /** - * @brief Registers a callback function to be called when custom sink detect the end-of-stream. + * @brief Sets a callback function to be called when custom sink detect the end-of-stream. * @since_tizen 3.0 - * @param [in] sink Media streamer sink node handle - * @param [in] callback Callback function pointer - * @param [in] user_data The user data passed from the code where + * @param[in] sink Media streamer sink node handle + * @param[in] callback Callback function pointer + * @param[in] user_data The user data passed from the code where * media_streamer_sink_set_eos_cb() was invoked. - * This data will be accessible from @a media_streamer_sink_eos_cb + * This data will be accessible from media_streamer_sink_eos_cb * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful @@ -686,9 +687,9 @@ int media_streamer_sink_unset_data_ready_cb(media_streamer_node_h sink); int media_streamer_sink_set_eos_cb(media_streamer_node_h sink, media_streamer_sink_eos_cb callback, void *user_data); /** - * @brief Unregisters the sink end-of-stream callback function. + * @brief Unsets the sink end-of-stream callback function. * @since_tizen 3.0 - * @param [in] sink Media streamer sink node handle + * @param[in] sink Media streamer sink node handle * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful @@ -703,7 +704,7 @@ int media_streamer_sink_unset_eos_cb(media_streamer_node_h sink); * passes the handle to the caller. * @since_tizen 3.0 * @remarks You must release @a streamer using media_streamer_destroy() - * @param [out] streamer Media streamer handle + * @param[out] streamer Media streamer handle * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful @@ -717,14 +718,14 @@ int media_streamer_create(media_streamer_h *streamer); /** * @brief Sets media streamer state to MEDIA_STREAMER_STATE_READY. * @since_tizen 3.0 - * @param [in] streamer Media streamer handle + * @param[in] streamer Media streamer handle * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful * @retval #MEDIA_STREAMER_ERROR_INVALID_STATE Invalid state * @retval #MEDIA_STREAMER_ERROR_INVALID_PARAMETER Invalid parameter * @retval #MEDIA_STREAMER_ERROR_INVALID_OPERATION Invalid operation - * @pre The media streamer state must be set to #MEDIA_STREAMER_STATE_IDLE + * @pre The media streamer state must be set to MEDIA_STREAMER_STATE_IDLE * by calling media_streamer_create() or media_streamer_unprepare(). * @pre At least one src and one sink should be added and linked in the streamer * by calling media_streamer_node_create_src(), media_streamer_node_create_sink() and media_streamer_node_link(). @@ -738,7 +739,7 @@ int media_streamer_prepare(media_streamer_h streamer); * @brief Sets media streamer state to MEDIA_STREAMER_STATE_IDLE. * @details The most recently used media is reset and no longer associated with the media streamer. * @since_tizen 3.0 - * @param [in] streamer Media streamer handle + * @param[in] streamer Media streamer handle * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful @@ -755,7 +756,7 @@ int media_streamer_unprepare(media_streamer_h streamer); * @brief Sets media streamer state to MEDIA_STREAMER_STATE_PLAYING. * @details Start running the current streamer, or resumes it if paused. * @since_tizen 3.0 - * @param [in] streamer Media streamer handle + * @param[in] streamer Media streamer handle * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful @@ -774,7 +775,7 @@ int media_streamer_play(media_streamer_h streamer); /** * @brief Pauses the media streamer. * @since_tizen 3.0 - * @param [in] streamer Media streamer handle + * @param[in] streamer Media streamer handle * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful @@ -791,7 +792,7 @@ int media_streamer_pause(media_streamer_h streamer); /** * @brief Stops the media streamer. * @since_tizen 3.0 - * @param [in] streamer Media streamer handle + * @param[in] streamer Media streamer handle * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful @@ -810,12 +811,12 @@ int media_streamer_stop(media_streamer_h streamer); /** * @brief Destroys media streamer. * @since_tizen 3.0 - * @remark Nodes in streamer will be removed automatically. - * Don't need to remove nodes by calling media_streamer_node_remove(). - * If you want to change the node without destroying streamer handle, - * you can call the media_streamer_node_remove() function - * after setting the streamer state to MEDIA_STREAMER_STATE_IDLE state. - * @param [in] streamer Media streamer handle + * @remarks Nodes in streamer will be removed automatically. + * Don't need to remove nodes by calling media_streamer_node_remove(). + * If you want to change the node without destroying streamer handle, + * you can call the media_streamer_node_remove() function + * after setting the streamer state to MEDIA_STREAMER_STATE_IDLE state. + * @param[in] streamer Media streamer handle * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful @@ -831,12 +832,12 @@ int media_streamer_destroy(media_streamer_h streamer); /** * @brief Changes playback position to the defined time value, asynchronously. * @since_tizen 3.0 - * @param [in] streamer Media streamer handle - * @param [in] time Time in millisecond - * @param [in] accurate If @c true, it will seek to the accurate position, but this might be considerably slower for some formats, - * otherwise @c false, it will seek to the nearest keyframe. - * @param [in] callback The callback function to register - * @param [in] user_data The user data to be passed to the callback function + * @param[in] streamer Media streamer handle + * @param[in] time Time in millisecond + * @param[in] accurate If @c true, it will seek to the accurate position, but this might be considerably slower for some formats, + * otherwise @c false, it will seek to the nearest keyframe + * @param[in] callback The callback function to register + * @param[in] user_data The user data to be passed to the callback function * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful @@ -854,8 +855,8 @@ int media_streamer_set_play_position(media_streamer_h streamer, int time, /** * @brief Gets the current position in milliseconds. * @since_tizen 3.0 - * @param [in] streamer Media streamer handle - * @param [out] time The current position in milliseconds + * @param[in] streamer Media streamer handle + * @param[out] time The current position in milliseconds * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful @@ -872,8 +873,8 @@ int media_streamer_get_play_position(media_streamer_h streamer, int *time); * @since_tizen 3.0 * @remarks The streamer's src node type should be MEDIA_STREAMER_NODE_SRC_TYPE_FILE or MEDIA_STREAMER_NODE_SRC_TYPE_HTTP. * If not, return value will be MEDIA_STREAMER_ERROR_NONE and duration will be -1. - * @param [in] streamer Media streamer handle - * @param [out] duration The duration in milliseconds + * @param[in] streamer Media streamer handle + * @param[out] duration The duration in milliseconds * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful @@ -887,8 +888,8 @@ int media_streamer_get_duration(media_streamer_h streamer, int *duration); /** * @brief Gets media streamer state. * @since_tizen 3.0 - * @param [in] streamer Media streamer handle - * @param [out] state Media streamer state + * @param[in] streamer Media streamer handle + * @param[out] state Media streamer state * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful @@ -902,12 +903,15 @@ int media_streamer_get_state(media_streamer_h streamer, media_streamer_state_e * /** * @brief Creates media streamer source node. * @since_tizen 3.0 + * @privilege http://tizen.org/privilege/internet + * http://tizen.org/privilege/camera + * http://tizen.org/privilege/recorder * @remarks The internet privilege(http://tizen.org/privilege/internet) should be added if any URIs are used to play from network. * The camera privilege(http://tizen.org/privilege/camera) should be added if the src node handle the camera device. * The recorder privilege(http://tizen.org/privilege/recorder) should be added if the src node handle the recorder device. - * You can release @a source node using media_streamer_node_destroy() function. - * @param [in] type Media streamer source node type - * @param [out] src Media streamer source node handle + * You can release source node using media_streamer_node_destroy() function. + * @param[in] type Media streamer source node type + * @param[out] src Media streamer source node handle * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful @@ -924,17 +928,15 @@ int media_streamer_node_create_src(media_streamer_node_src_type_e type, media_st * @brief Pushes packet into custom source node. * @details This function can be called only for MEDIA_STREAMER_NODE_SRC_TYPE_CUSTOM. * @since_tizen 3.0 - * @param [in] src Media streamer source node handle - * @param [in] packet Media packet handle + * @param[in] src Media streamer source node handle + * @param[in] packet Media packet handle * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful - * @retval #MEDIA_STREAMER_ERROR_INVALID_STATE Invalid state * @retval #MEDIA_STREAMER_ERROR_INVALID_PARAMETER Invalid parameter * @retval #MEDIA_STREAMER_ERROR_INVALID_OPERATION Invalid operation - * @retval #MEDIA_STREAMER_ERROR_PERMISSION_DENIED Permission denied * @pre Create a source node handle by calling media_streamer_node_create_src() function - * @pre The media streamer state must be set to #MEDIA_STREAMER_STATE_IDLE at least. + * @pre The media streamer state must be set to #MEDIA_STREAMER_STATE_IDLE at least. * @see #media_packet_h */ int media_streamer_node_push_packet(media_streamer_node_h src, media_packet_h packet); @@ -942,12 +944,13 @@ int media_streamer_node_push_packet(media_streamer_node_h src, media_packet_h pa /** * @brief Creates media streamer sink node. * @since_tizen 3.0 + * @privilege http://tizen.org/privilege/internet * @remarks The internet privilege(http://tizen.org/privilege/internet) should be added if any URIs are used to transmit the output data. * You can release @a sink node using media_streamer_node_destroy() * @remarks If @a type is #MEDIA_STREAMER_NODE_SINK_TYPE_ADAPTIVE, the HTTP server will be started and the server will be able to transmit the output data to the other device. * The application must have an authentication responsibility between a server and client because the data transmission is not secure. - * @param [in] type Type of sink node to be created - * @param [out] sink Media streamer sink node handle + * @param[in] type Type of sink node to be created + * @param[out] sink Media streamer sink node handle * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful @@ -964,8 +967,8 @@ int media_streamer_node_create_sink(media_streamer_node_sink_type_e type, media_ * @brief Pulls packet from custom sink node. * @details This function can be called only for MEDIA_STREAMER_NODE_SINK_TYPE_CUSTOM * @since_tizen 3.0 - * @param [in] sink Media streamer sink node handle - * @param [out] packet Media packet handle + * @param[in] sink Media streamer sink node handle + * @param[out] packet Media packet handle * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful @@ -987,10 +990,10 @@ int media_streamer_node_pull_packet(media_streamer_node_h sink, media_packet_h * * @remarks The node type should not be MEDIA_STREAMER_NODE_TYPE_SRC and MEDIA_STREAMER_NODE_TYPE_SINK. * To create src/sink type node, media_streamer_node_create_src()/media_streamer_node_create_sink() should be called. * You can release @a node using media_streamer_node_destroy() function - * @param [in] type Created node type - * @param [in] in_fmt Media format handle for input data - * @param [in] out_fmt Media format handle for output data - * @param [out] node Media streamer node handle to be created + * @param[in] type Created node type + * @param[in] in_fmt Media format handle for input data + * @param[in] out_fmt Media format handle for output data + * @param[out] node Media streamer node handle to be created * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful @@ -1006,8 +1009,8 @@ int media_streamer_node_create(media_streamer_node_type_e type, media_format_h i /** * @brief Adds node to media streamer. * @since_tizen 3.0 - * @param [in] streamer Media streamer handle - * @param [in] node Media streamer node handle to be added + * @param[in] streamer Media streamer handle + * @param[in] node Media streamer node handle to be added * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful @@ -1026,7 +1029,7 @@ int media_streamer_node_add(media_streamer_h streamer, media_streamer_node_h nod /** * @brief Destroys media streamer node. * @since_tizen 3.0 - * @param [in] node Media streamer node handle + * @param[in] node Media streamer node handle * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful @@ -1047,8 +1050,8 @@ int media_streamer_node_destroy(media_streamer_node_h node); * @since_tizen 3.0 * @remarks To remove node without error posting, the state of streamer should be MEDIA_STREAMER_STATE_IDLE. * If the node is linked, it will be unlinked before removing. - * @param [in] streamer Media streamer handle - * @param [in] node Media streamer node handle + * @param[in] streamer Media streamer handle + * @param[in] node Media streamer node handle * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful @@ -1063,18 +1066,18 @@ int media_streamer_node_remove(media_streamer_h streamer, media_streamer_node_h /** * @brief Links two media streamer nodes. * @since_tizen 3.0 - * @remark Pads are node's input and output, where you can connect other nodes. - * (src_node) - (sink_node) - * src_node and sink_node is determined relatively. - * In case of (A)-(B)-(C), - * (B) can be sink_node with (A) or (B) can be src_node with (C). - * However, src type node is always src node and sink type node is always sink node. - * (A) is src node and can not be sink node at all. - * (C) is sink node and can not be src node at all. - * @param [in] src_node Media streamer node handle - * @param [in] src_pad_name The name of the source pad of the source node - * @param [in] dest_node The destination media streamer node handle - * @param [in] sink_pad_name The name of the sink pad of the destination node + * @remarks Pads are node's input and output, where you can connect other nodes. + * (src_node) - (sink_node) + * src_node and sink_node is determined relatively. + * In case of (A)-(B)-(C), + * (B) can be sink_node with (A) or (B) can be src_node with (C). + * However, src type node is always src node and sink type node is always sink node. + * (A) is src node and can not be sink node at all. + * (C) is sink node and can not be src node at all. + * @param[in] src_node Media streamer node handle + * @param[in] src_pad_name The name of the source pad of the source node + * @param[in] dest_node The destination media streamer node handle + * @param[in] sink_pad_name The name of the sink pad of the destination node * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful @@ -1093,9 +1096,9 @@ int media_streamer_node_link(media_streamer_node_h src_node, const char *src_pad /** * @brief Sets media format for pad of media streamer node. * @since_tizen 3.0 - * @param [in] node Media streamer node handle - * @param [in] pad_name Pad name - * @param [in] fmt Media format handle + * @param[in] node Media streamer node handle + * @param[in] pad_name Pad name + * @param[in] fmt Media format handle * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful @@ -1111,9 +1114,9 @@ int media_streamer_node_set_pad_format(media_streamer_node_h node, const char *p /** * @brief Gets media format for pad of media streamer node. * @since_tizen 3.0 - * @param [in] node Media streamer node handle - * @param [in] pad_name Pad name - * @param [out] fmt Media format handle + * @param[in] node Media streamer node handle + * @param[in] pad_name Pad name + * @param[out] fmt Media format handle * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful @@ -1129,15 +1132,15 @@ int media_streamer_node_get_pad_format(media_streamer_node_h node, const char *p /** * @brief Gets name of node pads. * @since_tizen 3.0 - * @remark After using the src_pad_name and sink_pad_name, it have to be free. - * src_pad_name or sink_pad_name can be null according to the node type. - * In case of src type node, sink_pad_name will be null. - * In case of sink type node, src_pad_name will be null. - * @param [in] node Media streamer node handle - * @param [out] src_pad_name Array of source pad name - * @param [out] src_pad_num The number of source pads - * @param [out] sink_pad_name Array of sink pad name - * @param [out] sink_pad_num The number of sink pads + * @remarks After using the src_pad_name and sink_pad_name, it have to be free. + * src_pad_name or sink_pad_name can be null according to the node type. + * In case of src type node, sink_pad_name will be null. + * In case of sink type node, src_pad_name will be null. + * @param[in] node Media streamer node handle + * @param[out] src_pad_name Array of source pad name + * @param[out] src_pad_num The number of source pads + * @param[out] sink_pad_name Array of sink pad name + * @param[out] sink_pad_num The number of sink pads * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful @@ -1151,15 +1154,16 @@ int media_streamer_node_get_pad_format(media_streamer_node_h node, const char *p int media_streamer_node_get_pad_name(media_streamer_node_h node, char ***src_pad_name, int *src_pad_num, char ***sink_pad_name, int *sink_pad_num); - /** * @brief Sets parameters of node. * @details Many parameters can be set at one time all together by using bundle. * @since_tizen 3.0 + * @privilege http://tizen.org/privilege/mediastorage + * http://tizen.org/privilege/externalstorage * @remarks The mediastorage privilege(http://tizen.org/privilege/mediastorage) should be added if any video/audio files are written in the internal storage devices. * The externalstorage privilege(http://tizen.org/privilege/externalstorage) should be added if any video/audio files are written in the external storage devices. - * @param [in] node Media streamer node handle - * @param [in] param_list Key value array of media streamer node parameters + * @param[in] node Media streamer node handle + * @param[in] param_list Key value array of media streamer node parameters * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful @@ -1178,10 +1182,10 @@ int media_streamer_node_set_params(media_streamer_node_h node, bundle *param_lis /** * @brief Gets node parameter list. * @since_tizen 3.0 - * @remark After using param_list, it have to be free by calling bundle_free() in bundle.h - * Refer to the "Parameter information of node" in this file to get info. - * @param [in] node Media streamer node handle - * @param [out] param_list Key value array of media streamer node parameters + * @remarks After using param_list, it have to be free by calling bundle_free() in bundle.h + * Refer to the "Parameter information of node" in this file to get info. + * @param[in] node Media streamer node handle + * @param[out] param_list Key value array of media streamer node parameters * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful @@ -1202,11 +1206,13 @@ int media_streamer_node_get_params(media_streamer_node_h node, bundle **param_li * @brief Sets single parameter of node. * @details Sets parameter one by one without creating param bundle. * @since_tizen 3.0 + * @privilege http://tizen.org/privilege/mediastorage + * http://tizen.org/privilege/externalstorage * @remarks The mediastorage privilege(http://tizen.org/privilege/mediastorage) should be added if any video/audio files are written in the internal storage devices. * The externalstorage privilege(http://tizen.org/privilege/externalstorage) should be added if any video/audio files are written in the external storage devices. - * @param [in] node Media streamer node handle - * @param [in] param_name Param name of node - * @param [in] param_value Param value of node + * @param[in] node Media streamer node handle + * @param[in] param_name Param name of node + * @param[in] param_value Param value of node * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful @@ -1230,9 +1236,9 @@ int media_streamer_node_set_param(media_streamer_node_h node, * @brief Gets value of parameter. * @details Gets parameter one by one without creating param bundle. * @since_tizen 3.0 - * @param [in] node Media streamer node handle - * @param [in] param_name Param name of node - * @param [out] param_value Param value of node + * @param[in] node Media streamer node handle + * @param[in] param_name Param name of node + * @param[out] param_value Param value of node * @return @c 0 on success, * otherwise a negative error value * @retval #MEDIA_STREAMER_ERROR_NONE Successful @@ -1258,4 +1264,4 @@ int media_streamer_node_get_param(media_streamer_node_h node, } #endif /* __cplusplus */ -#endif /* __TIZEN_MEDIASTREAMER_H__ */ +#endif /* __TIZEN_MULTIMEDIA_MEDIA_STREAMER_H__ */ diff --git a/packaging/capi-media-streamer.spec b/packaging/capi-media-streamer.spec index a562ad4..c5e2b77 100644 --- a/packaging/capi-media-streamer.spec +++ b/packaging/capi-media-streamer.spec @@ -1,6 +1,6 @@ Name: capi-media-streamer Summary: A Media Streamer API -Version: 0.1.20 +Version: 0.1.21 Release: 0 Group: Multimedia/API License: Apache-2.0 -- 2.7.4 From f791e0c1fa62cda9005a217c8de3f4b1dbfb3461 Mon Sep 17 00:00:00 2001 From: Hyunil Date: Thu, 1 Feb 2018 13:34:58 +0900 Subject: [PATCH 14/16] Change the name of the toplogy_bin to transform_bin Topology is a term of MediaSession, the components of MediaSession include Source Node,Transform Node, Output Node and Tee Node. I want to change the name of the TopologyBin to TransformBin because Toppology is the same as GstBin or GstPipeline of Gstreamer, then leves are correct and we don't need to use the term of MediaSession. Change-Id: I174322f3d4041e3aa4ea5faea4168a4de2762c20 Signed-off-by: Hyunil --- include/media_streamer_gst.h | 4 +-- include/media_streamer_priv.h | 2 +- src/media_streamer_gst.c | 64 +++++++++++++++++++++---------------------- src/media_streamer_node.c | 18 ++++++------ src/media_streamer_priv.c | 12 ++++---- 5 files changed, 50 insertions(+), 50 deletions(-) diff --git a/include/media_streamer_gst.h b/include/media_streamer_gst.h index 11b1da8..69e7c68 100644 --- a/include/media_streamer_gst.h +++ b/include/media_streamer_gst.h @@ -23,7 +23,7 @@ #define MEDIA_STREAMER_PIPELINE_NAME "media-streamer-pipeline" #define MEDIA_STREAMER_SRC_BIN_NAME "streamer_src" #define MEDIA_STREAMER_SINK_BIN_NAME "streamer_sink" -#define MEDIA_STREAMER_TOPOLOGY_BIN_NAME "streamer_topology" +#define MEDIA_STREAMER_TRANSFORM_BIN_NAME "streamer_transform" #define MEDIA_STREAMER_PAYLOADER_KLASS "Codec/Payloader/Network/RTP" #define MEDIA_STREAMER_RTP_KLASS "Filter/Network/RTP" @@ -192,7 +192,7 @@ gboolean __ms_element_lock_state(const GValue *item, GValue *ret, gpointer user_ gboolean __ms_element_unlock_state(const GValue *item, GValue *ret, gpointer user_data); /** - * @brief Creates pipeline, bus and src/sink/topology bins. + * @brief Creates pipeline, bus and src/sink/transform bins. * * @since_tizen 3.0 */ diff --git a/include/media_streamer_priv.h b/include/media_streamer_priv.h index 6d2e889..ad6df63 100644 --- a/include/media_streamer_priv.h +++ b/include/media_streamer_priv.h @@ -96,7 +96,7 @@ typedef struct { GstElement *src_bin; GstElement *sink_bin; - GstElement *topology_bin; + GstElement *transform_bin; GHashTable *nodes_table; GMutex mutex_lock; diff --git a/src/media_streamer_gst.c b/src/media_streamer_gst.c index 5a8c6ce..502ec4e 100644 --- a/src/media_streamer_gst.c +++ b/src/media_streamer_gst.c @@ -535,36 +535,36 @@ static void __decodebin_nomore_pads_combine(GstPad *src_pad, media_streamer_s *m const gchar *new_pad_type = __ms_get_pad_type(src_pad); if (MS_ELEMENT_IS_VIDEO(new_pad_type)) { - if (__ms_bin_find_element_by_type(found_element, src_pad, ms_streamer->topology_bin, __ms_node_get_klass_by_its_type(MEDIA_STREAMER_NODE_TYPE_TEXT_OVERLAY))) { - found_element = __ms_combine_next_element(found_element, src_pad, ms_streamer->topology_bin, MEDIA_STREAMER_NODE_TYPE_TEXT_OVERLAY); + if (__ms_bin_find_element_by_type(found_element, src_pad, ms_streamer->transform_bin, __ms_node_get_klass_by_its_type(MEDIA_STREAMER_NODE_TYPE_TEXT_OVERLAY))) { + found_element = __ms_combine_next_element(found_element, src_pad, ms_streamer->transform_bin, MEDIA_STREAMER_NODE_TYPE_TEXT_OVERLAY); src_pad = NULL; } if (sink_bin_type == MEDIA_STREAMER_SINK_BIN_RTP_SERVER) { - found_element = __ms_combine_next_element(found_element, src_pad, ms_streamer->topology_bin, MEDIA_STREAMER_NODE_TYPE_VIDEO_ENCODER); - found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->topology_bin, MEDIA_STREAMER_NODE_TYPE_VIDEO_PAY); - found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->topology_bin, MEDIA_STREAMER_NODE_TYPE_RTP); + found_element = __ms_combine_next_element(found_element, src_pad, ms_streamer->transform_bin, MEDIA_STREAMER_NODE_TYPE_VIDEO_ENCODER); + found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->transform_bin, MEDIA_STREAMER_NODE_TYPE_VIDEO_PAY); + found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->transform_bin, MEDIA_STREAMER_NODE_TYPE_RTP); } else if (sink_bin_type == MEDIA_STREAMER_SINK_BIN_ADAPTIVE) { - found_element = __ms_combine_next_element(found_element, src_pad, ms_streamer->topology_bin, MEDIA_STREAMER_NODE_TYPE_VIDEO_ENCODER); - found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->topology_bin, MEDIA_STREAMER_NODE_TYPE_MUXER); + found_element = __ms_combine_next_element(found_element, src_pad, ms_streamer->transform_bin, MEDIA_STREAMER_NODE_TYPE_VIDEO_ENCODER); + found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->transform_bin, MEDIA_STREAMER_NODE_TYPE_MUXER); found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->sink_bin, MEDIA_STREAMER_NODE_TYPE_SINK); } else { - found_element = __ms_combine_next_element(found_element, src_pad, ms_streamer->topology_bin, MEDIA_STREAMER_NODE_TYPE_VIDEO_CONVERTER); + found_element = __ms_combine_next_element(found_element, src_pad, ms_streamer->transform_bin, MEDIA_STREAMER_NODE_TYPE_VIDEO_CONVERTER); found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->sink_bin, MEDIA_STREAMER_NODE_TYPE_SINK); } } else if (MS_ELEMENT_IS_AUDIO(new_pad_type)) { if (sink_bin_type == MEDIA_STREAMER_SINK_BIN_RTP_SERVER) { - found_element = __ms_combine_next_element(found_element, src_pad, ms_streamer->topology_bin, MEDIA_STREAMER_NODE_TYPE_AUDIO_ENCODER); - found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->topology_bin, MEDIA_STREAMER_NODE_TYPE_AUDIO_PAY); - found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->topology_bin, MEDIA_STREAMER_NODE_TYPE_RTP); + found_element = __ms_combine_next_element(found_element, src_pad, ms_streamer->transform_bin, MEDIA_STREAMER_NODE_TYPE_AUDIO_ENCODER); + found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->transform_bin, MEDIA_STREAMER_NODE_TYPE_AUDIO_PAY); + found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->transform_bin, MEDIA_STREAMER_NODE_TYPE_RTP); } else if (sink_bin_type == MEDIA_STREAMER_SINK_BIN_ADAPTIVE) { - found_element = __ms_combine_next_element(found_element, src_pad, ms_streamer->topology_bin, MEDIA_STREAMER_NODE_TYPE_AUDIO_ENCODER); - found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->topology_bin, MEDIA_STREAMER_NODE_TYPE_MUXER); + found_element = __ms_combine_next_element(found_element, src_pad, ms_streamer->transform_bin, MEDIA_STREAMER_NODE_TYPE_AUDIO_ENCODER); + found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->transform_bin, MEDIA_STREAMER_NODE_TYPE_MUXER); found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->sink_bin, MEDIA_STREAMER_NODE_TYPE_SINK); } else { found_element = __ms_combine_next_element(found_element, src_pad, ms_streamer->sink_bin, MEDIA_STREAMER_NODE_TYPE_SINK); } } else if (MS_ELEMENT_IS_TEXT(new_pad_type)) { - found_element = __ms_combine_next_element(found_element, src_pad, ms_streamer->topology_bin, MEDIA_STREAMER_NODE_TYPE_TEXT_OVERLAY); + found_element = __ms_combine_next_element(found_element, src_pad, ms_streamer->transform_bin, MEDIA_STREAMER_NODE_TYPE_TEXT_OVERLAY); } else { ms_error("Unsupported pad type [%s]!", new_pad_type); } @@ -621,7 +621,7 @@ GstElement *__ms_decodebin_create(media_streamer_s * ms_streamer, char * name) ms_retvm_if(!ms_streamer, NULL, "Handle is NULL"); GstElement *decodebin = __ms_element_create(DEFAULT_DECODEBIN, name); - __ms_bin_add_element(ms_streamer->topology_bin, decodebin, TRUE); + __ms_bin_add_element(ms_streamer->transform_bin, decodebin, TRUE); gst_element_sync_state_with_parent(decodebin); __ms_signal_create(&ms_streamer->autoplug_sig_list, decodebin, "pad-added", G_CALLBACK(__decodebin_newpad_cb), ms_streamer); @@ -641,8 +641,8 @@ static gboolean __ms_sink_bin_prepare(media_streamer_s * ms_streamer, GstPad * s if (MS_ELEMENT_IS_VIDEO(src_pad_type)) { gst_object_ref(parent_rtp_element); - found_element = __ms_combine_next_element(parent_rtp_element, source_pad, ms_streamer->topology_bin, MEDIA_STREAMER_NODE_TYPE_VIDEO_DEPAY); - decoder_element = __ms_bin_find_element_by_type(found_element, NULL, ms_streamer->topology_bin, __ms_node_get_klass_by_its_type(MEDIA_STREAMER_NODE_TYPE_VIDEO_DECODER)); + found_element = __ms_combine_next_element(parent_rtp_element, source_pad, ms_streamer->transform_bin, MEDIA_STREAMER_NODE_TYPE_VIDEO_DEPAY); + decoder_element = __ms_bin_find_element_by_type(found_element, NULL, ms_streamer->transform_bin, __ms_node_get_klass_by_its_type(MEDIA_STREAMER_NODE_TYPE_VIDEO_DECODER)); if (!decoder_element) { if (ms_streamer->ini.use_decodebin) { @@ -653,7 +653,7 @@ static gboolean __ms_sink_bin_prepare(media_streamer_s * ms_streamer, GstPad * s return TRUE; } else { gst_object_ref(found_element); - found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->topology_bin, MEDIA_STREAMER_NODE_TYPE_VIDEO_DECODER); + found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->transform_bin, MEDIA_STREAMER_NODE_TYPE_VIDEO_DECODER); found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->sink_bin, MEDIA_STREAMER_NODE_TYPE_SINK); } } else { @@ -662,8 +662,8 @@ static gboolean __ms_sink_bin_prepare(media_streamer_s * ms_streamer, GstPad * s } } else if (MS_ELEMENT_IS_AUDIO(src_pad_type)) { gst_object_ref(parent_rtp_element); - found_element = __ms_combine_next_element(parent_rtp_element, source_pad, ms_streamer->topology_bin, MEDIA_STREAMER_NODE_TYPE_AUDIO_DEPAY); - found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->topology_bin, MEDIA_STREAMER_NODE_TYPE_AUDIO_DECODER); + found_element = __ms_combine_next_element(parent_rtp_element, source_pad, ms_streamer->transform_bin, MEDIA_STREAMER_NODE_TYPE_AUDIO_DEPAY); + found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->transform_bin, MEDIA_STREAMER_NODE_TYPE_AUDIO_DECODER); found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->sink_bin, MEDIA_STREAMER_NODE_TYPE_SINK); } else { ms_info("Unknown media type received from rtp element!"); @@ -776,11 +776,11 @@ static int __ms_adaptive_sink_prepare(media_streamer_s * ms_streamer) node_plug_s mux_plug_info = {&(nodes_info[2]), muxer_src_caps, NULL, NULL}; GstElement *muxer = __ms_node_element_create(&mux_plug_info, MEDIA_STREAMER_NODE_TYPE_MUXER); - __ms_bin_add_element(ms_streamer->topology_bin, muxer, FALSE); + __ms_bin_add_element(ms_streamer->transform_bin, muxer, FALSE); gst_element_sync_state_with_parent(muxer); - __ms_bin_add_element(ms_streamer->topology_bin, video_enc, FALSE); + __ms_bin_add_element(ms_streamer->transform_bin, video_enc, FALSE); gst_element_sync_state_with_parent(video_enc); - __ms_bin_add_element(ms_streamer->topology_bin, audio_enc, FALSE); + __ms_bin_add_element(ms_streamer->transform_bin, audio_enc, FALSE); gst_element_sync_state_with_parent(audio_enc); return MEDIA_STREAMER_ERROR_NONE; @@ -1584,8 +1584,8 @@ int __ms_add_node_into_bin(media_streamer_s *ms_streamer, media_streamer_node_s bin = ms_streamer->sink_bin; break; default: - /* Another elements will be add into topology bin */ - bin = ms_streamer->topology_bin; + /* Another elements will be add into transform bin */ + bin = ms_streamer->transform_bin; break; } @@ -1863,10 +1863,10 @@ int __ms_pipeline_create(media_streamer_s *ms_streamer) ms_streamer->sink_bin = gst_bin_new(MEDIA_STREAMER_SINK_BIN_NAME); ms_retvm_if(ms_streamer->sink_bin == NULL, MEDIA_STREAMER_ERROR_INVALID_OPERATION, "Error creating Sink bin"); - ms_streamer->topology_bin = gst_bin_new(MEDIA_STREAMER_TOPOLOGY_BIN_NAME); - ms_retvm_if(ms_streamer->topology_bin == NULL, MEDIA_STREAMER_ERROR_INVALID_OPERATION, "Error creating Topology bin"); + ms_streamer->transform_bin = gst_bin_new(MEDIA_STREAMER_TRANSFORM_BIN_NAME); + ms_retvm_if(ms_streamer->transform_bin == NULL, MEDIA_STREAMER_ERROR_INVALID_OPERATION, "Error creating Transform bin"); - gst_bin_add_many(GST_BIN(ms_streamer->pipeline), ms_streamer->src_bin, ms_streamer->sink_bin, ms_streamer->topology_bin, NULL); + gst_bin_add_many(GST_BIN(ms_streamer->pipeline), ms_streamer->src_bin, ms_streamer->sink_bin, ms_streamer->transform_bin, NULL); ms_info("Media streamer pipeline created successfully."); return ret; @@ -2222,11 +2222,11 @@ static void __demux_nomore_pads_combine(GstPad *src_pad, media_streamer_s *ms_st GstElement *found_element = gst_pad_get_parent_element(src_pad); const gchar *new_pad_type = __ms_get_pad_type(src_pad); if (MS_ELEMENT_IS_VIDEO(new_pad_type)) - found_element = __ms_combine_next_element(found_element, src_pad, ms_streamer->topology_bin, MEDIA_STREAMER_NODE_TYPE_VIDEO_DECODER); + found_element = __ms_combine_next_element(found_element, src_pad, ms_streamer->transform_bin, MEDIA_STREAMER_NODE_TYPE_VIDEO_DECODER); else if (MS_ELEMENT_IS_AUDIO(new_pad_type)) - found_element = __ms_combine_next_element(found_element, src_pad, ms_streamer->topology_bin, MEDIA_STREAMER_NODE_TYPE_AUDIO_DECODER); + found_element = __ms_combine_next_element(found_element, src_pad, ms_streamer->transform_bin, MEDIA_STREAMER_NODE_TYPE_AUDIO_DECODER); else if (MS_ELEMENT_IS_TEXT(new_pad_type)) - found_element = __ms_combine_next_element(found_element, src_pad, ms_streamer->topology_bin, MEDIA_STREAMER_NODE_TYPE_TEXT_OVERLAY); + found_element = __ms_combine_next_element(found_element, src_pad, ms_streamer->transform_bin, MEDIA_STREAMER_NODE_TYPE_TEXT_OVERLAY); else ms_error("Unsupported pad type [%s]!", new_pad_type); @@ -2291,7 +2291,7 @@ int __ms_find_type(media_streamer_s *ms_streamer, GstElement *src_element) ms_retvm_if(typefind == NULL, MEDIA_STREAMER_ERROR_INVALID_OPERATION, "Error creating element [typefind]"); - __ms_bin_add_element(ms_streamer->topology_bin, typefind, TRUE); + __ms_bin_add_element(ms_streamer->transform_bin, typefind, TRUE); gst_element_sync_state_with_parent(typefind); g_signal_connect(typefind, "have-type", G_CALLBACK(__ms_typefound_cb), ms_streamer); diff --git a/src/media_streamer_node.c b/src/media_streamer_node.c index d7018b4..ff7563a 100644 --- a/src/media_streamer_node.c +++ b/src/media_streamer_node.c @@ -807,19 +807,19 @@ static gboolean _src_node_prepare(const GValue *item, GValue *ret, gpointer user } /* It is media streamer Server part */ if (MS_ELEMENT_IS_VIDEO(new_pad_type) || MS_ELEMENT_IS_IMAGE(new_pad_type)) { - found_element = __ms_combine_next_element(src_element, src_pad, ms_streamer->topology_bin, MEDIA_STREAMER_NODE_TYPE_FILTER); + found_element = __ms_combine_next_element(src_element, src_pad, ms_streamer->transform_bin, MEDIA_STREAMER_NODE_TYPE_FILTER); GstCaps *videoCaps = gst_caps_from_string(MEDIA_STREAMER_DEFAULT_CAMERA_FORMAT); g_object_set(G_OBJECT(found_element), "caps", videoCaps, NULL); gst_caps_unref(videoCaps); - found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->topology_bin, MEDIA_STREAMER_NODE_TYPE_VIDEO_ENCODER); - found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->topology_bin, MEDIA_STREAMER_NODE_TYPE_VIDEO_PAY); - found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->topology_bin, MEDIA_STREAMER_NODE_TYPE_RTP); + found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->transform_bin, MEDIA_STREAMER_NODE_TYPE_VIDEO_ENCODER); + found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->transform_bin, MEDIA_STREAMER_NODE_TYPE_VIDEO_PAY); + found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->transform_bin, MEDIA_STREAMER_NODE_TYPE_RTP); } if (MS_ELEMENT_IS_AUDIO(new_pad_type)) { - found_element = __ms_combine_next_element(src_element, src_pad, ms_streamer->topology_bin, MEDIA_STREAMER_NODE_TYPE_AUDIO_ENCODER); - found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->topology_bin, MEDIA_STREAMER_NODE_TYPE_AUDIO_PAY); - found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->topology_bin, MEDIA_STREAMER_NODE_TYPE_RTP); + found_element = __ms_combine_next_element(src_element, src_pad, ms_streamer->transform_bin, MEDIA_STREAMER_NODE_TYPE_AUDIO_ENCODER); + found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->transform_bin, MEDIA_STREAMER_NODE_TYPE_AUDIO_PAY); + found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->transform_bin, MEDIA_STREAMER_NODE_TYPE_RTP); } __ms_generate_dots(ms_streamer->pipeline, "after_connecting_rtp"); MS_SAFE_UNREF(found_element); @@ -913,7 +913,7 @@ int __ms_pipeline_prepare(media_streamer_s *ms_streamer) } if (adaptive_src) { - if (GST_BIN(ms_streamer->topology_bin)->numchildren == 0) + if (GST_BIN(ms_streamer->transform_bin)->numchildren == 0) ret = __ms_adaptive_element_prepare(adaptive_src, true); else ret = __ms_adaptive_element_prepare(adaptive_src, false); @@ -1037,7 +1037,7 @@ int __ms_pipeline_unprepare(media_streamer_s *ms_streamer) } MS_BIN_UNPREPARE(ms_streamer->src_bin); - MS_BIN_UNPREPARE(ms_streamer->topology_bin); + MS_BIN_UNPREPARE(ms_streamer->transform_bin); MS_BIN_UNPREPARE(ms_streamer->sink_bin); return ret; diff --git a/src/media_streamer_priv.c b/src/media_streamer_priv.c index e0efc4e..30f2908 100644 --- a/src/media_streamer_priv.c +++ b/src/media_streamer_priv.c @@ -218,14 +218,14 @@ int __ms_acquire_resources(media_streamer_s *ms_streamer) return ret; } - /* Acquire resources for topology bin. If user doesn't + /* Acquire resources for transform bin. If user doesn't add nodes explicitly they will be acquired later. For example when decodebin is used resources are quired when 'autoplug-select' signal is triggered for new GstElement. */ - ret = __ms_bin_foreach_elements(GST_BIN(ms_streamer->topology_bin), + ret = __ms_bin_foreach_elements(GST_BIN(ms_streamer->transform_bin), _ms_node_resouces_acquire_iter, ms_streamer); if (MEDIA_STREAMER_ERROR_NONE != ret) { - ms_error("Failed to acquire resources for topology bin"); + ms_error("Failed to acquire resources for transform bin"); return ret; } @@ -252,13 +252,13 @@ int __ms_release_resources(media_streamer_s *ms_streamer) return ret; } - /* Release resources for topology bin. Here we also consider + /* Release resources for transform bin. Here we also consider nodes that were not added by user explicitly (e.g. decodebin was used). */ - ret = __ms_bin_foreach_elements(GST_BIN(ms_streamer->topology_bin), + ret = __ms_bin_foreach_elements(GST_BIN(ms_streamer->transform_bin), _ms_node_resouces_release_iter, ms_streamer); if (MEDIA_STREAMER_ERROR_NONE != ret) { - ms_error("Failed to release resources for topology bin"); + ms_error("Failed to release resources for trannsform bin"); return ret; } -- 2.7.4 From 3e62b300ce1b80274b44da74d94dd71373844e56 Mon Sep 17 00:00:00 2001 From: Hyunil Date: Thu, 8 Feb 2018 11:10:17 +0900 Subject: [PATCH 15/16] Remove setting render rectangle Videosink set full screen without setting the window size of the application Change-Id: Ib9462a01425b630cab19a3b1ce1e6cbcc4294b6b Signed-off-by: Hyunil --- include/media_streamer_priv.h | 5 ----- src/media_streamer_node.c | 31 +------------------------------ 2 files changed, 1 insertion(+), 35 deletions(-) diff --git a/include/media_streamer_priv.h b/include/media_streamer_priv.h index ad6df63..a2a49ce 100644 --- a/include/media_streamer_priv.h +++ b/include/media_streamer_priv.h @@ -148,11 +148,6 @@ typedef struct { typedef struct _media_streamer_wl_info_s { int parent_id; - int window_x; - int window_y; - int window_width; - int window_height; - void *evas_obj; } media_streamer_wl_info_s; /* Private functions definition */ diff --git a/src/media_streamer_node.c b/src/media_streamer_node.c index ff7563a..3be4629 100644 --- a/src/media_streamer_node.c +++ b/src/media_streamer_node.c @@ -1379,34 +1379,7 @@ int _media_streamer_get_wl_info(Evas_Object *obj, media_streamer_wl_info_s *wl_i wl_display_roundtrip_queue(display, queue); if (wl_info->parent_id > 0) { - int rotation = 0; - Ecore_Evas *ecore_evas = NULL; - ret = MEDIA_STREAMER_ERROR_NONE; - - wl_info->evas_obj = obj; - - evas_object_geometry_get(obj, &wl_info->window_x, &wl_info->window_y, - &wl_info->window_width, &wl_info->window_height); - - ecore_evas = ecore_evas_ecore_evas_get(evas_object_evas_get(obj)); - if (ecore_evas) { - rotation = ecore_evas_rotation_get(ecore_evas); - if (rotation == 90 || rotation == 270) { - int temp = wl_info->window_width; - - LOGD("swap width and height %d, %d", wl_info->window_width, wl_info->window_height); - - wl_info->window_width = wl_info->window_height; - wl_info->window_height = temp; - } - } else { - LOGW("failed to get ecore_evas.. skip rotation check"); - } - - LOGD("evas object : %p, rotation : %d, parent id : %u, window : %d,%d,%dx%d", - wl_info->evas_obj, rotation, wl_info->parent_id, - wl_info->window_x, wl_info->window_y, - wl_info->window_width, wl_info->window_height); + LOGD("parent id : %u", wl_info->parent_id); } else { ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION; LOGE("failed to get parent id"); @@ -1463,8 +1436,6 @@ int __ms_node_set_display(media_streamer_node_s *ms_node, const char *param_valu LOGD("wayland global surface id : %d", wl_info.parent_id); gst_video_overlay_set_wl_window_wl_surface_id(GST_VIDEO_OVERLAY(ms_node->gst_element), (guintptr)wl_info.parent_id); - gst_video_overlay_set_render_rectangle(GST_VIDEO_OVERLAY(ms_node->gst_element), - wl_info.window_x, wl_info.window_y, wl_info.window_width, wl_info.window_height); return ret; } -- 2.7.4 From 72513c69037af22e33ed860a64988bc81a8b193f Mon Sep 17 00:00:00 2001 From: Hyunil Date: Mon, 12 Feb 2018 11:13:03 +0900 Subject: [PATCH 16/16] Check return value of __ms_adaptive_sink_http_server_prepare() Change-Id: Id260a37fbedabd6c5bcc1669e566b16e827487d9 Signed-off-by: Hyunil --- src/media_streamer_node.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/media_streamer_node.c b/src/media_streamer_node.c index 3be4629..f13824b 100644 --- a/src/media_streamer_node.c +++ b/src/media_streamer_node.c @@ -920,7 +920,7 @@ int __ms_pipeline_prepare(media_streamer_s *ms_streamer) } if (adaptive_sink) - __ms_adaptive_sink_http_server_prepare(ms_streamer, adaptive_sink); + ret = __ms_adaptive_sink_http_server_prepare(ms_streamer, adaptive_sink); if (ret != MEDIA_STREAMER_ERROR_NONE) goto prepare_fail; -- 2.7.4