if ((type < MM_PLAYER_STREAM_TYPE_DEFAULT) || (type > MM_PLAYER_STREAM_TYPE_TEXT))
return MM_ERROR_INVALID_ARGUMENT;
+ MMPLAYER_MEDIA_STREAM_CALLBACK_LOCK(player);
+
if (player->media_stream_buffer_status_cb[type]) {
if (!callback)
LOGD("[type:%d] will be clear.\n", type);
LOGD("player handle %p, type %d, callback %p\n", player, type,
player->media_stream_buffer_status_cb[type]);
+ MMPLAYER_MEDIA_STREAM_CALLBACK_UNLOCK(player);
MMPLAYER_FLEAVE();
if ((type < MM_PLAYER_STREAM_TYPE_DEFAULT) || (type > MM_PLAYER_STREAM_TYPE_TEXT))
return MM_ERROR_INVALID_ARGUMENT;
+ MMPLAYER_MEDIA_STREAM_CALLBACK_LOCK(player);
if (player->media_stream_seek_data_cb[type]) {
if (!callback)
LOGD("player handle %p, type %d, callback %p\n", player, type,
player->media_stream_seek_data_cb[type]);
+ MMPLAYER_MEDIA_STREAM_CALLBACK_UNLOCK(player);
MMPLAYER_FLEAVE();
}
if (MMPLAYER_CURRENT_STATE(player) != MM_PLAYER_STATE_PLAYING) {
- if (!player->media_stream_buffer_status_cb[type])
+ MMPLAYER_MEDIA_STREAM_CALLBACK_LOCK(player);
+ if (!player->media_stream_buffer_status_cb[type]) {
+ MMPLAYER_MEDIA_STREAM_CALLBACK_UNLOCK(player);
return MM_ERROR_NONE;
+ }
current_level_per = (guint)(gst_util_guint64_to_gdouble(current_level_bytes)/gst_util_guint64_to_gdouble(max_bytes)*100);
if (current_level_per < player->media_stream_buffer_min_percent[type])
player->media_stream_buffer_status_cb[type](type, MM_PLAYER_MEDIA_STREAM_BUFFER_UNDERRUN, current_level_bytes, player->buffer_cb_user_param);
+
+ MMPLAYER_MEDIA_STREAM_CALLBACK_UNLOCK(player);
}
MMPLAYER_FLEAVE();
player->pipeline &&
player->pipeline->mainbin &&
player->pipeline->mainbin[MMPLAYER_M_SRC].gst,
- MM_ERROR_PLAYER_INTERNAL);
+ MM_ERROR_PLAYER_NOT_INITIALIZED);
/* get stream type if audio or video */
media_packet_is_audio(packet, &flag);
LOGI("app-src: feed data\n");
g_object_get(G_OBJECT(element), "current-level-bytes", ¤t_level_bytes, NULL);
+ MMPLAYER_MEDIA_STREAM_CALLBACK_LOCK(player);
if (player->media_stream_buffer_status_cb[type])
player->media_stream_buffer_status_cb[type](type, MM_PLAYER_MEDIA_STREAM_BUFFER_UNDERRUN, current_level_bytes, player->buffer_cb_user_param);
+
+ MMPLAYER_MEDIA_STREAM_CALLBACK_UNLOCK(player);
}
static gboolean
MMPLAYER_RETURN_VAL_IF_FAIL(player, FALSE);
LOGI("app-src: seek data, offset: %llu\n", offset);
+ MMPLAYER_MEDIA_STREAM_CALLBACK_LOCK(player);
if (player->media_stream_seek_data_cb[type])
player->media_stream_seek_data_cb[type](type, offset, player->buffer_cb_user_param);
+ MMPLAYER_MEDIA_STREAM_CALLBACK_UNLOCK(player);
return TRUE;
}
MMPLAYER_RETURN_VAL_IF_FAIL(player, FALSE);
- LOGI("app-src: enough data:%p\n", player->media_stream_buffer_status_cb[type]);
-
g_object_get(G_OBJECT(element), "current-level-bytes", ¤t_level_bytes, NULL);
+ MMPLAYER_MEDIA_STREAM_CALLBACK_LOCK(player);
+
+ LOGI("app-src: enough data:%p %llu\n", player->media_stream_buffer_status_cb[type], current_level_bytes);
if (player->media_stream_buffer_status_cb[type])
player->media_stream_buffer_status_cb[type](type, MM_PLAYER_MEDIA_STREAM_BUFFER_OVERFLOW, current_level_bytes, player->buffer_cb_user_param);
+ MMPLAYER_MEDIA_STREAM_CALLBACK_UNLOCK(player);
return TRUE;
}
g_mutex_init(&player->video_bo_mutex);
g_cond_init(&player->video_bo_cond);
+ /* create media stream callback mutex */
+ g_mutex_init(&player->media_stream_cb_lock);
+
player->streaming_type = STREAMING_SERVICE_NONE;
/* give default value of audio effect setting */
return MM_ERROR_NONE;
}
+static void
+__mmplayer_check_async_state_transition(mm_player_t* player)
+{
+ GstState element_state = GST_STATE_VOID_PENDING;
+ GstState element_pending_state = GST_STATE_VOID_PENDING;
+ GstStateChangeReturn ret = GST_STATE_CHANGE_FAILURE;
+ GstElement * element = NULL;
+ gboolean async = FALSE;
+
+ /* check player handle */
+ MMPLAYER_RETURN_IF_FAIL(player &&
+ player->pipeline &&
+ player->pipeline->mainbin &&
+ player->pipeline->mainbin[MMPLAYER_M_PIPE].gst);
+
+ if (player->attrs)
+ mm_attrs_get_int_by_name(player->attrs, "profile_prepare_async", &async);
+
+ if (!MMPLAYER_IS_MS_BUFF_SRC(player) && (async == FALSE)) {
+ LOGD("don't need to check the pipeline state");
+ return;
+ }
+
+ MMPLAYER_PRINT_STATE(player);
+
+ /* wait for state transition */
+ element = player->pipeline->mainbin[MMPLAYER_M_PIPE].gst;
+ ret = gst_element_get_state(element, &element_state, &element_pending_state, 1*GST_SECOND);
+
+ if (ret == GST_STATE_CHANGE_FAILURE) {
+ LOGE(" [%s] state : %s pending : %s \n",
+ GST_ELEMENT_NAME(element),
+ gst_element_state_get_name(element_state),
+ gst_element_state_get_name(element_pending_state));
+
+ /* dump state of all element */
+ __mmplayer_dump_pipeline_state(player);
+
+ return;
+ }
+
+ LOGD("[%s] element state has changed\n", GST_ELEMENT_NAME(element));
+ return;
+}
+
int
_mmplayer_destroy(MMHandleType handle) // @
{
/* destroy can called at anytime */
MMPLAYER_CHECK_STATE(player, MMPLAYER_COMMAND_DESTROY);
+ /* check async state transition */
+ __mmplayer_check_async_state_transition(player);
+
__mmplayer_destroy_streaming_ext(player);
/* release repeat thread */
g_mutex_clear(&player->video_bo_mutex);
g_cond_clear(&player->video_bo_cond);
+ /* release media stream callback lock */
+ g_mutex_clear(&player->media_stream_cb_lock);
+
MMPLAYER_FLEAVE();
return MM_ERROR_NONE;
/* check current state */
MMPLAYER_CHECK_STATE(player, MMPLAYER_COMMAND_UNREALIZE);
+ /* check async state transition */
+ __mmplayer_check_async_state_transition(player);
+
__mmplayer_unrealize_streaming_ext(player);
/* unrealize pipeline */
player->maximum_bitrate[i] = 0;
}
+ MMPLAYER_MEDIA_STREAM_CALLBACK_LOCK(player);
+
/* remove media stream cb(appsrc cb) */
for (i = 0; i < MM_PLAYER_STREAM_TYPE_MAX; i++) {
player->media_stream_buffer_status_cb[i] = NULL;
player->media_stream_seek_data_cb[i] = NULL;
}
+ MMPLAYER_MEDIA_STREAM_CALLBACK_UNLOCK(player);
/* free memory related to audio effect */
MMPLAYER_FREEIF(player->audio_effect_info.custom_ext_level_for_plugin);
g_object_get(G_OBJECT(element), "current-level-bytes", ¤t_level_bytes, NULL);
LOGI("app-src: feed audio(%llu)\n", current_level_bytes);
+ MMPLAYER_MEDIA_STREAM_CALLBACK_LOCK(player);
if (player->media_stream_buffer_status_cb[type])
player->media_stream_buffer_status_cb[type](type, MM_PLAYER_MEDIA_STREAM_BUFFER_UNDERRUN, current_level_bytes, player->buffer_cb_user_param);
+ MMPLAYER_MEDIA_STREAM_CALLBACK_UNLOCK(player);
+
}
void
LOGI("app-src: feed video(%llu)\n", current_level_bytes);
+ MMPLAYER_MEDIA_STREAM_CALLBACK_LOCK(player);
if (player->media_stream_buffer_status_cb[type])
player->media_stream_buffer_status_cb[type](type, MM_PLAYER_MEDIA_STREAM_BUFFER_UNDERRUN, current_level_bytes, player->buffer_cb_user_param);
+ MMPLAYER_MEDIA_STREAM_CALLBACK_UNLOCK(player);
}
void
g_object_get(G_OBJECT(element), "current-level-bytes", ¤t_level_bytes, NULL);
+ MMPLAYER_MEDIA_STREAM_CALLBACK_LOCK(player);
if (player->media_stream_buffer_status_cb[type])
player->media_stream_buffer_status_cb[type](type, MM_PLAYER_MEDIA_STREAM_BUFFER_UNDERRUN, current_level_bytes, player->buffer_cb_user_param);
+
+ MMPLAYER_MEDIA_STREAM_CALLBACK_UNLOCK(player);
}
void
g_object_get(G_OBJECT(element), "current-level-bytes", ¤t_level_bytes, NULL);
+ MMPLAYER_MEDIA_STREAM_CALLBACK_LOCK(player);
+
if (player->media_stream_buffer_status_cb[type])
player->media_stream_buffer_status_cb[type](type, MM_PLAYER_MEDIA_STREAM_BUFFER_OVERFLOW, current_level_bytes, player->buffer_cb_user_param);
+
+ MMPLAYER_MEDIA_STREAM_CALLBACK_UNLOCK(player);
}
void
g_object_get(G_OBJECT(element), "current-level-bytes", ¤t_level_bytes, NULL);
+ MMPLAYER_MEDIA_STREAM_CALLBACK_LOCK(player);
if (player->media_stream_buffer_status_cb[type])
player->media_stream_buffer_status_cb[type](type, MM_PLAYER_MEDIA_STREAM_BUFFER_OVERFLOW, current_level_bytes, player->buffer_cb_user_param);
+
+ MMPLAYER_MEDIA_STREAM_CALLBACK_UNLOCK(player);
}
gboolean
MMPLAYER_RETURN_VAL_IF_FAIL(player, FALSE);
LOGD("app-src: seek audio data %llu\n", position);
+ MMPLAYER_MEDIA_STREAM_CALLBACK_LOCK(player);
if (player->media_stream_seek_data_cb[type])
player->media_stream_seek_data_cb[type](type, position, player->buffer_cb_user_param);
+ MMPLAYER_MEDIA_STREAM_CALLBACK_UNLOCK(player);
return TRUE;
}
MMPLAYER_RETURN_VAL_IF_FAIL(player, FALSE);
LOGD("app-src: seek video data %llu\n", position);
-
+ MMPLAYER_MEDIA_STREAM_CALLBACK_LOCK(player);
if (player->media_stream_seek_data_cb[type])
player->media_stream_seek_data_cb[type](type, position, player->buffer_cb_user_param);
+ MMPLAYER_MEDIA_STREAM_CALLBACK_UNLOCK(player);
return TRUE;
}
MMPLAYER_RETURN_VAL_IF_FAIL(player, FALSE);
LOGD("app-src: seek subtitle data\n");
+ MMPLAYER_MEDIA_STREAM_CALLBACK_LOCK(player);
if (player->media_stream_seek_data_cb[type])
player->media_stream_seek_data_cb[type](type, position, player->buffer_cb_user_param);
+ MMPLAYER_MEDIA_STREAM_CALLBACK_UNLOCK(player);
return TRUE;
}