From: Vadym Sachenko Date: Wed, 8 Nov 2017 11:24:33 +0000 (+0200) Subject: mm-resource-manager integration patch X-Git-Tag: submit/tizen/20171117.022846^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=bbaeab91d1451fcc9895b481776f6b45d01e5a62;p=platform%2Fcore%2Fapi%2Fmediastreamer.git mm-resource-manager integration patch Change-Id: Ic87dc5efc00765e511b143d357a5550db8cb51c1 Signed-off-by: Vadym Sachenko --- 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; -}