X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fmm_player_priv.c;h=b936df471fcbb49bec2875b12819b451f5fc8985;hb=6fa740f1deab4de11bd8cbee1a0fb7f931e14c54;hp=42743aeff5237c23594432d7e99cdc3bb35e0fe3;hpb=0b04788f3c6f510db475504f324f92fa85f16e55;p=platform%2Fcore%2Fmultimedia%2Flibmm-player.git diff --git a/src/mm_player_priv.c b/src/mm_player_priv.c index 42743ae..b936df4 100644 --- a/src/mm_player_priv.c +++ b/src/mm_player_priv.c @@ -1449,6 +1449,7 @@ ERROR: sinkpad = NULL; } + MMPLAYER_GENERATE_DOT_IF_ENABLED(player, "pipeline-pad-added"); return; } @@ -2269,6 +2270,8 @@ _mmplayer_set_audio_only(MMHandleType hplayer, bool audio_only) player->pipeline->videobin[MMPLAYER_V_SINK].gst, MM_ERROR_PLAYER_NO_OP); /* invalid op */ + __mmplayer_del_sink(player, player->pipeline->videobin[MMPLAYER_V_SINK].gst); + __mmplayer_switch_stream(player, MM_PLAYER_TRACK_TYPE_VIDEO, INVALID_TRACK_INDEX); /* release decoder resource */ @@ -7582,6 +7585,7 @@ _mmplayer_gst_decode_pad_removed(GstElement *elem, GstPad *pad, mmplayer_t *player = (mmplayer_t *)data; mmplayer_gst_element_t *mainbin = player->pipeline->mainbin; mmplayer_gst_element_t *videobin = player->pipeline->videobin; + gint timeout = MMPLAYER_STATE_CHANGE_TIMEOUT(player); MMPLAYER_FENTER(); MMPLAYER_RETURN_IF_FAIL(player && player->pipeline && mainbin); @@ -7596,11 +7600,29 @@ _mmplayer_gst_decode_pad_removed(GstElement *elem, GstPad *pad, __mmplayer_release_signal_connection(player, MM_PLAYER_SIGNAL_TYPE_VIDEOBIN); + __mmplayer_del_sink(player, videobin[MMPLAYER_V_SINK].gst); + + LOGD("remove videobin"); + ret = _mmplayer_gst_set_state(player, videobin[MMPLAYER_V_BIN].gst, + GST_STATE_NULL, FALSE, timeout); + if (ret != MM_ERROR_NONE) { + LOGE("fail to change state of videobin to NULL"); + return; + } + if (!gst_bin_remove(GST_BIN_CAST(mainbin[MMPLAYER_M_PIPE].gst), videobin[MMPLAYER_V_BIN].gst)) { LOGE("failed to remove videobin"); gst_object_unref(GST_OBJECT(videobin[MMPLAYER_V_BIN].gst)); } + LOGD("remove concat"); + ret = _mmplayer_gst_set_state(player, mainbin[MMPLAYER_M_V_CONCAT].gst, + GST_STATE_NULL, FALSE, timeout); + if (ret != MM_ERROR_NONE) { + LOGE("fail to change state of concat to NULL"); + return; + } + if (!gst_bin_remove(GST_BIN_CAST(mainbin[MMPLAYER_M_PIPE].gst), mainbin[MMPLAYER_M_V_CONCAT].gst)) { LOGE("failed to remove video concat"); gst_object_unref(GST_OBJECT(mainbin[MMPLAYER_M_V_CONCAT].gst)); @@ -7736,75 +7758,75 @@ _mmplayer_gst_element_added(GstElement *bin, GstElement *element, gpointer data) if (__mmplayer_add_dump_buffer_probe(player, element)) LOGD("add buffer probe"); - if (g_strrstr(klass, "Codec/Decoder/Audio")) { - gchar *selected = NULL; - selected = g_strdup(GST_ELEMENT_NAME(element)); - player->audio_decoders = g_list_append(player->audio_decoders, selected); + if (g_strrstr(klass, "Decoder")) { + if (g_strrstr(klass, "Audio")) { + player->audio_decoders = g_list_append(player->audio_decoders, + g_strdup(GST_ELEMENT_NAME(element))); - /* update codec info */ - player->not_supported_codec &= MISSING_PLUGIN_VIDEO; - player->can_support_codec |= FOUND_PLUGIN_AUDIO; - player->audiodec_linked = 1; - } else if (g_strrstr(klass, "Codec/Decoder/Video")) { - /* update codec info */ - player->not_supported_codec &= MISSING_PLUGIN_AUDIO; - player->can_support_codec |= FOUND_PLUGIN_VIDEO; - player->videodec_linked = 1; - } - - if (g_strrstr(klass, "Demuxer/Adaptive")) { - player->pipeline->mainbin[MMPLAYER_M_ADAPTIVE_DEMUX].id = MMPLAYER_M_ADAPTIVE_DEMUX; - player->pipeline->mainbin[MMPLAYER_M_ADAPTIVE_DEMUX].gst = element; - - LOGD("set max variant limit: %d, %d %d", player->adaptive_info.limit.bandwidth, - player->adaptive_info.limit.width, player->adaptive_info.limit.height); + /* update codec info */ + player->not_supported_codec &= MISSING_PLUGIN_VIDEO; + player->can_support_codec |= FOUND_PLUGIN_AUDIO; + player->audiodec_linked = 1; + } else if (g_strrstr(klass, "Video")) { + GstElement *video_parse = player->pipeline->mainbin[MMPLAYER_M_V_PARSE].gst; + /* update codec info */ + player->not_supported_codec &= MISSING_PLUGIN_AUDIO; + player->can_support_codec |= FOUND_PLUGIN_VIDEO; + player->videodec_linked = 1; + + if (video_parse) { + GstPad *srcpad = gst_element_get_static_pad (video_parse, "src"); + if (srcpad) { + GstCaps *caps = NULL; + GstStructure *str = NULL; + const gchar *name = NULL; + gboolean caps_ret = TRUE; + + MMPLAYER_GST_GET_CAPS_INFO_FROM_PAD (srcpad, caps, str, name, caps_ret); + if (caps_ret && str) { + const gchar *stream_format = gst_structure_get_string (str, "stream-format"); + if (stream_format && g_strrstr(stream_format, "byte-stream")) { + if ((g_object_class_find_property(G_OBJECT_GET_CLASS(video_parse), "config-interval"))) { + g_object_set(G_OBJECT(video_parse), "config-interval", -1, NULL); + LOGD("Send SPS and PPS Insertion every IDR frame"); + } + } + } + gst_object_unref(GST_OBJECT(srcpad)); + } + } + } + } else if (g_strrstr(klass, "Demuxer")) { + if (g_strrstr(klass, "Adaptive")) { + player->pipeline->mainbin[MMPLAYER_M_ADAPTIVE_DEMUX].id = MMPLAYER_M_ADAPTIVE_DEMUX; + player->pipeline->mainbin[MMPLAYER_M_ADAPTIVE_DEMUX].gst = element; - g_object_set(player->pipeline->mainbin[MMPLAYER_M_ADAPTIVE_DEMUX].gst, - "max-bandwidth", player->adaptive_info.limit.bandwidth, - "max-video-width", player->adaptive_info.limit.width, - "max-video-height", player->adaptive_info.limit.height, NULL); + LOGD("set max variant limit: %d, %d %d", player->adaptive_info.limit.bandwidth, + player->adaptive_info.limit.width, player->adaptive_info.limit.height); - } else if (g_strrstr(klass, "Demuxer")) { + g_object_set(player->pipeline->mainbin[MMPLAYER_M_ADAPTIVE_DEMUX].gst, + "max-bandwidth", player->adaptive_info.limit.bandwidth, + "max-video-width", player->adaptive_info.limit.width, + "max-video-height", player->adaptive_info.limit.height, NULL); + } else { #ifdef __DEBUG__ - LOGD("plugged element is demuxer. take it"); + LOGD("plugged element is demuxer. take it"); #endif - player->pipeline->mainbin[MMPLAYER_M_DEMUX].id = MMPLAYER_M_DEMUX; - player->pipeline->mainbin[MMPLAYER_M_DEMUX].gst = element; + player->pipeline->mainbin[MMPLAYER_M_DEMUX].id = MMPLAYER_M_DEMUX; + player->pipeline->mainbin[MMPLAYER_M_DEMUX].gst = element; + } } else if (g_strrstr(klass, "Parser") && (g_strrstr(klass, "Video"))) { player->pipeline->mainbin[MMPLAYER_M_V_PARSE].id = MMPLAYER_M_V_PARSE; player->pipeline->mainbin[MMPLAYER_M_V_PARSE].gst = element; } - if (g_strrstr(factory_name, "asfdemux") || g_strrstr(factory_name, "qtdemux") || g_strrstr(factory_name, "avidemux")) { - int surface_type = 0; - - mm_attrs_get_int_by_name(player->attrs, "display_surface_type", &surface_type); - } - - // to support trust-zone only - if (g_strrstr(factory_name, "asfdemux")) { - LOGD("set file-location %s", player->profile.uri); - g_object_set(G_OBJECT(element), "file-location", player->profile.uri, NULL); - } else if (g_strrstr(factory_name, "legacyh264parse")) { - LOGD("[%s] output-format to legacyh264parse", "mssdemux"); - g_object_set(G_OBJECT(element), "output-format", 1, NULL); /* NALU/Byte Stream format */ - } else if (g_strrstr(factory_name, "mpegaudioparse")) { + if (g_strrstr(factory_name, "mpegaudioparse")) { if ((MMPLAYER_IS_HTTP_STREAMING(player)) && (__mmplayer_is_only_mp3_type(player->type))) { LOGD("[mpegaudioparse] set streaming pull mode."); g_object_set(G_OBJECT(element), "http-pull-mp3dec", TRUE, NULL); } - } else if (g_strrstr(factory_name, player->ini.videocodec_element_hw)) { - player->pipeline->mainbin[MMPLAYER_M_DEC1].gst = element; - } else if (g_strrstr(factory_name, "omxdec_h264")) { - GstElement *video_parse = player->pipeline->mainbin[MMPLAYER_M_V_PARSE].gst; - if (video_parse && (g_object_class_find_property(G_OBJECT_GET_CLASS(video_parse), "config-interval"))) { - g_object_set(G_OBJECT(video_parse), "config-interval", -1, NULL); - LOGD("Send SPS and PPS Insertion every IDR frame"); - } - } - - if ((player->pipeline->mainbin[MMPLAYER_M_DEMUX].gst) && + } else if ((player->pipeline->mainbin[MMPLAYER_M_DEMUX].gst) && (g_strrstr(GST_ELEMENT_NAME(element), "multiqueue"))) { LOGD("plugged element is multiqueue. take it %s", GST_ELEMENT_NAME(element)); @@ -7818,7 +7840,6 @@ _mmplayer_gst_element_added(GstElement *bin, GstElement *element, gpointer data) _mm_player_streaming_set_multiqueue(player->streamer, element); _mm_player_streaming_sync_property(player->streamer, player->pipeline->mainbin[MMPLAYER_M_AUTOPLUG].gst); } - } return; @@ -8522,6 +8543,24 @@ __mmplayer_switch_stream(mmplayer_t *player, mmplayer_track_type_e type, int ind g_list_free(streams); } + /* in paused state, seek to current pos to flush mq buffer and release waiting task */ + if (MMPLAYER_CURRENT_STATE(player) == MM_PLAYER_STATE_PAUSED) { + gint64 pos_nsec = GST_CLOCK_TIME_NONE; + + if (!gst_element_query_position(player->pipeline->mainbin[MMPLAYER_M_PIPE].gst, GST_FORMAT_TIME, &pos_nsec)) + pos_nsec = player->last_position; + + LOGD("current pos %" GST_TIME_FORMAT ", rate = %f", GST_TIME_ARGS(pos_nsec), player->playback_rate); + + if (!_mmplayer_gst_seek(player, player->pipeline->mainbin[MMPLAYER_M_PIPE].gst, + player->playback_rate, GST_FORMAT_TIME, + (GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE), + GST_SEEK_TYPE_SET, pos_nsec, GST_SEEK_TYPE_SET, GST_CLOCK_TIME_NONE)) { + LOGW("failed to seek"); + return MM_ERROR_PLAYER_INTERNAL; + } + } + MMPLAYER_FLEAVE(); return MM_ERROR_NONE; }