mm-resource-manager integration patch 82/159382/2 accepted/tizen/unified/20171123.065759 submit/tizen/20171117.022846 submit/tizen/20171117.070221
authorVadym Sachenko <va.sachenko@partner.samsung.com>
Wed, 8 Nov 2017 11:24:33 +0000 (13:24 +0200)
committereunhae choi <eunhae1.choi@samsung.com>
Thu, 16 Nov 2017 06:00:18 +0000 (06:00 +0000)
Change-Id: Ic87dc5efc00765e511b143d357a5550db8cb51c1
Signed-off-by: Vadym Sachenko <va.sachenko@partner.samsung.com>
CMakeLists.txt
include/media_streamer_node_resources.h
include/media_streamer_priv.h
include/media_streamer_resource.h [deleted file]
packaging/capi-media-streamer.spec
src/media_streamer_gst.c
src/media_streamer_node.c
src/media_streamer_node_resources.c
src/media_streamer_priv.c
src/media_streamer_resource.c [deleted file]

index 649690ef17d3a6b0b42ed80a632321174b1b46d5..3867ff635aa001469a8442add1c717347a099671 100644 (file)
@@ -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})
index 2f4dd12818015d5b4ca9a3fe116ab28f82356019..e13aed33a6d2b4fe12437bb914267f0606cb9e7a 100644 (file)
 #define __MEDIA_STREAMER_NODE_RESOURCE_H__
 
 #include <media_streamer_priv.h>
-#include <media_streamer_resource.h>
 
 #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
index 9ba66a0f542f9155ccb8ae5a410571a32e46a748..6d2e8898123abfa2f56702ea841020297dd35afe 100644 (file)
@@ -28,7 +28,7 @@ extern "C" {
 
 #include <media_streamer.h>
 #include <media_streamer_util.h>
-#include <media_streamer_resource.h>
+#include <mm_resource_manager.h>
 #include <media_streamer_http_server.h>
 
 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 (file)
index 2cefdc8..0000000
+++ /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 <murphy/plugins/resource-native/libmurphy-resource/resource-api.h>
-
-#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__ */
index 3a73e2b48405d612230d6c956d5bf2cedb73b7be..a562ad4b697cf6a66994ea16692f0be3a1302118 100644 (file)
@@ -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)
index b61fbda863b425142f9920b37509f7e3c0d72f04..5a8c6ce7ca8d687714394ffc9bb8cd562aec334d 100644 (file)
@@ -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;
                                }
                        }
index 1c5a0fb0d3f53b854923da8d7a127f172980ff58..d7018b4d2553378a842f63b96d6c1b389e5553cd 100644 (file)
@@ -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;
index dbf8c54b385fbd0f5394d4e9e5fd64d9e33e12b7..98bdfdd9d45b5b115623a80a2b88a6bf49a19b79 100644 (file)
 #include <media_streamer.h>
 #include <media_streamer_priv.h>
 #include <media_streamer_node.h>
-#include <media_streamer_resource.h>
-
-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 <mm_resource_manager.h>
 
 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;
 }
index c3825dc90f90785025ef0432092bbe8b4e165e05..e0efc4e032178aea65dc215453173f328dd22cc7 100644 (file)
 #include "media_streamer_util.h"
 #include "media_streamer_node.h"
 #include "media_streamer_gst.h"
-#include "media_streamer_resource.h"
+#include <mm_resource_manager.h>
 
 #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 (file)
index bce054d..0000000
+++ /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 <murphy/common/glib-glue.h>
-
-#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;
-}