106 TrackSource source, AudioFrameCallback callback,
123 const std::string &track_name,
124 AudioFrameCallback callback,
141 TrackSource source, VideoFrameCallback callback,
158 const std::string &track_name,
159 VideoFrameCallback callback,
184 const std::string &track_name);
208 const std::string &track_name);
225 TrackSource source,
const std::string &track_name,
226 const std::shared_ptr<Track> &track);
242 const std::string &track_name);
267 const std::string &track_name,
268 DataFrameCallback callback);
310 friend class SubscriptionThreadDispatcherTest;
316 std::string participant_identity;
318 std::string track_name;
320 bool operator==(
const CallbackKey &o)
const {
321 return participant_identity == o.participant_identity &&
322 source == o.source && track_name == o.track_name;
327 struct CallbackKeyHash {
328 std::size_t operator()(
const CallbackKey &k)
const {
329 auto h1 = std::hash<std::string>{}(k.participant_identity);
330 auto h2 = std::hash<int>{}(
static_cast<int>(k.source));
331 auto h3 = std::hash<std::string>{}(k.track_name);
332 return h1 ^ (h2 << 1) ^ (h3 << 2);
337 struct ActiveReader {
338 std::shared_ptr<AudioStream> audio_stream;
339 std::shared_ptr<VideoStream> video_stream;
344 struct DataCallbackKey {
345 std::string participant_identity;
346 std::string track_name;
348 bool operator==(
const DataCallbackKey &o)
const {
349 return participant_identity == o.participant_identity &&
350 track_name == o.track_name;
355 struct DataCallbackKeyHash {
356 std::size_t operator()(
const DataCallbackKey &k)
const {
357 auto h1 = std::hash<std::string>{}(k.participant_identity);
358 auto h2 = std::hash<std::string>{}(k.track_name);
359 return h1 ^ (h2 << 1);
364 struct RegisteredDataCallback {
366 DataFrameCallback callback;
370 struct ActiveDataReader {
371 std::shared_ptr<RemoteDataTrack> remote_track;
372 std::mutex sub_mutex;
373 std::shared_ptr<DataTrackStream> stream;
378 struct RegisteredAudioCallback {
379 AudioFrameCallback callback;
380 AudioStream::Options options;
384 struct RegisteredVideoCallback {
385 VideoFrameCallback callback;
386 VideoStream::Options options;
393 std::thread extractReaderThreadLocked(
const CallbackKey &key);
398 std::thread startReaderLocked(
const CallbackKey &key,
399 const std::shared_ptr<Track> &track);
405 std::thread startAudioReaderLocked(
const CallbackKey &key,
406 const std::shared_ptr<Track> &track,
407 AudioFrameCallback cb,
408 const AudioStream::Options &opts);
414 std::thread startVideoReaderLocked(
const CallbackKey &key,
415 const std::shared_ptr<Track> &track,
416 VideoFrameCallback cb,
417 const VideoStream::Options &opts);
421 std::thread extractDataReaderThreadLocked(DataFrameCallbackId
id);
425 std::thread extractDataReaderThreadLocked(
const DataCallbackKey &key);
430 startDataReaderLocked(DataFrameCallbackId
id,
const DataCallbackKey &key,
431 const std::shared_ptr<RemoteDataTrack> &track,
432 DataFrameCallback cb);
435 mutable std::mutex lock_;
438 std::unordered_map<CallbackKey, RegisteredAudioCallback, CallbackKeyHash>
442 std::unordered_map<CallbackKey, RegisteredVideoCallback, CallbackKeyHash>
446 std::unordered_map<CallbackKey, ActiveReader, CallbackKeyHash>
450 DataFrameCallbackId next_data_callback_id_;
453 std::unordered_map<DataFrameCallbackId, RegisteredDataCallback>
457 std::unordered_map<DataFrameCallbackId, std::shared_ptr<ActiveDataReader>>
458 active_data_readers_;
461 std::unordered_map<DataCallbackKey, std::shared_ptr<RemoteDataTrack>,
466 static constexpr int kMaxActiveReaders = 20;