Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(22)

Side by Side Diff: webrtc/media/engine/webrtcvideoengine2.cc

Issue 2469993003: Remove WebRtcVideoSendStream2::VideoSink inheritance. Remove sending black frame on source remova… (Closed)
Patch Set: Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 1546 matching lines...) Expand 10 before | Expand all | Expand 10 after
1557 ssrc_groups_(sp.ssrc_groups), 1557 ssrc_groups_(sp.ssrc_groups),
1558 call_(call), 1558 call_(call),
1559 enable_cpu_overuse_detection_(enable_cpu_overuse_detection), 1559 enable_cpu_overuse_detection_(enable_cpu_overuse_detection),
1560 source_(nullptr), 1560 source_(nullptr),
1561 external_encoder_factory_(external_encoder_factory), 1561 external_encoder_factory_(external_encoder_factory),
1562 stream_(nullptr), 1562 stream_(nullptr),
1563 encoder_sink_(nullptr), 1563 encoder_sink_(nullptr),
1564 parameters_(std::move(config), options, max_bitrate_bps, codec_settings), 1564 parameters_(std::move(config), options, max_bitrate_bps, codec_settings),
1565 rtp_parameters_(CreateRtpParametersWithOneEncoding()), 1565 rtp_parameters_(CreateRtpParametersWithOneEncoding()),
1566 allocated_encoder_(nullptr, webrtc::kVideoCodecUnknown, false), 1566 allocated_encoder_(nullptr, webrtc::kVideoCodecUnknown, false),
1567 sending_(false), 1567 sending_(false) {
1568 last_frame_timestamp_us_(0) {
1569 parameters_.config.rtp.max_packet_size = kVideoMtu; 1568 parameters_.config.rtp.max_packet_size = kVideoMtu;
1570 parameters_.conference_mode = send_params.conference_mode; 1569 parameters_.conference_mode = send_params.conference_mode;
1571 1570
1572 sp.GetPrimarySsrcs(&parameters_.config.rtp.ssrcs); 1571 sp.GetPrimarySsrcs(&parameters_.config.rtp.ssrcs);
1573 sp.GetFidSsrcs(parameters_.config.rtp.ssrcs, 1572 sp.GetFidSsrcs(parameters_.config.rtp.ssrcs,
1574 &parameters_.config.rtp.rtx.ssrcs); 1573 &parameters_.config.rtp.rtx.ssrcs);
1575 parameters_.config.rtp.c_name = sp.cname; 1574 parameters_.config.rtp.c_name = sp.cname;
1576 if (rtp_extensions) { 1575 if (rtp_extensions) {
1577 parameters_.config.rtp.extensions = *rtp_extensions; 1576 parameters_.config.rtp.extensions = *rtp_extensions;
1578 } 1577 }
1579 parameters_.config.rtp.rtcp_mode = send_params.rtcp.reduced_size 1578 parameters_.config.rtp.rtcp_mode = send_params.rtcp.reduced_size
1580 ? webrtc::RtcpMode::kReducedSize 1579 ? webrtc::RtcpMode::kReducedSize
1581 : webrtc::RtcpMode::kCompound; 1580 : webrtc::RtcpMode::kCompound;
1582 if (codec_settings) { 1581 if (codec_settings) {
1583 SetCodec(*codec_settings); 1582 SetCodec(*codec_settings);
1584 } 1583 }
1585 } 1584 }
1586 1585
1587 WebRtcVideoChannel2::WebRtcVideoSendStream::~WebRtcVideoSendStream() { 1586 WebRtcVideoChannel2::WebRtcVideoSendStream::~WebRtcVideoSendStream() {
1588 if (stream_ != NULL) { 1587 if (stream_ != NULL) {
1589 call_->DestroyVideoSendStream(stream_); 1588 call_->DestroyVideoSendStream(stream_);
1590 } 1589 }
1591 DestroyVideoEncoder(&allocated_encoder_); 1590 DestroyVideoEncoder(&allocated_encoder_);
1592 } 1591 }
1593 1592
1594 void WebRtcVideoChannel2::WebRtcVideoSendStream::OnFrame(
1595 const VideoFrame& frame) {
1596 TRACE_EVENT0("webrtc", "WebRtcVideoSendStream::OnFrame");
1597 webrtc::VideoFrame video_frame(frame.video_frame_buffer(),
1598 frame.rotation(),
1599 frame.timestamp_us());
1600
1601 rtc::CritScope cs(&lock_);
1602
1603 if (video_frame.width() != last_frame_info_.width ||
1604 video_frame.height() != last_frame_info_.height ||
1605 video_frame.rotation() != last_frame_info_.rotation ||
1606 video_frame.is_texture() != last_frame_info_.is_texture) {
1607 last_frame_info_.width = video_frame.width();
1608 last_frame_info_.height = video_frame.height();
1609 last_frame_info_.rotation = video_frame.rotation();
1610 last_frame_info_.is_texture = video_frame.is_texture();
1611
1612 LOG(LS_INFO) << "Video frame parameters changed: dimensions="
1613 << last_frame_info_.width << "x" << last_frame_info_.height
1614 << ", rotation=" << last_frame_info_.rotation
1615 << ", texture=" << last_frame_info_.is_texture;
1616 }
1617
1618 if (encoder_sink_ == NULL) {
1619 // Frame input before send codecs are configured, dropping frame.
1620 return;
1621 }
1622
1623 last_frame_timestamp_us_ = video_frame.timestamp_us();
1624
1625 // Forward frame to the encoder regardless if we are sending or not. This is
1626 // to ensure that the encoder can be reconfigured with the correct frame size
1627 // as quickly as possible.
1628 encoder_sink_->OnFrame(video_frame);
1629 }
1630
1631 bool WebRtcVideoChannel2::WebRtcVideoSendStream::SetVideoSend( 1593 bool WebRtcVideoChannel2::WebRtcVideoSendStream::SetVideoSend(
1632 bool enable, 1594 bool enable,
1633 const VideoOptions* options, 1595 const VideoOptions* options,
1634 rtc::VideoSourceInterface<cricket::VideoFrame>* source) { 1596 rtc::VideoSourceInterface<cricket::VideoFrame>* source) {
1635 TRACE_EVENT0("webrtc", "WebRtcVideoSendStream::SetVideoSend"); 1597 TRACE_EVENT0("webrtc", "WebRtcVideoSendStream::SetVideoSend");
1636 RTC_DCHECK_RUN_ON(&thread_checker_); 1598 RTC_DCHECK_RUN_ON(&thread_checker_);
1637 1599
1638 // Ignore |options| pointer if |enable| is false. 1600 // Ignore |options| pointer if |enable| is false.
1639 bool options_present = enable && options; 1601 bool options_present = enable && options;
1640 bool source_changing = source_ != source;
1641 1602
1642 if (options_present) { 1603 if (options_present) {
1643 VideoOptions old_options = parameters_.options; 1604 VideoOptions old_options = parameters_.options;
1644 parameters_.options.SetAll(*options); 1605 parameters_.options.SetAll(*options);
1645 if (parameters_.options != old_options) { 1606 if (parameters_.options != old_options) {
1646 ReconfigureEncoder(); 1607 ReconfigureEncoder();
1647 } 1608 }
1648 } 1609 }
1649 1610
1650 if (source_changing) {
1651 rtc::CritScope cs(&lock_);
1652 if (source == nullptr && last_frame_info_.width > 0 && encoder_sink_) {
1653 LOG(LS_VERBOSE) << "Disabling capturer, sending black frame.";
1654 // Force this black frame not to be dropped due to timestamp order
1655 // check. As IncomingCapturedFrame will drop the frame if this frame's
1656 // timestamp is less than or equal to last frame's timestamp, it is
1657 // necessary to give this black frame a larger timestamp than the
1658 // previous one.
1659 last_frame_timestamp_us_ += rtc::kNumMicrosecsPerMillisec;
1660 rtc::scoped_refptr<webrtc::I420Buffer> black_buffer(
1661 webrtc::I420Buffer::Create(last_frame_info_.width,
1662 last_frame_info_.height));
1663 black_buffer->SetToBlack();
1664
1665 encoder_sink_->OnFrame(webrtc::VideoFrame(
1666 black_buffer, last_frame_info_.rotation, last_frame_timestamp_us_));
1667 }
1668 }
1669
1670 // TODO(perkj, nisse): Remove |source_| and directly call
1671 // |stream_|->SetSource(source) once the video frame types have been
1672 // merged.
1673 if (source_ && stream_) { 1611 if (source_ && stream_) {
1674 stream_->SetSource( 1612 stream_->SetSource(
1675 nullptr, webrtc::VideoSendStream::DegradationPreference::kBalanced); 1613 nullptr, webrtc::VideoSendStream::DegradationPreference::kBalanced);
1676 } 1614 }
1677 // Switch to the new source. 1615 // Switch to the new source.
1678 source_ = source; 1616 source_ = source;
1679 if (source && stream_) { 1617 if (source && stream_) {
1680 // Do not adapt resolution for screen content as this will likely 1618 // Do not adapt resolution for screen content as this will likely
1681 // result in blurry and unreadable text. 1619 // result in blurry and unreadable text.
1682 stream_->SetSource( 1620 stream_->SetSource(
1683 this, enable_cpu_overuse_detection_ && 1621 source, enable_cpu_overuse_detection_ &&
perkj_webrtc 2016/11/16 21:27:24 ops, this should still be |this|
1684 !parameters_.options.is_screencast.value_or(false) 1622 !parameters_.options.is_screencast.value_or(false)
1685 ? webrtc::VideoSendStream::DegradationPreference::kBalanced 1623 ? webrtc::VideoSendStream::DegradationPreference::kBalanced
1686 : webrtc::VideoSendStream::DegradationPreference:: 1624 : webrtc::VideoSendStream::DegradationPreference::
1687 kMaintainResolution); 1625 kMaintainResolution);
1688 } 1626 }
1689 return true; 1627 return true;
1690 } 1628 }
1691 1629
1692 const std::vector<uint32_t>& 1630 const std::vector<uint32_t>&
1693 WebRtcVideoChannel2::WebRtcVideoSendStream::GetSsrcs() const { 1631 WebRtcVideoChannel2::WebRtcVideoSendStream::GetSsrcs() const {
1694 return ssrcs_; 1632 return ssrcs_;
1695 } 1633 }
1696 1634
1697 WebRtcVideoChannel2::WebRtcVideoSendStream::AllocatedEncoder 1635 WebRtcVideoChannel2::WebRtcVideoSendStream::AllocatedEncoder
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after
1938 parameters_.encoder_config = std::move(encoder_config); 1876 parameters_.encoder_config = std::move(encoder_config);
1939 } 1877 }
1940 1878
1941 void WebRtcVideoChannel2::WebRtcVideoSendStream::SetSend(bool send) { 1879 void WebRtcVideoChannel2::WebRtcVideoSendStream::SetSend(bool send) {
1942 RTC_DCHECK_RUN_ON(&thread_checker_); 1880 RTC_DCHECK_RUN_ON(&thread_checker_);
1943 sending_ = send; 1881 sending_ = send;
1944 UpdateSendState(); 1882 UpdateSendState();
1945 } 1883 }
1946 1884
1947 void WebRtcVideoChannel2::WebRtcVideoSendStream::RemoveSink( 1885 void WebRtcVideoChannel2::WebRtcVideoSendStream::RemoveSink(
1948 VideoSinkInterface<webrtc::VideoFrame>* sink) { 1886 rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) {
1949 RTC_DCHECK_RUN_ON(&thread_checker_); 1887 RTC_DCHECK_RUN_ON(&thread_checker_);
1950 { 1888 RTC_DCHECK(encoder_sink_ == sink);
1951 rtc::CritScope cs(&lock_); 1889 encoder_sink_ = nullptr;
1952 RTC_DCHECK(encoder_sink_ == sink); 1890 source_->RemoveSink(sink);
1953 encoder_sink_ = nullptr;
1954 }
1955 source_->RemoveSink(this);
1956 } 1891 }
1957 1892
1958 void WebRtcVideoChannel2::WebRtcVideoSendStream::AddOrUpdateSink( 1893 void WebRtcVideoChannel2::WebRtcVideoSendStream::AddOrUpdateSink(
1959 VideoSinkInterface<webrtc::VideoFrame>* sink, 1894 rtc::VideoSinkInterface<webrtc::VideoFrame>* sink,
1960 const rtc::VideoSinkWants& wants) { 1895 const rtc::VideoSinkWants& wants) {
1961 if (worker_thread_ == rtc::Thread::Current()) { 1896 if (worker_thread_ == rtc::Thread::Current()) {
1962 // AddOrUpdateSink is called on |worker_thread_| if this is the first 1897 // AddOrUpdateSink is called on |worker_thread_| if this is the first
1963 // registration of |sink|. 1898 // registration of |sink|.
1964 RTC_DCHECK_RUN_ON(&thread_checker_); 1899 RTC_DCHECK_RUN_ON(&thread_checker_);
1965 { 1900 encoder_sink_ = sink;
1966 rtc::CritScope cs(&lock_); 1901 source_->AddOrUpdateSink(encoder_sink_, wants);
1967 encoder_sink_ = sink;
1968 }
1969 source_->AddOrUpdateSink(this, wants);
1970 } else { 1902 } else {
1971 // Subsequent calls to AddOrUpdateSink will happen on the encoder task 1903 // Subsequent calls to AddOrUpdateSink will happen on the encoder task
1972 // queue. 1904 // queue.
1973 invoker_.AsyncInvoke<void>(RTC_FROM_HERE, worker_thread_, [this, wants] { 1905 invoker_.AsyncInvoke<void>(
1974 RTC_DCHECK_RUN_ON(&thread_checker_); 1906 RTC_FROM_HERE, worker_thread_, [this, sink, wants] {
1975 bool encoder_sink_valid = true; 1907 RTC_DCHECK_RUN_ON(&thread_checker_);
1976 { 1908 // |sink| may be invalidated after this task was posted since
1977 rtc::CritScope cs(&lock_); 1909 // RemoveSink is called on the worker thread.
1978 encoder_sink_valid = encoder_sink_ != nullptr; 1910 bool encoder_sink_valid = sink == encoder_sink_;
nisse-webrtc 2016/11/07 09:52:46 Hmm, this also appears to be the only use of the e
nisse-webrtc 2016/11/07 09:52:46 Style: I'd prefer a pair of () around the comparis
perkj_webrtc 2016/11/16 21:27:24 Since we can not use rtc::Threads on lower levels
nisse-webrtc 2016/11/17 08:07:13 Not sure what other use cases there are with AddOr
1979 } 1911 if (source_ && encoder_sink_valid) {
1980 // Since |source_| is still valid after a call to RemoveSink, check if 1912 source_->AddOrUpdateSink(encoder_sink_, wants);
1981 // |encoder_sink_| is still valid to check if this call should be 1913 }
1982 // cancelled. 1914 });
1983 if (source_ && encoder_sink_valid) {
1984 source_->AddOrUpdateSink(this, wants);
1985 }
1986 });
1987 } 1915 }
1988 } 1916 }
1989 1917
1990 VideoSenderInfo WebRtcVideoChannel2::WebRtcVideoSendStream::GetVideoSenderInfo( 1918 VideoSenderInfo WebRtcVideoChannel2::WebRtcVideoSendStream::GetVideoSenderInfo(
1991 bool log_stats) { 1919 bool log_stats) {
1992 VideoSenderInfo info; 1920 VideoSenderInfo info;
1993 RTC_DCHECK_RUN_ON(&thread_checker_); 1921 RTC_DCHECK_RUN_ON(&thread_checker_);
1994 for (uint32_t ssrc : parameters_.config.rtp.ssrcs) 1922 for (uint32_t ssrc : parameters_.config.rtp.ssrcs)
1995 info.add_ssrc(ssrc); 1923 info.add_ssrc(ssrc);
1996 1924
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
2097 LOG(LS_WARNING) << "RTX SSRCs configured but there's no configured RTX " 2025 LOG(LS_WARNING) << "RTX SSRCs configured but there's no configured RTX "
2098 "payload type the set codec. Ignoring RTX."; 2026 "payload type the set codec. Ignoring RTX.";
2099 config.rtp.rtx.ssrcs.clear(); 2027 config.rtp.rtx.ssrcs.clear();
2100 } 2028 }
2101 stream_ = call_->CreateVideoSendStream(std::move(config), 2029 stream_ = call_->CreateVideoSendStream(std::move(config),
2102 parameters_.encoder_config.Copy()); 2030 parameters_.encoder_config.Copy());
2103 2031
2104 parameters_.encoder_config.encoder_specific_settings = NULL; 2032 parameters_.encoder_config.encoder_specific_settings = NULL;
2105 2033
2106 if (source_) { 2034 if (source_) {
2107 // TODO(perkj, nisse): Remove |source_| and directly call
2108 // |stream_|->SetSource(source) once the video frame types have been
2109 // merged and |stream_| internally reconfigure the encoder on frame
2110 // resolution change.
2111 // Do not adapt resolution for screen content as this will likely result in 2035 // Do not adapt resolution for screen content as this will likely result in
2112 // blurry and unreadable text. 2036 // blurry and unreadable text.
2113 stream_->SetSource( 2037 stream_->SetSource(
2114 this, enable_cpu_overuse_detection_ && 2038 source_, enable_cpu_overuse_detection_ &&
2115 !parameters_.options.is_screencast.value_or(false) 2039 !parameters_.options.is_screencast.value_or(false)
2116 ? webrtc::VideoSendStream::DegradationPreference::kBalanced 2040 ? webrtc::VideoSendStream::DegradationPreference::kBalanced
2117 : webrtc::VideoSendStream::DegradationPreference:: 2041 : webrtc::VideoSendStream::DegradationPreference::
2118 kMaintainResolution); 2042 kMaintainResolution);
2119 } 2043 }
2120 2044
2121 // Call stream_->Start() if necessary conditions are met. 2045 // Call stream_->Start() if necessary conditions are met.
2122 UpdateSendState(); 2046 UpdateSendState();
2123 } 2047 }
2124 2048
2125 WebRtcVideoChannel2::WebRtcVideoReceiveStream::WebRtcVideoReceiveStream( 2049 WebRtcVideoChannel2::WebRtcVideoReceiveStream::WebRtcVideoReceiveStream(
2126 webrtc::Call* call, 2050 webrtc::Call* call,
2127 const StreamParams& sp, 2051 const StreamParams& sp,
2128 webrtc::VideoReceiveStream::Config config, 2052 webrtc::VideoReceiveStream::Config config,
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after
2563 rtx_mapping[video_codecs[i].codec.id] != 2487 rtx_mapping[video_codecs[i].codec.id] !=
2564 ulpfec_config.red_payload_type) { 2488 ulpfec_config.red_payload_type) {
2565 video_codecs[i].rtx_payload_type = rtx_mapping[video_codecs[i].codec.id]; 2489 video_codecs[i].rtx_payload_type = rtx_mapping[video_codecs[i].codec.id];
2566 } 2490 }
2567 } 2491 }
2568 2492
2569 return video_codecs; 2493 return video_codecs;
2570 } 2494 }
2571 2495
2572 } // namespace cricket 2496 } // namespace cricket
OLDNEW
« no previous file with comments | « webrtc/media/engine/webrtcvideoengine2.h ('k') | webrtc/media/engine/webrtcvideoengine2_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698