#ifndef CHROMECAST_MEDIA_COMMON_MEDIA_PIPELINE_BACKEND_MANAGER_H_
#define CHROMECAST_MEDIA_COMMON_MEDIA_PIPELINE_BACKEND_MANAGER_H_
#include <map>
#include <memory>
#include <vector>
#include "base/containers/flat_map.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list_threadsafe.h"
#include "base/task/sequenced_task_runner.h"
#include "base/task/single_thread_task_runner.h"
#include "base/timer/timer.h"
#include "chromecast/media/api/cma_backend_factory.h"
#include "chromecast/public/media/decoder_config.h"
#include "chromecast/public/media/media_pipeline_device_params.h"
namespace chromecast {
namespace media {
enum class AudioContentType;
class CastDecoderBuffer;
class CmaBackend;
class MediaPipelineBackendWrapper;
class ActiveMediaPipelineBackendWrapper;
class MediaResourceTracker;
class MediaPipelineBackendManager : public media::CmaBackendFactory {
public:
class ActiveAudioStreamObserver {
public:
virtual void OnActiveAudioStreamChange(bool have_active_streams) = 0;
protected:
virtual ~ActiveAudioStreamObserver() = default;
};
class BufferDelegate {
public:
virtual bool IsActive() = 0;
virtual void OnStreamStarted() = 0;
virtual void OnStreamStopped() = 0;
virtual void OnPushBuffer(const CastDecoderBuffer* buffer) = 0;
virtual void OnSetConfig(const AudioConfig& config) = 0;
virtual void OnSetVolume(float volume) = 0;
protected:
virtual ~BufferDelegate() = default;
};
enum DecoderType {
AUDIO_DECODER,
VIDEO_DECODER,
SFX_DECODER,
NUM_DECODER_TYPES
};
MediaPipelineBackendManager(
scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
MediaResourceTracker* media_resource_tracker);
MediaPipelineBackendManager(const MediaPipelineBackendManager&) = delete;
MediaPipelineBackendManager& operator=(const MediaPipelineBackendManager&) =
delete;
~MediaPipelineBackendManager() override;
std::unique_ptr<CmaBackend> CreateBackend(
const MediaPipelineDeviceParams& params) override;
scoped_refptr<base::SequencedTaskRunner> GetMediaTaskRunner() override;
void BackendDestroyed(MediaPipelineBackendWrapper* backend_wrapper);
void BackendUseVideoDecoder(MediaPipelineBackendWrapper* backend_wrapper);
base::SingleThreadTaskRunner* task_runner() const {
return media_task_runner_.get();
}
void AddActiveAudioStreamObserver(ActiveAudioStreamObserver* observer);
void RemoveActiveAudioStreamObserver(ActiveAudioStreamObserver* observer);
void AddExtraPlayingStream(bool sfx, const AudioContentType type);
void RemoveExtraPlayingStream(bool sfx, const AudioContentType type);
void SetBufferDelegate(BufferDelegate* buffer_delegate);
BufferDelegate* buffer_delegate() const { return buffer_delegate_; }
void SetPowerSaveEnabled(bool power_save_enabled);
void TemporaryDisablePowerSave();
private:
friend class ActiveMediaPipelineBackendWrapper;
class MixerConnection {
public:
virtual ~MixerConnection() = default;
};
void CreateMixerConnection();
bool IncrementDecoderCount(DecoderType type);
void DecrementDecoderCount(DecoderType type);
void UpdatePlayingAudioCount(bool sfx,
const AudioContentType type,
int change);
void OnMixerStreamCountChange(int primary_streams, int sfx_streams);
void HandlePlayingAudioStreamsChange(bool had_playing_audio_streams,
bool had_playing_primary_streams);
int TotalPlayingAudioStreamsCount();
int TotalPlayingNoneffectsAudioStreamsCount();
void EnterPowerSaveMode();
const scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
MediaResourceTracker* const media_resource_tracker_;
int decoder_count_[NUM_DECODER_TYPES];
base::flat_map<AudioContentType, int> playing_audio_streams_count_;
base::flat_map<AudioContentType, int> playing_noneffects_audio_streams_count_;
scoped_refptr<base::ObserverListThreadSafe<ActiveAudioStreamObserver>>
active_audio_stream_observers_;
MediaPipelineBackendWrapper* backend_wrapper_using_video_decoder_;
BufferDelegate* buffer_delegate_;
bool power_save_enabled_ = true;
base::OneShotTimer power_save_timer_;
std::unique_ptr<MixerConnection> mixer_connection_;
int mixer_primary_stream_count_ = 0;
int mixer_sfx_stream_count_ = 0;
base::WeakPtrFactory<MediaPipelineBackendManager> weak_factory_;
};
}
}
#endif