blob: 2c5a5c703b16b14c7ae3e4e2bd5b2cfb20f78612 [file] [log] [blame]
/*
* Copyright 2020 The WebRTC Project Authors. All rights reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#ifndef CALL_ADAPTATION_BROADCAST_RESOURCE_LISTENER_H_
#define CALL_ADAPTATION_BROADCAST_RESOURCE_LISTENER_H_
#include <vector>
#include "api/adaptation/resource.h"
#include "api/scoped_refptr.h"
#include "rtc_base/synchronization/mutex.h"
namespace webrtc {
// Responsible for forwarding 1 resource usage measurement to N listeners by
// creating N "adapter" resources.
//
// Example:
// If we have ResourceA, ResourceListenerX and ResourceListenerY we can create a
// BroadcastResourceListener that listens to ResourceA, use CreateAdapter() to
// spawn adapter resources ResourceX and ResourceY and let ResourceListenerX
// listen to ResourceX and ResourceListenerY listen to ResourceY. When ResourceA
// makes a measurement it will be echoed by both ResourceX and ResourceY.
//
// TODO(https://crbug.com/webrtc/11565): When the ResourceAdaptationProcessor is
// moved to call there will only be one ResourceAdaptationProcessor that needs
// to listen to the injected resources. When this is the case, delete this class
// and DCHECK that a Resource's listener is never overwritten.
class BroadcastResourceListener : public ResourceListener {
public:
explicit BroadcastResourceListener(
rtc::scoped_refptr<Resource> source_resource);
~BroadcastResourceListener() override;
rtc::scoped_refptr<Resource> SourceResource() const;
void StartListening();
void StopListening();
// Creates a Resource that redirects any resource usage measurements that
// BroadcastResourceListener receives to its listener.
rtc::scoped_refptr<Resource> CreateAdapterResource();
// Unregister the adapter from the BroadcastResourceListener; it will no
// longer receive resource usage measurement and will no longer be referenced.
// Use this to prevent memory leaks of old adapters.
void RemoveAdapterResource(rtc::scoped_refptr<Resource> resource);
std::vector<rtc::scoped_refptr<Resource>> GetAdapterResources();
// ResourceListener implementation.
void OnResourceUsageStateMeasured(rtc::scoped_refptr<Resource> resource,
ResourceUsageState usage_state) override;
private:
class AdapterResource;
friend class AdapterResource;
const rtc::scoped_refptr<Resource> source_resource_;
Mutex lock_;
bool is_listening_ RTC_GUARDED_BY(lock_);
// The AdapterResource unregisters itself prior to destruction, guaranteeing
// that these pointers are safe to use.
std::vector<rtc::scoped_refptr<AdapterResource>> adapters_
RTC_GUARDED_BY(lock_);
};
} // namespace webrtc
#endif // CALL_ADAPTATION_BROADCAST_RESOURCE_LISTENER_H_