110 TrackSource source, AudioFrameCallback callback,
127 const std::string &track_name,
128 AudioFrameCallback callback,
145 TrackSource source, VideoFrameCallback callback,
162 const std::string &track_name,
163 VideoFrameCallback callback,
182 const std::string &track_name,
183 VideoFrameEventCallback callback,
208 const std::string &track_name);
232 const std::string &track_name);
249 TrackSource source,
const std::string &track_name,
250 const std::shared_ptr<Track> &track);
266 const std::string &track_name);
291 const std::string &track_name,
292 DataFrameCallback callback);
334 friend class SubscriptionThreadDispatcherTest;
340 std::string participant_identity;
342 std::string track_name;
344 bool operator==(
const CallbackKey &o)
const {
345 return participant_identity == o.participant_identity &&
346 source == o.source && track_name == o.track_name;
351 struct CallbackKeyHash {
352 std::size_t operator()(
const CallbackKey &k)
const {
353 auto h1 = std::hash<std::string>{}(k.participant_identity);
354 auto h2 = std::hash<int>{}(
static_cast<int>(k.source));
355 auto h3 = std::hash<std::string>{}(k.track_name);
356 return h1 ^ (h2 << 1) ^ (h3 << 2);
361 struct ActiveReader {
362 std::shared_ptr<AudioStream> audio_stream;
363 std::shared_ptr<VideoStream> video_stream;
368 struct DataCallbackKey {
369 std::string participant_identity;
370 std::string track_name;
372 bool operator==(
const DataCallbackKey &o)
const {
373 return participant_identity == o.participant_identity &&
374 track_name == o.track_name;
379 struct DataCallbackKeyHash {
380 std::size_t operator()(
const DataCallbackKey &k)
const {
381 auto h1 = std::hash<std::string>{}(k.participant_identity);
382 auto h2 = std::hash<std::string>{}(k.track_name);
383 return h1 ^ (h2 << 1);
388 struct RegisteredDataCallback {
390 DataFrameCallback callback;
394 struct ActiveDataReader {
395 std::shared_ptr<RemoteDataTrack> remote_track;
396 std::mutex sub_mutex;
397 std::shared_ptr<DataTrackStream> stream;
402 struct RegisteredAudioCallback {
403 AudioFrameCallback callback;
404 AudioStream::Options options;
408 struct RegisteredVideoCallback {
409 VideoFrameCallback legacy_callback;
410 VideoFrameEventCallback event_callback;
411 VideoStream::Options options;
418 std::thread extractReaderThreadLocked(
const CallbackKey &key);
423 std::thread startReaderLocked(
const CallbackKey &key,
424 const std::shared_ptr<Track> &track);
430 std::thread startAudioReaderLocked(
const CallbackKey &key,
431 const std::shared_ptr<Track> &track,
432 const AudioFrameCallback &cb,
433 const AudioStream::Options &opts);
439 std::thread startVideoReaderLocked(
const CallbackKey &key,
440 const std::shared_ptr<Track> &track,
441 const RegisteredVideoCallback &callback);
445 std::thread extractDataReaderThreadLocked(DataFrameCallbackId
id);
449 std::thread extractDataReaderThreadLocked(
const DataCallbackKey &key);
454 startDataReaderLocked(DataFrameCallbackId
id,
const DataCallbackKey &key,
455 const std::shared_ptr<RemoteDataTrack> &track,
456 const DataFrameCallback &cb);
459 mutable std::mutex lock_;
462 std::unordered_map<CallbackKey, RegisteredAudioCallback, CallbackKeyHash>
466 std::unordered_map<CallbackKey, RegisteredVideoCallback, CallbackKeyHash>
470 std::unordered_map<CallbackKey, ActiveReader, CallbackKeyHash>
474 DataFrameCallbackId next_data_callback_id_;
477 std::unordered_map<DataFrameCallbackId, RegisteredDataCallback>
481 std::unordered_map<DataFrameCallbackId, std::shared_ptr<ActiveDataReader>>
482 active_data_readers_;
485 std::unordered_map<DataCallbackKey, std::shared_ptr<RemoteDataTrack>,
490 static constexpr int kMaxActiveReaders = 20;