Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 980 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 991 { | 991 { |
| 992 rtc::CritScope stream_lock(&stream_crit_); | 992 rtc::CritScope stream_lock(&stream_crit_); |
| 993 for (const auto& kv : send_streams_) { | 993 for (const auto& kv : send_streams_) { |
| 994 kv.second->SetSend(send); | 994 kv.second->SetSend(send); |
| 995 } | 995 } |
| 996 } | 996 } |
| 997 sending_ = send; | 997 sending_ = send; |
| 998 return true; | 998 return true; |
| 999 } | 999 } |
| 1000 | 1000 |
| 1001 bool WebRtcVideoChannel2::SetVideoSend(uint32_t ssrc, bool enable, | 1001 bool WebRtcVideoChannel2::SetVideoSend(uint32_t ssrc, |
| 1002 const VideoOptions* options) { | 1002 bool enable, |
| 1003 const VideoOptions* options, | |
| 1004 VideoCapturer* capturer) { | |
| 1003 TRACE_EVENT0("webrtc", "SetVideoSend"); | 1005 TRACE_EVENT0("webrtc", "SetVideoSend"); |
| 1006 RTC_DCHECK(ssrc != 0); | |
| 1004 LOG(LS_INFO) << "SetVideoSend (ssrc= " << ssrc << ", enable = " << enable | 1007 LOG(LS_INFO) << "SetVideoSend (ssrc= " << ssrc << ", enable = " << enable |
| 1005 << "options: " << (options ? options->ToString() : "nullptr") | 1008 << "options: " << (options ? options->ToString() : "nullptr") |
| 1006 << ")."; | 1009 << ", capturer = " |
| 1010 << (capturer != nullptr ? "(capturer)" : "NULL") << ")"; | |
| 1007 | 1011 |
| 1008 // TODO(solenberg): The state change should be fully rolled back if any one of | 1012 // TODO(solenberg): The state change should be fully rolled back if any one of |
| 1009 // these calls fail. | 1013 // these calls fail. |
| 1010 if (!MuteStream(ssrc, !enable)) { | 1014 rtc::CritScope stream_lock(&stream_crit_); |
| 1015 const auto& kv = send_streams_.find(ssrc); | |
| 1016 if (kv == send_streams_.end()) { | |
| 1017 LOG(LS_ERROR) << "No sending stream on ssrc " << ssrc; | |
| 1011 return false; | 1018 return false; |
| 1012 } | 1019 } |
| 1013 if (enable && options) { | 1020 |
| 1014 SetOptions(ssrc, *options); | 1021 kv->second->SetVideoSend(enable, options, capturer); |
| 1015 } | |
| 1016 return true; | 1022 return true; |
| 1017 } | 1023 } |
| 1018 | 1024 |
| 1019 bool WebRtcVideoChannel2::ValidateSendSsrcAvailability( | 1025 bool WebRtcVideoChannel2::ValidateSendSsrcAvailability( |
| 1020 const StreamParams& sp) const { | 1026 const StreamParams& sp) const { |
| 1021 for (uint32_t ssrc : sp.ssrcs) { | 1027 for (uint32_t ssrc : sp.ssrcs) { |
| 1022 if (send_ssrcs_.find(ssrc) != send_ssrcs_.end()) { | 1028 if (send_ssrcs_.find(ssrc) != send_ssrcs_.end()) { |
| 1023 LOG(LS_ERROR) << "Send stream with SSRC '" << ssrc << "' already exists."; | 1029 LOG(LS_ERROR) << "Send stream with SSRC '" << ssrc << "' already exists."; |
| 1024 return false; | 1030 return false; |
| 1025 } | 1031 } |
| (...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1305 // Get send stream bitrate stats. | 1311 // Get send stream bitrate stats. |
| 1306 rtc::CritScope stream_lock(&stream_crit_); | 1312 rtc::CritScope stream_lock(&stream_crit_); |
| 1307 for (std::map<uint32_t, WebRtcVideoSendStream*>::iterator stream = | 1313 for (std::map<uint32_t, WebRtcVideoSendStream*>::iterator stream = |
| 1308 send_streams_.begin(); | 1314 send_streams_.begin(); |
| 1309 stream != send_streams_.end(); ++stream) { | 1315 stream != send_streams_.end(); ++stream) { |
| 1310 stream->second->FillBandwidthEstimationInfo(&bwe_info); | 1316 stream->second->FillBandwidthEstimationInfo(&bwe_info); |
| 1311 } | 1317 } |
| 1312 video_media_info->bw_estimations.push_back(bwe_info); | 1318 video_media_info->bw_estimations.push_back(bwe_info); |
| 1313 } | 1319 } |
| 1314 | 1320 |
| 1315 bool WebRtcVideoChannel2::SetCapturer(uint32_t ssrc, VideoCapturer* capturer) { | |
| 1316 LOG(LS_INFO) << "SetCapturer: " << ssrc << " -> " | |
| 1317 << (capturer != NULL ? "(capturer)" : "NULL"); | |
| 1318 RTC_DCHECK(ssrc != 0); | |
| 1319 { | |
| 1320 rtc::CritScope stream_lock(&stream_crit_); | |
| 1321 const auto& kv = send_streams_.find(ssrc); | |
| 1322 if (kv == send_streams_.end()) { | |
| 1323 LOG(LS_ERROR) << "No sending stream on ssrc " << ssrc; | |
| 1324 return false; | |
| 1325 } | |
| 1326 if (!kv->second->SetCapturer(capturer)) { | |
| 1327 return false; | |
| 1328 } | |
| 1329 } | |
| 1330 return true; | |
| 1331 } | |
| 1332 | |
| 1333 void WebRtcVideoChannel2::OnPacketReceived( | 1321 void WebRtcVideoChannel2::OnPacketReceived( |
| 1334 rtc::CopyOnWriteBuffer* packet, | 1322 rtc::CopyOnWriteBuffer* packet, |
| 1335 const rtc::PacketTime& packet_time) { | 1323 const rtc::PacketTime& packet_time) { |
| 1336 const webrtc::PacketTime webrtc_packet_time(packet_time.timestamp, | 1324 const webrtc::PacketTime webrtc_packet_time(packet_time.timestamp, |
| 1337 packet_time.not_before); | 1325 packet_time.not_before); |
| 1338 const webrtc::PacketReceiver::DeliveryStatus delivery_result = | 1326 const webrtc::PacketReceiver::DeliveryStatus delivery_result = |
| 1339 call_->Receiver()->DeliverPacket( | 1327 call_->Receiver()->DeliverPacket( |
| 1340 webrtc::MediaType::VIDEO, | 1328 webrtc::MediaType::VIDEO, |
| 1341 packet->cdata(), packet->size(), | 1329 packet->cdata(), packet->size(), |
| 1342 webrtc_packet_time); | 1330 webrtc_packet_time); |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1403 webrtc_packet_time); | 1391 webrtc_packet_time); |
| 1404 } | 1392 } |
| 1405 | 1393 |
| 1406 void WebRtcVideoChannel2::OnReadyToSend(bool ready) { | 1394 void WebRtcVideoChannel2::OnReadyToSend(bool ready) { |
| 1407 LOG(LS_VERBOSE) << "OnReadyToSend: " << (ready ? "Ready." : "Not ready."); | 1395 LOG(LS_VERBOSE) << "OnReadyToSend: " << (ready ? "Ready." : "Not ready."); |
| 1408 call_->SignalChannelNetworkState( | 1396 call_->SignalChannelNetworkState( |
| 1409 webrtc::MediaType::VIDEO, | 1397 webrtc::MediaType::VIDEO, |
| 1410 ready ? webrtc::kNetworkUp : webrtc::kNetworkDown); | 1398 ready ? webrtc::kNetworkUp : webrtc::kNetworkDown); |
| 1411 } | 1399 } |
| 1412 | 1400 |
| 1413 bool WebRtcVideoChannel2::MuteStream(uint32_t ssrc, bool mute) { | |
| 1414 LOG(LS_VERBOSE) << "MuteStream: " << ssrc << " -> " | |
| 1415 << (mute ? "mute" : "unmute"); | |
| 1416 RTC_DCHECK(ssrc != 0); | |
| 1417 rtc::CritScope stream_lock(&stream_crit_); | |
| 1418 const auto& kv = send_streams_.find(ssrc); | |
| 1419 if (kv == send_streams_.end()) { | |
| 1420 LOG(LS_ERROR) << "No sending stream on ssrc " << ssrc; | |
| 1421 return false; | |
| 1422 } | |
| 1423 | |
| 1424 kv->second->MuteStream(mute); | |
| 1425 return true; | |
| 1426 } | |
| 1427 | |
| 1428 // TODO(pbos): Remove SetOptions in favor of SetSendParameters. | |
| 1429 void WebRtcVideoChannel2::SetOptions(uint32_t ssrc, | |
| 1430 const VideoOptions& options) { | |
| 1431 LOG(LS_INFO) << "SetOptions: ssrc " << ssrc << ": " << options.ToString(); | |
| 1432 | |
| 1433 rtc::CritScope stream_lock(&stream_crit_); | |
| 1434 const auto& kv = send_streams_.find(ssrc); | |
| 1435 if (kv == send_streams_.end()) { | |
| 1436 return; | |
| 1437 } | |
| 1438 kv->second->SetOptions(options); | |
| 1439 } | |
| 1440 | |
| 1441 void WebRtcVideoChannel2::SetInterface(NetworkInterface* iface) { | 1401 void WebRtcVideoChannel2::SetInterface(NetworkInterface* iface) { |
| 1442 MediaChannel::SetInterface(iface); | 1402 MediaChannel::SetInterface(iface); |
| 1443 // Set the RTP recv/send buffer to a bigger size | 1403 // Set the RTP recv/send buffer to a bigger size |
| 1444 MediaChannel::SetOption(NetworkInterface::ST_RTP, | 1404 MediaChannel::SetOption(NetworkInterface::ST_RTP, |
| 1445 rtc::Socket::OPT_RCVBUF, | 1405 rtc::Socket::OPT_RCVBUF, |
| 1446 kVideoRtpBufferSize); | 1406 kVideoRtpBufferSize); |
| 1447 | 1407 |
| 1448 // Speculative change to increase the outbound socket buffer size. | 1408 // Speculative change to increase the outbound socket buffer size. |
| 1449 // In b/15152257, we are seeing a significant number of packets discarded | 1409 // In b/15152257, we are seeing a significant number of packets discarded |
| 1450 // due to lack of socket buffer space, although it's not yet clear what the | 1410 // due to lack of socket buffer space, although it's not yet clear what the |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1603 // Not sending, abort after reconfiguration. Reconfiguration should still | 1563 // Not sending, abort after reconfiguration. Reconfiguration should still |
| 1604 // occur to permit sending this input as quickly as possible once we start | 1564 // occur to permit sending this input as quickly as possible once we start |
| 1605 // sending (without having to reconfigure then). | 1565 // sending (without having to reconfigure then). |
| 1606 if (!sending_) { | 1566 if (!sending_) { |
| 1607 return; | 1567 return; |
| 1608 } | 1568 } |
| 1609 | 1569 |
| 1610 stream_->Input()->IncomingCapturedFrame(video_frame); | 1570 stream_->Input()->IncomingCapturedFrame(video_frame); |
| 1611 } | 1571 } |
| 1612 | 1572 |
| 1613 bool WebRtcVideoChannel2::WebRtcVideoSendStream::SetCapturer( | 1573 bool WebRtcVideoChannel2::WebRtcVideoSendStream::SetVideoSend( |
| 1574 bool enable, | |
| 1575 const VideoOptions* options, | |
| 1614 VideoCapturer* capturer) { | 1576 VideoCapturer* capturer) { |
| 1615 TRACE_EVENT0("webrtc", "WebRtcVideoSendStream::SetCapturer"); | 1577 TRACE_EVENT0("webrtc", "WebRtcVideoSendStream::SetVideoSend"); |
| 1616 RTC_DCHECK(thread_checker_.CalledOnValidThread()); | 1578 RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
| 1617 if (!DisconnectCapturer() && capturer == NULL) { | 1579 |
| 1618 return false; | 1580 bool capturer_changing = capturer_ != capturer; |
| 1581 if (capturer_changing) { | |
| 1582 if (!DisconnectCapturer() && capturer == nullptr) { | |
| 1583 return false; | |
| 1584 } | |
| 1619 } | 1585 } |
| 1620 | 1586 |
| 1621 { | 1587 { |
| 1622 rtc::CritScope cs(&lock_); | 1588 rtc::CritScope cs(&lock_); |
| 1623 | 1589 |
| 1624 // Reset timestamps to realign new incoming frames to a webrtc timestamp. A | 1590 muted_ = !enable; |
| 1625 // new capturer may have a different timestamp delta than the previous one. | 1591 if (enable && options) { |
| 1626 first_frame_timestamp_ms_ = 0; | 1592 VideoOptions old_options = parameters_.options; |
| 1593 parameters_.options.SetAll(*options); | |
| 1594 if (parameters_.options != old_options) { | |
| 1595 // Reconfigure encoder settings on the next frame or stream recreation. | |
| 1596 pending_encoder_reconfiguration_ = true; | |
| 1597 } | |
| 1598 } | |
| 1627 | 1599 |
| 1628 if (capturer == NULL) { | 1600 if (capturer_changing) { |
| 1629 if (stream_ != NULL) { | 1601 // Reset timestamps to realign new incoming frames to a webrtc timestamp. |
| 1602 // A new capturer may have a different timestamp delta than the previous | |
| 1603 // one. | |
| 1604 first_frame_timestamp_ms_ = 0; | |
| 1605 | |
| 1606 if (capturer == nullptr && stream_ != nullptr) { | |
| 1630 LOG(LS_VERBOSE) << "Disabling capturer, sending black frame."; | 1607 LOG(LS_VERBOSE) << "Disabling capturer, sending black frame."; |
| 1631 webrtc::VideoFrame black_frame; | 1608 webrtc::VideoFrame black_frame; |
| 1632 | 1609 |
| 1633 CreateBlackFrame(&black_frame, last_dimensions_.width, | 1610 CreateBlackFrame(&black_frame, last_dimensions_.width, |
| 1634 last_dimensions_.height, last_rotation_); | 1611 last_dimensions_.height, last_rotation_); |
| 1635 | 1612 |
| 1636 // Force this black frame not to be dropped due to timestamp order | 1613 // Force this black frame not to be dropped due to timestamp order |
| 1637 // check. As IncomingCapturedFrame will drop the frame if this frame's | 1614 // check. As IncomingCapturedFrame will drop the frame if this frame's |
| 1638 // timestamp is less than or equal to last frame's timestamp, it is | 1615 // timestamp is less than or equal to last frame's timestamp, it is |
| 1639 // necessary to give this black frame a larger timestamp than the | 1616 // necessary to give this black frame a larger timestamp than the |
| 1640 // previous one. | 1617 // previous one. |
| 1641 last_frame_timestamp_ms_ += 1; | 1618 last_frame_timestamp_ms_ += 1; |
| 1642 black_frame.set_render_time_ms(last_frame_timestamp_ms_); | 1619 black_frame.set_render_time_ms(last_frame_timestamp_ms_); |
| 1643 stream_->Input()->IncomingCapturedFrame(black_frame); | 1620 stream_->Input()->IncomingCapturedFrame(black_frame); |
| 1644 } | 1621 } |
| 1645 | 1622 capturer_ = capturer; |
| 1646 capturer_ = NULL; | |
| 1647 return true; | |
|
Taylor Brandstetter
2016/03/29 22:30:35
I got rid of this early return and added "if (capt
| |
| 1648 } | 1623 } |
| 1649 } | 1624 } |
| 1650 capturer_ = capturer; | 1625 |
| 1651 // |capturer_->AddOrUpdateSink| may not be called while holding |lock_| since | 1626 // |capturer_->AddOrUpdateSink| may not be called while holding |lock_| since |
| 1652 // that might cause a lock order inversion. | 1627 // that might cause a lock order inversion. |
| 1653 capturer_->AddOrUpdateSink(this, sink_wants_); | 1628 if (capturer_changing && capturer_ != nullptr) { |
| 1629 capturer_->AddOrUpdateSink(this, sink_wants_); | |
| 1630 } | |
| 1654 return true; | 1631 return true; |
| 1655 } | 1632 } |
| 1656 | 1633 |
| 1657 void WebRtcVideoChannel2::WebRtcVideoSendStream::MuteStream(bool mute) { | |
| 1658 rtc::CritScope cs(&lock_); | |
| 1659 muted_ = mute; | |
| 1660 } | |
| 1661 | |
| 1662 bool WebRtcVideoChannel2::WebRtcVideoSendStream::DisconnectCapturer() { | 1634 bool WebRtcVideoChannel2::WebRtcVideoSendStream::DisconnectCapturer() { |
| 1663 RTC_DCHECK(thread_checker_.CalledOnValidThread()); | 1635 RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
| 1664 if (capturer_ == NULL) { | 1636 if (capturer_ == NULL) { |
| 1665 return false; | 1637 return false; |
| 1666 } | 1638 } |
| 1667 | 1639 |
| 1668 // |capturer_->RemoveSink| may not be called while holding |lock_| since | 1640 // |capturer_->RemoveSink| may not be called while holding |lock_| since |
| 1669 // that might cause a lock order inversion. | 1641 // that might cause a lock order inversion. |
| 1670 capturer_->RemoveSink(this); | 1642 capturer_->RemoveSink(this); |
| 1671 capturer_ = NULL; | 1643 capturer_ = NULL; |
| 1672 // Reset |cpu_restricted_counter_| if the capturer is changed. It is not | 1644 // Reset |cpu_restricted_counter_| if the capturer is changed. It is not |
| 1673 // possible to know if the video resolution is restricted by CPU usage after | 1645 // possible to know if the video resolution is restricted by CPU usage after |
| 1674 // the capturer is changed since the next capturer might be screen capture | 1646 // the capturer is changed since the next capturer might be screen capture |
| 1675 // with another resolution and frame rate. | 1647 // with another resolution and frame rate. |
| 1676 cpu_restricted_counter_ = 0; | 1648 cpu_restricted_counter_ = 0; |
| 1677 return true; | 1649 return true; |
| 1678 } | 1650 } |
| 1679 | 1651 |
| 1680 const std::vector<uint32_t>& | 1652 const std::vector<uint32_t>& |
| 1681 WebRtcVideoChannel2::WebRtcVideoSendStream::GetSsrcs() const { | 1653 WebRtcVideoChannel2::WebRtcVideoSendStream::GetSsrcs() const { |
| 1682 return ssrcs_; | 1654 return ssrcs_; |
| 1683 } | 1655 } |
| 1684 | 1656 |
| 1685 void WebRtcVideoChannel2::WebRtcVideoSendStream::SetOptions( | |
| 1686 const VideoOptions& options) { | |
| 1687 rtc::CritScope cs(&lock_); | |
| 1688 | |
| 1689 parameters_.options.SetAll(options); | |
| 1690 // Reconfigure encoder settings on the next frame or stream | |
| 1691 // recreation. | |
| 1692 pending_encoder_reconfiguration_ = true; | |
| 1693 } | |
| 1694 | |
| 1695 webrtc::VideoCodecType CodecTypeFromName(const std::string& name) { | 1657 webrtc::VideoCodecType CodecTypeFromName(const std::string& name) { |
| 1696 if (CodecNamesEq(name, kVp8CodecName)) { | 1658 if (CodecNamesEq(name, kVp8CodecName)) { |
| 1697 return webrtc::kVideoCodecVP8; | 1659 return webrtc::kVideoCodecVP8; |
| 1698 } else if (CodecNamesEq(name, kVp9CodecName)) { | 1660 } else if (CodecNamesEq(name, kVp9CodecName)) { |
| 1699 return webrtc::kVideoCodecVP9; | 1661 return webrtc::kVideoCodecVP9; |
| 1700 } else if (CodecNamesEq(name, kH264CodecName)) { | 1662 } else if (CodecNamesEq(name, kH264CodecName)) { |
| 1701 return webrtc::kVideoCodecH264; | 1663 return webrtc::kVideoCodecH264; |
| 1702 } | 1664 } |
| 1703 return webrtc::kVideoCodecUnknown; | 1665 return webrtc::kVideoCodecUnknown; |
| 1704 } | 1666 } |
| (...skipping 881 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2586 rtx_mapping[video_codecs[i].codec.id] != | 2548 rtx_mapping[video_codecs[i].codec.id] != |
| 2587 fec_settings.red_payload_type) { | 2549 fec_settings.red_payload_type) { |
| 2588 video_codecs[i].rtx_payload_type = rtx_mapping[video_codecs[i].codec.id]; | 2550 video_codecs[i].rtx_payload_type = rtx_mapping[video_codecs[i].codec.id]; |
| 2589 } | 2551 } |
| 2590 } | 2552 } |
| 2591 | 2553 |
| 2592 return video_codecs; | 2554 return video_codecs; |
| 2593 } | 2555 } |
| 2594 | 2556 |
| 2595 } // namespace cricket | 2557 } // namespace cricket |
| OLD | NEW |