#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);
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));
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;
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;
* 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,
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;
}
} 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;
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
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