Changeset 209125 in webkit


Ignore:
Timestamp:
Nov 30, 2016 12:36:45 AM (7 years ago)
Author:
Philippe Normand
Message:

[WebRTC][OpenWebRTC] Temporary device selection support
https://bugs.webkit.org/show_bug.cgi?id=165141

Reviewed by Alejandro G. Castro.

Make sure the player handles only one audio and video track at
most for now. The device choice can be influenced with the
WEBKIT_VIDEO_DEVICE and WEBKIT_AUDIO_DEVICE environment variables.
Each variable optionally holds the name of the device to use.

  • platform/graphics/gstreamer/MediaPlayerPrivateGStreamerOwr.cpp:

(WebCore::MediaPlayerPrivateGStreamerOwr::play):
(WebCore::MediaPlayerPrivateGStreamerOwr::load):

Location:
trunk/Source/WebCore
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r209124 r209125  
     12016-11-29  Philippe Normand  <pnormand@igalia.com>
     2
     3        [WebRTC][OpenWebRTC] Temporary device selection support
     4        https://bugs.webkit.org/show_bug.cgi?id=165141
     5
     6        Reviewed by Alejandro G. Castro.
     7
     8        Make sure the player handles only one audio and video track at
     9        most for now. The device choice can be influenced with the
     10        WEBKIT_VIDEO_DEVICE and WEBKIT_AUDIO_DEVICE environment variables.
     11        Each variable optionally holds the name of the device to use.
     12
     13        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamerOwr.cpp:
     14        (WebCore::MediaPlayerPrivateGStreamerOwr::play):
     15        (WebCore::MediaPlayerPrivateGStreamerOwr::load):
     16
    1172016-11-29  Claudio Saavedra  <csaavedra@igalia.com>
    218
  • trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerOwr.cpp

    r208943 r209125  
    7474    GST_DEBUG("Connecting to live stream, descriptor: %p", m_streamPrivate.get());
    7575
     76    if (m_videoTrack)
     77        maybeHandleChangeMutedState(*m_videoTrack.get());
     78
     79    if (m_audioTrack)
     80        maybeHandleChangeMutedState(*m_audioTrack.get());
     81}
     82
     83void MediaPlayerPrivateGStreamerOwr::pause()
     84{
     85    GST_DEBUG("Pause");
     86    m_paused = true;
     87    stop();
     88}
     89
     90bool MediaPlayerPrivateGStreamerOwr::hasVideo() const
     91{
     92    return m_videoTrack;
     93}
     94
     95bool MediaPlayerPrivateGStreamerOwr::hasAudio() const
     96{
     97    return m_audioTrack;
     98}
     99
     100void MediaPlayerPrivateGStreamerOwr::setVolume(float volume)
     101{
     102    if (!m_audioTrack)
     103        return;
     104
     105    auto& realTimeMediaSource = static_cast<RealtimeMediaSourceOwr&>(m_audioTrack->source());
     106    auto mediaSource = OWR_MEDIA_SOURCE(realTimeMediaSource.mediaSource());
     107
     108    GST_DEBUG("Setting volume: %f", volume);
     109    g_object_set(mediaSource, "volume", static_cast<gdouble>(volume), nullptr);
     110}
     111
     112void MediaPlayerPrivateGStreamerOwr::setMuted(bool muted)
     113{
     114    if (!m_audioTrack)
     115        return;
     116
     117    auto& realTimeMediaSource = static_cast<RealtimeMediaSourceOwr&>(m_audioTrack->source());
     118    auto mediaSource = OWR_MEDIA_SOURCE(realTimeMediaSource.mediaSource());
     119    if (!mediaSource)
     120        return;
     121
     122    GST_DEBUG("Setting mute: %s", muted ? "on":"off");
     123    g_object_set(mediaSource, "mute", muted, nullptr);
     124}
     125
     126float MediaPlayerPrivateGStreamerOwr::currentTime() const
     127{
     128    gint64 position = GST_CLOCK_TIME_NONE;
     129    GstQuery* query = gst_query_new_position(GST_FORMAT_TIME);
     130
     131    if (m_videoTrack && gst_element_query(m_videoSink.get(), query))
     132        gst_query_parse_position(query, 0, &position);
     133    else if (m_audioTrack && gst_element_query(m_audioSink.get(), query))
     134        gst_query_parse_position(query, 0, &position);
     135
     136    float result = 0;
     137    if (static_cast<GstClockTime>(position) != GST_CLOCK_TIME_NONE)
     138        result = static_cast<double>(position) / GST_SECOND;
     139
     140    GST_LOG("Position %" GST_TIME_FORMAT, GST_TIME_ARGS(position));
     141    gst_query_unref(query);
     142
     143    return result;
     144}
     145
     146void MediaPlayerPrivateGStreamerOwr::load(const String &)
     147{
     148    // Properly fail so the global MediaPlayer tries to fallback to the next MediaPlayerPrivate.
     149    m_networkState = MediaPlayer::FormatError;
     150    m_player->networkStateChanged();
     151}
     152
     153#if ENABLE(MEDIA_SOURCE)
     154void MediaPlayerPrivateGStreamerOwr::load(const String&, MediaSourcePrivateClient*)
     155{
     156    // Properly fail so the global MediaPlayer tries to fallback to the next MediaPlayerPrivate.
     157    m_networkState = MediaPlayer::FormatError;
     158    m_player->networkStateChanged();
     159}
     160#endif
     161
     162void MediaPlayerPrivateGStreamerOwr::load(MediaStreamPrivate& streamPrivate)
     163{
     164    if (!initializeGStreamer())
     165        return;
     166
     167    m_streamPrivate = &streamPrivate;
     168    if (!m_streamPrivate->active()) {
     169        loadingFailed(MediaPlayer::NetworkError);
     170        return;
     171    }
     172
     173    if (streamPrivate.hasVideo() && !m_videoSink)
     174        createVideoSink();
     175
     176    if (streamPrivate.hasAudio() && !m_audioSink)
     177        createGSTAudioSinkBin();
     178
     179    GST_DEBUG("Loading MediaStreamPrivate %p video: %s, audio: %s", &streamPrivate, streamPrivate.hasVideo() ? "yes":"no", streamPrivate.hasAudio() ? "yes":"no");
     180
     181    m_readyState = MediaPlayer::HaveNothing;
     182    m_networkState = MediaPlayer::Loading;
     183    m_player->networkStateChanged();
     184    m_player->readyStateChanged();
     185
    76186    for (auto track : m_streamPrivate->tracks()) {
    77187        if (!track->enabled()) {
     
    80190        }
    81191
    82         maybeHandleChangeMutedState(*track);
    83     }
    84 }
    85 
    86 void MediaPlayerPrivateGStreamerOwr::pause()
    87 {
    88     GST_DEBUG("Pause");
    89     m_paused = true;
    90     stop();
    91 }
    92 
    93 bool MediaPlayerPrivateGStreamerOwr::hasVideo() const
    94 {
    95     return m_videoTrack;
    96 }
    97 
    98 bool MediaPlayerPrivateGStreamerOwr::hasAudio() const
    99 {
    100     return m_audioTrack;
    101 }
    102 
    103 void MediaPlayerPrivateGStreamerOwr::setVolume(float volume)
    104 {
    105     if (!m_audioTrack)
    106         return;
    107 
    108     auto& realTimeMediaSource = static_cast<RealtimeMediaSourceOwr&>(m_audioTrack->source());
    109     auto mediaSource = OWR_MEDIA_SOURCE(realTimeMediaSource.mediaSource());
    110 
    111     GST_DEBUG("Setting volume: %f", volume);
    112     g_object_set(mediaSource, "volume", static_cast<gdouble>(volume), nullptr);
    113 }
    114 
    115 void MediaPlayerPrivateGStreamerOwr::setMuted(bool muted)
    116 {
    117     if (!m_audioTrack)
    118         return;
    119 
    120     auto& realTimeMediaSource = static_cast<RealtimeMediaSourceOwr&>(m_audioTrack->source());
    121     auto mediaSource = OWR_MEDIA_SOURCE(realTimeMediaSource.mediaSource());
    122     if (!mediaSource)
    123         return;
    124 
    125     GST_DEBUG("Setting mute: %s", muted ? "on":"off");
    126     g_object_set(mediaSource, "mute", muted, nullptr);
    127 }
    128 
    129 float MediaPlayerPrivateGStreamerOwr::currentTime() const
    130 {
    131     gint64 position = GST_CLOCK_TIME_NONE;
    132     GstQuery* query = gst_query_new_position(GST_FORMAT_TIME);
    133 
    134     if (m_videoTrack && gst_element_query(m_videoSink.get(), query))
    135         gst_query_parse_position(query, 0, &position);
    136     else if (m_audioTrack && gst_element_query(m_audioSink.get(), query))
    137         gst_query_parse_position(query, 0, &position);
    138 
    139     float result = 0;
    140     if (static_cast<GstClockTime>(position) != GST_CLOCK_TIME_NONE)
    141         result = static_cast<double>(position) / GST_SECOND;
    142 
    143     GST_LOG("Position %" GST_TIME_FORMAT, GST_TIME_ARGS(position));
    144     gst_query_unref(query);
    145 
    146     return result;
    147 }
    148 
    149 void MediaPlayerPrivateGStreamerOwr::load(const String &)
    150 {
    151     // Properly fail so the global MediaPlayer tries to fallback to the next MediaPlayerPrivate.
    152     m_networkState = MediaPlayer::FormatError;
    153     m_player->networkStateChanged();
    154 }
    155 
    156 #if ENABLE(MEDIA_SOURCE)
    157 void MediaPlayerPrivateGStreamerOwr::load(const String&, MediaSourcePrivateClient*)
    158 {
    159     // Properly fail so the global MediaPlayer tries to fallback to the next MediaPlayerPrivate.
    160     m_networkState = MediaPlayer::FormatError;
    161     m_player->networkStateChanged();
    162 }
    163 #endif
    164 
    165 void MediaPlayerPrivateGStreamerOwr::load(MediaStreamPrivate& streamPrivate)
    166 {
    167     if (!initializeGStreamer())
    168         return;
    169 
    170     m_streamPrivate = &streamPrivate;
    171     if (!m_streamPrivate->active()) {
    172         loadingFailed(MediaPlayer::NetworkError);
    173         return;
    174     }
    175 
    176     if (streamPrivate.hasVideo() && !m_videoSink)
    177         createVideoSink();
    178 
    179     if (streamPrivate.hasAudio() && !m_audioSink)
    180         createGSTAudioSinkBin();
    181 
    182     GST_DEBUG("Loading MediaStreamPrivate %p video: %s, audio: %s", &streamPrivate, streamPrivate.hasVideo() ? "yes":"no", streamPrivate.hasAudio() ? "yes":"no");
    183 
    184     m_readyState = MediaPlayer::HaveNothing;
    185     m_networkState = MediaPlayer::Loading;
    186     m_player->networkStateChanged();
    187     m_player->readyStateChanged();
    188 
    189     for (auto track : m_streamPrivate->tracks()) {
    190         if (!track->enabled()) {
    191             GST_DEBUG("Track %s disabled", track->label().ascii().data());
    192             continue;
    193         }
    194 
    195         track->addObserver(*this);
     192        GST_DEBUG("Processing track %s", track->label().ascii().data());
     193
     194        bool observeTrack = false;
     195
     196        // TODO: Support for multiple tracks of the same type.
    196197
    197198        switch (track->type()) {
    198199        case RealtimeMediaSource::Audio:
    199             m_audioTrack = track;
     200            if (!m_audioTrack) {
     201                String preSelectedDevice = getenv("WEBKIT_AUDIO_DEVICE");
     202                if (!preSelectedDevice || (preSelectedDevice == track->label())) {
     203                    m_audioTrack = track;
     204                    observeTrack = true;
     205                }
     206            }
    200207            break;
    201208        case RealtimeMediaSource::Video:
    202             m_videoTrack = track;
     209            if (!m_videoTrack) {
     210                String preSelectedDevice = getenv("WEBKIT_VIDEO_DEVICE");
     211                if (!preSelectedDevice || (preSelectedDevice == track->label())) {
     212                    m_videoTrack = track;
     213                    observeTrack = true;
     214                }
     215            }
    203216            break;
    204217        case RealtimeMediaSource::None:
    205218            GST_WARNING("Loading a track with None type");
    206219        }
     220
     221        if (observeTrack)
     222            track->addObserver(*this);
    207223    }
    208224
Note: See TracChangeset for help on using the changeset viewer.