Changeset 209125 in webkit
- Timestamp:
- Nov 30, 2016 12:36:45 AM (7 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r209124 r209125 1 2016-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 1 17 2016-11-29 Claudio Saavedra <csaavedra@igalia.com> 2 18 -
trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerOwr.cpp
r208943 r209125 74 74 GST_DEBUG("Connecting to live stream, descriptor: %p", m_streamPrivate.get()); 75 75 76 if (m_videoTrack) 77 maybeHandleChangeMutedState(*m_videoTrack.get()); 78 79 if (m_audioTrack) 80 maybeHandleChangeMutedState(*m_audioTrack.get()); 81 } 82 83 void MediaPlayerPrivateGStreamerOwr::pause() 84 { 85 GST_DEBUG("Pause"); 86 m_paused = true; 87 stop(); 88 } 89 90 bool MediaPlayerPrivateGStreamerOwr::hasVideo() const 91 { 92 return m_videoTrack; 93 } 94 95 bool MediaPlayerPrivateGStreamerOwr::hasAudio() const 96 { 97 return m_audioTrack; 98 } 99 100 void 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 112 void 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 126 float 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 146 void 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) 154 void 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 162 void 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 76 186 for (auto track : m_streamPrivate->tracks()) { 77 187 if (!track->enabled()) { … … 80 190 } 81 191 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. 196 197 197 198 switch (track->type()) { 198 199 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 } 200 207 break; 201 208 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 } 203 216 break; 204 217 case RealtimeMediaSource::None: 205 218 GST_WARNING("Loading a track with None type"); 206 219 } 220 221 if (observeTrack) 222 track->addObserver(*this); 207 223 } 208 224
Note: See TracChangeset
for help on using the changeset viewer.