parent
23393312b7
commit
c3f40a8cc3
@ -0,0 +1,49 @@ |
|||||||
|
/*
|
||||||
|
* Copyright 2023 jacqueline <me@jacqueline.id.au> |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: GPL-3.0-only |
||||||
|
*/ |
||||||
|
|
||||||
|
#pragma once |
||||||
|
|
||||||
|
#include <cstddef> |
||||||
|
#include <cstdint> |
||||||
|
#include <memory> |
||||||
|
#include <optional> |
||||||
|
#include <string> |
||||||
|
#include <utility> |
||||||
|
|
||||||
|
#include "opus.h" |
||||||
|
#include "span.hpp" |
||||||
|
|
||||||
|
#include "codec.hpp" |
||||||
|
|
||||||
|
namespace codecs { |
||||||
|
|
||||||
|
class XiphOpusDecoder : public ICodec { |
||||||
|
public: |
||||||
|
XiphOpusDecoder(); |
||||||
|
~XiphOpusDecoder(); |
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns the output format for the next frame in the stream. MP3 streams |
||||||
|
* may represent multiple distinct tracks, with different bitrates, and so we |
||||||
|
* handle the stream only on a frame-by-frame basis. |
||||||
|
*/ |
||||||
|
auto BeginStream(cpp::span<const std::byte>) -> Result<OutputFormat> override; |
||||||
|
|
||||||
|
/*
|
||||||
|
* Writes samples for the current frame. |
||||||
|
*/ |
||||||
|
auto ContinueStream(cpp::span<const std::byte> input, |
||||||
|
cpp::span<std::byte> output) |
||||||
|
-> Result<OutputInfo> override; |
||||||
|
|
||||||
|
auto SeekStream(cpp::span<const std::byte> input, std::size_t target_sample) |
||||||
|
-> Result<void> override; |
||||||
|
|
||||||
|
private: |
||||||
|
OpusDecoder *opus_; |
||||||
|
float *sample_buffer_; |
||||||
|
std::size_t sample_buffer_len_; |
||||||
|
} // namespace codecs
|
@ -0,0 +1,52 @@ |
|||||||
|
/*
|
||||||
|
* Copyright 2023 jacqueline <me@jacqueline.id.au> |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: GPL-3.0-only |
||||||
|
*/ |
||||||
|
|
||||||
|
#include "opus.hpp" |
||||||
|
#include <stdint.h> |
||||||
|
#include <sys/_stdint.h> |
||||||
|
|
||||||
|
#include <cstdint> |
||||||
|
#include <cstring> |
||||||
|
#include <optional> |
||||||
|
|
||||||
|
#include "mad.h" |
||||||
|
|
||||||
|
#include "codec.hpp" |
||||||
|
#include "esp_log.h" |
||||||
|
#include "opus.h" |
||||||
|
#include "result.hpp" |
||||||
|
#include "types.hpp" |
||||||
|
|
||||||
|
namespace codecs { |
||||||
|
|
||||||
|
static constexpr std::size_t kSampleBufferSize = 5760 * sizeof(float); |
||||||
|
|
||||||
|
XiphOpusDecoder::XiphOpusDecoder() { |
||||||
|
int err; |
||||||
|
opus_ = opus_decoder_create(48000, 2, &err); |
||||||
|
assert(err == OPUS_OK); |
||||||
|
} |
||||||
|
XiphOpusDecoder::~XiphOpusDecoder() { |
||||||
|
opus_decoder_destroy(opus_); |
||||||
|
} |
||||||
|
|
||||||
|
auto XiphOpusDecoder::BeginStream(const cpp::span<const std::byte> input) |
||||||
|
-> Result<OutputFormat> {} |
||||||
|
|
||||||
|
auto XiphOpusDecoder::ContinueStream(cpp::span<const std::byte> input, |
||||||
|
cpp::span<std::byte> output) |
||||||
|
-> Result<OutputInfo> { |
||||||
|
int samples_decoded = opus_decode_float( |
||||||
|
opus_, reinterpret_cast<const unsigned char*>(input.data()), |
||||||
|
input.size_bytes(), sample_buffer_, sample_buffer_len_, 0); |
||||||
|
} |
||||||
|
|
||||||
|
auto XiphOpusDecoder::SeekStream(cpp::span<const std::byte> input, |
||||||
|
std::size_t target_sample) -> Result<void> { |
||||||
|
return {}; |
||||||
|
} |
||||||
|
|
||||||
|
} // namespace codecs
|
Loading…
Reference in new issue