2015-06-08 13:04:56 +02:00
|
|
|
/*
|
|
|
|
|
* Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
|
|
|
|
|
*
|
|
|
|
|
* Use of this source code is governed by a BSD-style license
|
|
|
|
|
* that can be found in the LICENSE file in the root of the source
|
|
|
|
|
* tree. An additional intellectual property rights grant can be found
|
|
|
|
|
* in the file PATENTS. All contributing project authors may
|
|
|
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
|
|
|
*/
|
|
|
|
|
|
2017-09-15 06:47:31 +02:00
|
|
|
#ifndef CALL_AUDIO_SEND_STREAM_H_
|
|
|
|
|
#define CALL_AUDIO_SEND_STREAM_H_
|
2015-06-08 13:04:56 +02:00
|
|
|
|
2016-05-01 14:53:46 -07:00
|
|
|
#include <memory>
|
2015-06-08 13:04:56 +02:00
|
|
|
#include <string>
|
|
|
|
|
#include <vector>
|
|
|
|
|
|
2018-06-15 12:28:07 +02:00
|
|
|
#include "absl/types/optional.h"
|
2018-03-21 15:18:42 +01:00
|
|
|
#include "api/audio_codecs/audio_codec_pair_id.h"
|
2017-09-15 06:47:31 +02:00
|
|
|
#include "api/audio_codecs/audio_encoder.h"
|
|
|
|
|
#include "api/audio_codecs/audio_encoder_factory.h"
|
|
|
|
|
#include "api/audio_codecs/audio_format.h"
|
|
|
|
|
#include "api/call/transport.h"
|
2019-01-11 09:11:00 -08:00
|
|
|
#include "api/crypto/crypto_options.h"
|
|
|
|
|
#include "api/crypto/frame_encryptor_interface.h"
|
2020-03-31 11:29:56 +02:00
|
|
|
#include "api/frame_transformer_interface.h"
|
2019-01-11 09:11:00 -08:00
|
|
|
#include "api/rtp_parameters.h"
|
2019-01-25 20:26:48 +01:00
|
|
|
#include "api/scoped_refptr.h"
|
2020-01-10 10:33:05 -08:00
|
|
|
#include "call/audio_sender.h"
|
2017-09-15 06:47:31 +02:00
|
|
|
#include "call/rtp_config.h"
|
2017-11-24 17:29:59 +01:00
|
|
|
#include "modules/audio_processing/include/audio_processing_statistics.h"
|
2019-05-27 12:19:33 +02:00
|
|
|
#include "modules/rtp_rtcp/include/report_block_data.h"
|
2015-06-08 13:04:56 +02:00
|
|
|
|
|
|
|
|
namespace webrtc {
|
|
|
|
|
|
2020-01-10 10:33:05 -08:00
|
|
|
class AudioSendStream : public AudioSender {
|
2015-06-08 13:04:56 +02:00
|
|
|
public:
|
2015-10-27 03:35:21 -07:00
|
|
|
struct Stats {
|
2016-10-25 11:19:07 -07:00
|
|
|
Stats();
|
2016-11-17 23:43:29 -08:00
|
|
|
~Stats();
|
2016-10-25 11:19:07 -07:00
|
|
|
|
2015-10-27 03:35:21 -07:00
|
|
|
// TODO(solenberg): Harmonize naming and defaults with receive stream stats.
|
|
|
|
|
uint32_t local_ssrc = 0;
|
2019-10-09 15:01:33 +02:00
|
|
|
int64_t payload_bytes_sent = 0;
|
|
|
|
|
int64_t header_and_padding_bytes_sent = 0;
|
2019-04-17 13:51:53 +02:00
|
|
|
// https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-retransmittedbytessent
|
|
|
|
|
uint64_t retransmitted_bytes_sent = 0;
|
2015-10-27 03:35:21 -07:00
|
|
|
int32_t packets_sent = 0;
|
2019-04-17 13:51:53 +02:00
|
|
|
// https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-retransmittedpacketssent
|
|
|
|
|
uint64_t retransmitted_packets_sent = 0;
|
2015-10-27 03:35:21 -07:00
|
|
|
int32_t packets_lost = -1;
|
|
|
|
|
float fraction_lost = -1.0f;
|
|
|
|
|
std::string codec_name;
|
2018-06-15 12:28:07 +02:00
|
|
|
absl::optional<int> codec_payload_type;
|
2015-10-27 03:35:21 -07:00
|
|
|
int32_t jitter_ms = -1;
|
|
|
|
|
int64_t rtt_ms = -1;
|
[getStats] Implement "media-source" audio levels, fixing Chrome bug.
Implements RTCAudioSourceStats members:
- audioLevel
- totalAudioEnergy
- totalSamplesDuration
In this CL description these are collectively referred to as the audio
levels.
The audio levels are removed from sending "track" stats (in Chrome,
these are now reported as undefined instead of 0).
Background:
For sending tracks, audio levels were always reported as 0 in Chrome
(https://crbug.com/736403), while audio levels were correctly reported
for receiving tracks. This problem affected the standard getStats() but
not the legacy getStats(), blocking some people from migrating. This
was likely not a problem in native third_party/webrtc code because the
delivery of audio frames from device to send-stream uses a different
code path outside of chromium.
A recent PR (https://github.com/w3c/webrtc-stats/pull/451) moved the
send-side audio levels to the RTCAudioSourceStats, while keeping the
receive-side audio levels on the "track" stats. This allows an
implementation to report the audio levels even if samples are not sent
onto the network (such as if an ICE connection has not been established
yet), reflecting some of the current implementation.
Changes:
1. Audio levels are added to RTCAudioSourceStats. Send-side audio
"track" stats are left undefined. Receive-side audio "track" stats
are not changed in this CL and continue to work.
2. Audio level computation is moved from the AudioState and
AudioTransportImpl to the AudioSendStream. This is because a) the
AudioTransportImpl::RecordedDataIsAvailable() code path is not
exercised in chromium, and b) audio levels should, per-spec, not be
calculated on a per-call basis, for which the AudioState is defined.
3. The audio level computation is now performed in
AudioSendStream::SendAudioData(), a code path used by both native
and chromium code.
4. Comments are added to document behavior of existing code, such as
AudioLevel and AudioSendStream::SendAudioData().
Note:
In this CL, just like before this CL, audio level is only calculated
after an AudioSendStream has been created. This means that before an
O/A negotiation, audio levels are unavailable.
According to spec, if we have an audio source, we should have audio
levels. An immediate solution to this would have been to calculate the
audio level at pc/rtp_sender.cc. The problem is that the
LocalAudioSinkAdapter::OnData() code path, while exercised in chromium,
is not exercised in native code. The issue of calculating audio levels
on a per-source bases rather than on a per-send stream basis is left to
https://crbug.com/webrtc/10771, an existing "media-source" bug.
This CL can be verified manually in Chrome at:
https://codepen.io/anon/pen/vqRGyq
Bug: chromium:736403, webrtc:10771
Change-Id: I8036cd9984f3b187c3177470a8c0d6670a201a5a
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/143789
Reviewed-by: Oskar Sundbom <ossu@webrtc.org>
Reviewed-by: Stefan Holmer <stefan@webrtc.org>
Commit-Queue: Henrik Boström <hbos@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#28480}
2019-07-03 17:11:10 +02:00
|
|
|
int16_t audio_level = 0;
|
2017-07-14 12:17:49 -07:00
|
|
|
// See description of "totalAudioEnergy" in the WebRTC stats spec:
|
|
|
|
|
// https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamtrackstats-totalaudioenergy
|
|
|
|
|
double total_input_energy = 0.0;
|
|
|
|
|
double total_input_duration = 0.0;
|
2015-10-27 03:35:21 -07:00
|
|
|
bool typing_noise_detected = false;
|
2017-11-24 17:29:59 +01:00
|
|
|
|
2017-09-08 08:13:19 -07:00
|
|
|
ANAStats ana_statistics;
|
2017-11-24 17:29:59 +01:00
|
|
|
AudioProcessingStats apm_statistics;
|
2018-10-25 16:22:02 +02:00
|
|
|
|
|
|
|
|
int64_t target_bitrate_bps = 0;
|
2019-05-27 12:19:33 +02:00
|
|
|
// A snapshot of Report Blocks with additional data of interest to
|
|
|
|
|
// statistics. Within this list, the sender-source SSRC pair is unique and
|
|
|
|
|
// per-pair the ReportBlockData represents the latest Report Block that was
|
|
|
|
|
// received for that pair.
|
|
|
|
|
std::vector<ReportBlockData> report_block_datas;
|
2015-10-27 03:35:21 -07:00
|
|
|
};
|
2015-06-08 13:04:56 +02:00
|
|
|
|
|
|
|
|
struct Config {
|
2015-08-28 04:07:10 -07:00
|
|
|
Config() = delete;
|
2016-10-25 11:19:07 -07:00
|
|
|
explicit Config(Transport* send_transport);
|
2016-10-31 04:08:32 -07:00
|
|
|
~Config();
|
2015-06-08 13:04:56 +02:00
|
|
|
std::string ToString() const;
|
|
|
|
|
|
2016-06-14 10:02:41 -07:00
|
|
|
// Send-stream specific RTP settings.
|
2015-06-08 13:04:56 +02:00
|
|
|
struct Rtp {
|
2016-10-25 11:19:07 -07:00
|
|
|
Rtp();
|
|
|
|
|
~Rtp();
|
2015-06-08 13:04:56 +02:00
|
|
|
std::string ToString() const;
|
|
|
|
|
|
|
|
|
|
// Sender SSRC.
|
|
|
|
|
uint32_t ssrc = 0;
|
|
|
|
|
|
2018-12-21 09:23:38 -08:00
|
|
|
// The value to send in the RID RTP header extension if the extension is
|
|
|
|
|
// included in the list of extensions.
|
|
|
|
|
std::string rid;
|
|
|
|
|
|
2018-03-26 10:24:32 -07:00
|
|
|
// The value to send in the MID RTP header extension if the extension is
|
|
|
|
|
// included in the list of extensions.
|
|
|
|
|
std::string mid;
|
|
|
|
|
|
2018-10-29 11:22:05 +01:00
|
|
|
// Corresponds to the SDP attribute extmap-allow-mixed.
|
|
|
|
|
bool extmap_allow_mixed = false;
|
|
|
|
|
|
2015-12-07 10:26:18 +01:00
|
|
|
// RTP header extensions used for the sent stream.
|
2015-06-08 13:04:56 +02:00
|
|
|
std::vector<RtpExtension> extensions;
|
2015-11-16 07:34:50 -08:00
|
|
|
|
|
|
|
|
// RTCP CNAME, see RFC 3550.
|
|
|
|
|
std::string c_name;
|
2015-06-08 13:04:56 +02:00
|
|
|
} rtp;
|
|
|
|
|
|
2018-11-09 13:17:39 -08:00
|
|
|
// Time interval between RTCP report for audio
|
|
|
|
|
int rtcp_report_interval_ms = 5000;
|
|
|
|
|
|
2015-10-16 14:35:07 -07:00
|
|
|
// Transport for outgoing packets. The transport is expected to exist for
|
|
|
|
|
// the entire life of the AudioSendStream and is owned by the API client.
|
2015-09-28 09:59:31 -07:00
|
|
|
Transport* send_transport = nullptr;
|
2015-08-28 04:07:10 -07:00
|
|
|
|
2016-07-26 04:44:06 -07:00
|
|
|
// Bitrate limits used for variable audio bitrate streams. Set both to -1 to
|
|
|
|
|
// disable audio bitrate adaptation.
|
|
|
|
|
// Note: This is still an experimental feature and not ready for real usage.
|
2016-11-07 09:29:22 -08:00
|
|
|
int min_bitrate_bps = -1;
|
|
|
|
|
int max_bitrate_bps = -1;
|
2016-10-20 03:27:12 -07:00
|
|
|
|
2017-12-22 09:36:42 -08:00
|
|
|
double bitrate_priority = 1.0;
|
2018-10-18 16:52:22 -07:00
|
|
|
bool has_dscp = false;
|
2017-12-22 09:36:42 -08:00
|
|
|
|
2016-10-31 04:08:32 -07:00
|
|
|
// Defines whether to turn on audio network adaptor, and defines its config
|
|
|
|
|
// string.
|
2018-06-15 12:28:07 +02:00
|
|
|
absl::optional<std::string> audio_network_adaptor_config;
|
2016-10-31 04:08:32 -07:00
|
|
|
|
2016-10-20 03:27:12 -07:00
|
|
|
struct SendCodecSpec {
|
2017-04-27 02:08:52 -07:00
|
|
|
SendCodecSpec(int payload_type, const SdpAudioFormat& format);
|
|
|
|
|
~SendCodecSpec();
|
2016-10-25 11:19:07 -07:00
|
|
|
std::string ToString() const;
|
|
|
|
|
|
|
|
|
|
bool operator==(const SendCodecSpec& rhs) const;
|
2016-10-20 03:27:12 -07:00
|
|
|
bool operator!=(const SendCodecSpec& rhs) const {
|
|
|
|
|
return !(*this == rhs);
|
|
|
|
|
}
|
|
|
|
|
|
2017-04-27 02:08:52 -07:00
|
|
|
int payload_type;
|
|
|
|
|
SdpAudioFormat format;
|
2016-10-20 03:27:12 -07:00
|
|
|
bool nack_enabled = false;
|
|
|
|
|
bool transport_cc_enabled = false;
|
2018-06-15 12:28:07 +02:00
|
|
|
absl::optional<int> cng_payload_type;
|
2020-06-24 12:52:42 +02:00
|
|
|
absl::optional<int> red_payload_type;
|
2017-04-27 02:08:52 -07:00
|
|
|
// If unset, use the encoder's default target bitrate.
|
2018-06-15 12:28:07 +02:00
|
|
|
absl::optional<int> target_bitrate_bps;
|
2017-04-27 02:08:52 -07:00
|
|
|
};
|
|
|
|
|
|
2018-06-15 12:28:07 +02:00
|
|
|
absl::optional<SendCodecSpec> send_codec_spec;
|
2017-04-27 02:08:52 -07:00
|
|
|
rtc::scoped_refptr<AudioEncoderFactory> encoder_factory;
|
2018-06-15 12:28:07 +02:00
|
|
|
absl::optional<AudioCodecPairId> codec_pair_id;
|
2017-10-13 14:56:18 +02:00
|
|
|
|
|
|
|
|
// Track ID as specified during track creation.
|
|
|
|
|
std::string track_id;
|
2018-10-04 14:22:34 -07:00
|
|
|
|
2018-10-15 10:20:24 -07:00
|
|
|
// Per PeerConnection crypto options.
|
|
|
|
|
webrtc::CryptoOptions crypto_options;
|
|
|
|
|
|
2018-10-04 14:22:34 -07:00
|
|
|
// An optional custom frame encryptor that allows the entire frame to be
|
|
|
|
|
// encryptor in whatever way the caller choses. This is not required by
|
|
|
|
|
// default.
|
|
|
|
|
rtc::scoped_refptr<webrtc::FrameEncryptorInterface> frame_encryptor;
|
2020-03-31 11:29:56 +02:00
|
|
|
|
|
|
|
|
// An optional frame transformer used by insertable streams to transform
|
|
|
|
|
// encoded frames.
|
|
|
|
|
rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer;
|
2015-06-08 13:04:56 +02:00
|
|
|
};
|
|
|
|
|
|
2017-07-26 02:09:44 -07:00
|
|
|
virtual ~AudioSendStream() = default;
|
|
|
|
|
|
|
|
|
|
virtual const webrtc::AudioSendStream::Config& GetConfig() const = 0;
|
|
|
|
|
|
2017-04-27 02:08:52 -07:00
|
|
|
// Reconfigure the stream according to the Configuration.
|
|
|
|
|
virtual void Reconfigure(const Config& config) = 0;
|
|
|
|
|
|
2016-05-01 20:18:34 -07:00
|
|
|
// Starts stream activity.
|
|
|
|
|
// When a stream is active, it can receive, process and deliver packets.
|
|
|
|
|
virtual void Start() = 0;
|
|
|
|
|
// Stops stream activity.
|
|
|
|
|
// When a stream is stopped, it can't receive, process or deliver packets.
|
|
|
|
|
virtual void Stop() = 0;
|
|
|
|
|
|
2015-12-04 15:22:19 +01:00
|
|
|
// TODO(solenberg): Make payload_type a config property instead.
|
2016-11-17 05:25:37 -08:00
|
|
|
virtual bool SendTelephoneEvent(int payload_type,
|
|
|
|
|
int payload_frequency,
|
|
|
|
|
int event,
|
|
|
|
|
int duration_ms) = 0;
|
2016-06-16 10:53:22 -07:00
|
|
|
|
|
|
|
|
virtual void SetMuted(bool muted) = 0;
|
|
|
|
|
|
2015-06-08 13:04:56 +02:00
|
|
|
virtual Stats GetStats() const = 0;
|
2017-11-24 17:29:59 +01:00
|
|
|
virtual Stats GetStats(bool has_remote_tracks) const = 0;
|
2015-06-08 13:04:56 +02:00
|
|
|
};
|
2020-01-10 10:33:05 -08:00
|
|
|
|
2015-06-08 13:04:56 +02:00
|
|
|
} // namespace webrtc
|
|
|
|
|
|
2017-09-15 06:47:31 +02:00
|
|
|
#endif // CALL_AUDIO_SEND_STREAM_H_
|