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})
#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
#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;
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;
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;
+++ /dev/null
-/*
- * 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__ */
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)
}
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;
}
}
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;
}
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);
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;
}
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);
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 */
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;
#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)
{
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;
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;
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;
}
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;
}
#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)
{
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;
}
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;
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;
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:
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)) {
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)
+++ /dev/null
-/*
- * 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;
-}