[0.6.188] refactoring the resource managing code 32/205232/1 accepted/tizen/unified/20190508.111053 submit/tizen/20190507.041044 submit/tizen/20190507.081944
authorEunhye Choi <eunhae1.choi@samsung.com>
Tue, 30 Apr 2019 11:27:19 +0000 (20:27 +0900)
committerEunhye Choi <eunhae1.choi@samsung.com>
Tue, 30 Apr 2019 11:27:22 +0000 (20:27 +0900)
- refactoring the resource managing code
- release all the resources in case of resource conflict

Change-Id: I2079dc476c1a986532d0c4d8cbf16395fc3b5216

packaging/libmm-player.spec
src/include/mm_player_priv.h
src/mm_player_priv.c

index dba7a4e..426cda7 100644 (file)
@@ -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
index 26cb28a..673d9ff 100644 (file)
@@ -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;
index 2f41371..952f8fa 100644 (file)
@@ -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 */