#ifndef CHROMECAST_MEDIA_COMMON_AUDIO_DECODER_SOFTWARE_WRAPPER_H_
#define CHROMECAST_MEDIA_COMMON_AUDIO_DECODER_SOFTWARE_WRAPPER_H_
#include <stdint.h>
#include <memory>
#include <string>
#include "base/memory/scoped_refptr.h"
#include "chromecast/media/api/cast_audio_decoder.h"
#include "chromecast/public/media/media_pipeline_backend.h"
namespace chromecast {
namespace media {
class AudioDecoderSoftwareWrapper
: public MediaPipelineBackend::Decoder::Delegate {
public:
using DecoderDelegate = MediaPipelineBackend::Decoder::Delegate;
using RenderingDelay = MediaPipelineBackend::AudioDecoder::RenderingDelay;
using Statistics = MediaPipelineBackend::AudioDecoder::Statistics;
using AudioTrackTimestamp =
MediaPipelineBackend::AudioDecoder::AudioTrackTimestamp;
AudioDecoderSoftwareWrapper(
MediaPipelineBackend::AudioDecoder* backend_decoder);
AudioDecoderSoftwareWrapper(const AudioDecoderSoftwareWrapper&) = delete;
AudioDecoderSoftwareWrapper& operator=(const AudioDecoderSoftwareWrapper&) =
delete;
~AudioDecoderSoftwareWrapper() override;
void SetDelegate(DecoderDelegate* delegate);
MediaPipelineBackend::BufferStatus PushBuffer(CastDecoderBuffer* buffer);
void GetStatistics(Statistics* statistics);
bool SetConfig(const AudioConfig& config);
bool SetVolume(float multiplier);
RenderingDelay GetRenderingDelay();
AudioTrackTimestamp GetAudioTrackTimestamp();
int GetStartThresholdInFrames();
bool IsUsingSoftwareDecoder();
private:
bool CreateSoftwareDecoder(const AudioConfig& config);
void OnDecodedBuffer(CastAudioDecoder::Status status,
const media::AudioConfig& config,
scoped_refptr<DecoderBufferBase> decoded);
void OnPushBufferComplete(MediaPipelineBackend::BufferStatus status) override;
void OnEndOfStream() override;
void OnDecoderError() override;
void OnKeyStatusChanged(const std::string& key_id,
CastKeyStatus key_status,
uint32_t system_code) override;
void OnVideoResolutionChanged(const Size& size) override;
MediaPipelineBackend::AudioDecoder* const backend_decoder_;
DecoderDelegate* delegate_;
std::unique_ptr<CastAudioDecoder> software_decoder_;
AudioConfig output_config_;
scoped_refptr<DecoderBufferBase> pending_pushed_buffer_;
bool decoder_error_;
};
}
}
#endif