// Copyright 2015 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_DECODER_H_
#define CHROMECAST_MEDIA_API_CAST_AUDIO_DECODER_H_
#include <memory>
#include "base/functional/callback.h"
#include "base/memory/ref_counted.h"
#include "chromecast/media/api/decoder_buffer_base.h"
#include "chromecast/public/media/decoder_config.h"
namespace base {
class SingleThreadTaskRunner;
} // namespace base
namespace chromecast {
namespace media {
// Audio decoder interface.
class CastAudioDecoder {
public:
enum Status {
kDecodeOk,
kDecodeError,
};
enum OutputFormat {
kOutputSigned16, // Output signed 16-bit interleaved samples.
kOutputPlanarFloat, // Output planar float samples.
};
// Callback called when a buffer has been decoded. |config| is the actual
// config of the buffer, which may differ from the config indicated by the
// wrapper format.
typedef base::OnceCallback<void(
Status status,
const AudioConfig& config,
scoped_refptr<media::DecoderBufferBase> decoded)>
DecodeCallback;
// Creates a CastAudioDecoder instance for the given |config|. Decoding must
// occur on the same thread as |task_runner|. Returns an empty unique_ptr if
// the decoder could not be created.
static std::unique_ptr<CastAudioDecoder> Create(
scoped_refptr<base::SingleThreadTaskRunner> task_runner,
const media::AudioConfig& config,
OutputFormat output_format);
// Given a CastAudioDecoder::OutputFormat, return the size of each sample in
// that OutputFormat in bytes.
static int OutputFormatSizeInBytes(CastAudioDecoder::OutputFormat format);
virtual ~CastAudioDecoder() = default;
// Returns the expected config of the next decoded audio. Note that the config
// may change as more audio is decoded.
virtual const AudioConfig& GetOutputConfig() const = 0;
// Converts encoded data to the |output_format|. Must be called on the same
// thread as |task_runner|. Decoded data will be passed to |decode_callback|.
// The |decode_callback| will not be called after the CastAudioDecoder
// instance is destroyed. It is OK to pass an end-of-stream DecoderBuffer as
// |data|.
virtual void Decode(scoped_refptr<media::DecoderBufferBase> data,
DecodeCallback decode_callback) = 0;
};
} // namespace media
} // namespace chromecast
#endif // CHROMECAST_MEDIA_API_CAST_AUDIO_DECODER_H_