X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fmm_player_priv.c;h=6b19906a6b7585bb4f6c1b9f8f2964c6a4564797;hb=refs%2Fchanges%2F69%2F243769%2F3;hp=a15b493879e5d5e3bff2af7c1dd7d5f239cc8337;hpb=fb4ccd152b91377ac03a0cbd9e2bb644f766c046;p=platform%2Fcore%2Fmultimedia%2Flibmm-player.git diff --git a/src/mm_player_priv.c b/src/mm_player_priv.c index a15b493..6b19906 100644 --- a/src/mm_player_priv.c +++ b/src/mm_player_priv.c @@ -83,7 +83,7 @@ #define MM_VOLUME_FACTOR_MAX 1.0 /* Don't need to sleep for sound fadeout - * fadeout related fucntion will be deleted(Deprecated) + * fadeout related function will be deleted(Deprecated) */ #define MM_PLAYER_FADEOUT_TIME_DEFAULT 0 @@ -157,7 +157,7 @@ static int __mmplayer_change_selector_pad(mmplayer_t *player, mmplayer_track_typ static gboolean __mmplayer_check_subtitle(mmplayer_t *player); static int __mmplayer_handle_missed_plugin(mmplayer_t *player); static int __mmplayer_check_not_supported_codec(mmplayer_t *player, const gchar *factory_class, const gchar *mime); -static void __mmplayer_add_sink(mmplayer_t *player, GstElement *sink); +static void __mmplayer_add_sink(mmplayer_t *player, GstElement *sink, gboolean first); static void __mmplayer_del_sink(mmplayer_t *player, GstElement *sink); static void __mmplayer_release_signal_connection(mmplayer_t *player, mmplayer_signal_type_e type); static gpointer __mmplayer_gapless_play_thread(gpointer data); @@ -310,7 +310,7 @@ _mmplayer_get_stream_service_type(mmplayer_t *player) } /* this function sets the player state and also report - * it to applicaton by calling callback function + * it to application by calling callback function */ void _mmplayer_set_state(mmplayer_t *player, int state) @@ -390,7 +390,7 @@ _mmplayer_check_state(mmplayer_t *player, mmplayer_command_state_e command) MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED); #ifdef __DEBUG__ - LOGD("incomming command : %d ", command); + LOGD("incoming command : %d ", command); #endif current_state = MMPLAYER_CURRENT_STATE(player); pending_state = MMPLAYER_PENDING_STATE(player); @@ -491,7 +491,7 @@ _mmplayer_check_state(mmplayer_t *player, mmplayer_command_state_e command) if (pending_state == MM_PLAYER_STATE_NONE) { if (current_state == MM_PLAYER_STATE_PAUSED) goto NO_OP; - else if (current_state != MM_PLAYER_STATE_PLAYING && current_state != MM_PLAYER_STATE_READY) // support loading state of broswer + else if (current_state != MM_PLAYER_STATE_PLAYING && current_state != MM_PLAYER_STATE_READY) // support loading state of browser goto INVALID_STATE; } else if (pending_state == MM_PLAYER_STATE_PAUSED) { goto ALREADY_GOING; @@ -584,6 +584,7 @@ int _mmplayer_acquire_hw_resource(mmplayer_t *player, mmplayer_resource_type_e t return MM_ERROR_PLAYER_INTERNAL; } + LOGD("commit [%d type] resource", type); 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); @@ -594,6 +595,36 @@ int _mmplayer_acquire_hw_resource(mmplayer_t *player, mmplayer_resource_type_e t return MM_ERROR_NONE; } +static void __mmplayer_destroy_hw_resource(mmplayer_t *player) +{ + int rm_ret = MM_RESOURCE_MANAGER_ERROR_NONE; + + MMPLAYER_RETURN_IF_FAIL(player); + MMPLAYER_RETURN_IF_FAIL(player->resource_manager); + + rm_ret = mm_resource_manager_mark_all_for_release(player->resource_manager); + if (rm_ret != MM_RESOURCE_MANAGER_ERROR_NONE) { + LOGW("failed to mark all for release of resource, ret(0x%x)", rm_ret); + goto rm_destroy; + } + + rm_ret = mm_resource_manager_commit(player->resource_manager); + if (rm_ret != MM_RESOURCE_MANAGER_ERROR_NONE) + LOGW("failed to commit resource, ret(0x%x)", rm_ret); + +rm_destroy: + /* de-initialize resource manager */ + rm_ret = mm_resource_manager_destroy(player->resource_manager); + if (rm_ret != MM_RESOURCE_MANAGER_ERROR_NONE) { + LOGW("failed to destroy resource manager, ret(0x%x)", rm_ret); + return; + } + + player->resource_manager = NULL; + + LOGD("resource manager is destroyed"); +} + static int __mmplayer_release_hw_resource(mmplayer_t *player, mmplayer_resource_type_e type) { int rm_ret = MM_RESOURCE_MANAGER_ERROR_NONE; @@ -614,9 +645,10 @@ static int __mmplayer_release_hw_resource(mmplayer_t *player, mmplayer_resource_ player->hw_resource[type] = NULL; + LOGD("commit [%d type] resource", type); 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); + LOGE("failed to commit resource, ret(0x%x)", rm_ret); return MM_ERROR_PLAYER_INTERNAL; } @@ -842,7 +874,7 @@ _mmplayer_gst_remove_fakesink(mmplayer_t *player, mmplayer_gst_element_t *fakesi gst_element_set_locked_state(fakesink->gst, TRUE); /* setting the state to NULL never returns async - * so no need to wait for completion of state transiton + * so no need to wait for completion of state transition */ if (GST_STATE_CHANGE_FAILURE == gst_element_set_state(fakesink->gst, GST_STATE_NULL)) LOGE("fakesink state change failure!"); @@ -1090,7 +1122,7 @@ ERROR: return ret; } -/* create fakesink for audio or video path witout audiobin or videobin */ +/* create fakesink for audio or video path without audiobin or videobin */ static void __mmplayer_gst_make_fakesink(mmplayer_t *player, GstPad *pad, const gchar *name) { @@ -1111,7 +1143,7 @@ __mmplayer_gst_make_fakesink(mmplayer_t *player, GstPad *pad, const gchar *name) } /* store it as it's sink element */ - __mmplayer_add_sink(player, fakesink); + __mmplayer_add_sink(player, fakesink, FALSE); gst_bin_add(GST_BIN(pipeline), fakesink); @@ -1356,10 +1388,16 @@ _mmplayer_gst_decode_pad_added(GstElement *elem, GstPad *pad, gpointer data) } } - if (MMPLAYER_USE_DECODEBIN(player)) + if (MMPLAYER_USE_DECODEBIN(player)) { _mmplayer_track_update_stream(player, stream_type, sinkpad); - else + } else { + /* apply the text track information */ + if (stream_type == MM_PLAYER_TRACK_TYPE_TEXT) + mm_player_set_attribute((MMHandleType)player, NULL, + "content_text_track_num", player->track[stream_type].total_track_num, + "current_text_track_index", player->track[stream_type].active_track_index, NULL); __mmplayer_create_sink_path(player, combiner, stream_type, caps); + } DONE: ERROR: @@ -1490,7 +1528,7 @@ __mmplayer_create_text_sink_path(mmplayer_t *player, GstElement *text_selector) MMPLAYER_RETURN_VAL_IF_FAIL(player && text_selector, FALSE); if (MMPLAYER_IS_MS_BUFF_SRC(player)) { - LOGD("text path is not supproted"); + LOGD("text path is not supported"); return TRUE; } @@ -1682,7 +1720,8 @@ __mmplayer_gst_create_sink_bin(GstElement *elem, GstPad *pad, GstCaps *ref_caps, MMPLAYER_GST_GET_CAPS_INFO(ref_caps, str, name, caps_ret); if (!caps_ret) goto ERROR; - + if (caps) + gst_caps_unref(caps); caps = gst_caps_ref(ref_caps); } @@ -1760,7 +1799,7 @@ __mmplayer_gst_create_sink_bin(GstElement *elem, GstPad *pad, GstCaps *ref_caps, player->textsink_linked = 1; } else { /* linked textbin exist which means that the external subtitle path exist already */ - LOGW("ignoring internal subtutle since external subtitle is available"); + LOGW("ignoring internal subtitle since external subtitle is available"); } } sink_pad_name = "text_sink"; @@ -1826,7 +1865,7 @@ __mmplayer_get_property_value_for_rotation(mmplayer_t *player, int display_angle if (rotation_angle >= 360) rotation_angle -= 360; - /* chech if supported or not */ + /* check if supported or not */ if (rotation_angle % 90) { LOGD("not supported rotation angle = %d", rotation_angle); return FALSE; @@ -1865,7 +1904,7 @@ _mmplayer_get_video_angle(mmplayer_t *player, int *display_angle, int *orientati } if (display_angle) { - /* update user roation */ + /* update user rotation */ mm_attrs_get_int_by_name(attrs, "display_rotation", &display_rotation); /* Counter clockwise */ @@ -2271,10 +2310,6 @@ __mmplayer_gst_caps_notify_cb(GstPad *pad, GParamSpec *unused, gpointer data) MMPLAYER_RETURN_IF_FAIL(unused); MMPLAYER_RETURN_IF_FAIL(data); - caps = gst_pad_get_current_caps(pad); - if (!caps) - return; - MMPLAYER_GST_GET_CAPS_INFO_FROM_PAD(pad, caps, str, name, caps_ret); if (!caps_ret) goto ERROR; @@ -2523,7 +2558,7 @@ __mmplayer_gst_audio_deinterleave_pad_added(GstElement *elem, GstPad *pad, gpoin G_CALLBACK(__mmplayer_audio_stream_decoded_render_cb), (gpointer)player); - __mmplayer_add_sink(player, sink); + __mmplayer_add_sink(player, sink, FALSE); if (gst_element_sync_state_with_parent(queue) == GST_STATE_CHANGE_FAILURE) { LOGE("failed to sync state"); @@ -2827,7 +2862,7 @@ __mmplayer_gst_make_audio_playback_sink(mmplayer_t *player, GList **bucket) "notify::caps", G_CALLBACK(__mmplayer_gst_caps_notify_cb), (gpointer)player); gst_object_unref(GST_OBJECT(sink_pad)); - __mmplayer_add_sink(player, audiobin[MMPLAYER_A_SINK].gst); + __mmplayer_add_sink(player, audiobin[MMPLAYER_A_SINK].gst, FALSE); MMPLAYER_FLEAVE(); return MM_ERROR_NONE; @@ -2983,7 +3018,7 @@ __mmplayer_gst_make_audio_extract_sink(mmplayer_t *player, GList **bucket) G_CALLBACK(__mmplayer_audio_stream_decoded_render_cb), (gpointer)player); - __mmplayer_add_sink(player, audiobin[extract_sink_id].gst); + __mmplayer_add_sink(player, audiobin[extract_sink_id].gst, FALSE); } MMPLAYER_FLEAVE(); @@ -3014,7 +3049,7 @@ __mmplayer_gst_make_audio_bin_element(mmplayer_t *player, GList **bucket) g_object_set(G_OBJECT(audiobin[MMPLAYER_A_SINK].gst), "sync", TRUE, "volume", player->sound.volume, "mute", player->sound.mute, NULL); - __mmplayer_add_sink(player, audiobin[MMPLAYER_A_SINK].gst); + __mmplayer_add_sink(player, audiobin[MMPLAYER_A_SINK].gst, FALSE); goto DONE; } @@ -3145,7 +3180,7 @@ ERROR: } } - /* release audiobin with it's childs */ + /* release audiobin with it's children */ if (audiobin[MMPLAYER_A_BIN].gst) gst_object_unref(GST_OBJECT(audiobin[MMPLAYER_A_BIN].gst)); @@ -3353,7 +3388,7 @@ __mmplayer_video_stream_decoded_render_cb(GstElement *object, GstBuffer *buffer, /* set size and timestamp */ mem = gst_buffer_peek_memory(buffer, 0); stream->length_total = gst_memory_get_sizes(mem, NULL, NULL); - stream->timestamp = (unsigned int)(GST_TIME_AS_MSECONDS(GST_BUFFER_PTS(buffer))); /* nano sec -> mili sec */ + stream->timestamp = (unsigned int)(GST_TIME_AS_MSECONDS(GST_BUFFER_PTS(buffer))); /* nano sec -> milli sec */ /* check zero-copy */ if (player->set_mode.video_zc && @@ -3646,7 +3681,7 @@ __mmplayer_gst_create_video_sink_bin(mmplayer_t *player, GstCaps *caps, MMDispla } /* store it as it's sink element */ - __mmplayer_add_sink(player, videobin[MMPLAYER_V_SINK].gst); + __mmplayer_add_sink(player, videobin[MMPLAYER_V_SINK].gst, TRUE); /* adding created elements to bin */ if (!_mmplayer_gst_element_add_bucket_to_bin(GST_BIN(videobin[MMPLAYER_V_BIN].gst), element_bucket)) { @@ -3695,7 +3730,7 @@ ERROR: if (pad) gst_object_unref(GST_OBJECT(pad)); - /* release videobin with it's childs */ + /* release videobin with it's children */ if (videobin[MMPLAYER_V_BIN].gst) gst_object_unref(GST_OBJECT(videobin[MMPLAYER_V_BIN].gst)); @@ -3730,7 +3765,7 @@ __mmplayer_gst_create_plain_text_elements(mmplayer_t *player) if (!player->play_subtitle) { LOGD("add textbin sink as sink element of whole pipeline."); - __mmplayer_add_sink(player, GST_ELEMENT(textbin[MMPLAYER_T_FAKE_SINK].gst)); + __mmplayer_add_sink(player, GST_ELEMENT(textbin[MMPLAYER_T_FAKE_SINK].gst), FALSE); } /* adding created elements to bin */ @@ -3869,7 +3904,7 @@ ERROR: } } - /* release textbin with it's childs */ + /* release textbin with it's children */ if (textbin[MMPLAYER_T_BIN].gst) gst_object_unref(GST_OBJECT(textbin[MMPLAYER_T_BIN].gst)); @@ -3991,7 +4026,7 @@ __mmplayer_gst_create_text_pipeline(mmplayer_t *player) /* release signal */ __mmplayer_release_signal_connection(player, MM_PLAYER_SIGNAL_TYPE_TEXTBIN); - /* release textbin with it's childs */ + /* release textbin with it's children */ gst_object_unref(GST_OBJECT(textbin[MMPLAYER_T_BIN].gst)); MMPLAYER_FREEIF(player->pipeline->textbin); player->pipeline->textbin = textbin = NULL; @@ -4042,7 +4077,7 @@ ERROR: if (player->pipeline->textbin) { LOGE("remove textbin"); - /* release textbin with it's childs */ + /* release textbin with it's children */ MMPLAYER_RELEASE_ELEMENT(player, player->pipeline->textbin, MMPLAYER_T_BIN); MMPLAYER_FREEIF(player->pipeline->textbin); player->pipeline->textbin = NULL; @@ -4167,7 +4202,7 @@ __mmplayer_gst_adjust_subtitle_position(mmplayer_t *player, int position) return MM_ERROR_NONE; } - /* check current postion */ + /* check current position */ player->adjust_subtitle_pos = position; LOGD("save adjust_subtitle_pos in player"); @@ -4242,7 +4277,7 @@ __mmplayer_gst_create_pipeline(mmplayer_t *player) goto INIT_ERROR; } - /* Note : check whether subtitle atrribute uri is set. If uri is set, then try to play subtitle file */ + /* Note : check whether subtitle attribute uri is set. If uri is set, then try to play subtitle file */ if (__mmplayer_check_subtitle(player) && (__mmplayer_gst_create_text_pipeline(player) != MM_ERROR_NONE)) LOGE("failed to create text pipeline"); @@ -4346,10 +4381,6 @@ __mmplayer_gst_destroy_pipeline(mmplayer_t *player) if (mainbin[MMPLAYER_M_SRC_FAKESINK].gst) gst_object_unref(GST_OBJECT(mainbin[MMPLAYER_M_SRC_FAKESINK].gst)); - /* free avsysaudiosink - avsysaudiosink should be unref when destory pipeline just after start play with BT. - Because audiosink is created but never added to bin, and therefore it will not be unref when pipeline is destroyed. - */ MMPLAYER_FREEIF(audiobin); MMPLAYER_FREEIF(videobin); MMPLAYER_FREEIF(textbin); @@ -4363,6 +4394,11 @@ __mmplayer_gst_destroy_pipeline(mmplayer_t *player) } MMPLAYER_FREEIF(player->album_art); + if (player->type_caps) { + gst_caps_unref(player->type_caps); + player->type_caps = NULL; + } + if (player->v_stream_caps) { gst_caps_unref(player->v_stream_caps); player->v_stream_caps = NULL; @@ -4453,7 +4489,7 @@ __mmplayer_gst_unrealize(mmplayer_t *player) /* destroy pipeline */ ret = __mmplayer_gst_destroy_pipeline(player); if (ret != MM_ERROR_NONE) { - LOGE("failed to destory pipeline"); + LOGE("failed to destroy pipeline"); return ret; } @@ -4537,55 +4573,6 @@ _mmplayer_parse_profile(const char *uri, void *param, mmplayer_parse_profile_t * return ret; } -static gboolean -__mmplayer_can_do_interrupt(mmplayer_t *player) -{ - if (!player || !player->pipeline || !player->attrs) { - LOGW("not initialized"); - goto FAILED; - } - - if (player->audio_decoded_cb) { - LOGW("not support in pcm extraction mode"); - goto FAILED; - } - - /* check if seeking */ - if (player->seek_state != MMPLAYER_SEEK_NONE) { - MMMessageParamType msg_param; - memset(&msg_param, 0, sizeof(MMMessageParamType)); - msg_param.code = MM_ERROR_PLAYER_SEEK; - player->seek_state = MMPLAYER_SEEK_NONE; - MMPLAYER_POST_MSG(player, MM_MESSAGE_ERROR, &msg_param); - goto FAILED; - } - - /* check other thread */ - if (!MMPLAYER_CMD_TRYLOCK(player)) { - LOGW("locked already, cmd state : %d", player->cmd); - - /* check application command */ - if (player->cmd == MMPLAYER_COMMAND_START || player->cmd == MMPLAYER_COMMAND_RESUME) { - LOGW("playing.. should wait cmd lock then, will be interrupted"); - - /* lock will be released at mrp_resource_release_cb() */ - MMPLAYER_CMD_LOCK(player); - goto INTERRUPT; - } - LOGW("nothing to do"); - goto FAILED; - } else { - LOGW("can interrupt immediately"); - goto INTERRUPT; - } - -FAILED: /* with CMD UNLOCKED */ - return FALSE; - -INTERRUPT: /* with CMD LOCKED, will do UNLOCK at __resource_release_cb() */ - return TRUE; -} - static int __resource_release_cb(mm_resource_manager_h rm, mm_resource_manager_res_h res, void *user_data) @@ -4599,14 +4586,25 @@ __resource_release_cb(mm_resource_manager_h rm, mm_resource_manager_res_h res, if (!user_data) { LOGE("user_data is null"); - return FALSE; + return TRUE; } + player = (mmplayer_t *)user_data; - if (!__mmplayer_can_do_interrupt(player)) { - LOGW("no need to interrupt, so leave"); - /* FIXME: there is no way to avoid releasing resource. */ - return FALSE; + if (!player->pipeline || !player->attrs) { + LOGW("not initialized"); + return TRUE; + } + + LOGD("cmd lock player, cmd state : %d", player->cmd); + MMPLAYER_CMD_LOCK(player); + LOGD("cmd locked player"); + + if (MMPLAYER_CURRENT_STATE(player) == MM_PLAYER_STATE_NULL + || MMPLAYER_CURRENT_STATE(player) == MM_PLAYER_STATE_NONE) { + LOGW("player already destroyed"); + MMPLAYER_CMD_UNLOCK(player); + return TRUE; } player->interrupted_by_resource = TRUE; @@ -4624,7 +4622,6 @@ __resource_release_cb(mm_resource_manager_h rm, mm_resource_manager_res_h res, if (_mmplayer_unrealize((MMHandleType)player) != MM_ERROR_NONE) LOGE("failed to unrealize"); - /* 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++) { @@ -4720,7 +4717,7 @@ _mmplayer_create_player(MMHandleType handle) if (mm_resource_manager_create(MM_RESOURCE_MANAGER_APP_CLASS_MEDIA, __resource_release_cb, player, &player->resource_manager) != MM_RESOURCE_MANAGER_ERROR_NONE) { - LOGE("failed to initialize resource manager"); + LOGE("failed to create resource manager"); ret = MM_ERROR_PLAYER_INTERNAL; goto ERROR; } @@ -4987,7 +4984,7 @@ _mmplayer_destroy(MMHandleType handle) MMPLAYER_GAPLESS_PLAY_THREAD_SIGNAL(player); MMPLAYER_GAPLESS_PLAY_THREAD_UNLOCK(player); - LOGD("waitting for gapless play thread exit"); + LOGD("waiting for gapless play thread exit"); g_thread_join(player->gapless_play_thread); g_mutex_clear(&player->gapless_play_thread_mutex); g_cond_clear(&player->gapless_play_thread_cond); @@ -4996,20 +4993,17 @@ _mmplayer_destroy(MMHandleType handle) _mmplayer_release_video_capture(player); - /* de-initialize resource manager */ - if (MM_RESOURCE_MANAGER_ERROR_NONE != mm_resource_manager_destroy( - player->resource_manager)) - LOGE("failed to deinitialize resource manager"); - /* release miscellaneous information */ __mmplayer_release_misc(player); /* release pipeline */ - if (MM_ERROR_NONE != __mmplayer_gst_destroy_pipeline(player)) { - LOGE("failed to destory pipeline"); + if (__mmplayer_gst_destroy_pipeline(player) != MM_ERROR_NONE) { + LOGE("failed to destroy pipeline"); return MM_ERROR_PLAYER_INTERNAL; } + __mmplayer_destroy_hw_resource(player); + g_queue_free(player->bus_msg_q); /* release subtitle info lock and cond */ @@ -5153,6 +5147,8 @@ _mmplayer_unrealize(MMHandleType hplayer) { mmplayer_t *player = (mmplayer_t *)hplayer; int ret = MM_ERROR_NONE; + int rm_ret = MM_ERROR_NONE; + mmplayer_resource_type_e res_idx = MMPLAYER_RESOURCE_TYPE_MAX; MMPLAYER_FENTER(); @@ -5174,17 +5170,14 @@ _mmplayer_unrealize(MMHandleType hplayer) /* unrealize pipeline */ ret = __mmplayer_gst_unrealize(player); - if (!player->interrupted_by_resource) { - int rm_ret = MM_ERROR_NONE; - mmplayer_resource_type_e res_idx = MMPLAYER_RESOURCE_TYPE_MAX; - - for (res_idx = MMPLAYER_RESOURCE_TYPE_VIDEO_DECODER; res_idx < MMPLAYER_RESOURCE_TYPE_MAX; res_idx++) { - rm_ret = __mmplayer_release_hw_resource(player, res_idx); - if (rm_ret != MM_ERROR_NONE) - LOGE("failed to release [%d] resources", res_idx); - } + for (res_idx = MMPLAYER_RESOURCE_TYPE_VIDEO_DECODER; res_idx < MMPLAYER_RESOURCE_TYPE_MAX; res_idx++) { + rm_ret = __mmplayer_release_hw_resource(player, res_idx); + if (rm_ret != MM_ERROR_NONE) + LOGE("failed to release [%d] resources", res_idx); } + player->interrupted_by_resource = FALSE; + MMPLAYER_FLEAVE(); return ret; } @@ -5592,14 +5585,14 @@ _mmplayer_pause(MMHandleType hplayer) /* check current state */ MMPLAYER_CHECK_STATE(player, MMPLAYER_COMMAND_PAUSE); - /* check pipline reconfigure state */ + /* check pipeline reconfigure state */ __mmplayer_check_pipeline_reconfigure_state(player); switch (MMPLAYER_CURRENT_STATE(player)) { case MM_PLAYER_STATE_READY: { /* check prepare async or not. - * In the case of streaming playback, it's recommned to avoid blocking wait. + * In the case of streaming playback, it's recommended to avoid blocking wait. */ mm_attrs_get_int_by_name(player->attrs, "profile_prepare_async", &async); LOGD("prepare working mode : %s", (async ? "async" : "sync")); @@ -5642,9 +5635,11 @@ _mmplayer_pause(MMHandleType hplayer) /* pause pipeline */ ret = _mmplayer_gst_pause(player, async); - - if (ret != MM_ERROR_NONE) + if (ret != MM_ERROR_NONE) { LOGE("failed to pause player. ret : 0x%x", ret); + MMPLAYER_GENERATE_DOT_IF_ENABLED(player, "pipeline-pause-err"); + return ret; + } if (MMPLAYER_PREV_STATE(player) == MM_PLAYER_STATE_READY && MMPLAYER_CURRENT_STATE(player) == MM_PLAYER_STATE_PAUSED) { if (_mmplayer_update_video_overlay_param(player, "display_rotation") != MM_ERROR_NONE) @@ -5652,8 +5647,7 @@ _mmplayer_pause(MMHandleType hplayer) } MMPLAYER_FLEAVE(); - - return ret; + return MM_ERROR_NONE; } /* in case of streaming, pause could take long time.*/ @@ -5800,7 +5794,7 @@ _mmplayer_set_position(MMHandleType hplayer, gint64 position) MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED); - /* check pipline reconfigure state */ + /* check pipeline reconfigure state */ __mmplayer_check_pipeline_reconfigure_state(player); ret = _mmplayer_gst_set_position(player, position, FALSE); @@ -5840,7 +5834,7 @@ _mmplayer_get_buffer_position(MMHandleType hplayer, int *start_pos, int *end_pos } int -_mmplayer_adjust_subtitle_postion(MMHandleType hplayer, int position) +_mmplayer_adjust_subtitle_position(MMHandleType hplayer, int position) { mmplayer_t *player = (mmplayer_t *)hplayer; int ret = MM_ERROR_NONE; @@ -5959,6 +5953,14 @@ _mmplayer_typefind_have_type(GstElement *tf, guint probability, MMPLAYER_RETURN_IF_FAIL(player && tf && caps); /* store type string */ + if (player->type_caps) { + gst_caps_unref(player->type_caps); + player->type_caps = NULL; + } + + player->type_caps = gst_caps_copy(caps); + MMPLAYER_LOG_GST_CAPS_TYPE(player->type_caps); + MMPLAYER_FREEIF(player->type); player->type = gst_caps_to_string(caps); if (player->type) @@ -6514,6 +6516,11 @@ __mmplayer_remove_sinkpad (const GValue *item, gpointer user_data) { GstPad *sinkpad = g_value_get_object (item); GstElement *element = GST_ELEMENT(user_data); + if (!sinkpad || !element) { + LOGE("invalid parameter"); + return; + } + LOGD("(%s)element release request pad(%s)", GST_ELEMENT_NAME(element), GST_PAD_NAME(sinkpad)); gst_element_release_request_pad(element, GST_PAD(sinkpad)); } @@ -6777,9 +6784,9 @@ _mmplayer_set_next_uri(MMHandleType hplayer, const char *uri, bool is_first_path player->uri_info.uri_list = g_list_append(player->uri_info.uri_list, g_strdup(uri)); SECURE_LOGD("add original path : %s", uri); } else { - player->uri_info.uri_list = g_list_delete_link(player->uri_info.uri_list, g_list_nth(player->uri_info.uri_list, 0)); - player->uri_info.uri_list = g_list_insert(player->uri_info.uri_list, g_strdup(uri), 0); - + g_free(g_list_nth_data(player->uri_info.uri_list, 0)); + player->uri_info.uri_list = g_list_prepend( + g_list_delete_link(player->uri_info.uri_list, player->uri_info.uri_list), g_strdup(uri)); SECURE_LOGD("change original path : %s", uri); } } else { @@ -7352,7 +7359,7 @@ _mmplayer_gst_decode_autoplug_select(GstElement *bin, GstPad *pad, /* filtering exclude keyword */ for (idx = 0; player->ini.exclude_element_keyword[idx][0] != '\0'; idx++) { if (strstr(factory_name, player->ini.exclude_element_keyword[idx])) { - LOGW("skipping [%s] by exculde keyword [%s]", + LOGW("skipping [%s] by exclude keyword [%s]", factory_name, player->ini.exclude_element_keyword[idx]); result = GST_AUTOPLUG_SELECT_SKIP; @@ -7759,7 +7766,7 @@ __mmplayer_release_misc(mmplayer_t *player) static void __mmplayer_release_misc_post(mmplayer_t *player) { - char *original_uri = NULL; + gchar *original_uri = NULL; MMPLAYER_FENTER(); /* player->pipeline is already released before. */ @@ -7796,7 +7803,7 @@ __mmplayer_release_misc_post(mmplayer_t *player) mm_player_set_attribute((MMHandleType)player, NULL, "profile_uri", original_uri, (original_uri) ? strlen(original_uri) : (0), NULL); - + MMPLAYER_FREEIF(original_uri); } /* clear the audio stream buffer list */ @@ -7859,14 +7866,17 @@ _mmplayer_cancel_eos_timer(mmplayer_t *player) } static void -__mmplayer_add_sink(mmplayer_t *player, GstElement *sink) +__mmplayer_add_sink(mmplayer_t *player, GstElement *sink, gboolean first) { MMPLAYER_FENTER(); MMPLAYER_RETURN_IF_FAIL(player); MMPLAYER_RETURN_IF_FAIL(sink); - player->sink_elements = g_list_append(player->sink_elements, sink); + if (first) + player->sink_elements = g_list_prepend(player->sink_elements, sink); + else + player->sink_elements = g_list_append(player->sink_elements, sink); MMPLAYER_FLEAVE(); } @@ -8133,7 +8143,7 @@ ERROR: /* release signal */ __mmplayer_release_signal_connection(player, MM_PLAYER_SIGNAL_TYPE_TEXTBIN); - /* release textbin with it's childs */ + /* release textbin with it's children */ MMPLAYER_RELEASE_ELEMENT(player, player->pipeline->textbin, MMPLAYER_T_BIN); MMPLAYER_FREEIF(player->pipeline->textbin); player->pipeline->textbin = NULL; @@ -8491,7 +8501,7 @@ _mmplayer_change_track_language(MMHandleType hplayer, mmplayer_track_type_e type current_state = GST_STATE(mainbin[MMPLAYER_M_PIPE].gst); if (current_state < GST_STATE_PAUSED) { result = MM_ERROR_PLAYER_INVALID_STATE; - LOGW("Pipeline not in porper state"); + LOGW("Pipeline not in proper state"); goto EXIT; } @@ -8724,7 +8734,7 @@ _mmplayer_manage_external_storage_state(MMHandleType hplayer, int id, int state) if (state != STORAGE_STATE_UNMOUNTABLE && state != STORAGE_STATE_REMOVED) return MM_ERROR_NONE; - /* FIXME: text path should be handled seperately. */ + /* FIXME: text path should be handled separately. */ if (((player->storage_info[MMPLAYER_PATH_VOD].type == STORAGE_TYPE_EXTERNAL) && (player->storage_info[MMPLAYER_PATH_VOD].id == id)) || ((player->storage_info[MMPLAYER_PATH_TEXT].type == STORAGE_TYPE_EXTERNAL) @@ -9270,7 +9280,7 @@ __mmplayer_update_video_attrs(mmplayer_t *player, MMHandleType attrs) } if (!caps_v) { - LOGD("no negitiated caps from videosink"); + LOGD("no negotiated caps from videosink"); gst_object_unref(pad); return FALSE; } @@ -9306,7 +9316,7 @@ __mmplayer_update_bitrate_attrs(mmplayer_t *player, MMHandleType attrs) gchar *path = NULL; struct stat sb; - /* FIXIT : please make it clear the dependancy with duration/codec/uritype */ + /* FIXIT : please make it clear the dependency with duration/codec/uritype */ if (!player->duration) return FALSE; @@ -9700,7 +9710,7 @@ __mmplayer_set_playing_state(mmplayer_t *player) /* try to get content metadata */ /* NOTE : giving ATTR_MISSING_ONLY may have dependency with - * c-api since c-api doesn't use _start() anymore. It may not work propery with + * c-api since c-api doesn't use _start() anymore. It may not work properly with * legacy mmfw-player api */ _mmplayer_update_content_attrs(player, ATTR_MISSING_ONLY);