| // Copyright 2020 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROMECAST_MEDIA_API_CAST_AUDIO_DEMUXER_H_ |
| #define CHROMECAST_MEDIA_API_CAST_AUDIO_DEMUXER_H_ |
| |
| #include <string_view> |
| |
| #include "base/time/time.h" |
| #include "chromecast/media/api/decoder_buffer_base.h" |
| #include "chromecast/public/media/decoder_config.h" |
| |
| namespace chromecast { |
| namespace media { |
| class DecoderBufferBase; |
| |
| // Demuxes an audio container and provides audio config and buffers that can be |
| // used to play the audio via the CMA backend. Must be created and destroyed on |
| // the same thread, and all methods must be called on that thread. |
| class CastAudioDemuxer { |
| public: |
| class Delegate { |
| public: |
| // Called with the audio config for the audio resource. Always called before |
| // OnDemuxedAudioBuffer() and never called more than once. |
| virtual void OnDemuxedAudioConfig(const AudioConfig& config) {} |
| |
| // Called for each buffer read from the audio resource. This may be called |
| // multiple times, and the last call will pass an end-of-stream buffer |
| // unless an error occurs. |
| virtual void OnDemuxedAudioBuffer(scoped_refptr<DecoderBufferBase> buffer) { |
| } |
| |
| // Called with the duration of the audio resource after the entire audio |
| // resource has been read. No more methods will be called after this. It is |
| // safe to destroy the CastAudioDemuxer in this callback. |
| virtual void OnDemuxComplete(base::TimeDelta duration) = 0; |
| |
| // Called when the audio resource could not be read due to an error. No more |
| // methods will be called after this. It is safe to destroy the |
| // CastAudioDemuxer in this callback. |
| virtual void OnDemuxError() = 0; |
| |
| protected: |
| virtual ~Delegate() = default; |
| }; |
| |
| virtual ~CastAudioDemuxer() = default; |
| |
| // Creates a CastAudioDemuxer instance for the given |audio_data|. |
| // |audio_data| must outlive the demuxer. |
| static std::unique_ptr<CastAudioDemuxer> Create(std::string_view audio_data, |
| Delegate* delegate); |
| |
| // Sets the base timestamp for the audio buffers passed to |
| // OnDemuxedAudioBuffer() on the delegate so that the first buffer has a |
| // timestamp equal to |timestamp| and the timestamps of all subsequent buffers |
| // are adjusted accordingly. Must not be called after Demux(). |
| virtual void SetBaseTimestamp(base::TimeDelta timestamp) = 0; |
| |
| // Demuxes the audio data. May be called only once. Unless an error occurs, |
| // this triggers a call to OnDemuxedAudioConfig() on the delegate followed by |
| // one or more calls to OnDemuxedAudioBuffer() and finally a call to |
| // OnDemuxComplete(), after which no more methods will be called. If an error |
| // occurs, OnDemuxError() will be called and no more methods will be called. |
| virtual void Demux() = 0; |
| }; |
| |
| } // namespace media |
| } // namespace chromecast |
| |
| #endif // CHROMECAST_MEDIA_API_CAST_AUDIO_DEMUXER_H_ |