📄 mediaplayerprivategstreamer.cpp
字号:
}void MediaPlayerPrivate::setVolume(float volume){ m_volume = volume; LOG_VERBOSE(Media, "Volume to %f", volume); setMuted(false);}void MediaPlayerPrivate::setMuted(bool b){ if (!m_playBin) return; if (b) { g_object_get(G_OBJECT(m_playBin), "volume", &m_volume, NULL); g_object_set(G_OBJECT(m_playBin), "volume", (double)0.0, NULL); } else { g_object_set(G_OBJECT(m_playBin), "volume", m_volume, NULL); }}void MediaPlayerPrivate::setRate(float rate){ if (rate == 0.0) { gst_element_set_state(m_playBin, GST_STATE_PAUSED); return; } if (m_isStreaming) return; m_rate = rate; LOG_VERBOSE(Media, "Set Rate to %f", rate); if (!gst_element_seek(m_playBin, rate, GST_FORMAT_TIME, (GstSeekFlags)(GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE), GST_SEEK_TYPE_SET, (GstClockTime) (currentTime() * GST_SECOND), GST_SEEK_TYPE_SET, (GstClockTime) (m_endTime * GST_SECOND))) LOG_VERBOSE(Media, "Set Rate to %f failed", rate);}int MediaPlayerPrivate::dataRate() const{ notImplemented(); return 1;}MediaPlayer::NetworkState MediaPlayerPrivate::networkState() const{ return m_networkState;}MediaPlayer::ReadyState MediaPlayerPrivate::readyState() const{ return m_readyState;}float MediaPlayerPrivate::maxTimeBuffered() const{ notImplemented(); LOG_VERBOSE(Media, "maxTimeBuffered"); // rtsp streams are not buffered return m_isStreaming ? 0 : maxTimeLoaded();}float MediaPlayerPrivate::maxTimeSeekable() const{ // TODO LOG_VERBOSE(Media, "maxTimeSeekable"); if (m_isStreaming) return numeric_limits<float>::infinity(); // infinite duration means live stream return maxTimeLoaded();}float MediaPlayerPrivate::maxTimeLoaded() const{ // TODO LOG_VERBOSE(Media, "maxTimeLoaded"); notImplemented(); return duration();}unsigned MediaPlayerPrivate::bytesLoaded() const{ notImplemented(); LOG_VERBOSE(Media, "bytesLoaded"); /*if (!m_playBin) return 0; float dur = duration(); float maxTime = maxTimeLoaded(); if (!dur) return 0;*/ return 1;//totalBytes() * maxTime / dur;}bool MediaPlayerPrivate::totalBytesKnown() const{ notImplemented(); LOG_VERBOSE(Media, "totalBytesKnown"); return totalBytes() > 0;}unsigned MediaPlayerPrivate::totalBytes() const{ notImplemented(); LOG_VERBOSE(Media, "totalBytes"); if (!m_playBin) return 0; if (!m_source) return 0; // Do something with m_source to get the total bytes of the media return 100;}void MediaPlayerPrivate::cancelLoad(){ notImplemented();}void MediaPlayerPrivate::updateStates(){ // There is no (known) way to get such level of information about // the state of GStreamer, therefore, when in PAUSED state, // we are sure we can display the first frame and go to play MediaPlayer::NetworkState oldNetworkState = m_networkState; MediaPlayer::ReadyState oldReadyState = m_readyState; GstState state; GstState pending; if (!m_playBin) return; GstStateChangeReturn ret = gst_element_get_state (m_playBin, &state, &pending, 250 * GST_NSECOND); switch(ret) { case GST_STATE_CHANGE_SUCCESS: LOG_VERBOSE(Media, "State: %s, pending: %s", gst_element_state_get_name(state), gst_element_state_get_name(pending)); if (state == GST_STATE_READY) { m_readyState = MediaPlayer::CanPlayThrough; } else if (state == GST_STATE_PAUSED) { m_readyState = MediaPlayer::CanPlayThrough; } if (m_networkState < MediaPlayer::Loaded) m_networkState = MediaPlayer::Loaded; g_object_get(m_playBin, "source", &m_source, NULL); if (!m_source) LOG_VERBOSE(Media, "m_source is NULL"); break; case GST_STATE_CHANGE_ASYNC: LOG_VERBOSE(Media, "Async: State: %s, pending: %s", gst_element_state_get_name(state), gst_element_state_get_name(pending)); // Change in progress return; break; case GST_STATE_CHANGE_NO_PREROLL: LOG_VERBOSE(Media, "No preroll: State: %s, pending: %s", gst_element_state_get_name(state), gst_element_state_get_name(pending)); if (state == GST_STATE_READY) { m_readyState = MediaPlayer::CanPlay; } else if (state == GST_STATE_PAUSED) { m_readyState = MediaPlayer::CanPlay; } if (m_networkState < MediaPlayer::LoadedMetaData) m_networkState = MediaPlayer::LoadedMetaData; break; default: LOG_VERBOSE(Media, "Else : %d", ret); break; } if (seeking()) m_readyState = MediaPlayer::DataUnavailable; if (m_networkState != oldNetworkState) { LOG_VERBOSE(Media, "Network State Changed from %u to %u", oldNetworkState, m_networkState); m_player->networkStateChanged(); } if (m_readyState != oldReadyState) { LOG_VERBOSE(Media, "Ready State Changed from %u to %u", oldReadyState, m_readyState); m_player->readyStateChanged(); }}void MediaPlayerPrivate::loadStateChanged(){ updateStates();}void MediaPlayerPrivate::rateChanged(){ updateStates();}void MediaPlayerPrivate::sizeChanged(){ notImplemented();}void MediaPlayerPrivate::timeChanged(){ updateStates(); m_player->timeChanged();}void MediaPlayerPrivate::volumeChanged(){ m_player->volumeChanged();}void MediaPlayerPrivate::didEnd(){ m_isEndReached = true; pause(); timeChanged();}void MediaPlayerPrivate::loadingFailed(){ if (m_networkState != MediaPlayer::LoadFailed) { m_networkState = MediaPlayer::LoadFailed; m_player->networkStateChanged(); } if (m_readyState != MediaPlayer::DataUnavailable) { m_readyState = MediaPlayer::DataUnavailable; m_player->readyStateChanged(); }}void MediaPlayerPrivate::setSize(const IntSize& size){ m_size = size;}void MediaPlayerPrivate::setVisible(bool visible){ m_visible = visible;}void MediaPlayerPrivate::repaint(){ m_player->repaint();}void MediaPlayerPrivate::paint(GraphicsContext* context, const IntRect& rect){ if (context->paintingDisabled()) return; if (!m_visible) return; //TODO: m_size vs rect? cairo_t* cr = context->platformContext(); cairo_save(cr); cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); cairo_translate(cr, rect.x(), rect.y()); cairo_rectangle(cr, 0, 0, rect.width(), rect.height()); cairo_set_source_surface(cr, m_surface, 0, 0); cairo_fill(cr); cairo_restore(cr);}void MediaPlayerPrivate::getSupportedTypes(HashSet<String>& types){ // FIXME: query the engine to see what types are supported notImplemented(); types.add(String("video/x-theora+ogg"));}MediaPlayer::SupportsType MediaPlayerPrivate::supportsType(const String& type, const String& codecs){ // FIXME: query the engine to see what types are supported notImplemented(); return type == "video/x-theora+ogg" ? (!codecs.isEmpty() ? MediaPlayer::MayBeSupported : MediaPlayer::IsSupported) : MediaPlayer::IsNotSupported;}void MediaPlayerPrivate::createGSTPlayBin(String url){ ASSERT(!m_playBin); m_playBin = gst_element_factory_make("playbin", "play"); GstBus* bus = gst_pipeline_get_bus(GST_PIPELINE(m_playBin)); gst_bus_add_signal_watch(bus); g_signal_connect(bus, "message::error", G_CALLBACK(mediaPlayerPrivateErrorCallback), this); g_signal_connect(bus, "message::eos", G_CALLBACK(mediaPlayerPrivateEOSCallback), this); g_signal_connect(bus, "message::state-changed", G_CALLBACK(mediaPlayerPrivateStateCallback), this); g_signal_connect(bus, "message::buffering", G_CALLBACK(mediaPlayerPrivateBufferingCallback), this); gst_object_unref(bus); g_object_set(G_OBJECT(m_playBin), "uri", url.utf8().data(), NULL); GstElement* audioSink = gst_element_factory_make("gconfaudiosink", NULL); m_videoSink = webkit_video_sink_new(m_surface); g_object_set(m_playBin, "audio-sink", audioSink, NULL); g_object_set(m_playBin, "video-sink", m_videoSink, NULL); setVolume(m_volume);}}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -