blob: 86de7658c9818b5852fc6423938fde5a731fc9cd [file] [log] [blame]
deadbeef6979b022015-09-24 16:47:53 -07001/*
kjellanderb24317b2016-02-10 07:54:43 -08002 * Copyright 2015 The WebRTC project authors. All Rights Reserved.
deadbeef6979b022015-09-24 16:47:53 -07003 *
kjellanderb24317b2016-02-10 07:54:43 -08004 * 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.
deadbeef6979b022015-09-24 16:47:53 -07009 */
10
deadbeef70ab1a12015-09-28 16:53:55 -070011// This file contains classes that implement RtpSenderInterface.
12// An RtpSender associates a MediaStreamTrackInterface with an underlying
13// transport (provided by AudioProviderInterface/VideoProviderInterface)
14
Henrik Kjellander15583c12016-02-10 10:53:12 +010015#ifndef WEBRTC_API_RTPSENDER_H_
16#define WEBRTC_API_RTPSENDER_H_
deadbeef70ab1a12015-09-28 16:53:55 -070017
kwibergd1fe2812016-04-27 06:47:29 -070018#include <memory>
deadbeef70ab1a12015-09-28 16:53:55 -070019#include <string>
20
Henrik Kjellander15583c12016-02-10 10:53:12 +010021#include "webrtc/api/mediastreamprovider.h"
22#include "webrtc/api/rtpsenderinterface.h"
23#include "webrtc/api/statscollector.h"
deadbeef70ab1a12015-09-28 16:53:55 -070024#include "webrtc/base/basictypes.h"
25#include "webrtc/base/criticalsection.h"
26#include "webrtc/base/scoped_ptr.h"
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080027#include "webrtc/media/base/audiosource.h"
deadbeef70ab1a12015-09-28 16:53:55 -070028
29namespace webrtc {
30
31// LocalAudioSinkAdapter receives data callback as a sink to the local
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080032// AudioTrack, and passes the data to the sink of AudioSource.
deadbeef70ab1a12015-09-28 16:53:55 -070033class LocalAudioSinkAdapter : public AudioTrackSinkInterface,
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080034 public cricket::AudioSource {
deadbeef70ab1a12015-09-28 16:53:55 -070035 public:
36 LocalAudioSinkAdapter();
37 virtual ~LocalAudioSinkAdapter();
38
39 private:
40 // AudioSinkInterface implementation.
41 void OnData(const void* audio_data,
42 int bits_per_sample,
43 int sample_rate,
Peter Kasting69558702016-01-12 16:26:35 -080044 size_t number_of_channels,
deadbeef70ab1a12015-09-28 16:53:55 -070045 size_t number_of_frames) override;
46
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080047 // cricket::AudioSource implementation.
48 void SetSink(cricket::AudioSource::Sink* sink) override;
deadbeef70ab1a12015-09-28 16:53:55 -070049
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080050 cricket::AudioSource::Sink* sink_;
deadbeef70ab1a12015-09-28 16:53:55 -070051 // Critical section protecting |sink_|.
52 rtc::CriticalSection lock_;
53};
54
55class AudioRtpSender : public ObserverInterface,
56 public rtc::RefCountedObject<RtpSenderInterface> {
57 public:
deadbeeffac06552015-11-25 11:26:01 -080058 // StatsCollector provided so that Add/RemoveLocalAudioTrack can be called
59 // at the appropriate times.
deadbeef70ab1a12015-09-28 16:53:55 -070060 AudioRtpSender(AudioTrackInterface* track,
deadbeeffac06552015-11-25 11:26:01 -080061 const std::string& stream_id,
62 AudioProviderInterface* provider,
63 StatsCollector* stats);
64
deadbeefe1f9d832016-01-14 15:35:42 -080065 // Randomly generates stream_id.
66 AudioRtpSender(AudioTrackInterface* track,
67 AudioProviderInterface* provider,
68 StatsCollector* stats);
69
deadbeeffac06552015-11-25 11:26:01 -080070 // Randomly generates id and stream_id.
71 AudioRtpSender(AudioProviderInterface* provider, StatsCollector* stats);
deadbeef70ab1a12015-09-28 16:53:55 -070072
73 virtual ~AudioRtpSender();
74
75 // ObserverInterface implementation
76 void OnChanged() override;
77
78 // RtpSenderInterface implementation
79 bool SetTrack(MediaStreamTrackInterface* track) override;
80 rtc::scoped_refptr<MediaStreamTrackInterface> track() const override {
81 return track_.get();
82 }
83
deadbeeffac06552015-11-25 11:26:01 -080084 void SetSsrc(uint32_t ssrc) override;
85
86 uint32_t ssrc() const override { return ssrc_; }
87
88 cricket::MediaType media_type() const override {
89 return cricket::MEDIA_TYPE_AUDIO;
90 }
91
deadbeef70ab1a12015-09-28 16:53:55 -070092 std::string id() const override { return id_; }
93
deadbeeffac06552015-11-25 11:26:01 -080094 void set_stream_id(const std::string& stream_id) override {
95 stream_id_ = stream_id;
96 }
97 std::string stream_id() const override { return stream_id_; }
98
deadbeef70ab1a12015-09-28 16:53:55 -070099 void Stop() override;
100
nisseef8b61e2016-04-29 06:09:15 -0700101 RtpParameters GetParameters() const override;
102 bool SetParameters(const RtpParameters& parameters) override;
skvladdc1c62c2016-03-16 19:07:43 -0700103
deadbeef70ab1a12015-09-28 16:53:55 -0700104 private:
nissefcc640f2016-04-01 01:10:42 -0700105 // TODO(nisse): Since SSRC == 0 is technically valid, figure out
106 // some other way to test if we have a valid SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800107 bool can_send_track() const { return track_ && ssrc_; }
108 // Helper function to construct options for
109 // AudioProviderInterface::SetAudioSend.
110 void SetAudioSend();
deadbeef70ab1a12015-09-28 16:53:55 -0700111
112 std::string id_;
deadbeeffac06552015-11-25 11:26:01 -0800113 std::string stream_id_;
deadbeef5def7b92015-11-20 11:43:22 -0800114 AudioProviderInterface* provider_;
deadbeeffac06552015-11-25 11:26:01 -0800115 StatsCollector* stats_;
116 rtc::scoped_refptr<AudioTrackInterface> track_;
117 uint32_t ssrc_ = 0;
118 bool cached_track_enabled_ = false;
119 bool stopped_ = false;
deadbeef70ab1a12015-09-28 16:53:55 -0700120
121 // Used to pass the data callback from the |track_| to the other end of
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800122 // cricket::AudioSource.
kwibergd1fe2812016-04-27 06:47:29 -0700123 std::unique_ptr<LocalAudioSinkAdapter> sink_adapter_;
deadbeef70ab1a12015-09-28 16:53:55 -0700124};
125
126class VideoRtpSender : public ObserverInterface,
127 public rtc::RefCountedObject<RtpSenderInterface> {
128 public:
129 VideoRtpSender(VideoTrackInterface* track,
deadbeeffac06552015-11-25 11:26:01 -0800130 const std::string& stream_id,
deadbeef70ab1a12015-09-28 16:53:55 -0700131 VideoProviderInterface* provider);
132
deadbeefe1f9d832016-01-14 15:35:42 -0800133 // Randomly generates stream_id.
134 VideoRtpSender(VideoTrackInterface* track, VideoProviderInterface* provider);
135
deadbeeffac06552015-11-25 11:26:01 -0800136 // Randomly generates id and stream_id.
137 explicit VideoRtpSender(VideoProviderInterface* provider);
138
deadbeef70ab1a12015-09-28 16:53:55 -0700139 virtual ~VideoRtpSender();
140
141 // ObserverInterface implementation
142 void OnChanged() override;
143
144 // RtpSenderInterface implementation
145 bool SetTrack(MediaStreamTrackInterface* track) override;
146 rtc::scoped_refptr<MediaStreamTrackInterface> track() const override {
147 return track_.get();
148 }
149
deadbeeffac06552015-11-25 11:26:01 -0800150 void SetSsrc(uint32_t ssrc) override;
151
152 uint32_t ssrc() const override { return ssrc_; }
153
154 cricket::MediaType media_type() const override {
155 return cricket::MEDIA_TYPE_VIDEO;
156 }
157
deadbeef70ab1a12015-09-28 16:53:55 -0700158 std::string id() const override { return id_; }
159
deadbeeffac06552015-11-25 11:26:01 -0800160 void set_stream_id(const std::string& stream_id) override {
161 stream_id_ = stream_id;
162 }
163 std::string stream_id() const override { return stream_id_; }
164
deadbeef70ab1a12015-09-28 16:53:55 -0700165 void Stop() override;
166
nisseef8b61e2016-04-29 06:09:15 -0700167 RtpParameters GetParameters() const override;
168 bool SetParameters(const RtpParameters& parameters) override;
skvladdc1c62c2016-03-16 19:07:43 -0700169
deadbeef70ab1a12015-09-28 16:53:55 -0700170 private:
deadbeeffac06552015-11-25 11:26:01 -0800171 bool can_send_track() const { return track_ && ssrc_; }
172 // Helper function to construct options for
173 // VideoProviderInterface::SetVideoSend.
174 void SetVideoSend();
deadbeef70ab1a12015-09-28 16:53:55 -0700175
176 std::string id_;
deadbeeffac06552015-11-25 11:26:01 -0800177 std::string stream_id_;
deadbeef5def7b92015-11-20 11:43:22 -0800178 VideoProviderInterface* provider_;
deadbeeffac06552015-11-25 11:26:01 -0800179 rtc::scoped_refptr<VideoTrackInterface> track_;
180 uint32_t ssrc_ = 0;
181 bool cached_track_enabled_ = false;
182 bool stopped_ = false;
deadbeef70ab1a12015-09-28 16:53:55 -0700183};
184
185} // namespace webrtc
186
Henrik Kjellander15583c12016-02-10 10:53:12 +0100187#endif // WEBRTC_API_RTPSENDER_H_