[Webkit-unassigned] [Bug 30004] [GStreamer] Should handle BUFFERING messages
bugzilla-daemon at webkit.org
bugzilla-daemon at webkit.org
Fri Jan 22 02:06:21 PST 2010
https://bugs.webkit.org/show_bug.cgi?id=30004
--- Comment #17 from Xan Lopez <xan.lopez at gmail.com> 2010-01-22 02:06:21 PST ---
(From update of attachment 46262)
Just a few nitpicks on top of gustavo's comments.
>+#include <glib/gstdio.h>
You should not include anything other than the toplevel glib header.
> #include <gst/gst.h>
> #include <gst/interfaces/mixer.h>
> #include <gst/interfaces/xoverlay.h>
>@@ -48,6 +49,18 @@
> #include <math.h>
> #include <wtf/gtk/GOwnPtr.h>
>
I have been informed that this stuff is not public and that you have to copy it
like this in order to use it, but a comment saying just that would be good
IMHO.
>+// GstPlayFlags flags from playbin2
>+typedef enum {
>+ GST_PLAY_FLAG_VIDEO = 0x01,
>+ GST_PLAY_FLAG_AUDIO = 0x02,
>+ GST_PLAY_FLAG_TEXT = 0x04,
>+ GST_PLAY_FLAG_VIS = 0x08,
>+ GST_PLAY_FLAG_SOFT_VOLUME = 0x10,
>+ GST_PLAY_FLAG_NATIVE_AUDIO = 0x20,
>+ GST_PLAY_FLAG_NATIVE_VIDEO = 0x40,
>+ GST_PLAY_FLAG_DOWNLOAD = 0x80
>+} GstPlayFlags;
>+
>+void MediaPlayerPrivate::processBufferingStats(GstMessage* message)
>+{
>+ GstBufferingMode mode;
>+
>+ gst_message_parse_buffering_stats(message, &mode, 0, 0, 0);
>+ if (mode != GST_BUFFERING_DOWNLOAD)
>+ return;
>+
>+ if (!m_startedBuffering) {
>+ m_startedBuffering = true;
>+
>+ if (m_fillTimeoutId > 0) {
>+ g_source_remove(m_fillTimeoutId);
>+ m_fillTimeoutId = 0;
I guess there's really no need to set the id to anything if you are going to
write over it in the next line.
>+ }
>+
>+ m_fillTimeoutId = g_timeout_add(200, (GSourceFunc) bufferingTimeoutCallback, this);
>+ }
>+}
>+
>+bool MediaPlayerPrivate::queryBufferingStats()
>+{
>+ GstQuery* query = gst_query_new_buffering(GST_FORMAT_PERCENT);
>+
>+ if (gst_element_query(m_playBin, query)) {
>+ gint64 start, stop;
>+ gdouble fillStatus;
>+
>+ gst_query_parse_buffering_range(query, 0, &start, &stop, 0);
>+
>+ if (stop != -1)
>+ fillStatus = 100.0 * stop / GST_FORMAT_PERCENT_MAX;
>+ else
>+ fillStatus = 100.0;
>+
>+ LOG_VERBOSE(Media, "Download buffer filled up to %f%%", fillStatus);
>+
>+ // Update maxTimeLoaded only if the media duration is
>+ // available. Otherwise we can't compute it.
>+ if (!m_mediaDuration) {
>+ float newDuration = duration();
>+ if (!isinf(newDuration)) {
>+ m_mediaDuration = newDuration;
>+ durationChanged();
>+ }
>+ }
>+
>+ if (m_mediaDuration) {
>+ m_maxTimeLoaded = static_cast<float>((fillStatus * m_mediaDuration) / 100.0);
>+ LOG_VERBOSE(Media, "Updated maxTimeLoaded: %f", m_maxTimeLoaded);
>+ }
>+
>+ if (fillStatus == 100.0) {
>+ // Buffering is done, remove the fill source from the main loop.
>+ m_fillTimeoutId = 0;
Unless I'm missing something you are not actually removing any source here.
>+ gst_query_unref(query);
>+
>+ // Media is now fully loaded. It will play even if network
>+ // connection is cut.
>+ m_networkState = MediaPlayer::Loaded;
>+ m_player->networkStateChanged();
>+
>+ return FALSE;
>+ }
>+
>+ if ((fillStatus > 0) && (m_readyState < MediaPlayer::HaveFutureData)) {
>+ // Buffering started, we should now have enough data to
>+ // start playback if it was requested.
>+ m_readyState = MediaPlayer::HaveFutureData;
>+ m_player->readyStateChanged();
>+ if (m_paused && m_playRequired) {
>+ m_playRequired = false;
>+ gst_element_set_state(m_playBin, GST_STATE_PLAYING);
>+ }
>+ }
>+ }
>+
>+ gst_query_unref(query);
>+ return TRUE;
>+}
>+
--
Configure bugmail: https://bugs.webkit.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.
More information about the webkit-unassigned
mailing list