66 lines
2.3 KiB
C++
66 lines
2.3 KiB
C++
#pragma once
|
|
|
|
#include "Converter.h"
|
|
#include <opus/opus.h>
|
|
#include <mutex>
|
|
|
|
namespace tc::audio::codec {
|
|
class OpusConverter : public Converter {
|
|
public:
|
|
OpusConverter(size_t /* channels */, size_t /* sample rate */, size_t /* frame size */);
|
|
virtual ~OpusConverter();
|
|
|
|
bool valid() override;
|
|
|
|
bool initialize(std::string& /* error */, int /* application type */);
|
|
void finalize() override;
|
|
|
|
void reset_encoder() override;
|
|
void reset_decoder() override;
|
|
|
|
ssize_t encode(std::string & /* error */, const void * /* source */, void * /* target */, size_t /* target size */, bool /* head package */) override;
|
|
ssize_t decode(std::string & /* error */, const void * /* source */, size_t /* source size */, void *pVoid1, bool /* use fec */) override;
|
|
|
|
ssize_t decode_lost(std::string &string, size_t /* packets */) override;
|
|
|
|
size_t expected_encoded_length(size_t size) override;
|
|
private:
|
|
std::mutex coder_lock;
|
|
OpusDecoder* decoder = nullptr;
|
|
OpusEncoder* encoder = nullptr;
|
|
|
|
bool fec_decoder_{false};
|
|
int _application_type = 0;
|
|
|
|
bool _finalize_encoder(std::string& /* error */);
|
|
bool _finalize_decoder(std::string& /* error */);
|
|
bool _initialize_encoder(std::string& /* error */);
|
|
bool _initialize_decoder(std::string& /* error */);
|
|
};
|
|
|
|
class OpusAudioEncoder : public AudioEncoder {
|
|
public:
|
|
explicit OpusAudioEncoder(int /* application type */);
|
|
~OpusAudioEncoder() override;
|
|
|
|
bool valid() const override;
|
|
|
|
bool initialize(std::string &string) override;
|
|
|
|
void reset_sequence() override;
|
|
|
|
size_t sample_rate() const override;
|
|
|
|
size_t channel_count() const override;
|
|
|
|
size_t expected_encoded_length(const float *pDouble, size_t size) const override;
|
|
|
|
bool encode(std::string&, void *, size_t &, const EncoderBufferInfo &, const float *) override;
|
|
|
|
[[nodiscard]] inline auto application_type() const { return this->application_type_; }
|
|
|
|
private:
|
|
int application_type_;
|
|
OpusEncoder* encoder{nullptr};
|
|
};
|
|
} |