blob: c725e37477af5f36b6a9a18c3556475d12b94b3e [file] [log] [blame]
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +02001/*
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3 *
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Peter Boström5c389d32015-09-25 13:58:30 +020011#include "webrtc/audio/audio_receive_stream.h"
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +020012
13#include <string>
14
15#include "webrtc/base/checks.h"
pbosa2f30de2015-10-15 05:22:13 -070016#include "webrtc/base/logging.h"
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +020017#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
18#include "webrtc/system_wrappers/interface/tick_util.h"
19
20namespace webrtc {
21std::string AudioReceiveStream::Config::Rtp::ToString() const {
22 std::stringstream ss;
23 ss << "{remote_ssrc: " << remote_ssrc;
24 ss << ", extensions: [";
25 for (size_t i = 0; i < extensions.size(); ++i) {
26 ss << extensions[i].ToString();
27 if (i != extensions.size() - 1)
28 ss << ", ";
29 }
30 ss << ']';
31 ss << '}';
32 return ss.str();
33}
34
35std::string AudioReceiveStream::Config::ToString() const {
36 std::stringstream ss;
37 ss << "{rtp: " << rtp.ToString();
pbos8fc7fa72015-07-15 08:02:58 -070038 ss << ", voe_channel_id: " << voe_channel_id;
39 if (!sync_group.empty())
40 ss << ", sync_group: " << sync_group;
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +020041 ss << '}';
42 return ss.str();
43}
44
45namespace internal {
46AudioReceiveStream::AudioReceiveStream(
47 RemoteBitrateEstimator* remote_bitrate_estimator,
48 const webrtc::AudioReceiveStream::Config& config)
49 : remote_bitrate_estimator_(remote_bitrate_estimator),
50 config_(config),
51 rtp_header_parser_(RtpHeaderParser::Create()) {
pbosa2f30de2015-10-15 05:22:13 -070052 LOG(LS_INFO) << "AudioReceiveStream: " << config_.ToString();
henrikg91d6ede2015-09-17 00:24:34 -070053 RTC_DCHECK(config.voe_channel_id != -1);
54 RTC_DCHECK(remote_bitrate_estimator_ != nullptr);
55 RTC_DCHECK(rtp_header_parser_ != nullptr);
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +020056 for (const auto& ext : config.rtp.extensions) {
57 // One-byte-extension local identifiers are in the range 1-14 inclusive.
henrikg91d6ede2015-09-17 00:24:34 -070058 RTC_DCHECK_GE(ext.id, 1);
59 RTC_DCHECK_LE(ext.id, 14);
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +020060 if (ext.name == RtpExtension::kAudioLevel) {
henrikg91d6ede2015-09-17 00:24:34 -070061 RTC_CHECK(rtp_header_parser_->RegisterRtpHeaderExtension(
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +020062 kRtpExtensionAudioLevel, ext.id));
63 } else if (ext.name == RtpExtension::kAbsSendTime) {
henrikg91d6ede2015-09-17 00:24:34 -070064 RTC_CHECK(rtp_header_parser_->RegisterRtpHeaderExtension(
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +020065 kRtpExtensionAbsoluteSendTime, ext.id));
sprang867fb522015-08-03 04:38:41 -070066 } else if (ext.name == RtpExtension::kTransportSequenceNumber) {
henrikg91d6ede2015-09-17 00:24:34 -070067 RTC_CHECK(rtp_header_parser_->RegisterRtpHeaderExtension(
sprang867fb522015-08-03 04:38:41 -070068 kRtpExtensionTransportSequenceNumber, ext.id));
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +020069 } else {
70 RTC_NOTREACHED() << "Unsupported RTP extension.";
71 }
72 }
73}
74
pbosa2f30de2015-10-15 05:22:13 -070075AudioReceiveStream::~AudioReceiveStream() {
76 LOG(LS_INFO) << "~AudioReceiveStream: " << config_.ToString();
77}
78
Fredrik Solenberg04f49312015-06-08 13:04:56 +020079webrtc::AudioReceiveStream::Stats AudioReceiveStream::GetStats() const {
80 return webrtc::AudioReceiveStream::Stats();
81}
82
pbosa2f30de2015-10-15 05:22:13 -070083const webrtc::AudioReceiveStream::Config& AudioReceiveStream::config() const {
84 return config_;
85}
86
Jelena Marusiccd670222015-07-16 09:30:09 +020087void AudioReceiveStream::Start() {
88}
89
90void AudioReceiveStream::Stop() {
91}
92
93void AudioReceiveStream::SignalNetworkState(NetworkState state) {
94}
95
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +020096bool AudioReceiveStream::DeliverRtcp(const uint8_t* packet, size_t length) {
97 return false;
98}
99
stefan68786d22015-09-08 05:36:15 -0700100bool AudioReceiveStream::DeliverRtp(const uint8_t* packet,
101 size_t length,
102 const PacketTime& packet_time) {
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200103 RTPHeader header;
pbos6bb1b6e2015-07-24 07:10:18 -0700104
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200105 if (!rtp_header_parser_->Parse(packet, length, &header)) {
106 return false;
107 }
108
pbos6bb1b6e2015-07-24 07:10:18 -0700109 // Only forward if the parsed header has absolute sender time. RTP timestamps
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200110 // may have different rates for audio and video and shouldn't be mixed.
pbos6bb1b6e2015-07-24 07:10:18 -0700111 if (config_.combined_audio_video_bwe &&
112 header.extension.hasAbsoluteSendTime) {
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200113 int64_t arrival_time_ms = TickTime::MillisecondTimestamp();
stefan68786d22015-09-08 05:36:15 -0700114 if (packet_time.timestamp >= 0)
Stefan Holmer8bffba72015-09-23 15:53:52 +0200115 arrival_time_ms = (packet_time.timestamp + 500) / 1000;
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200116 size_t payload_size = length - header.headerLength;
117 remote_bitrate_estimator_->IncomingPacket(arrival_time_ms, payload_size,
Stefan Holmerff4ea932015-06-18 16:01:33 +0200118 header, false);
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200119 }
120 return true;
121}
122} // namespace internal
123} // namespace webrtc