| OLD | NEW |
| 1 /* | 1 /* |
| 2 * libjingle | 2 * libjingle |
| 3 * Copyright 2004 Google Inc. | 3 * Copyright 2004 Google Inc. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions are met: | 6 * modification, are permitted provided that the following conditions are met: |
| 7 * | 7 * |
| 8 * 1. Redistributions of source code must retain the above copyright notice, | 8 * 1. Redistributions of source code must retain the above copyright notice, |
| 9 * this list of conditions and the following disclaimer. | 9 * this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright notice, | 10 * 2. Redistributions in binary form must reproduce the above copyright notice, |
| (...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 316 tc->SignalReadyToSend.disconnect(this); | 316 tc->SignalReadyToSend.disconnect(this); |
| 317 } | 317 } |
| 318 | 318 |
| 319 bool BaseChannel::Enable(bool enable) { | 319 bool BaseChannel::Enable(bool enable) { |
| 320 worker_thread_->Invoke<void>(Bind( | 320 worker_thread_->Invoke<void>(Bind( |
| 321 enable ? &BaseChannel::EnableMedia_w : &BaseChannel::DisableMedia_w, | 321 enable ? &BaseChannel::EnableMedia_w : &BaseChannel::DisableMedia_w, |
| 322 this)); | 322 this)); |
| 323 return true; | 323 return true; |
| 324 } | 324 } |
| 325 | 325 |
| 326 bool BaseChannel::MuteStream(uint32 ssrc, bool mute) { | |
| 327 return InvokeOnWorker(Bind(&BaseChannel::MuteStream_w, this, ssrc, mute)); | |
| 328 } | |
| 329 | |
| 330 bool BaseChannel::IsStreamMuted(uint32 ssrc) { | |
| 331 return InvokeOnWorker(Bind(&BaseChannel::IsStreamMuted_w, this, ssrc)); | |
| 332 } | |
| 333 | |
| 334 bool BaseChannel::AddRecvStream(const StreamParams& sp) { | 326 bool BaseChannel::AddRecvStream(const StreamParams& sp) { |
| 335 return InvokeOnWorker(Bind(&BaseChannel::AddRecvStream_w, this, sp)); | 327 return InvokeOnWorker(Bind(&BaseChannel::AddRecvStream_w, this, sp)); |
| 336 } | 328 } |
| 337 | 329 |
| 338 bool BaseChannel::RemoveRecvStream(uint32 ssrc) { | 330 bool BaseChannel::RemoveRecvStream(uint32 ssrc) { |
| 339 return InvokeOnWorker(Bind(&BaseChannel::RemoveRecvStream_w, this, ssrc)); | 331 return InvokeOnWorker(Bind(&BaseChannel::RemoveRecvStream_w, this, ssrc)); |
| 340 } | 332 } |
| 341 | 333 |
| 342 bool BaseChannel::AddSendStream(const StreamParams& sp) { | 334 bool BaseChannel::AddSendStream(const StreamParams& sp) { |
| 343 return InvokeOnWorker( | 335 return InvokeOnWorker( |
| (...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 717 void BaseChannel::DisableMedia_w() { | 709 void BaseChannel::DisableMedia_w() { |
| 718 ASSERT(worker_thread_ == rtc::Thread::Current()); | 710 ASSERT(worker_thread_ == rtc::Thread::Current()); |
| 719 if (!enabled_) | 711 if (!enabled_) |
| 720 return; | 712 return; |
| 721 | 713 |
| 722 LOG(LS_INFO) << "Channel disabled"; | 714 LOG(LS_INFO) << "Channel disabled"; |
| 723 enabled_ = false; | 715 enabled_ = false; |
| 724 ChangeState(); | 716 ChangeState(); |
| 725 } | 717 } |
| 726 | 718 |
| 727 bool BaseChannel::MuteStream_w(uint32 ssrc, bool mute) { | |
| 728 ASSERT(worker_thread_ == rtc::Thread::Current()); | |
| 729 bool ret = media_channel()->MuteStream(ssrc, mute); | |
| 730 if (ret) { | |
| 731 if (mute) | |
| 732 muted_streams_.insert(ssrc); | |
| 733 else | |
| 734 muted_streams_.erase(ssrc); | |
| 735 } | |
| 736 return ret; | |
| 737 } | |
| 738 | |
| 739 bool BaseChannel::IsStreamMuted_w(uint32 ssrc) { | |
| 740 ASSERT(worker_thread_ == rtc::Thread::Current()); | |
| 741 return muted_streams_.find(ssrc) != muted_streams_.end(); | |
| 742 } | |
| 743 | |
| 744 void BaseChannel::ChannelWritable_w() { | 719 void BaseChannel::ChannelWritable_w() { |
| 745 ASSERT(worker_thread_ == rtc::Thread::Current()); | 720 ASSERT(worker_thread_ == rtc::Thread::Current()); |
| 746 if (writable_) | 721 if (writable_) |
| 747 return; | 722 return; |
| 748 | 723 |
| 749 LOG(LS_INFO) << "Channel socket writable (" | 724 LOG(LS_INFO) << "Channel socket writable (" |
| 750 << transport_channel_->content_name() << ", " | 725 << transport_channel_->content_name() << ", " |
| 751 << transport_channel_->component() << ")" | 726 << transport_channel_->component() << ")" |
| 752 << (was_ever_writable_ ? "" : " for the first time"); | 727 << (was_ever_writable_ ? "" : " for the first time"); |
| 753 | 728 |
| (...skipping 534 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1288 bool VoiceChannel::SetRemoteRenderer(uint32 ssrc, AudioRenderer* renderer) { | 1263 bool VoiceChannel::SetRemoteRenderer(uint32 ssrc, AudioRenderer* renderer) { |
| 1289 return InvokeOnWorker(Bind(&VoiceMediaChannel::SetRemoteRenderer, | 1264 return InvokeOnWorker(Bind(&VoiceMediaChannel::SetRemoteRenderer, |
| 1290 media_channel(), ssrc, renderer)); | 1265 media_channel(), ssrc, renderer)); |
| 1291 } | 1266 } |
| 1292 | 1267 |
| 1293 bool VoiceChannel::SetLocalRenderer(uint32 ssrc, AudioRenderer* renderer) { | 1268 bool VoiceChannel::SetLocalRenderer(uint32 ssrc, AudioRenderer* renderer) { |
| 1294 return InvokeOnWorker(Bind(&VoiceMediaChannel::SetLocalRenderer, | 1269 return InvokeOnWorker(Bind(&VoiceMediaChannel::SetLocalRenderer, |
| 1295 media_channel(), ssrc, renderer)); | 1270 media_channel(), ssrc, renderer)); |
| 1296 } | 1271 } |
| 1297 | 1272 |
| 1273 bool VoiceChannel::MuteStream(uint32 ssrc, bool mute, |
| 1274 const AudioOptions* options) { |
| 1275 return InvokeOnWorker( |
| 1276 Bind(&VoiceChannel::MuteStream_w, this, ssrc, mute, options)); |
| 1277 } |
| 1278 |
| 1279 bool VoiceChannel::IsStreamMuted(uint32 ssrc) { |
| 1280 return InvokeOnWorker(Bind(&VoiceChannel::IsStreamMuted_w, this, ssrc)); |
| 1281 } |
| 1282 |
| 1298 bool VoiceChannel::SetRingbackTone(const void* buf, int len) { | 1283 bool VoiceChannel::SetRingbackTone(const void* buf, int len) { |
| 1299 return InvokeOnWorker(Bind(&VoiceChannel::SetRingbackTone_w, this, buf, len)); | 1284 return InvokeOnWorker(Bind(&VoiceChannel::SetRingbackTone_w, this, buf, len)); |
| 1300 } | 1285 } |
| 1301 | 1286 |
| 1302 // TODO(juberti): Handle early media the right way. We should get an explicit | 1287 // TODO(juberti): Handle early media the right way. We should get an explicit |
| 1303 // ringing message telling us to start playing local ringback, which we cancel | 1288 // ringing message telling us to start playing local ringback, which we cancel |
| 1304 // if any early media actually arrives. For now, we do the opposite, which is | 1289 // if any early media actually arrives. For now, we do the opposite, which is |
| 1305 // to wait 1 second for early media, and start playing local ringback if none | 1290 // to wait 1 second for early media, and start playing local ringback if none |
| 1306 // arrives. | 1291 // arrives. |
| 1307 void VoiceChannel::SetEarlyMedia(bool enable) { | 1292 void VoiceChannel::SetEarlyMedia(bool enable) { |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1390 } | 1375 } |
| 1391 | 1376 |
| 1392 void VoiceChannel::StopTypingMonitor() { | 1377 void VoiceChannel::StopTypingMonitor() { |
| 1393 typing_monitor_.reset(); | 1378 typing_monitor_.reset(); |
| 1394 } | 1379 } |
| 1395 | 1380 |
| 1396 bool VoiceChannel::IsTypingMonitorRunning() const { | 1381 bool VoiceChannel::IsTypingMonitorRunning() const { |
| 1397 return typing_monitor_; | 1382 return typing_monitor_; |
| 1398 } | 1383 } |
| 1399 | 1384 |
| 1400 bool VoiceChannel::MuteStream_w(uint32 ssrc, bool mute) { | 1385 bool VoiceChannel::MuteStream_w(uint32 ssrc, bool mute, |
| 1401 bool ret = BaseChannel::MuteStream_w(ssrc, mute); | 1386 const AudioOptions* options) { |
| 1402 if (typing_monitor_ && mute) | 1387 ASSERT(worker_thread()->IsCurrent()); |
| 1388 bool ret = media_channel()->MuteStream(ssrc, mute, options); |
| 1389 if (ret) { |
| 1390 if (mute) |
| 1391 muted_streams_.insert(ssrc); |
| 1392 else |
| 1393 muted_streams_.erase(ssrc); |
| 1394 } |
| 1395 if (typing_monitor_ && mute) { |
| 1403 typing_monitor_->OnChannelMuted(); | 1396 typing_monitor_->OnChannelMuted(); |
| 1397 } |
| 1404 return ret; | 1398 return ret; |
| 1405 } | 1399 } |
| 1406 | 1400 |
| 1401 bool VoiceChannel::IsStreamMuted_w(uint32 ssrc) { |
| 1402 ASSERT(worker_thread()->IsCurrent()); |
| 1403 return muted_streams_.find(ssrc) != muted_streams_.end(); |
| 1404 } |
| 1405 |
| 1407 int VoiceChannel::GetInputLevel_w() { | 1406 int VoiceChannel::GetInputLevel_w() { |
| 1408 return media_engine_->GetInputLevel(); | 1407 return media_engine_->GetInputLevel(); |
| 1409 } | 1408 } |
| 1410 | 1409 |
| 1411 int VoiceChannel::GetOutputLevel_w() { | 1410 int VoiceChannel::GetOutputLevel_w() { |
| 1412 return media_channel()->GetOutputLevel(); | 1411 return media_channel()->GetOutputLevel(); |
| 1413 } | 1412 } |
| 1414 | 1413 |
| 1415 void VoiceChannel::GetActiveStreams_w(AudioInfo::StreamList* actives) { | 1414 void VoiceChannel::GetActiveStreams_w(AudioInfo::StreamList* actives) { |
| 1416 media_channel()->GetActiveStreams(actives); | 1415 media_channel()->GetActiveStreams(actives); |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1574 | 1573 |
| 1575 bool VoiceChannel::InsertDtmf_w(uint32 ssrc, int event, int duration, | 1574 bool VoiceChannel::InsertDtmf_w(uint32 ssrc, int event, int duration, |
| 1576 int flags) { | 1575 int flags) { |
| 1577 if (!enabled()) { | 1576 if (!enabled()) { |
| 1578 return false; | 1577 return false; |
| 1579 } | 1578 } |
| 1580 | 1579 |
| 1581 return media_channel()->InsertDtmf(ssrc, event, duration, flags); | 1580 return media_channel()->InsertDtmf(ssrc, event, duration, flags); |
| 1582 } | 1581 } |
| 1583 | 1582 |
| 1584 bool VoiceChannel::SetChannelOptions(const AudioOptions& options) { | |
| 1585 return InvokeOnWorker(Bind(&VoiceMediaChannel::SetOptions, | |
| 1586 media_channel(), options)); | |
| 1587 } | |
| 1588 | |
| 1589 void VoiceChannel::OnMessage(rtc::Message *pmsg) { | 1583 void VoiceChannel::OnMessage(rtc::Message *pmsg) { |
| 1590 switch (pmsg->message_id) { | 1584 switch (pmsg->message_id) { |
| 1591 case MSG_EARLYMEDIATIMEOUT: | 1585 case MSG_EARLYMEDIATIMEOUT: |
| 1592 HandleEarlyMediaTimeout(); | 1586 HandleEarlyMediaTimeout(); |
| 1593 break; | 1587 break; |
| 1594 case MSG_CHANNEL_ERROR: { | 1588 case MSG_CHANNEL_ERROR: { |
| 1595 VoiceChannelErrorMessageData* data = | 1589 VoiceChannelErrorMessageData* data = |
| 1596 static_cast<VoiceChannelErrorMessageData*>(pmsg->pdata); | 1590 static_cast<VoiceChannelErrorMessageData*>(pmsg->pdata); |
| 1597 SignalMediaError(this, data->ssrc, data->error); | 1591 SignalMediaError(this, data->ssrc, data->error); |
| 1598 delete data; | 1592 delete data; |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1749 &VideoMediaChannel::SendIntraFrame, media_channel())); | 1743 &VideoMediaChannel::SendIntraFrame, media_channel())); |
| 1750 return true; | 1744 return true; |
| 1751 } | 1745 } |
| 1752 | 1746 |
| 1753 bool VideoChannel::RequestIntraFrame() { | 1747 bool VideoChannel::RequestIntraFrame() { |
| 1754 worker_thread()->Invoke<void>(Bind( | 1748 worker_thread()->Invoke<void>(Bind( |
| 1755 &VideoMediaChannel::RequestIntraFrame, media_channel())); | 1749 &VideoMediaChannel::RequestIntraFrame, media_channel())); |
| 1756 return true; | 1750 return true; |
| 1757 } | 1751 } |
| 1758 | 1752 |
| 1753 bool VideoChannel::MuteStream(uint32 ssrc, bool mute, |
| 1754 const VideoOptions* options) { |
| 1755 return InvokeOnWorker( |
| 1756 Bind(&VideoChannel::MuteStream_w, this, ssrc, mute, options)); |
| 1757 } |
| 1758 |
| 1759 void VideoChannel::ChangeState() { | 1759 void VideoChannel::ChangeState() { |
| 1760 // Render incoming data if we're the active call, and we have the local | 1760 // Render incoming data if we're the active call, and we have the local |
| 1761 // content. We receive data on the default channel and multiplexed streams. | 1761 // content. We receive data on the default channel and multiplexed streams. |
| 1762 bool recv = IsReadyToReceive(); | 1762 bool recv = IsReadyToReceive(); |
| 1763 if (!media_channel()->SetRender(recv)) { | 1763 if (!media_channel()->SetRender(recv)) { |
| 1764 LOG(LS_ERROR) << "Failed to SetRender on video channel"; | 1764 LOG(LS_ERROR) << "Failed to SetRender on video channel"; |
| 1765 // TODO(gangji): Report error back to server. | 1765 // TODO(gangji): Report error back to server. |
| 1766 } | 1766 } |
| 1767 | 1767 |
| 1768 // Send outgoing data if we're the active call, we have the remote content, | 1768 // Send outgoing data if we're the active call, we have the remote content, |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1966 data->fps = VideoFormat::IntervalToFps(video_format->interval); | 1966 data->fps = VideoFormat::IntervalToFps(video_format->interval); |
| 1967 data->screencast_max_pixels = capturer->screencast_max_pixels(); | 1967 data->screencast_max_pixels = capturer->screencast_max_pixels(); |
| 1968 } | 1968 } |
| 1969 | 1969 |
| 1970 void VideoChannel::OnScreencastWindowEvent_s(uint32 ssrc, | 1970 void VideoChannel::OnScreencastWindowEvent_s(uint32 ssrc, |
| 1971 rtc::WindowEvent we) { | 1971 rtc::WindowEvent we) { |
| 1972 ASSERT(signaling_thread() == rtc::Thread::Current()); | 1972 ASSERT(signaling_thread() == rtc::Thread::Current()); |
| 1973 SignalScreencastWindowEvent(ssrc, we); | 1973 SignalScreencastWindowEvent(ssrc, we); |
| 1974 } | 1974 } |
| 1975 | 1975 |
| 1976 bool VideoChannel::SetChannelOptions(const VideoOptions &options) { | |
| 1977 return InvokeOnWorker(Bind(&VideoMediaChannel::SetOptions, | |
| 1978 media_channel(), options)); | |
| 1979 } | |
| 1980 | |
| 1981 void VideoChannel::OnMessage(rtc::Message *pmsg) { | 1976 void VideoChannel::OnMessage(rtc::Message *pmsg) { |
| 1982 switch (pmsg->message_id) { | 1977 switch (pmsg->message_id) { |
| 1983 case MSG_SCREENCASTWINDOWEVENT: { | 1978 case MSG_SCREENCASTWINDOWEVENT: { |
| 1984 const ScreencastEventMessageData* data = | 1979 const ScreencastEventMessageData* data = |
| 1985 static_cast<ScreencastEventMessageData*>(pmsg->pdata); | 1980 static_cast<ScreencastEventMessageData*>(pmsg->pdata); |
| 1986 OnScreencastWindowEvent_s(data->ssrc, data->event); | 1981 OnScreencastWindowEvent_s(data->ssrc, data->event); |
| 1987 delete data; | 1982 delete data; |
| 1988 break; | 1983 break; |
| 1989 } | 1984 } |
| 1990 case MSG_CHANNEL_ERROR: { | 1985 case MSG_CHANNEL_ERROR: { |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2080 ASSERT(mode == SrtpFilter::UNPROTECT); | 2075 ASSERT(mode == SrtpFilter::UNPROTECT); |
| 2081 // TODO(gangji): Turn on the signaling of replay error once we have | 2076 // TODO(gangji): Turn on the signaling of replay error once we have |
| 2082 // switched to the new mechanism for doing video retransmissions. | 2077 // switched to the new mechanism for doing video retransmissions. |
| 2083 // OnVideoChannelError(ssrc, VideoMediaChannel::ERROR_PLAY_SRTP_REPLAY); | 2078 // OnVideoChannelError(ssrc, VideoMediaChannel::ERROR_PLAY_SRTP_REPLAY); |
| 2084 break; | 2079 break; |
| 2085 default: | 2080 default: |
| 2086 break; | 2081 break; |
| 2087 } | 2082 } |
| 2088 } | 2083 } |
| 2089 | 2084 |
| 2090 | |
| 2091 void VideoChannel::GetSrtpCiphers(std::vector<std::string>* ciphers) const { | 2085 void VideoChannel::GetSrtpCiphers(std::vector<std::string>* ciphers) const { |
| 2092 GetSupportedVideoCryptoSuites(ciphers); | 2086 GetSupportedVideoCryptoSuites(ciphers); |
| 2093 } | 2087 } |
| 2094 | 2088 |
| 2089 bool VideoChannel::MuteStream_w(uint32 ssrc, bool mute, |
| 2090 const VideoOptions* options) { |
| 2091 ASSERT(worker_thread()->IsCurrent()); |
| 2092 return media_channel()->MuteStream(ssrc, mute, options); |
| 2093 } |
| 2094 |
| 2095 DataChannel::DataChannel(rtc::Thread* thread, | 2095 DataChannel::DataChannel(rtc::Thread* thread, |
| 2096 DataMediaChannel* media_channel, | 2096 DataMediaChannel* media_channel, |
| 2097 BaseSession* session, | 2097 BaseSession* session, |
| 2098 const std::string& content_name, | 2098 const std::string& content_name, |
| 2099 bool rtcp) | 2099 bool rtcp) |
| 2100 : BaseChannel(thread, media_channel, session, content_name, rtcp), | 2100 : BaseChannel(thread, media_channel, session, content_name, rtcp), |
| 2101 data_channel_type_(cricket::DCT_NONE), | 2101 data_channel_type_(cricket::DCT_NONE), |
| 2102 ready_to_send_data_(false) { | 2102 ready_to_send_data_(false) { |
| 2103 } | 2103 } |
| 2104 | 2104 |
| (...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2428 return (data_channel_type_ == DCT_RTP); | 2428 return (data_channel_type_ == DCT_RTP); |
| 2429 } | 2429 } |
| 2430 | 2430 |
| 2431 void DataChannel::OnStreamClosedRemotely(uint32 sid) { | 2431 void DataChannel::OnStreamClosedRemotely(uint32 sid) { |
| 2432 rtc::TypedMessageData<uint32>* message = | 2432 rtc::TypedMessageData<uint32>* message = |
| 2433 new rtc::TypedMessageData<uint32>(sid); | 2433 new rtc::TypedMessageData<uint32>(sid); |
| 2434 signaling_thread()->Post(this, MSG_STREAMCLOSEDREMOTELY, message); | 2434 signaling_thread()->Post(this, MSG_STREAMCLOSEDREMOTELY, message); |
| 2435 } | 2435 } |
| 2436 | 2436 |
| 2437 } // namespace cricket | 2437 } // namespace cricket |
| OLD | NEW |