Move handle of resource manager creation code 40/217740/3 accepted/tizen/unified/20191118.234500 submit/tizen/20191118.104059
authorJeongmo Yang <jm80.yang@samsung.com>
Thu, 14 Nov 2019 03:14:26 +0000 (12:14 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Fri, 15 Nov 2019 01:37:49 +0000 (10:37 +0900)
- It's moved from __mediacodec_init_lib() to mediacodec_create().
  It will reduce library loading time.

[Version] 0.6.7
[Profile] Common
[Issue Type] Optimization

Change-Id: I373cf58f25b631712c04ae01e190832403a390fe
Signed-off-by: Jeongmo Yang <jm80.yang@samsung.com>
packaging/capi-media-codec.spec
src/media_codec.c

index 41b392e..9c4c6c9 100644 (file)
@@ -4,7 +4,7 @@
 
 Name:       capi-media-codec
 Summary:    A Media Codec library in Tizen Native API
-Version:    0.6.6
+Version:    0.6.7
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index 88e12d8..4149d9b 100644 (file)
@@ -27,9 +27,9 @@
 #define MC_PREALLOCATED_HANDLE_ARRAY_SIZE 16
 
 #ifdef USE_MM_RESOURCE_MANAGER
-static mm_resource_manager_h resource_manager;
-static GPtrArray *mediacodec_handles;
-static GMutex mediacodec_handles_lock;
+static mm_resource_manager_h g_mc_resource_manager;
+static GPtrArray *g_mediacodec_handles;
+static GMutex g_mediacodec_lock;
 #endif
 
 static gboolean  __mediacodec_empty_buffer_cb(media_packet_h pkt, void *user_data);
@@ -136,8 +136,19 @@ int mediacodec_create(mediacodec_h *mediacodec)
        LOGD("mediacodec_create..");
 
 #ifdef USE_MM_RESOURCE_MANAGER
-       if (resource_manager == NULL)
-               return MEDIACODEC_ERROR_INTERNAL;
+       g_mutex_lock(&g_mediacodec_lock);
+
+       if (!g_mc_resource_manager) {
+               int mm_ret = mm_resource_manager_create(MM_RESOURCE_MANAGER_APP_CLASS_MEDIA,
+                       __mediacodec_resource_release_cb, NULL, &g_mc_resource_manager);
+               if (mm_ret != MM_RESOURCE_MANAGER_ERROR_NONE) {
+                       g_mutex_unlock(&g_mediacodec_lock);
+                       LOGE("mm_resource_manager_create failed 0x%x", mm_ret);
+                       return MEDIACODEC_ERROR_INTERNAL;
+               }
+       }
+
+       g_mutex_unlock(&g_mediacodec_lock);
 #endif
 
        handle = (mediacodec_s *)malloc(sizeof(mediacodec_s));
@@ -171,9 +182,9 @@ int mediacodec_create(mediacodec_h *mediacodec)
        mc_set_supported_codec_cb(handle->mc_handle, (mediacodec_supported_codec_cb)__mediacodec_supported_codec_cb, handle);
 
 #ifdef USE_MM_RESOURCE_MANAGER
-       g_mutex_lock(&mediacodec_handles_lock);
-       g_ptr_array_insert(mediacodec_handles, -1, *mediacodec);
-       g_mutex_unlock(&mediacodec_handles_lock);
+       g_mutex_lock(&g_mediacodec_lock);
+       g_ptr_array_insert(g_mediacodec_handles, -1, *mediacodec);
+       g_mutex_unlock(&g_mediacodec_lock);
 #endif
 
        return MEDIACODEC_ERROR_NONE;
@@ -192,9 +203,9 @@ int mediacodec_destroy(mediacodec_h mediacodec)
                return MEDIACODEC_ERROR_INVALID_OPERATION;
        } else {
 #ifdef USE_MM_RESOURCE_MANAGER
-               g_mutex_lock(&mediacodec_handles_lock);
-               g_ptr_array_remove_fast(mediacodec_handles, mediacodec);
-               g_mutex_unlock(&mediacodec_handles_lock);
+               g_mutex_lock(&g_mediacodec_lock);
+               g_ptr_array_remove_fast(g_mediacodec_handles, mediacodec);
+               g_mutex_unlock(&g_mediacodec_lock);
 #endif
 
                handle->state = MEDIACODEC_STATE_NONE;
@@ -333,7 +344,7 @@ int mediacodec_prepare(mediacodec_h mediacodec)
                 * mm_resource_manager_get_res_type_volume() can be used.
                 * Additional info can be found in doxygen comments of mm_resource_manager.h
                 */
-               rm_ret = mm_resource_manager_mark_for_acquire(resource_manager,
+               rm_ret = mm_resource_manager_mark_for_acquire(g_mc_resource_manager,
                                mc_handle->is_encoder ?
                                MM_RESOURCE_MANAGER_RES_TYPE_VIDEO_ENCODER :
                                MM_RESOURCE_MANAGER_RES_TYPE_VIDEO_DECODER,
@@ -349,9 +360,9 @@ int mediacodec_prepare(mediacodec_h mediacodec)
                                return MEDIACODEC_ERROR_INTERNAL;
                        }
 
-               rm_ret = mm_resource_manager_commit(resource_manager);
+               rm_ret = mm_resource_manager_commit(g_mc_resource_manager);
                if (rm_ret != MM_RESOURCE_MANAGER_ERROR_NONE) {
-                       mm_resource_manager_mark_for_release(resource_manager, resource);
+                       mm_resource_manager_mark_for_release(g_mc_resource_manager, resource);
                        LOGE("Failed to commit resource manager : %x", rm_ret);
                        return MEDIACODEC_ERROR_INTERNAL;
                }
@@ -385,12 +396,12 @@ int mediacodec_unprepare(mediacodec_h mediacodec)
        } else {
 #ifdef USE_MM_RESOURCE_MANAGER
                if (handle->codec_resource != NULL) {
-                       mm_resource_manager_mark_for_release(resource_manager,
+                       mm_resource_manager_mark_for_release(g_mc_resource_manager,
                                        handle->codec_resource);
                        handle->codec_resource = NULL;
-                       rm_ret = mm_resource_manager_commit(resource_manager);
+                       rm_ret = mm_resource_manager_commit(g_mc_resource_manager);
                        if (rm_ret != MM_RESOURCE_MANAGER_ERROR_NONE) {
-                               mm_resource_manager_mark_for_release(resource_manager, handle->codec_resource);
+                               mm_resource_manager_mark_for_release(g_mc_resource_manager, handle->codec_resource);
                                switch (rm_ret) {
                                case MM_RESOURCE_MANAGER_ERROR_LOW_PRIORITY:
                                        return MEDIACODEC_ERROR_RESOURCE_OVERLOADED;
@@ -714,9 +725,9 @@ static int __mediacodec_resource_release_cb(mm_resource_manager_h rm,
        int i;
        mediacodec_s *handle;
 
-       g_mutex_lock(&mediacodec_handles_lock);
-       for (i = 0; i < mediacodec_handles->len; i++) {
-               handle = g_ptr_array_index(mediacodec_handles, i);
+       g_mutex_lock(&g_mediacodec_lock);
+       for (i = 0; i < g_mediacodec_handles->len; i++) {
+               handle = g_ptr_array_index(g_mediacodec_handles, i);
                if (handle->codec_resource == resource_h) {
                        /*
                         * TODO
@@ -731,26 +742,32 @@ static int __mediacodec_resource_release_cb(mm_resource_manager_h rm,
                        break;
                }
        }
-       g_mutex_unlock(&mediacodec_handles_lock);
+       g_mutex_unlock(&g_mediacodec_lock);
 
        return FALSE;
 }
 
+
 static void __mediacodec_init_lib()
 {
-       mediacodec_handles = g_ptr_array_sized_new(MC_PREALLOCATED_HANDLE_ARRAY_SIZE);
+       LOGD("START");
 
-       if (MM_RESOURCE_MANAGER_ERROR_NONE != mm_resource_manager_create(MM_RESOURCE_MANAGER_APP_CLASS_MEDIA,
-                       __mediacodec_resource_release_cb, NULL, &resource_manager)) {
-               LOGE("Failed to initialize resource manager");
-               g_ptr_array_unref(mediacodec_handles);
-       }
+       g_mutex_init(&g_mediacodec_lock);
+       g_mediacodec_handles = g_ptr_array_sized_new(MC_PREALLOCATED_HANDLE_ARRAY_SIZE);
+
+       LOGD("DONE");
 }
 
 static void __mediacodec_deinit_lib()
 {
-       if (resource_manager != NULL)
-               mm_resource_manager_destroy(resource_manager);
-       g_ptr_array_unref(mediacodec_handles);
+       LOGD("START");
+
+       if (g_mc_resource_manager != NULL)
+               mm_resource_manager_destroy(g_mc_resource_manager);
+
+       g_ptr_array_unref(g_mediacodec_handles);
+       g_mutex_clear(&g_mediacodec_lock);
+
+       LOGD("DONE");
 }
 #endif