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