From 269d598011f94d21724a3eedbbec05286f54ed4f Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Thu, 14 Nov 2019 12:14:26 +0900 Subject: [PATCH] Move handle of resource manager creation code - 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 --- packaging/capi-media-codec.spec | 2 +- src/media_codec.c | 77 +++++++++++++++++++++++++---------------- 2 files changed, 48 insertions(+), 31 deletions(-) diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index 41b392e..9c4c6c9 100644 --- a/packaging/capi-media-codec.spec +++ b/packaging/capi-media-codec.spec @@ -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 diff --git a/src/media_codec.c b/src/media_codec.c index 88e12d8..4149d9b 100644 --- a/src/media_codec.c +++ b/src/media_codec.c @@ -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 -- 2.7.4