Add 'AudioPacket' notification to media transport interface.
So far, base channel was only notifying about 'first audio packet' when RTP was used, and it never notified about it when media_transport interface was used. This change adds a sigslot to notify about a new media packet to the media transport interface. Bug: webrtc:9719 Change-Id: Ie9230c407f35b1aaa71ba71008ac34ba8869e2d4 Reviewed-on: https://webrtc-review.googlesource.com/c/117249 Reviewed-by: Anton Sukhanov <sukhanov@webrtc.org> Reviewed-by: Steve Anton <steveanton@webrtc.org> Reviewed-by: Niels Moller <nisse@webrtc.org> Commit-Queue: Peter Slatala <psla@webrtc.org> Cr-Commit-Position: refs/heads/master@{#26282}
This commit is contained in:

committed by
Commit Bot

parent
e7d08df837
commit
309aafe351
@ -157,6 +157,9 @@ MediaTransportFactory::CreateMediaTransport(
|
||||
return std::unique_ptr<MediaTransportInterface>(nullptr);
|
||||
}
|
||||
|
||||
MediaTransportInterface::MediaTransportInterface() = default;
|
||||
MediaTransportInterface::~MediaTransportInterface() = default;
|
||||
|
||||
void MediaTransportInterface::SetKeyFrameRequestCallback(
|
||||
MediaTransportKeyFrameRequestCallback* callback) {}
|
||||
|
||||
@ -168,6 +171,9 @@ MediaTransportInterface::GetLatestTargetTransferRate() {
|
||||
void MediaTransportInterface::SetNetworkChangeCallback(
|
||||
MediaTransportNetworkChangeCallback* callback) {}
|
||||
|
||||
void MediaTransportInterface::SetFirstAudioPacketReceivedObserver(
|
||||
AudioPacketReceivedObserver* observer) {}
|
||||
|
||||
void MediaTransportInterface::AddTargetTransferRateObserver(
|
||||
TargetTransferRateObserver* observer) {}
|
||||
void MediaTransportInterface::RemoveTargetTransferRateObserver(
|
||||
|
@ -40,6 +40,15 @@ namespace webrtc {
|
||||
|
||||
class RtcEventLog;
|
||||
|
||||
class AudioPacketReceivedObserver {
|
||||
public:
|
||||
virtual ~AudioPacketReceivedObserver() = default;
|
||||
|
||||
// Invoked for the first received audio packet on a given channel id.
|
||||
// It will be invoked once for each channel id.
|
||||
virtual void OnFirstAudioPacketReceived(int64_t channel_id) = 0;
|
||||
};
|
||||
|
||||
// A collection of settings for creation of media transport.
|
||||
struct MediaTransportSettings final {
|
||||
MediaTransportSettings();
|
||||
@ -352,7 +361,8 @@ class DataChannelSink {
|
||||
// and receiving bandwidth estimate update from congestion control.
|
||||
class MediaTransportInterface {
|
||||
public:
|
||||
virtual ~MediaTransportInterface() = default;
|
||||
MediaTransportInterface();
|
||||
virtual ~MediaTransportInterface();
|
||||
|
||||
// Start asynchronous send of audio frame. The status returned by this method
|
||||
// only pertains to the synchronous operations (e.g.
|
||||
@ -399,6 +409,15 @@ class MediaTransportInterface {
|
||||
virtual void RemoveTargetTransferRateObserver(
|
||||
TargetTransferRateObserver* observer);
|
||||
|
||||
// Sets audio packets observer, which gets informed about incoming audio
|
||||
// packets. Before destruction, the observer must be unregistered by setting
|
||||
// nullptr.
|
||||
//
|
||||
// This method may be temporary, when the multiplexer is implemented (or
|
||||
// multiplexer may use it to demultiplex channel ids).
|
||||
virtual void SetFirstAudioPacketReceivedObserver(
|
||||
AudioPacketReceivedObserver* observer);
|
||||
|
||||
// Intended for receive side. AddRttObserver registers an observer to be
|
||||
// called for each RTT measurement, typically once per ACK. Before media
|
||||
// transport is destructed the observer must be unregistered.
|
||||
|
@ -744,6 +744,9 @@ VoiceChannel::VoiceChannel(rtc::Thread* worker_thread,
|
||||
crypto_options) {}
|
||||
|
||||
VoiceChannel::~VoiceChannel() {
|
||||
if (media_transport()) {
|
||||
media_transport()->SetFirstAudioPacketReceivedObserver(nullptr);
|
||||
}
|
||||
TRACE_EVENT0("webrtc", "VoiceChannel::~VoiceChannel");
|
||||
// this can't be done in the base class, since it calls a virtual
|
||||
DisableMedia_w();
|
||||
@ -762,6 +765,19 @@ void BaseChannel::OnNetworkRouteChanged(
|
||||
OnNetworkRouteChanged(absl::make_optional(network_route));
|
||||
}
|
||||
|
||||
void VoiceChannel::Init_w(webrtc::RtpTransportInternal* rtp_transport,
|
||||
webrtc::MediaTransportInterface* media_transport) {
|
||||
BaseChannel::Init_w(rtp_transport, media_transport);
|
||||
if (BaseChannel::media_transport()) {
|
||||
this->media_transport()->SetFirstAudioPacketReceivedObserver(this);
|
||||
}
|
||||
}
|
||||
|
||||
void VoiceChannel::OnFirstAudioPacketReceived(int64_t channel_id) {
|
||||
has_received_packet_ = true;
|
||||
signaling_thread()->Post(RTC_FROM_HERE, this, MSG_FIRSTPACKETRECEIVED);
|
||||
}
|
||||
|
||||
void VoiceChannel::UpdateMediaSendRecvState_w() {
|
||||
// Render incoming data if we're the active call, and we have the local
|
||||
// content. We receive data on the default channel and multiplexed streams.
|
||||
@ -1034,7 +1050,8 @@ RtpDataChannel::~RtpDataChannel() {
|
||||
Deinit();
|
||||
}
|
||||
|
||||
void RtpDataChannel::Init_w(webrtc::RtpTransportInternal* rtp_transport) {
|
||||
void RtpDataChannel::Init_w(webrtc::RtpTransportInternal* rtp_transport,
|
||||
webrtc::MediaTransportInterface* media_transport) {
|
||||
BaseChannel::Init_w(rtp_transport, /*media_transport=*/nullptr);
|
||||
media_channel()->SignalDataReceived.connect(this,
|
||||
&RtpDataChannel::OnDataReceived);
|
||||
|
18
pc/channel.h
18
pc/channel.h
@ -20,6 +20,7 @@
|
||||
|
||||
#include "api/call/audio_sink.h"
|
||||
#include "api/jsep.h"
|
||||
#include "api/media_transport_interface.h"
|
||||
#include "api/rtp_receiver_interface.h"
|
||||
#include "api/video/video_sink_interface.h"
|
||||
#include "api/video/video_source_interface.h"
|
||||
@ -87,7 +88,7 @@ class BaseChannel : public ChannelInterface,
|
||||
bool srtp_required,
|
||||
webrtc::CryptoOptions crypto_options);
|
||||
virtual ~BaseChannel();
|
||||
void Init_w(webrtc::RtpTransportInternal* rtp_transport,
|
||||
virtual void Init_w(webrtc::RtpTransportInternal* rtp_transport,
|
||||
webrtc::MediaTransportInterface* media_transport);
|
||||
|
||||
// Deinit may be called multiple times and is simply ignored if it's already
|
||||
@ -292,6 +293,8 @@ class BaseChannel : public ChannelInterface,
|
||||
|
||||
bool RegisterRtpDemuxerSink();
|
||||
|
||||
bool has_received_packet_ = false;
|
||||
|
||||
private:
|
||||
bool ConnectToRtpTransport();
|
||||
void DisconnectFromRtpTransport();
|
||||
@ -301,6 +304,7 @@ class BaseChannel : public ChannelInterface,
|
||||
|
||||
// MediaTransportNetworkChangeCallback override.
|
||||
void OnNetworkRouteChanged(const rtc::NetworkRoute& network_route) override;
|
||||
|
||||
rtc::Thread* const worker_thread_;
|
||||
rtc::Thread* const network_thread_;
|
||||
rtc::Thread* const signaling_thread_;
|
||||
@ -323,7 +327,6 @@ class BaseChannel : public ChannelInterface,
|
||||
std::vector<std::pair<rtc::Socket::Option, int> > rtcp_socket_options_;
|
||||
bool writable_ = false;
|
||||
bool was_ever_writable_ = false;
|
||||
bool has_received_packet_ = false;
|
||||
const bool srtp_required_ = true;
|
||||
webrtc::CryptoOptions crypto_options_;
|
||||
|
||||
@ -346,7 +349,8 @@ class BaseChannel : public ChannelInterface,
|
||||
|
||||
// VoiceChannel is a specialization that adds support for early media, DTMF,
|
||||
// and input/output level monitoring.
|
||||
class VoiceChannel : public BaseChannel {
|
||||
class VoiceChannel : public BaseChannel,
|
||||
public webrtc::AudioPacketReceivedObserver {
|
||||
public:
|
||||
VoiceChannel(rtc::Thread* worker_thread,
|
||||
rtc::Thread* network_thread,
|
||||
@ -366,6 +370,8 @@ class VoiceChannel : public BaseChannel {
|
||||
cricket::MediaType media_type() const override {
|
||||
return cricket::MEDIA_TYPE_AUDIO;
|
||||
}
|
||||
void Init_w(webrtc::RtpTransportInternal* rtp_transport,
|
||||
webrtc::MediaTransportInterface* media_transport) override;
|
||||
|
||||
private:
|
||||
// overrides from BaseChannel
|
||||
@ -377,6 +383,8 @@ class VoiceChannel : public BaseChannel {
|
||||
webrtc::SdpType type,
|
||||
std::string* error_desc) override;
|
||||
|
||||
void OnFirstAudioPacketReceived(int64_t channel_id) override;
|
||||
|
||||
// Last AudioSendParameters sent down to the media_channel() via
|
||||
// SetSendParameters.
|
||||
AudioSendParameters last_send_params_;
|
||||
@ -443,7 +451,9 @@ class RtpDataChannel : public BaseChannel {
|
||||
DtlsTransportInternal* rtcp_dtls_transport,
|
||||
rtc::PacketTransportInternal* rtp_packet_transport,
|
||||
rtc::PacketTransportInternal* rtcp_packet_transport);
|
||||
void Init_w(webrtc::RtpTransportInternal* rtp_transport);
|
||||
void Init_w(
|
||||
webrtc::RtpTransportInternal* rtp_transport,
|
||||
webrtc::MediaTransportInterface* media_transport = nullptr) override;
|
||||
|
||||
virtual bool SendData(const SendDataParams& params,
|
||||
const rtc::CopyOnWriteBuffer& payload,
|
||||
|
Reference in New Issue
Block a user