blob: 001264d7a761181f76380a6fc1b27e09569f9f60 [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 RtpReceiverInterface.
12// An RtpReceiver associates a MediaStreamTrackInterface with an underlying
13// transport (provided by AudioProviderInterface/VideoProviderInterface)
14
Henrik Kjellander15583c12016-02-10 10:53:12 +010015#ifndef WEBRTC_API_RTPRECEIVER_H_
16#define WEBRTC_API_RTPRECEIVER_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/rtpreceiverinterface.h"
perkjd61bf802016-03-24 03:16:19 -070022#include "webrtc/api/remoteaudiosource.h"
perkjf0dcfe22016-03-10 18:32:00 +010023#include "webrtc/api/videotracksource.h"
deadbeef70ab1a12015-09-28 16:53:55 -070024#include "webrtc/base/basictypes.h"
perkjf0dcfe22016-03-10 18:32:00 +010025#include "webrtc/media/base/videobroadcaster.h"
deadbeef70ab1a12015-09-28 16:53:55 -070026
27namespace webrtc {
28
deadbeefa601f5c2016-06-06 14:27:39 -070029// Internal class used by PeerConnection.
30class RtpReceiverInternal : public RtpReceiverInterface {
31 public:
32 virtual void Stop() = 0;
33};
34
deadbeef70ab1a12015-09-28 16:53:55 -070035class AudioRtpReceiver : public ObserverInterface,
36 public AudioSourceInterface::AudioObserver,
deadbeefa601f5c2016-06-06 14:27:39 -070037 public rtc::RefCountedObject<RtpReceiverInternal> {
deadbeef70ab1a12015-09-28 16:53:55 -070038 public:
perkjd61bf802016-03-24 03:16:19 -070039 AudioRtpReceiver(MediaStreamInterface* stream,
40 const std::string& track_id,
Peter Boström0c4e06b2015-10-07 12:23:21 +020041 uint32_t ssrc,
deadbeef70ab1a12015-09-28 16:53:55 -070042 AudioProviderInterface* provider);
43
44 virtual ~AudioRtpReceiver();
45
46 // ObserverInterface implementation
47 void OnChanged() override;
48
49 // AudioSourceInterface::AudioObserver implementation
50 void OnSetVolume(double volume) override;
51
perkjd61bf802016-03-24 03:16:19 -070052 rtc::scoped_refptr<AudioTrackInterface> audio_track() const {
53 return track_.get();
54 }
55
deadbeef70ab1a12015-09-28 16:53:55 -070056 // RtpReceiverInterface implementation
57 rtc::scoped_refptr<MediaStreamTrackInterface> track() const override {
58 return track_.get();
59 }
60
61 std::string id() const override { return id_; }
62
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070063 RtpParameters GetParameters() const override;
64 bool SetParameters(const RtpParameters& parameters) override;
65
deadbeefa601f5c2016-06-06 14:27:39 -070066 // RtpReceiverInternal implementation.
67 void Stop() override;
68
deadbeef70ab1a12015-09-28 16:53:55 -070069 private:
70 void Reconfigure();
71
Tommif888bb52015-12-12 01:37:01 +010072 const std::string id_;
Tommif888bb52015-12-12 01:37:01 +010073 const uint32_t ssrc_;
74 AudioProviderInterface* provider_; // Set to null in Stop().
perkjd61bf802016-03-24 03:16:19 -070075 const rtc::scoped_refptr<AudioTrackInterface> track_;
deadbeef70ab1a12015-09-28 16:53:55 -070076 bool cached_track_enabled_;
77};
78
deadbeefa601f5c2016-06-06 14:27:39 -070079class VideoRtpReceiver : public rtc::RefCountedObject<RtpReceiverInternal> {
deadbeef70ab1a12015-09-28 16:53:55 -070080 public:
perkjf0dcfe22016-03-10 18:32:00 +010081 VideoRtpReceiver(MediaStreamInterface* stream,
82 const std::string& track_id,
83 rtc::Thread* worker_thread,
Peter Boström0c4e06b2015-10-07 12:23:21 +020084 uint32_t ssrc,
deadbeef70ab1a12015-09-28 16:53:55 -070085 VideoProviderInterface* provider);
86
87 virtual ~VideoRtpReceiver();
88
perkjf0dcfe22016-03-10 18:32:00 +010089 rtc::scoped_refptr<VideoTrackInterface> video_track() const {
90 return track_.get();
91 }
92
deadbeef70ab1a12015-09-28 16:53:55 -070093 // RtpReceiverInterface implementation
94 rtc::scoped_refptr<MediaStreamTrackInterface> track() const override {
95 return track_.get();
96 }
97
98 std::string id() const override { return id_; }
99
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700100 RtpParameters GetParameters() const override;
101 bool SetParameters(const RtpParameters& parameters) override;
102
deadbeefa601f5c2016-06-06 14:27:39 -0700103 // RtpReceiverInternal implementation.
104 void Stop() override;
105
deadbeef70ab1a12015-09-28 16:53:55 -0700106 private:
107 std::string id_;
Peter Boström0c4e06b2015-10-07 12:23:21 +0200108 uint32_t ssrc_;
deadbeef70ab1a12015-09-28 16:53:55 -0700109 VideoProviderInterface* provider_;
perkjf0dcfe22016-03-10 18:32:00 +0100110 // |broadcaster_| is needed since the decoder can only handle one sink.
111 // It might be better if the decoder can handle multiple sinks and consider
112 // the VideoSinkWants.
113 rtc::VideoBroadcaster broadcaster_;
114 // |source_| is held here to be able to change the state of the source when
115 // the VideoRtpReceiver is stopped.
116 rtc::scoped_refptr<VideoTrackSource> source_;
117 rtc::scoped_refptr<VideoTrackInterface> track_;
deadbeef70ab1a12015-09-28 16:53:55 -0700118};
119
120} // namespace webrtc
121
Henrik Kjellander15583c12016-02-10 10:53:12 +0100122#endif // WEBRTC_API_RTPRECEIVER_H_