⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mediaplayerprivategstreamer.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
📖 第 1 页 / 共 2 页
字号:
}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 + -