return TRUE;
}
-static void
-__gst_appsrc_feed_data(GstElement *element, guint size, gpointer user_data) // @
-{
- mm_player_t *player = (mm_player_t*)user_data;
- MMPlayerStreamType type = MM_PLAYER_STREAM_TYPE_DEFAULT;
- guint64 current_level_bytes = 0;
- MMPLAYER_RETURN_IF_FAIL(player);
-
- 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
-__gst_appsrc_seek_data(GstElement *element, guint64 offset, gpointer user_data) // @
-{
- mm_player_t *player = (mm_player_t*)user_data;
- MMPlayerStreamType type = MM_PLAYER_STREAM_TYPE_DEFAULT;
-
- 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;
-}
-
-
-static gboolean
-__gst_appsrc_enough_data(GstElement *element, gpointer user_data) // @
-{
- mm_player_t *player = (mm_player_t*)user_data;
- MMPlayerStreamType type = MM_PLAYER_STREAM_TYPE_DEFAULT;
- guint64 current_level_bytes = 0;
-
- MMPLAYER_RETURN_VAL_IF_FAIL(player, FALSE);
-
- 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;
-}
-
-int
-_mmplayer_push_buffer(MMHandleType hplayer, unsigned char *buf, int size) // @
-{
- mm_player_t* player = (mm_player_t*)hplayer;
- GstBuffer *buffer = NULL;
- GstFlowReturn gst_ret = GST_FLOW_OK;
- int ret = MM_ERROR_NONE;
-// gint len = size;
-
- MMPLAYER_FENTER();
-
- MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
-
- /* check current state */
-// MMPLAYER_CHECK_STATE(player, MMPLAYER_COMMAND_START);
-
-
- /* NOTE : we should check and create pipeline again if not created as we destroy
- * whole pipeline when stopping in streamming playback
- */
- if (!player->pipeline) {
- if (MM_ERROR_NONE != __gst_realize(player)) {
- LOGE("failed to realize before starting. only in streamming\n");
- return MM_ERROR_PLAYER_INTERNAL;
- }
- }
-
- LOGI("app-src: pushing data\n");
-
- if (buf == NULL) {
- LOGE("buf is null\n");
- return MM_ERROR_NONE;
- }
-
- buffer = gst_buffer_new();
-
- if (size <= 0) {
- LOGD("call eos appsrc\n");
- g_signal_emit_by_name(player->pipeline->mainbin[MMPLAYER_M_SRC].gst, "end-of-stream", &gst_ret);
- return MM_ERROR_NONE;
- }
-
- //gst_buffer_insert_memory(buffer, -1, gst_memory_new_wrapped(0, (guint8 *)(buf->buf + buf->offset), len, 0, len, (guint8*)(buf->buf + buf->offset), g_free));
-
- LOGD("feed buffer %p, length %u\n", buf, size);
- g_signal_emit_by_name(player->pipeline->mainbin[MMPLAYER_M_SRC].gst, "push-buffer", buffer, &gst_ret);
-
- MMPLAYER_FLEAVE();
-
- return ret;
-}
-
static GstBusSyncReply
__mmplayer_bus_sync_callback(GstBus * bus, GstMessage * message, gpointer data)
{
g_object_set(G_OBJECT(element), "timeout", http_timeout, NULL);
}
break;
-
- /* appsrc */
- case MM_PLAYER_URI_TYPE_BUFF:
- {
- guint64 stream_type = GST_APP_STREAM_TYPE_STREAM;
-
- LOGD("mem src is selected\n");
-
- element = gst_element_factory_make("appsrc", "buff-source");
- if (!element) {
- LOGE("failed to create appsrc element\n");
- break;
- }
-
- g_object_set(element, "stream-type", stream_type, NULL);
- //g_object_set(element, "size", player->mem_buf.len, NULL);
- //g_object_set(element, "blocksize", (guint64)20480, NULL);
-
- MMPLAYER_SIGNAL_CONNECT(player, element, MM_PLAYER_SIGNAL_TYPE_OTHERS, "seek-data",
- G_CALLBACK(__gst_appsrc_seek_data), player);
- MMPLAYER_SIGNAL_CONNECT(player, element, MM_PLAYER_SIGNAL_TYPE_OTHERS, "need-data",
- G_CALLBACK(__gst_appsrc_feed_data), player);
- MMPLAYER_SIGNAL_CONNECT(player, element, MM_PLAYER_SIGNAL_TYPE_OTHERS, "enough-data",
- G_CALLBACK(__gst_appsrc_enough_data), player);
- }
- break;
case MM_PLAYER_URI_TYPE_MS_BUFF:
{
LOGD("MS buff src is selected\n");
gboolean rewind = FALSE;
gint timeout = 0;
int ret = MM_ERROR_NONE;
- GstState state;
gboolean async = FALSE;
MMPLAYER_FENTER();
/* Just set state to PAUESED and the rewind. it's usual player behavior. */
timeout = MMPLAYER_STATE_CHANGE_TIMEOUT(player);
- if (player->profile.uri_type == MM_PLAYER_URI_TYPE_BUFF) {
- state = GST_STATE_READY;
- } else {
- state = GST_STATE_PAUSED;
-
- if (!MMPLAYER_IS_STREAMING(player) ||
- (player->streaming_type == STREAMING_SERVICE_VOD && player->videodec_linked))
- rewind = TRUE;
- }
+ if ((!MMPLAYER_IS_STREAMING(player) && !MMPLAYER_IS_MS_BUFF_SRC(player)) ||
+ (player->streaming_type == STREAMING_SERVICE_VOD && player->videodec_linked))
+ rewind = TRUE;
if (player->es_player_push_mode)
async = TRUE;
/* set gst state */
- ret = __mmplayer_gst_set_state(player, player->pipeline->mainbin[MMPLAYER_M_PIPE].gst, state, async, timeout);
+ ret = __mmplayer_gst_set_state(player, player->pipeline->mainbin[MMPLAYER_M_PIPE].gst, GST_STATE_PAUSED, async, timeout);
/* disable fadeout */
if (fadedown || player->sound_focus.by_asm_cb)
data->uri_type = MM_PLAYER_URI_TYPE_MS_BUFF;
ret = MM_ERROR_NONE;
}
- } else if ((path = strstr(uri, "buff://"))) {
- data->uri_type = MM_PLAYER_URI_TYPE_BUFF;
- ret = MM_ERROR_NONE;
} else if ((path = strstr(uri, "rtsp://"))) {
if (strlen(path)) {
if ((path = strstr(uri, "/wfd1.0/"))) {