From ea9dd5395819c4d05ddf123957e79d80a28fc2a2 Mon Sep 17 00:00:00 2001 From: Eunhye Choi Date: Tue, 30 Apr 2019 20:27:19 +0900 Subject: [PATCH] [0.6.188] refactoring the resource managing code - refactoring the resource managing code - release all the resources in case of resource conflict Change-Id: I2079dc476c1a986532d0c4d8cbf16395fc3b5216 --- packaging/libmm-player.spec | 2 +- src/include/mm_player_priv.h | 10 +- src/mm_player_priv.c | 253 ++++++++++++++++++++----------------------- 3 files changed, 125 insertions(+), 140 deletions(-) diff --git a/packaging/libmm-player.spec b/packaging/libmm-player.spec index dba7a4e..426cda7 100644 --- a/packaging/libmm-player.spec +++ b/packaging/libmm-player.spec @@ -1,6 +1,6 @@ Name: libmm-player Summary: Multimedia Framework Player Library -Version: 0.6.187 +Version: 0.6.188 Release: 0 Group: Multimedia/Libraries License: Apache-2.0 diff --git a/src/include/mm_player_priv.h b/src/include/mm_player_priv.h index 26cb28a..673d9ff 100644 --- a/src/include/mm_player_priv.h +++ b/src/include/mm_player_priv.h @@ -361,6 +361,13 @@ typedef enum { MMFILE_AMBISONIC_ORDER_TOA = 3, /**< Third order Ambisonics */ } mmfile_ambisonic_order_e; +typedef enum { + MMPLAYER_RESOURCE_TYPE_VIDEO_DECODER, + MMPLAYER_RESOURCE_TYPE_VIDEO_OVERLAY, + /* FIXME: need to add MMPLAYER_RESOURCE_TYPE_AUDIO_OFFLOAD */ + MMPLAYER_RESOURCE_TYPE_MAX, +} mmplayer_resource_type_e; + /*--------------------------------------------------------------------------- | GLOBAL DATA TYPE DEFINITIONS: | ---------------------------------------------------------------------------*/ @@ -710,8 +717,7 @@ typedef struct { /* resource manager for H/W resources */ mm_resource_manager_h resource_manager; - mm_resource_manager_res_h video_overlay_resource; - mm_resource_manager_res_h video_decoder_resource; + mm_resource_manager_res_h hw_resource[MMPLAYER_RESOURCE_TYPE_MAX]; gboolean interrupted_by_resource; gboolean is_subtitle_off; diff --git a/src/mm_player_priv.c b/src/mm_player_priv.c index 2f41371..952f8fa 100644 --- a/src/mm_player_priv.c +++ b/src/mm_player_priv.c @@ -188,7 +188,6 @@ static guint32 _mmplayer_convert_fourcc_string_to_value(const gchar *format_name static void __mmplayer_gst_caps_notify_cb(GstPad *pad, GParamSpec *unused, gpointer data); static void __mmplayer_audio_stream_send_data(mmplayer_t *player, mmplayer_audio_stream_buff_t *a_buffer); static void __mmplayer_initialize_storage_info(mmplayer_t *player, mmplayer_path_type_e path_type); -static int __resource_release_cb(mm_resource_manager_h rm, mm_resource_manager_res_h res, void *user_data); static gboolean __mmplayer_update_duration_value(mmplayer_t *player); static gboolean __mmplayer_update_audio_attrs(mmplayer_t *player, MMHandleType attrs); static gboolean __mmplayer_update_video_attrs(mmplayer_t *player, MMHandleType attrs); @@ -596,11 +595,80 @@ ALREADY_GOING: return MM_ERROR_PLAYER_NO_OP; } +static int __mmplayer_acquire_hw_resource(mmplayer_t *player, mmplayer_resource_type_e type) +{ + int rm_ret = MM_RESOURCE_MANAGER_ERROR_NONE; + mm_resource_manager_res_type_e rm_res_type = MM_RESOURCE_MANAGER_RES_TYPE_MAX; + + switch (type) { + case MMPLAYER_RESOURCE_TYPE_VIDEO_DECODER: + rm_res_type = MM_RESOURCE_MANAGER_RES_TYPE_VIDEO_DECODER; + break; + case MMPLAYER_RESOURCE_TYPE_VIDEO_OVERLAY: + rm_res_type = MM_RESOURCE_MANAGER_RES_TYPE_VIDEO_OVERLAY; + break; + default: + LOGE("invalid mmplayer resource type %d", type); + return MM_ERROR_PLAYER_INTERNAL; + } + + if (player->hw_resource[type] != NULL) { + LOGD("[%d type] resource was already acquired", type); + return MM_ERROR_NONE; + } + + LOGD("mark for acquire [%d type] resource", type); + rm_ret = mm_resource_manager_mark_for_acquire(player->resource_manager, + rm_res_type, MM_RESOURCE_MANAGER_RES_VOLUME_FULL, &player->hw_resource[type]); + if (rm_ret != MM_RESOURCE_MANAGER_ERROR_NONE) { + LOGE("failed to mark resource for acquire, ret(0x%x)", rm_ret); + return MM_ERROR_PLAYER_INTERNAL; + } + + rm_ret = mm_resource_manager_commit(player->resource_manager); + if (rm_ret != MM_RESOURCE_MANAGER_ERROR_NONE) { + LOGE("failed to commit of resource, ret(0x%x)", rm_ret); + return MM_ERROR_PLAYER_INTERNAL; + } + + MMPLAYER_FLEAVE(); + return MM_ERROR_NONE; +} + +static int __mmplayer_release_hw_resource(mmplayer_t *player, mmplayer_resource_type_e type) +{ + int rm_ret = MM_RESOURCE_MANAGER_ERROR_NONE; + + MMPLAYER_FENTER(); + + if (player->hw_resource[type] == NULL) { + LOGD("there is no acquired [%d type] resource", type); + return MM_ERROR_NONE; + } + + LOGD("mark for release [%d type] resource", type); + rm_ret = mm_resource_manager_mark_for_release(player->resource_manager, player->hw_resource[type]); + if (rm_ret != MM_RESOURCE_MANAGER_ERROR_NONE) { + LOGE("failed to mark resource for release, ret(0x%x)", rm_ret); + return MM_ERROR_PLAYER_INTERNAL; + } + + player->hw_resource[type] = NULL; + + rm_ret = mm_resource_manager_commit(player->resource_manager); + if (rm_ret != MM_RESOURCE_MANAGER_ERROR_NONE) { + LOGE("failed to commit of resource, ret(0x%x)", rm_ret); + return MM_ERROR_PLAYER_INTERNAL; + } + + MMPLAYER_FLEAVE(); + return MM_ERROR_NONE; +} + static void __mmplayer_initialize_gapless_play(mmplayer_t *player) { int i; - int rm_ret = MM_RESOURCE_MANAGER_ERROR_NONE; MMPLAYER_FENTER(); @@ -652,22 +720,7 @@ __mmplayer_initialize_gapless_play(mmplayer_t *player) player->audio_decoders = NULL; } - /* release video decoder resource */ - if (player->video_decoder_resource != NULL) { - rm_ret = mm_resource_manager_mark_for_release(player->resource_manager, - player->video_decoder_resource); - if (rm_ret != MM_RESOURCE_MANAGER_ERROR_NONE) { - LOGE("failed to mark the video decoder resource for release, ret(0x%x)", rm_ret); - return; - } - player->video_decoder_resource = NULL; - } - - rm_ret = mm_resource_manager_commit(player->resource_manager); - if (rm_ret != MM_RESOURCE_MANAGER_ERROR_NONE) { - LOGE("failed to commit of resource, ret(0x%x)", rm_ret); - return; - } + __mmplayer_release_hw_resource(player, MMPLAYER_RESOURCE_TYPE_VIDEO_DECODER); MMPLAYER_FLEAVE(); } @@ -1628,26 +1681,14 @@ __mmplayer_gst_create_sinkbin(GstElement *elem, GstPad *pad, gpointer data) mm_attrs_get_int_by_name(player->attrs, "display_surface_type", &surface_type); LOGD("display_surface_type (%d)", surface_type); - if (surface_type == MM_DISPLAY_SURFACE_OVERLAY && player->video_overlay_resource == NULL) { - LOGD("mark video overlay for acquire"); - if (mm_resource_manager_mark_for_acquire(player->resource_manager, - MM_RESOURCE_MANAGER_RES_TYPE_VIDEO_OVERLAY, - MM_RESOURCE_MANAGER_RES_VOLUME_FULL, - &player->video_overlay_resource) - != MM_RESOURCE_MANAGER_ERROR_NONE) { - LOGE("could not mark video_overlay resource for acquire"); - goto ERROR; - } + if ((surface_type == MM_DISPLAY_SURFACE_OVERLAY) && + (__mmplayer_acquire_hw_resource(player, MMPLAYER_RESOURCE_TYPE_VIDEO_OVERLAY) != MM_ERROR_NONE)) { + LOGE("failed to acquire video overlay resource"); + goto ERROR; } player->interrupted_by_resource = FALSE; - if (mm_resource_manager_commit(player->resource_manager) != - MM_RESOURCE_MANAGER_ERROR_NONE) { - LOGE("could not acquire resources for video playing"); - goto ERROR; - } - if (__mmplayer_gst_create_video_sink_bin(player, caps, surface_type) != MM_ERROR_NONE) { LOGE("failed to create videobin. continuing without video"); goto ERROR; @@ -2077,7 +2118,6 @@ _mmplayer_set_audio_only(MMHandleType hplayer, bool audio_only) { gboolean disable_overlay = FALSE; mmplayer_t *player = (mmplayer_t *)hplayer; - int ret = MM_ERROR_NONE; MMPLAYER_FENTER(); MMPLAYER_RETURN_VAL_IF_FAIL(player && player->pipeline, MM_ERROR_PLAYER_NOT_INITIALIZED); @@ -2102,41 +2142,16 @@ _mmplayer_set_audio_only(MMHandleType hplayer, bool audio_only) g_object_set(player->pipeline->videobin[MMPLAYER_V_SINK].gst, "disable-overlay", TRUE, NULL); /* release overlay resource */ - if (player->video_overlay_resource != NULL) { - ret = mm_resource_manager_mark_for_release(player->resource_manager, - player->video_overlay_resource); - if (ret != MM_RESOURCE_MANAGER_ERROR_NONE) { - LOGE("failed to mark overlay resource for release, ret(0x%x)", ret); - goto ERROR; - } - player->video_overlay_resource = NULL; - } - - ret = mm_resource_manager_commit(player->resource_manager); - if (ret != MM_RESOURCE_MANAGER_ERROR_NONE) { - LOGE("failed to commit acquiring of overlay resource, ret(0x%x)", ret); + if (__mmplayer_release_hw_resource(player, MMPLAYER_RESOURCE_TYPE_VIDEO_OVERLAY) != MM_ERROR_NONE) { + LOGE("failed to release overlay resource"); goto ERROR; } } else { - /* mark video overlay for acquire */ - if (player->video_overlay_resource == NULL) { - ret = mm_resource_manager_mark_for_acquire(player->resource_manager, - MM_RESOURCE_MANAGER_RES_TYPE_VIDEO_OVERLAY, - MM_RESOURCE_MANAGER_RES_VOLUME_FULL, - &player->video_overlay_resource); - if (ret != MM_RESOURCE_MANAGER_ERROR_NONE) { - LOGE("could not prepare for video_overlay resource"); - goto ERROR; - } - } - - player->interrupted_by_resource = FALSE; - /* acquire resources for video overlay */ - ret = mm_resource_manager_commit(player->resource_manager); - if (ret != MM_RESOURCE_MANAGER_ERROR_NONE) { - LOGE("could not acquire resources for video playing"); + if (__mmplayer_acquire_hw_resource(player, MMPLAYER_RESOURCE_TYPE_VIDEO_OVERLAY) != MM_ERROR_NONE) { + LOGE("failed to acquire video overlay resource"); goto ERROR; } + player->interrupted_by_resource = FALSE; LOGD("enable overlay"); __mmplayer_video_param_set_display_overlay(player); @@ -4547,7 +4562,7 @@ __mmplayer_can_do_interrupt(mmplayer_t *player) FAILED: /* with CMD UNLOCKED */ return FALSE; -INTERRUPT: /* with CMD LOCKED, released at mrp_resource_release_cb() */ +INTERRUPT: /* with CMD LOCKED, will do UNLOCK at __resource_release_cb() */ return TRUE; } @@ -4556,49 +4571,48 @@ __resource_release_cb(mm_resource_manager_h rm, mm_resource_manager_res_h res, void *user_data) { mmplayer_t *player = NULL; + MMMessageParamType msg = {0, }; + gint64 pos = 0; + mmplayer_resource_type_e res_idx = MMPLAYER_RESOURCE_TYPE_MAX; MMPLAYER_FENTER(); - if (user_data == NULL) { - LOGE("- user_data is null"); + if (!user_data) { + LOGE("user_data is null"); return FALSE; } player = (mmplayer_t *)user_data; - /* do something to release resource here. - * player stop and interrupt forwarding */ if (!__mmplayer_can_do_interrupt(player)) { LOGW("no need to interrupt, so leave"); + /* FIXME: there is no way to avoid releasing resource. */ + return FALSE; + } + + player->interrupted_by_resource = TRUE; + + /* get last play position */ + if (_mmplayer_gst_get_position(player, &pos) == MM_ERROR_NONE) { + msg.union_type = MM_MSG_UNION_TIME; + msg.time.elapsed = pos; + MMPLAYER_POST_MSG(player, MM_MESSAGE_PLAY_POSITION, &msg); } else { - MMMessageParamType msg = {0, }; - gint64 pos = 0; + LOGW("failed to get play position."); + } - player->interrupted_by_resource = TRUE; + LOGD("video resource conflict so, resource will be freed by unrealizing"); + if (_mmplayer_unrealize((MMHandleType)player) != MM_ERROR_NONE) + LOGE("failed to unrealize"); - /* get last play position */ - if (_mmplayer_gst_get_position(player, &pos) != MM_ERROR_NONE) { - LOGW("failed to get play position."); - } else { - msg.union_type = MM_MSG_UNION_TIME; - msg.time.elapsed = pos; - MMPLAYER_POST_MSG(player, MM_MESSAGE_PLAY_POSITION, &msg); - } - LOGD("video resource conflict so, resource will be freed by unrealizing"); - if (_mmplayer_unrealize((MMHandleType)player)) - LOGW("failed to unrealize"); + /* lock is called in __mmplayer_can_do_interrupt() */ + MMPLAYER_CMD_UNLOCK(player); - /* lock is called in __mmplayer_can_do_interrupt() */ - MMPLAYER_CMD_UNLOCK(player); + for (res_idx = MMPLAYER_RESOURCE_TYPE_VIDEO_DECODER; res_idx < MMPLAYER_RESOURCE_TYPE_MAX; res_idx++) { + player->hw_resource[res_idx] = NULL; } - if (res == player->video_overlay_resource) - player->video_overlay_resource = FALSE; - else - player->video_decoder_resource = FALSE; - MMPLAYER_FLEAVE(); - - return FALSE; + return TRUE; /* release all the resources */ } static void @@ -5140,36 +5154,13 @@ _mmplayer_unrealize(MMHandleType hplayer) /* unrealize pipeline */ ret = __mmplayer_gst_unrealize(player); - /* set asm stop if success */ - if (MM_ERROR_NONE == ret) { - if (!player->interrupted_by_resource) { - if (player->video_decoder_resource != NULL) { - ret = mm_resource_manager_mark_for_release(player->resource_manager, - player->video_decoder_resource); - if (ret != MM_RESOURCE_MANAGER_ERROR_NONE) - LOGE("failed to mark decoder resource for release, ret(0x%x)", ret); - else - player->video_decoder_resource = NULL; - } - - if (player->video_overlay_resource != NULL) { - ret = mm_resource_manager_mark_for_release(player->resource_manager, - player->video_overlay_resource); - if (ret != MM_RESOURCE_MANAGER_ERROR_NONE) - LOGE("failed to mark overlay resource for release, ret(0x%x)", ret); - else - player->video_overlay_resource = NULL; - } - - ret = mm_resource_manager_commit(player->resource_manager); - if (ret != MM_RESOURCE_MANAGER_ERROR_NONE) - LOGE("failed to commit resource releases, ret(0x%x)", ret); - } - } else - LOGE("failed and don't change asm state to stop"); + if (!player->interrupted_by_resource) { + if ((__mmplayer_release_hw_resource(player, MMPLAYER_RESOURCE_TYPE_VIDEO_DECODER) != MM_ERROR_NONE) || + (__mmplayer_release_hw_resource(player, MMPLAYER_RESOURCE_TYPE_VIDEO_OVERLAY) != MM_ERROR_NONE)) + LOGE("failed to release video resources"); + } MMPLAYER_FLEAVE(); - return ret; } @@ -7097,30 +7088,18 @@ __mmplayer_check_codec_info(mmplayer_t *player, const char *klass, GstCaps *caps (g_strrstr(factory_name, player->ini.videocodec_element_hw))) { /* mark video decoder for acquire */ - if (player->video_decoder_resource == NULL) { - if (mm_resource_manager_mark_for_acquire(player->resource_manager, - MM_RESOURCE_MANAGER_RES_TYPE_VIDEO_DECODER, - MM_RESOURCE_MANAGER_RES_VOLUME_FULL, - &player->video_decoder_resource) - != MM_RESOURCE_MANAGER_ERROR_NONE) { - LOGE("could not mark video_decoder resource for acquire"); - ret = GST_AUTOPLUG_SELECT_SKIP; - goto DONE; - } - } else { + if (player->hw_resource[MMPLAYER_RESOURCE_TYPE_VIDEO_DECODER] != NULL) { LOGW("video decoder resource is already acquired, skip it."); ret = GST_AUTOPLUG_SELECT_SKIP; goto DONE; } - player->interrupted_by_resource = FALSE; - /* acquire resources for video playing */ - if (mm_resource_manager_commit(player->resource_manager) - != MM_RESOURCE_MANAGER_ERROR_NONE) { - LOGE("could not acquire resources for video decoding"); + if (__mmplayer_acquire_hw_resource(player, MMPLAYER_RESOURCE_TYPE_VIDEO_DECODER) != MM_ERROR_NONE) { + LOGE("failed to acquire video decoder resource"); ret = GST_AUTOPLUG_SELECT_SKIP; goto DONE; } + player->interrupted_by_resource = FALSE; } /* update codec info */ -- 2.7.4