12 #include <unordered_map>
15 #include "AgoraBase.h"
16 #include "NGIAgoraVideoTrack.h"
18 #include "rtc_connection_i.h"
19 #include "track_stat_i.h"
20 #include "video_config_i.h"
21 #include "common_defines.h"
29 CONFIG_PRIORITY_DEBUG = 0,
31 CONFIG_PRIORITY_DEVICE,
35 CONFIG_PRIORITY_HIGH_FROM_SERVER,
41 CONFIG_PRIORITY_NORMAL_FROM_SERVER,
43 CONFIG_PRIORITY_INTERNAL,
47 template <
typename Observer>
53 bool add(std::shared_ptr<Observer> obs) {
58 std::lock_guard<std::mutex> _(obs_mutex_);
59 observer_map_[obs.get()] = obs;
64 std::lock_guard<std::mutex> _(obs_mutex_);
65 return observer_map_.size();
69 bool remove(Observer* obs) {
74 std::lock_guard<std::mutex> _(obs_mutex_);
75 if (observer_map_.find(obs) == observer_map_.end()) {
79 observer_map_.erase(obs);
83 void notify(std::function<
void (std::shared_ptr<Observer>)>&& notify) {
84 std::vector<std::shared_ptr<Observer>> obs_copy;
87 std::lock_guard<std::mutex> _(obs_mutex_);
89 for (
auto it = observer_map_.begin(); it != observer_map_.end();) {
90 auto obs_shared = it->second.lock();
92 it = observer_map_.erase(it);
96 obs_copy.push_back(obs_shared);
101 for (
auto obs : obs_copy) {
107 std::mutex obs_mutex_;
108 std::unordered_map<Observer*, std::weak_ptr<Observer>> observer_map_;
115 class VideoNodeRtpSink;
116 class VideoNodeRtpSource;
117 class VideoTrackConfigurator;
122 virtual void onLocalVideoStateChanged(
int id,
123 LOCAL_VIDEO_STREAM_STATE state,
124 LOCAL_VIDEO_STREAM_ERROR errorCode,
127 virtual void onRemoteVideoStateChanged(uid_t uid,
128 REMOTE_VIDEO_STATE state,
129 REMOTE_VIDEO_STATE_REASON reason,
132 virtual void onFirstVideoFrameRendered(uid_t uid,
int width,
int height,
int timestamp_ms) {}
134 virtual void onFirstVideoFrameDecoded(uid_t uid,
int width,
int height,
int timestamp_ms) {}
136 virtual void onSourceVideoSizeChanged(uid_t uid,
137 int width,
int height,
138 int rotation,
int timestamp_ms) {}
139 virtual void onSendSideDelay(
int id,
int send_delay) {}
140 virtual void onRecvSideDelay(uid_t uid,
int recv_delay) {}
141 virtual void onRecvSideFps(uid_t uid,
int fps) {}
146 enum DetachReason { MANUAL, TRACK_DESTROY, NETWORK_DESTROY };
150 std::vector<int> fec_protection_factor;
151 std::vector<std::vector<int>> fec_ratioLevel;
152 std::vector<int> fec_rttThreshold;
159 VideoNodeRtpSink* network;
160 WeakPipelineBuilder builder;
161 uint64_t stats_space;
162 CongestionControlType cc_type;
163 int32_t rsfec_minimum_level;
164 bool enable_two_bytes_extension;
167 std::string enable_hw_encoder;
168 std::string hw_encoder_provider;
172 VideoNodeRtpSink* network;
179 virtual bool hasPublished() = 0;
181 virtual int SetVideoConfigEx(
const VideoConfigurationEx& configEx, utils::ConfigPriority priority = utils::CONFIG_PRIORITY_USER) = 0;
183 virtual int GetConfigExs(std::vector<VideoConfigurationEx>& configs) = 0;
185 virtual int setUserId(uid_t uid) { user_id_ = uid;
return 0; }
187 virtual uid_t getUserId() {
return user_id_; }
189 virtual int getObserverSize() {
return track_observers_.size(); }
191 virtual int GetActiveStreamsCount() = 0;
193 virtual int prepareNodes() = 0;
195 virtual bool attach(
const AttachInfo& info) = 0;
196 virtual bool detach(
const DetachInfo& info) = 0;
198 virtual bool registerTrackObserver(std::shared_ptr<IVideoTrackObserver> observer) {
201 virtual bool unregisterTrackObserver(IVideoTrackObserver* observer) {
205 virtual int32_t Width()
const = 0;
206 virtual int32_t Height()
const = 0;
207 virtual bool Enabled()
const = 0;
209 virtual int addVideoWatermark(
const char* watermarkUrl,
const WatermarkOptions& options) {
return -ERR_NOT_SUPPORTED; };
210 virtual int clearVideoWatermarks() {
return -ERR_NOT_SUPPORTED; }
212 virtual VideoTrackConfigurator* GetVideoTrackConfigurator() {
216 int TrackId()
const {
return id_; }
219 static void resetIdGenerator();
223 utils::WeakObservers<IVideoTrackObserver> track_observers_;
227 static std::atomic<int> id_generator_;
231 uint64_t firstDecodingTimeTickMs = 0;
232 uint64_t firstVideoFrameRendered = 0;
237 enum DetachReason { MANUAL, TRACK_DESTROY, NETWORK_DESTROY };
238 using RemoteVideoEvents = StateEvents<REMOTE_VIDEO_STATE, REMOTE_VIDEO_STATE_REASON>;
241 VideoNodeRtpSource* source;
242 VideoNodeRtpSink* rtcp_sender;
243 WeakPipelineBuilder builder;
244 bool recv_media_packet =
false;
245 uint64_t stats_space = 0;
249 VideoNodeRtpSource* source;
250 VideoNodeRtpSink* rtcp_sender;
258 virtual uint32_t getRemoteSsrc() = 0;
260 virtual bool attach(
const AttachInfo& info, REMOTE_VIDEO_STATE_REASON reason) = 0;
261 virtual bool detach(
const DetachInfo& info, REMOTE_VIDEO_STATE_REASON reason) = 0;
265 virtual bool registerTrackObserver(std::shared_ptr<IVideoTrackObserver> observer) {
268 virtual bool unregisterTrackObserver(IVideoTrackObserver* observer) {
273 utils::WeakObservers<IVideoTrackObserver> track_observers_;