[1.1.0] Enable resource manager commonization 30/314930/17
authorYoungHun Kim <yh8004.kim@samsung.com>
Tue, 23 Jul 2024 08:54:39 +0000 (17:54 +0900)
committerYoungHun Kim <yh8004.kim@samsung.com>
Fri, 2 Aug 2024 01:15:12 +0000 (10:15 +0900)
Change-Id: Ie8d4561ba76f2391d07536549052815a0ae9ec41

CMakeLists.txt
include/MediaTransporter.h
include/MediaTransporterBase.h
include/MediaTransporterResource.h
packaging/capi-media-transporter.spec
src/MediaSourceBinCamera.cpp
src/MediaSourceBinVideoTest.cpp
src/MediaTransporterBase.cpp
src/MediaTransporterReceiver.cpp
src/MediaTransporterResource.cpp

index 2d0ab7027a3a49d39f84fb1c9a9851b10b39b1e9..d0130fdd6dc7e009088cd8c7b3f765ae602ec3c0 100644 (file)
@@ -16,7 +16,7 @@ SET(dependents "dlog glib-2.0 gstreamer-1.0 gstreamer-video-1.0 gstreamer-audio-
                 capi-media-sound-manager gstreamer-rtsp-server-1.0 libpulse")
 
 IF(NOT TIZEN_PROFILE_TV)
-    SET(dependents "${dependents} mm-resource-manager")
+    SET(dependents "${dependents} resource-manager resource-center-api")
 ELSE()
     ADD_DEFINITIONS("-DTIZEN_TV")
 ENDIF()
index 6bd9ce9dd3a09d5ed658b036176e7424297db931..67760f9bb92ddfb31268ef2c31c06e9117c55932 100644 (file)
@@ -7,11 +7,18 @@
 #include "mtpr_internal.h"
 
 #include <set>
-#include <mm_resource_manager.h>
+
+typedef enum {
+       RES_TYPE_VIDEO_DECODER,     /**< ID of video decoder resource type */
+       RES_TYPE_VIDEO_OVERLAY,     /**< ID of video overlay resource type */
+       RES_TYPE_CAMERA,            /**< ID of camera resource type */
+       RES_TYPE_VIDEO_ENCODER,     /**< ID of video encoder resource type */
+       RES_TYPE_MAX,               /**< Used to iterate on resource types only */
+} res_type_e;
 
 namespace tizen_media_transporter {
 
-using ResourceSet = std::set<mm_resource_manager_res_type_e>;
+using ResourceSet = std::set<res_type_e>;
 
 using mtprConnectionType = mtpr_connection_type_e;
 using mtprSourceType = mtpr_source_type_e;
index cac8cd7fbdc1d03ddaf2bcf1038c2d93afa4c07e..f701e9a8a95e5ed94a8810119a717bd4b449a1f2 100644 (file)
@@ -22,7 +22,6 @@
 #include <string>
 #include <mutex>
 #include <glib.h>
-#include <mm_resource_manager.h>
 #include <gst/gst.h>
 
 #include "MediaTransporter.h"
index 2be05dbb62d0e3196921d60c0b7947f1de19e68c..e2d6c5543bccea2afa22e7ad97a87d86fe2d830d 100644 (file)
@@ -19,8 +19,7 @@
 
 #include <mutex>
 #include <map>
-#include <mm_resource_manager.h>
-
+#include <rm_api.h>
 #include "MediaTransporter.h"
 #include "MediaTransporterObserver.h"
 
@@ -37,19 +36,22 @@ public:
        ~MediaTransporterResource();
 
        int acquire(ResourceSet resourceSet);
-       int acquire(mm_resource_manager_res_type_e type);
+       int acquire(res_type_e type);
        int releaseAll();
 
-       static int _resourceReleaseCallback(mm_resource_manager_h mgr, mm_resource_manager_res_h res, void *user_data);
-
 private:
+       static rm_cb_result _resourceReleaseCallback(int handle, rm_callback_type event_src, rm_device_request_s *info, void *user_data);
+
        int create();
        int destroy();
-       int acquireInternal(mm_resource_manager_res_type_e type);
-       bool resourceReleased(mm_resource_manager_res_h res);
+       int acquireInternal(res_type_e type);
+       int release(int device_id);
+       int getAppid(int pid, char *name, size_t size);
+
+       rm_consumer_info _rci;
 
-       mm_resource_manager_h _mgr { nullptr };
-       std::map<mm_resource_manager_res_type_e, mm_resource_manager_res_h> _resources;
+       int _rmHandle { 0 };
+       std::map<res_type_e, int> _resources;
        bool _onReleaseCallback { false };
 
        std::mutex _mutex;
index 004ca6332d506ae26d3c55d5389028e28f3ecbf1..50b000cb40b5b3ac8d90646adc04485f97046fbc 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-transporter
 Summary:    A Media Transporter library in Tizen Native API
-Version:    1.0.30
+Version:    1.1.0
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
@@ -30,7 +30,8 @@ BuildRequires:  pkgconfig(capi-media-sound-manager)
 # for test
 BuildRequires:  pkgconfig(mm-display-interface)
 BuildRequires:  pkgconfig(esplusplayer)
-BuildRequires:  pkgconfig(mm-resource-manager)
+BuildRequires:  pkgconfig(resource-manager)
+BuildRequires:  pkgconfig(resource-center-api)
 BuildRequires:  pkgconfig(capi-media-camera)
 %if 0%{?gtests:1}
 BuildRequires:  pkgconfig(gmock)
index 63d1cf8a0cf5ed0661d5f28f2b762d5e6f1874e8..14f4995d09a7cda2f880507fd2ec679e6c65c95f 100644 (file)
@@ -87,9 +87,9 @@ MediaSourceBinInfo MediaSourceBinCamera::generate()
                throw;
        }
 
-       ResourceSet resourceRequired = { MM_RESOURCE_MANAGER_RES_TYPE_CAMERA };
+       ResourceSet resourceRequired = { RES_TYPE_CAMERA };
        if (gst::_containHwEncoderElement(elements))
-               resourceRequired.insert(MM_RESOURCE_MANAGER_RES_TYPE_VIDEO_ENCODER);
+               resourceRequired.insert(RES_TYPE_VIDEO_ENCODER);
 
        return std::make_tuple(MTPR_SOURCE_TYPE_CAMERA, bin, resourceRequired);
 }
index 8e91432be0357856dc2cbe5062d2a2d4465a53ba..649bd6d8bc2f32299328a0c2f9ed71cb78ed79a8 100644 (file)
@@ -83,7 +83,7 @@ MediaSourceBinInfo MediaSourceBinVideoTest::generate()
 
        ResourceSet resourceRequired;
        if (gst::_containHwEncoderElement(elements))
-               resourceRequired.insert(MM_RESOURCE_MANAGER_RES_TYPE_VIDEO_ENCODER);
+               resourceRequired.insert(RES_TYPE_VIDEO_ENCODER);
 
        return std::make_tuple(MTPR_SOURCE_TYPE_VIDEOTEST, bin, resourceRequired);
 }
index c396981313b5302cf68793b6cf67db52d059266a..a81d1eef76abb3e2b3f08a4d8d254e9490df00c2 100644 (file)
@@ -256,6 +256,7 @@ void MediaTransporterBase::changed()
 {
        try {
                stopInternal();
+               _resourceManager->releaseAll();
                if (_errorCallback)
                        _errorCallback->invoke(VariantData{MTPR_ERROR_RESOURCE_CONFLICT});
        } catch (const MediaTransporterException& e) {
index 902656a1205bae93880baa2ed08d57ca6b72ea3d..760dbc68712acb9a77dbb95c0cbe3b7dcc0173e5 100644 (file)
@@ -503,7 +503,7 @@ void MediaTransporterReceiver::_buildVideoRenderingSink(gst::GstElements& elemen
 
        try {
                // display RM acquire
-               _resourceManager->acquire(MM_RESOURCE_MANAGER_RES_TYPE_VIDEO_OVERLAY);
+               _resourceManager->acquire(RES_TYPE_VIDEO_OVERLAY);
                converter = gst::_createElement(gst::DEFAULT_ELEMENT_VIDEOCONVERT);
                elements.push_back(converter);
                sink = _display->videoSink();
index 57ebc8de18116e905ff3f6eef518a880e7e8d5ec..be4d9be509b23562b961c1d43af7f095a6997fac 100644 (file)
 #include "MediaTransporterException.h"
 #include <algorithm>
 
+#include <rm_type.h>
+#include <resource_center.h>
+#include <sys/types.h>
+#include <unistd.h>
+
 using namespace tizen_media_transporter;
 
 MediaTransporterResource::MediaTransporterResource()
@@ -40,89 +45,132 @@ MediaTransporterResource::~MediaTransporterResource()
        LOG_DEBUG("dtor: %p", this);
 }
 
-int MediaTransporterResource::_resourceReleaseCallback(mm_resource_manager_h mgr,
-                                                                                                       mm_resource_manager_res_h res,
-                                                                                                       void *user_data)
+rm_cb_result MediaTransporterResource::_resourceReleaseCallback(int res, rm_callback_type event_src,
+                                                                                                       rm_device_request_s *info, void *cb_data)
 {
-       auto resourceClass = static_cast<MediaTransporterResource*>(user_data);
-       RET_VAL_IF(!resourceClass, FALSE, "mtpr is NULL");
+       auto resourceClass = static_cast<MediaTransporterResource*>(cb_data);
+       RET_VAL_IF(!resourceClass, RM_CB_RESULT_ERROR, "mtpr is NULL");
+
+       LOG_WARNING("res %d, event type %d, info %p (# %d), cb_data %p", res, event_src, info, info ? info->request_num : 0, cb_data);
+
+       resourceClass->notify();
 
-       return resourceClass->resourceReleased(res);
+       LOG_INFO("RM_CB_RESULT_OK");
+
+       return RM_CB_RESULT_OK;
 }
 
-bool MediaTransporterResource::resourceReleased(mm_resource_manager_res_h res)
+int MediaTransporterResource::getAppid(int pid, char *name, size_t size)
 {
-       std::lock_guard<std::mutex> mutex(_mutex);
+       g_autofree gchar *cmdline = NULL;
+       g_autofree gchar *contents = NULL;
+       g_autofree gchar *base = NULL;
+       g_autoptr(GError) error = NULL;
 
-       bool interrupted = false;
+       RET_VAL_IF(!name, MTPR_ERROR_INVALID_PARAMETER, "name is NULL");
+       RET_VAL_IF(size == 0, MTPR_ERROR_INVALID_PARAMETER, "size is %lu", size);
 
-       _onReleaseCallback = true;
+       cmdline = g_strdup_printf("/proc/%d/cmdline", pid);
 
-       for (auto& [ type, handle ] : _resources) {
-               if (res == handle) {
-                       LOG_INFO("type[%d] resource was released by resource manager", static_cast<int>(type));
-                       _resources.erase(type);
-                       interrupted = true;
-               }
+       if (!g_file_get_contents(cmdline, &contents, NULL, &error)) {
+               LOG_ERROR("error : %s", error->message);
+               return MTPR_ERROR_INVALID_OPERATION;
        }
 
-       if (interrupted)
-               notify();
+       base = g_path_get_basename(contents);
 
-       _onReleaseCallback = false;
+       if (g_strlcpy(name, base, size) >= size) {
+               LOG_ERROR("string truncated");
+               return MTPR_ERROR_INVALID_OPERATION;
+       }
 
-       return true;
+       return MTPR_ERROR_NONE;
 }
 
 int MediaTransporterResource::create()
 {
        std::lock_guard<std::mutex> mutex(_mutex);
 
-       if (mm_resource_manager_create(MM_RESOURCE_MANAGER_APP_CLASS_MEDIA,
-                               _resourceReleaseCallback, this, &_mgr) != MM_RESOURCE_MANAGER_ERROR_NONE) {
+       _rci.app_pid = (int)getpid();
+       if (getAppid(_rci.app_pid, _rci.app_id, sizeof(_rci.app_id)) != MTPR_ERROR_NONE) {
+               LOG_ERROR("__mmplayer_get_appid_by_pid is failed");
+               return MTPR_ERROR_INVALID_OPERATION;
+       }
+
+       if (rm_register((rm_resource_cb)_resourceReleaseCallback,
+                       static_cast<void *>(this),
+                       &(_rmHandle),
+                       (_rci.app_id[0] != '\0') ? &_rci : NULL) != RM_OK) {
                LOG_ERROR("failed to create resource manager");
                return MTPR_ERROR_RESOURCE_FAILED;
        }
 
-       LOG_INFO("resource manager created : %p", _mgr);
+       LOG_INFO("[h %d] resource manager created ", _rmHandle);
 
        return MTPR_ERROR_NONE;
 }
 
-int MediaTransporterResource::acquireInternal(mm_resource_manager_res_type_e type)
+int MediaTransporterResource::acquireInternal(res_type_e type)
 {
-       int ret = MM_RESOURCE_MANAGER_ERROR_NONE;
-       mm_resource_manager_res_h handle;
-
-       if (!_mgr)
-               return MTPR_ERROR_NONE;
-
-       if (_resources.find(type) != _resources.end()) {
-               LOG_ERROR("type[%d] resource was already acquired", type);
+       int category_option = 0;
+       rm_rsc_category_e category_id = RM_CATEGORY_NONE;
+       rm_requests_resource_state_e state;
+       rm_category_request_s request_resources;
+
+       RET_VAL_IF(type >= RES_TYPE_MAX, MTPR_ERROR_INVALID_PARAMETER, "invalid type(%d)", type);
+
+       LOG_INFO("[h %d] app id : %s type %d", _rmHandle, _rci.app_id, type);
+       memset(&request_resources, 0x0, sizeof(rm_category_request_s));
+
+       rm_device_return_s device;
+       memset(&device, 0x0, sizeof(rm_device_return_s));
+
+       switch (type) {
+       case RES_TYPE_VIDEO_DECODER:
+               state = RM_STATE_EXCLUSIVE;
+               category_id = RM_CATEGORY_VIDEO_DECODER;
+               break;
+       case RES_TYPE_VIDEO_OVERLAY:
+               state = RM_STATE_EXCLUSIVE;
+               category_id = RM_CATEGORY_SCALER;
+               break;
+       case RES_TYPE_CAMERA:
+               state = RM_STATE_EXCLUSIVE;
+               category_id = RM_CATEGORY_CAMERA;
+               break;
+       case RES_TYPE_VIDEO_ENCODER:
+               state = RM_STATE_EXCLUSIVE;
+               category_id = RM_CATEGORY_VIDEO_ENCODER;
+               break;
+       default:
+               LOG_ERROR("category id can't set");
                return MTPR_ERROR_RESOURCE_FAILED;
        }
 
-       LOG_DEBUG("mark for acquire type[%d] resource", type);
-       ret = mm_resource_manager_mark_for_acquire(_mgr, type,
-                               MM_RESOURCE_MANAGER_RES_VOLUME_FULL, &handle);
-       if (ret != MM_RESOURCE_MANAGER_ERROR_NONE) {
-               LOG_ERROR("failed to mark resource for acquire, ret[0x%x]", ret);
-               return MTPR_ERROR_RESOURCE_FAILED;
-       }
+       category_option = rc_get_capable_category_id(_rmHandle, _rci.app_id, category_id);
 
-       LOG_DEBUG("commit type[%d] resource", type);
-       ret = mm_resource_manager_commit(_mgr);
-       if (ret != MM_RESOURCE_MANAGER_ERROR_NONE) {
-               LOG_ERROR("failed to commit of resource, ret([0x%x]", ret);
+       request_resources.request_num = 1;
+       request_resources.state[0] = state;
+       request_resources.category_id[0] = category_id;
+       request_resources.category_option[0] = category_option;
+
+       LOG_INFO("[h %d] allocate resources type[%d]", _rmHandle, type);
+
+       int ret = rm_allocate_resources(_rmHandle, &request_resources, &device);
+       if (ret != RM_OK) {
+               LOG_ERROR("failed to rm_allocate_resources, ret[0x%x]", ret);
                return MTPR_ERROR_RESOURCE_FAILED;
        }
 
-       _resources[type] = handle;
+       _resources[type] = device.device_id[0];
+
+       free(device.device_node[0]);
+       free(device.omx_comp_name[0]);
 
        return MTPR_ERROR_NONE;
 }
 
-int MediaTransporterResource::acquire(mm_resource_manager_res_type_e type)
+int MediaTransporterResource::acquire(res_type_e type)
 {
        std::lock_guard<std::mutex> mutex(_mutex);
 
@@ -143,52 +191,61 @@ int MediaTransporterResource::acquire(ResourceSet resourceSet)
        return ret;
 }
 
+int MediaTransporterResource::release(int device_id)
+{
+       LOG_INFO("[h %d] deviceId %d", _rmHandle,device_id);
+
+       rm_device_request_s requested;
+       memset(&requested, 0x0, sizeof(rm_device_request_s));
+       requested.request_num = 1;
+       requested.device_id[0] = device_id;
+
+       int ret = rm_deallocate_resources(_rmHandle, &requested);
+       if (ret != RM_OK) {
+               LOG_ERROR("Resource deallocation request failed [%d] [handle %d]", ret, _rmHandle);
+               return MTPR_ERROR_INVALID_OPERATION;
+       }
+
+       return MTPR_ERROR_NONE;
+}
+
 int MediaTransporterResource::releaseAll()
 {
        std::lock_guard<std::mutex> mutex(_mutex);
 
-       int ret = MM_RESOURCE_MANAGER_ERROR_NONE;
-
-       if (!_mgr)
-               return MTPR_ERROR_NONE;
+       LOG_INFO("[h %d] RELEASE ALL", _rmHandle);
 
-       if (_onReleaseCallback) {
-               LOG_INFO("__resource_release_cb is calling, so skip");
+       if (!_rmHandle) {
+               LOG_WARNING("resource handle is not register");
                return MTPR_ERROR_NONE;
        }
 
-       ret = mm_resource_manager_mark_all_for_release(_mgr);
-       if (ret != MM_RESOURCE_MANAGER_ERROR_NONE) {
-               LOG_ERROR("failed to mark all for release, ret[0x%x]", ret);
-               return MTPR_ERROR_RESOURCE_FAILED;
-       }
-       ret = mm_resource_manager_commit(_mgr);
-       if (ret != MM_RESOURCE_MANAGER_ERROR_NONE) {
-               LOG_ERROR("failed to commit resource, ret[0x%x]", ret);
-               return MTPR_ERROR_RESOURCE_FAILED;
+       for (auto& [type, deviceId] : _resources) {
+               LOG_INFO("  => type %d device id %d", type, deviceId);
+               release(deviceId);
        }
-       LOG_DEBUG("all resources were released by resource manager");
+
+       LOG_INFO("[h %d] RELEASE ALL : DONE", _rmHandle);
 
        return MTPR_ERROR_NONE;
 }
 
-
 int MediaTransporterResource::destroy()
 {
        std::lock_guard<std::mutex> mutex(_mutex);
 
-       if (!_mgr)
+       LOG_INFO("[h %d] resource manager destroyed", _rmHandle);
+
+       if (!_rmHandle) {
+               LOG_WARNING("resource handle is not register");
                return MTPR_ERROR_NONE;
+       }
 
-       int ret = mm_resource_manager_destroy(_mgr);
-       if (ret != MM_RESOURCE_MANAGER_ERROR_NONE) {
+       int ret = rm_unregister(_rmHandle);
+       if (ret != RM_OK) {
                LOG_ERROR("failed to destroy resource manager, ret[0x%x]", ret);
                return MTPR_ERROR_RESOURCE_FAILED;
        }
 
-       LOG_INFO("resource manager destroyed : %p", _mgr);
-       _mgr = nullptr;
-
        return MTPR_ERROR_NONE;
 }
-