blob: 879a332209b3bdef484da7094178005b36286107 [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
18#include <string>
19
Henrik Kjellander15583c12016-02-10 10:53:12 +010020#include "webrtc/api/mediastreamprovider.h"
21#include "webrtc/api/rtpsenderinterface.h"
22#include "webrtc/api/statscollector.h"
deadbeef70ab1a12015-09-28 16:53:55 -070023#include "webrtc/base/basictypes.h"
24#include "webrtc/base/criticalsection.h"
25#include "webrtc/base/scoped_ptr.h"
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080026#include "webrtc/media/base/audiosource.h"
deadbeef70ab1a12015-09-28 16:53:55 -070027
28namespace webrtc {
29
30// LocalAudioSinkAdapter receives data callback as a sink to the local
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080031// AudioTrack, and passes the data to the sink of AudioSource.
deadbeef70ab1a12015-09-28 16:53:55 -070032class LocalAudioSinkAdapter : public AudioTrackSinkInterface,
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080033 public cricket::AudioSource {
deadbeef70ab1a12015-09-28 16:53:55 -070034 public:
35 LocalAudioSinkAdapter();
36 virtual ~LocalAudioSinkAdapter();
37
38 private:
39 // AudioSinkInterface implementation.
40 void OnData(const void* audio_data,
41 int bits_per_sample,
42 int sample_rate,
Peter Kasting69558702016-01-12 16:26:35 -080043 size_t number_of_channels,
deadbeef70ab1a12015-09-28 16:53:55 -070044 size_t number_of_frames) override;
45
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080046 // cricket::AudioSource implementation.
47 void SetSink(cricket::AudioSource::Sink* sink) override;
deadbeef70ab1a12015-09-28 16:53:55 -070048
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080049 cricket::AudioSource::Sink* sink_;
deadbeef70ab1a12015-09-28 16:53:55 -070050 // Critical section protecting |sink_|.
51 rtc::CriticalSection lock_;
52};
53
54class AudioRtpSender : public ObserverInterface,
55 public rtc::RefCountedObject<RtpSenderInterface> {
56 public:
deadbeeffac06552015-11-25 11:26:01 -080057 // StatsCollector provided so that Add/RemoveLocalAudioTrack can be called
58 // at the appropriate times.
deadbeef70ab1a12015-09-28 16:53:55 -070059 AudioRtpSender(AudioTrackInterface* track,
deadbeeffac06552015-11-25 11:26:01 -080060 const std::string& stream_id,
61 AudioProviderInterface* provider,
62 StatsCollector* stats);
63
deadbeefe1f9d832016-01-14 15:35:42 -080064 // Randomly generates stream_id.
65 AudioRtpSender(AudioTrackInterface* track,
66 AudioProviderInterface* provider,
67 StatsCollector* stats);
68
deadbeeffac06552015-11-25 11:26:01 -080069 // Randomly generates id and stream_id.
70 AudioRtpSender(AudioProviderInterface* provider, StatsCollector* stats);
deadbeef70ab1a12015-09-28 16:53:55 -070071
72 virtual ~AudioRtpSender();
73
74 // ObserverInterface implementation
75 void OnChanged() override;
76
77 // RtpSenderInterface implementation
78 bool SetTrack(MediaStreamTrackInterface* track) override;
79 rtc::scoped_refptr<MediaStreamTrackInterface> track() const override {
80 return track_.get();
81 }
82
deadbeeffac06552015-11-25 11:26:01 -080083 void SetSsrc(uint32_t ssrc) override;
84
85 uint32_t ssrc() const override { return ssrc_; }
86
87 cricket::MediaType media_type() const override {
88 return cricket::MEDIA_TYPE_AUDIO;
89 }
90
deadbeef70ab1a12015-09-28 16:53:55 -070091 std::string id() const override { return id_; }
92
deadbeeffac06552015-11-25 11:26:01 -080093 void set_stream_id(const std::string& stream_id) override {
94 stream_id_ = stream_id;
95 }
96 std::string stream_id() const override { return stream_id_; }
97
deadbeef70ab1a12015-09-28 16:53:55 -070098 void Stop() override;
99
skvladdc1c62c2016-03-16 19:07:43 -0700100 RtpParameters GetParameters() const;
101 bool SetParameters(const RtpParameters& parameters);
102
deadbeef70ab1a12015-09-28 16:53:55 -0700103 private:
deadbeeffac06552015-11-25 11:26:01 -0800104 bool can_send_track() const { return track_ && ssrc_; }
105 // Helper function to construct options for
106 // AudioProviderInterface::SetAudioSend.
107 void SetAudioSend();
deadbeef70ab1a12015-09-28 16:53:55 -0700108
109 std::string id_;
deadbeeffac06552015-11-25 11:26:01 -0800110 std::string stream_id_;
deadbeef5def7b92015-11-20 11:43:22 -0800111 AudioProviderInterface* provider_;
deadbeeffac06552015-11-25 11:26:01 -0800112 StatsCollector* stats_;
113 rtc::scoped_refptr<AudioTrackInterface> track_;
114 uint32_t ssrc_ = 0;
115 bool cached_track_enabled_ = false;
116 bool stopped_ = false;
deadbeef70ab1a12015-09-28 16:53:55 -0700117
118 // Used to pass the data callback from the |track_| to the other end of
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800119 // cricket::AudioSource.
deadbeef70ab1a12015-09-28 16:53:55 -0700120 rtc::scoped_ptr<LocalAudioSinkAdapter> sink_adapter_;
121};
122
123class VideoRtpSender : public ObserverInterface,
124 public rtc::RefCountedObject<RtpSenderInterface> {
125 public:
126 VideoRtpSender(VideoTrackInterface* track,
deadbeeffac06552015-11-25 11:26:01 -0800127 const std::string& stream_id,
deadbeef70ab1a12015-09-28 16:53:55 -0700128 VideoProviderInterface* provider);
129
deadbeefe1f9d832016-01-14 15:35:42 -0800130 // Randomly generates stream_id.
131 VideoRtpSender(VideoTrackInterface* track, VideoProviderInterface* provider);
132
deadbeeffac06552015-11-25 11:26:01 -0800133 // Randomly generates id and stream_id.
134 explicit VideoRtpSender(VideoProviderInterface* provider);
135
deadbeef70ab1a12015-09-28 16:53:55 -0700136 virtual ~VideoRtpSender();
137
138 // ObserverInterface implementation
139 void OnChanged() override;
140
141 // RtpSenderInterface implementation
142 bool SetTrack(MediaStreamTrackInterface* track) override;
143 rtc::scoped_refptr<MediaStreamTrackInterface> track() const override {
144 return track_.get();
145 }
146
deadbeeffac06552015-11-25 11:26:01 -0800147 void SetSsrc(uint32_t ssrc) override;
148
149 uint32_t ssrc() const override { return ssrc_; }
150
151 cricket::MediaType media_type() const override {
152 return cricket::MEDIA_TYPE_VIDEO;
153 }
154
deadbeef70ab1a12015-09-28 16:53:55 -0700155 std::string id() const override { return id_; }
156
deadbeeffac06552015-11-25 11:26:01 -0800157 void set_stream_id(const std::string& stream_id) override {
158 stream_id_ = stream_id;
159 }
160 std::string stream_id() const override { return stream_id_; }
161
deadbeef70ab1a12015-09-28 16:53:55 -0700162 void Stop() override;
163
skvladdc1c62c2016-03-16 19:07:43 -0700164 RtpParameters GetParameters() const;
165 bool SetParameters(const RtpParameters& parameters);
166
deadbeef70ab1a12015-09-28 16:53:55 -0700167 private:
deadbeeffac06552015-11-25 11:26:01 -0800168 bool can_send_track() const { return track_ && ssrc_; }
169 // Helper function to construct options for
170 // VideoProviderInterface::SetVideoSend.
171 void SetVideoSend();
deadbeef70ab1a12015-09-28 16:53:55 -0700172
173 std::string id_;
deadbeeffac06552015-11-25 11:26:01 -0800174 std::string stream_id_;
deadbeef5def7b92015-11-20 11:43:22 -0800175 VideoProviderInterface* provider_;
deadbeeffac06552015-11-25 11:26:01 -0800176 rtc::scoped_refptr<VideoTrackInterface> track_;
177 uint32_t ssrc_ = 0;
178 bool cached_track_enabled_ = false;
179 bool stopped_ = false;
deadbeef70ab1a12015-09-28 16:53:55 -0700180};
181
182} // namespace webrtc
183
Henrik Kjellander15583c12016-02-10 10:53:12 +0100184#endif // WEBRTC_API_RTPSENDER_H_