fakesink = gst_element_factory_make("fakesink", NULL);
if (fakesink == NULL) {
LOGE("failed to create fakesink");
- goto EXIT;
+ return;
}
- /* store it as it's sink element */
- __mmplayer_add_sink(player, fakesink, FALSE);
-
- gst_bin_add(GST_BIN(pipeline), fakesink);
+ if (!gst_bin_add(GST_BIN(pipeline), fakesink)) {
+ LOGE("failed to add fakesink to pipeline");
+ goto ERROR;
+ }
/* link */
sinkpad = gst_element_get_static_pad(fakesink, "sink");
if (gst_pad_link(pad, sinkpad) != GST_PAD_LINK_OK) {
LOGE("failed to link fakesink");
- gst_object_unref(GST_OBJECT(fakesink));
- goto EXIT;
+ goto ERROR;
}
if (strstr(name, "video")) {
g_object_set(G_OBJECT(fakesink), "sync", TRUE, NULL);
gst_element_set_state(fakesink, GST_STATE_PAUSED);
-EXIT:
+ /* store it as it's sink element */
+ __mmplayer_add_sink(player, fakesink, FALSE);
+
if (sinkpad)
gst_object_unref(GST_OBJECT(sinkpad));
MMPLAYER_FLEAVE();
return;
+
+ERROR:
+
+ if (sinkpad)
+ gst_object_unref(GST_OBJECT(sinkpad));
+
+ if (fakesink) {
+ gst_element_set_state(fakesink, GST_STATE_NULL);
+
+ if (!gst_bin_remove(GST_BIN(pipeline), fakesink))
+ gst_object_unref(GST_OBJECT(fakesink));
+ }
+
+ return;
}
static GstElement *
return NULL;
}
+ gst_element_set_state(concat, GST_STATE_PAUSED);
+
+ pipeline = player->pipeline->mainbin[MMPLAYER_M_PIPE].gst;
+ if (!gst_bin_add(GST_BIN(pipeline), concat)) {
+ LOGE("failed to add concat to pipeline");
+ gst_element_set_state(concat, GST_STATE_NULL);
+ gst_object_unref(GST_OBJECT(concat));
+ return NULL;
+ }
+
LOGD("Create concat [%d] element", elem_idx);
player->pipeline->mainbin[elem_idx].id = elem_idx;
player->pipeline->mainbin[elem_idx].gst = concat;
- gst_element_set_state(concat, GST_STATE_PAUSED);
-
- pipeline = player->pipeline->mainbin[MMPLAYER_M_PIPE].gst;
- gst_bin_add(GST_BIN(pipeline), concat);
-
MMPLAYER_FLEAVE();
return concat;
}
}
g_object_set(selector, "sync-streams", TRUE, NULL);
- player->pipeline->mainbin[elem_idx].id = elem_idx;
- player->pipeline->mainbin[elem_idx].gst = selector;
-
- /* player->track[stream_type].active_track_index = DEFAULT_TRACK; */
-
srcpad = gst_element_get_static_pad(selector, "src");
LOGD("blocking %s:%s", GST_DEBUG_PAD_NAME(srcpad));
gst_element_set_state(selector, GST_STATE_PAUSED);
pipeline = player->pipeline->mainbin[MMPLAYER_M_PIPE].gst;
- gst_bin_add(GST_BIN(pipeline), selector);
+ if (!gst_bin_add(GST_BIN(pipeline), selector)) {
+ LOGE("failed to add selector to pipeline");
+
+ if (player->track[stream_type].block_id != 0)
+ gst_pad_remove_probe (srcpad, player->track[stream_type].block_id);
+ player->track[stream_type].block_id = 0;
+
+ if (player->track[stream_type].event_probe_id != 0)
+ gst_pad_remove_probe (srcpad, player->track[stream_type].event_probe_id);
+ player->track[stream_type].event_probe_id = 0;
+
+ gst_object_unref(GST_OBJECT(srcpad));
+
+ gst_element_set_state(selector, GST_STATE_NULL);
+ gst_object_unref(GST_OBJECT(selector));
+ return NULL;
+ }
gst_object_unref(GST_OBJECT(srcpad));
+ player->pipeline->mainbin[elem_idx].id = elem_idx;
+ player->pipeline->mainbin[elem_idx].gst = selector;
+
MMPLAYER_FLEAVE();
return selector;
}
sinkpad = NULL;
}
+ MMPLAYER_GENERATE_DOT_IF_ENABLED(player, "pipeline-pad-added");
return;
}
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) &&
+ if ((surface_type == MM_DISPLAY_SURFACE_OVERLAY || surface_type == MM_DISPLAY_SURFACE_OVERLAY_SYNC_UI) &&
(_mmplayer_acquire_hw_resource(player, MMPLAYER_RESOURCE_TYPE_VIDEO_OVERLAY) != MM_ERROR_NONE)) {
LOGE("failed to acquire video overlay resource");
goto ERROR;
MMPLAYER_FENTER();
/* check video sinkbin is created */
- if (!_mmplayer_is_videosink_ready(player, MM_DISPLAY_SURFACE_OVERLAY))
+ if (!(_mmplayer_is_videosink_ready(player, MM_DISPLAY_SURFACE_OVERLAY) ||
+ _mmplayer_is_videosink_ready(player, MM_DISPLAY_SURFACE_OVERLAY_SYNC_UI)))
return;
attrs = MMPLAYER_GET_ATTRS(player);
win_roi_x, win_roi_y, win_roi_width, win_roi_height);
}
+static void __mmplayer_video_param_set_display_overlay_sync_ui(mmplayer_t *player)
+{
+ MMHandleType attrs = 0;
+ gchar *handle = NULL;
+
+ /* check video sinkbin is created */
+ if (!_mmplayer_is_videosink_ready(player, MM_DISPLAY_SURFACE_OVERLAY_SYNC_UI))
+ return;
+
+ attrs = MMPLAYER_GET_ATTRS(player);
+ MMPLAYER_RETURN_IF_FAIL(attrs);
+
+ /* common case if using overlay surface */
+ mm_attrs_get_string_by_name(attrs, "exported_shell_handle", &handle);
+ MMPLAYER_RETURN_IF_FAIL(handle);
+
+ gst_video_overlay_set_wl_window_exported_shell_handle(
+ GST_VIDEO_OVERLAY(player->pipeline->videobin[MMPLAYER_V_SINK].gst),
+ handle);
+ LOGD("set video param: exported_shell_handle (%s)", handle);
+}
+
static void __mmplayer_video_param_set_display_overlay(mmplayer_t *player)
{
MMHandleType attrs = 0;
_mmplayer_update_video_overlay_param(mmplayer_t *player, const char *param_name)
{
gboolean update_all_param = FALSE;
+ int curr_type = MM_DISPLAY_SURFACE_NUM;
MMPLAYER_FENTER();
- if (!_mmplayer_is_videosink_ready(player, MM_DISPLAY_SURFACE_OVERLAY)) {
+ if (!player || !player->pipeline || !player->pipeline->mainbin || !player->pipeline->videobin ||
+ !player->pipeline->videobin[MMPLAYER_V_BIN].gst ||
+ !player->pipeline->videobin[MMPLAYER_V_SINK].gst) {
LOGW("videosink is not ready yet");
return MM_ERROR_PLAYER_NOT_INITIALIZED;
}
+ mm_attrs_get_int_by_name(player->attrs, "display_surface_type", &curr_type);
+
+ if (curr_type != MM_DISPLAY_SURFACE_OVERLAY && curr_type != MM_DISPLAY_SURFACE_OVERLAY_SYNC_UI) {
+ LOGE("current type(%d) is wrong", curr_type);
+ return MM_ERROR_PLAYER_INTERNAL;
+ }
+
if (strcmp(player->ini.videosink_element_overlay, "tizenwlsink")) {
LOGE("invalid videosink [%s]", player->ini.videosink_element_overlay);
return MM_ERROR_PLAYER_INTERNAL;
if (!g_strcmp0(param_name, "update_all_param"))
update_all_param = TRUE;
+ if (curr_type == MM_DISPLAY_SURFACE_OVERLAY_SYNC_UI) {
+ __mmplayer_video_param_set_display_overlay_sync_ui(player);
+ MMPLAYER_FLEAVE();
+ return MM_ERROR_NONE;
+ }
if (update_all_param || !g_strcmp0(param_name, "display_overlay"))
__mmplayer_video_param_set_display_overlay(player);
if (update_all_param || !g_strcmp0(param_name, "display_method"))
if (update_all_param)
__mmplayer_video_param_set_video_roi_area(player);
-
MMPLAYER_FLEAVE();
return MM_ERROR_NONE;
}
LOGD("enable overlay");
__mmplayer_video_param_set_display_overlay(player);
+ __mmplayer_video_param_set_display_overlay_sync_ui(player);
g_object_set(player->pipeline->videobin[MMPLAYER_V_SINK].gst, "disable-overlay", FALSE, NULL);
}
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 */
MM_PLAYER_SIGNAL_TYPE_AUTOPLUG, "no-more-pads", G_CALLBACK(__mmplayer_gst_audio_deinterleave_no_more_pads), (gpointer)player);
player->no_more_pad = FALSE;
} else {
- /* 4-2. create fakesink to extract interlevaed pcm */
+ /* 4-2. create fakesink to extract interleaved pcm */
LOGD("add audio fakesink for interleaved audio");
MMPLAYER_CREATE_ELEMENT(audiobin, extract_sink_id, "fakesink", "fakeaudiosink", *bucket, player);
if (!(player->audio_extract_opt & MM_PLAYER_AUDIO_EXTRACT_NO_SYNC_WITH_CLOCK))
GList *l = NULL;
MMPLAYER_RETURN_VAL_IF_FAIL(player, NULL);
gboolean ret = TRUE;
+ gint64 end_time = 0;
/* check DRC, if it is, destroy the prev bo list to create again */
if (player->video_bo_size != size) {
}
}
+ if (player->ini.video_bo_timeout > 0)
+ end_time = g_get_monotonic_time() + player->ini.video_bo_timeout * G_TIME_SPAN_SECOND;
+
while (TRUE) {
/* get bo from list*/
for (l = g_list_first(player->video_bo_list); l; l = g_list_next(l)) {
return tbm_bo_ref(tmp->bo);
}
}
- if (!ret) {
- LOGE("failed to get bo in %d timeout", player->ini.video_bo_timeout);
- MMPLAYER_VIDEO_BO_UNLOCK(player);
- return NULL;
- }
if (player->ini.video_bo_timeout <= 0) {
MMPLAYER_VIDEO_BO_WAIT(player);
} else {
- gint64 timeout = g_get_monotonic_time() + player->ini.video_bo_timeout * G_TIME_SPAN_SECOND;
- ret = MMPLAYER_VIDEO_BO_WAIT_UNTIL(player, timeout);
+ ret = MMPLAYER_VIDEO_BO_WAIT_UNTIL(player, end_time);
+ if (!ret) {
+ LOGE("failed to get bo in %d timeout", player->ini.video_bo_timeout);
+ break;
+ }
}
- continue;
}
+
+ MMPLAYER_VIDEO_BO_UNLOCK(player);
+ return NULL;
}
static void
goto EXIT;
}
- if (surface_type != MM_DISPLAY_SURFACE_OVERLAY || player->set_mode.video_zc) {
+ if ((surface_type != MM_DISPLAY_SURFACE_OVERLAY &&
+ surface_type != MM_DISPLAY_SURFACE_OVERLAY_SYNC_UI) ||
+ player->set_mode.video_zc) {
LOGD("skip creating the videoconv and rotator");
return MM_ERROR_NONE;
}
switch (surface_type) {
case MM_DISPLAY_SURFACE_OVERLAY:
+ /* fall through */
+ case MM_DISPLAY_SURFACE_OVERLAY_SYNC_UI:
if (strlen(player->ini.videosink_element_overlay) > 0)
factory_name = player->ini.videosink_element_overlay;
break;
case MM_DISPLAY_SURFACE_REMOTE:
+ /* fall through */
case MM_DISPLAY_SURFACE_NULL:
if (strlen(player->ini.videosink_element_fake) > 0)
factory_name = player->ini.videosink_element_fake;
return MM_ERROR_PLAYER_INTERNAL;
}
- if (surface_type == MM_DISPLAY_SURFACE_OVERLAY) {
+ if (surface_type == MM_DISPLAY_SURFACE_OVERLAY || surface_type == MM_DISPLAY_SURFACE_OVERLAY_SYNC_UI) {
bool use_tbm = (player->set_mode.video_zc || (player->is_360_feature_enabled && player->is_content_spherical));
if (strncmp(factory_name, "tizenwlsink", strlen(factory_name)) == 0) {
g_object_set(player->pipeline->videobin[MMPLAYER_V_SINK].gst,
LOGD("adding created elements to bin");
if (!_mmplayer_gst_element_add_bucket_to_bin(GST_BIN(textbin[MMPLAYER_T_BIN].gst), element_bucket)) {
LOGE("failed to add elements");
- g_list_free(element_bucket);
goto ERROR;
}
LOGD("Linking elements in the bucket by added order.");
if (_mmplayer_gst_element_link_bucket(element_bucket) == -1) {
LOGE("failed to link elements");
- g_list_free(element_bucket);
goto ERROR;
}
- /* done. free allocated variables */
- g_list_free(element_bucket);
-
if (textbin[MMPLAYER_T_QUEUE].gst) {
GstPad *pad = NULL;
GstPad *ghostpad = NULL;
}
}
+ g_list_free(element_bucket);
+
return MM_ERROR_NONE;
ERROR:
+ g_list_free(element_bucket);
+
if (!player->play_subtitle && textbin[MMPLAYER_T_FAKE_SINK].gst) {
LOGE("remove textbin sink from sink list");
__mmplayer_del_sink(player, textbin[MMPLAYER_T_FAKE_SINK].gst);
__mmplayer_gst_create_text_sink_bin(mmplayer_t *player)
{
mmplayer_gst_element_t *textbin = NULL;
- GList *element_bucket = NULL;
int surface_type = 0;
gint i = 0;
LOGD("ERROR : releasing textbin");
- g_list_free(element_bucket);
-
/* release signal */
__mmplayer_release_signal_connection(player, MM_PLAYER_SIGNAL_TYPE_TEXTBIN);
__mmplayer_release_signal_connection(player, MM_PLAYER_SIGNAL_TYPE_ALL);
if (mainbin) {
- mmplayer_gst_element_t *audiobin = player->pipeline->audiobin;
- mmplayer_gst_element_t *videobin = player->pipeline->videobin;
- mmplayer_gst_element_t *textbin = player->pipeline->textbin;
GstBus *bus = gst_pipeline_get_bus(GST_PIPELINE(mainbin[MMPLAYER_M_PIPE].gst));
gst_bus_set_sync_handler(bus, NULL, NULL, NULL);
gst_object_unref(bus);
if (mainbin[MMPLAYER_M_SRC_FAKESINK].gst)
gst_object_unref(GST_OBJECT(mainbin[MMPLAYER_M_SRC_FAKESINK].gst));
- MMPLAYER_FREEIF(audiobin);
- MMPLAYER_FREEIF(videobin);
- MMPLAYER_FREEIF(textbin);
+ MMPLAYER_FREEIF(player->pipeline->audiobin);
+ MMPLAYER_FREEIF(player->pipeline->videobin);
+ MMPLAYER_FREEIF(player->pipeline->textbin);
MMPLAYER_FREEIF(mainbin);
}
player->interrupted_by_resource = TRUE;
+ MMPLAYER_POST_MSG(player, MM_MESSAGE_INTERRUPT_STARTED, NULL);
+
/* get last play position */
if (_mmplayer_gst_get_position(player, &pos) == MM_ERROR_NONE) {
msg.union_type = MM_MSG_UNION_TIME;
player->pipeline->mainbin,
MM_ERROR_PLAYER_NOT_INITIALIZED);
- LOGD("set the pipeline state to READY");
+ if (player->pipeline->videobin && player->pipeline->videobin[MMPLAYER_V_BIN].gst) {
+ LOGD("set the videobin state to READY");
+ ret = _mmplayer_gst_set_state(player, player->pipeline->videobin[MMPLAYER_V_BIN].gst,
+ GST_STATE_READY, TRUE, MMPLAYER_STATE_CHANGE_TIMEOUT(player));
+
+ }
- /* set state to READY */
+ if (player->pipeline->audiobin && player->pipeline->audiobin[MMPLAYER_A_BIN].gst) {
+ LOGD("set the audiobin state to READY");
+ ret = _mmplayer_gst_set_state(player, player->pipeline->audiobin[MMPLAYER_A_BIN].gst,
+ GST_STATE_READY, TRUE, MMPLAYER_STATE_CHANGE_TIMEOUT(player));
+
+ }
+
+ LOGD("set the pipeline state to READY");
ret = _mmplayer_gst_set_state(player, player->pipeline->mainbin[MMPLAYER_M_PIPE].gst,
GST_STATE_READY, FALSE, MMPLAYER_STATE_CHANGE_TIMEOUT(player));
+
if (ret != MM_ERROR_NONE) {
LOGE("fail to change state to READY");
return MM_ERROR_PLAYER_INTERNAL;
/* And, it still has a parent "player".
* You need to let the parent manage the object instead of unreffing the object directly.
*/
- gst_bin_remove(GST_BIN(mainbin[MMPLAYER_M_PIPE].gst), queue2);
- gst_object_unref(queue2);
+ if (!gst_bin_remove(GST_BIN(mainbin[MMPLAYER_M_PIPE].gst), queue2)) {
+ LOGE("failed to remove queue2");
+ gst_object_unref(queue2);
+ }
queue2 = NULL;
}
* You need to let the parent manage the object instead of unreffing the object directly.
*/
- gst_bin_remove(GST_BIN(mainbin[MMPLAYER_M_PIPE].gst), decodebin);
- gst_object_unref(decodebin);
+ if (!gst_bin_remove(GST_BIN(mainbin[MMPLAYER_M_PIPE].gst), decodebin)) {
+ LOGE("failed to remove decodebin");
+ gst_object_unref(decodebin);
+ }
decodebin = NULL;
}
g_ptr_array_set_size(selector->streams, 0);
gst_element_set_state(player->pipeline->mainbin[selectorId].gst, GST_STATE_NULL);
- gst_bin_remove(GST_BIN_CAST(player->pipeline->mainbin[MMPLAYER_M_PIPE].gst), player->pipeline->mainbin[selectorId].gst);
+ if (!gst_bin_remove(GST_BIN_CAST(player->pipeline->mainbin[MMPLAYER_M_PIPE].gst),
+ player->pipeline->mainbin[selectorId].gst)) {
+ LOGE("failed to remove selector");
+ gst_object_unref(player->pipeline->mainbin[selectorId].gst);
+ }
player->pipeline->mainbin[selectorId].gst = NULL;
selector = NULL;
MMPLAYER_FREEIF(caps_str);
} else if (g_str_has_prefix(mime, "video") && player->videodec_linked) {
- LOGD("already video linked");
- ret = FALSE;
+ if((MMPLAYER_IS_HTTP_LIVE_STREAMING(player)) || (MMPLAYER_IS_DASH_STREAMING(player))) {
+ LOGD("video is already linked, allow the stream switch");
+ ret = TRUE;
+ } else {
+ LOGD("video is already linked");
+ ret = FALSE;
+ }
} else {
LOGD("found new stream");
}
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);
if (MMPLAYER_USE_DECODEBIN(player))
return;
- if (!videobin || !g_str_has_prefix (GST_PAD_NAME (pad), "video"))
+ if (!videobin || !g_str_has_prefix(GST_PAD_NAME (pad), "video"))
return;
- 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 to NULL");
- return;
- }
+ __mmplayer_release_signal_connection(player, MM_PLAYER_SIGNAL_TYPE_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 to NULL");
- return;
+ __mmplayer_del_sink(player, videobin[MMPLAYER_V_SINK].gst);
+
+ 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));
}
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));
}
- 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(mainbin[MMPLAYER_M_V_CONCAT].gst));
mainbin[MMPLAYER_M_V_CONCAT].gst = NULL;
mainbin[MMPLAYER_M_V_CONCAT].id = 0;
-
- gst_object_unref(GST_OBJECT(videobin[MMPLAYER_V_BIN].gst));
MMPLAYER_FREEIF(player->pipeline->videobin);
ret = __mmplayer_release_hw_resource(player, MMPLAYER_RESOURCE_TYPE_VIDEO_OVERLAY);
_mmplayer_set_reconfigure_state(player, TRUE);
MMPLAYER_CMD_UNLOCK(player);
- MMPLAYER_POST_MSG(player, MM_MESSAGE_GAPLESS_CONSTRUCTION, NULL);
+ MMPLAYER_POST_MSG(player, MM_MESSAGE_FLUSH_BUFFER, NULL);
__mmplayer_deactivate_old_path(player);
MMPLAYER_FLEAVE();
player->gapless.update_segment[MM_PLAYER_TRACK_TYPE_VIDEO] = FALSE;
/* deactivate pipeline except sinkbins to set up the new pipeline of next uri*/
- MMPLAYER_POST_MSG(player, MM_MESSAGE_GAPLESS_CONSTRUCTION, NULL); /* post message for gapless */
+ MMPLAYER_POST_MSG(player, MM_MESSAGE_FLUSH_BUFFER, NULL); /* post message for gapless */
__mmplayer_deactivate_old_path(player);
MMPLAYER_FLEAVE();
#endif
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")) {
player->pipeline->mainbin[MMPLAYER_M_DEC1].gst = element;
}
+ if (g_strrstr(factory_name, "omxdec_h264") || g_strrstr(factory_name, "v4l2h264dec")) {
+ 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) &&
(g_strrstr(GST_ELEMENT_NAME(element), "multiqueue"))) {
LOGD("plugged element is multiqueue. take it %s", GST_ELEMENT_NAME(element));
for (; sig_list; sig_list = sig_list->next) {
item = sig_list->data;
- if (item && item->obj && GST_IS_ELEMENT(item->obj)) {
+ if (item && item->obj) {
if (g_signal_handler_is_connected(item->obj, item->sig))
g_signal_handler_disconnect(item->obj, item->sig);
}
if (streams) {
LOGD("send select stream event");
- gst_element_send_event(player->pipeline->mainbin[MMPLAYER_M_PIPE].gst,
+ gst_element_send_event(player->pipeline->mainbin[MMPLAYER_M_AUTOPLUG].gst,
gst_event_new_select_streams(streams));
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;
}
}
p = gst_caps_get_structure(caps_a, 0);
-
- mm_attrs_get_int_by_name(attrs, "content_audio_samplerate", &samplerate);
-
gst_structure_get_int(p, "rate", &samplerate);
gst_structure_get_int(p, "channels", &channels);