Ref T730, OPUS de/encoder namespace

This commit is contained in:
Klaus Basan
2019-09-19 01:44:28 +02:00
committed by Mat Sutcliffe
parent 9809acd98c
commit 34d1e8268c
7 changed files with 169 additions and 105 deletions

View File

@@ -16,16 +16,16 @@ DEPENDPATH += . ..
DEFINES += LOG_IN_FILE BUILD_BLACKSOUND_LIB
HEADERS += *.h
HEADERS += wav/wavfile.h
HEADERS += dsp/*.h
HEADERS += codecs/*.h
HEADERS += samplesprovider/*.h
HEADERS += $$PWD/wav/wavfile.h
HEADERS += $$PWD/dsp/*.h
HEADERS += $$PWD/codecs/*.h
HEADERS += $$PWD/sampleprovider/*.h
SOURCES += *.cpp
SOURCES += wav/wavfile.cpp
SOURCES += dsp/*.cpp
SOURCES += codecs/*.cpp
SOURCES += samplesprovider/*.cpp
SOURCES += $$PWD/wav/wavfile.cpp
SOURCES += $$PWD/dsp/*.cpp
SOURCES += $$PWD/codecs/*.cpp
SOURCES += $$PWD/sampleprovider/*.cpp
LIBS *= -lopus

View File

@@ -1,40 +1,54 @@
/* Copyright (C) 2019
* swift project Community / Contributors
*
* This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level
* directory of this distribution. No part of swift project, including this file, may be copied, modified, propagated,
* or distributed except according to the terms contained in the LICENSE file.
*/
#include "opusdecoder.h"
COpusDecoder::COpusDecoder(int sampleRate, int channels) :
m_sampleRate(sampleRate),
m_channels(channels)
namespace BlackSound
{
int error;
opusDecoder = opus_decoder_create(sampleRate, channels, &error);
}
COpusDecoder::~COpusDecoder()
{
opus_decoder_destroy(opusDecoder);
}
int COpusDecoder::frameCount(int bufferSize)
{
// seems like bitrate should be required
int bitrate = 16;
int bytesPerSample = (bitrate / 8) * m_channels;
return bufferSize / bytesPerSample;
}
QVector<qint16> COpusDecoder::decode(const QByteArray opusData, int dataLength, int *decodedLength)
{
QVector<qint16> decoded(maxDataBytes, 0);
int count = frameCount(maxDataBytes);
if (! opusData.isEmpty())
namespace Codecs
{
*decodedLength = opus_decode(opusDecoder, reinterpret_cast<const unsigned char*>(opusData.data()), dataLength, decoded.data(), count, 0);
}
decoded.resize(*decodedLength);
return decoded;
}
COpusDecoder::COpusDecoder(int sampleRate, int channels) :
m_sampleRate(sampleRate),
m_channels(channels)
{
int error;
opusDecoder = opus_decoder_create(sampleRate, channels, &error);
}
void COpusDecoder::resetState()
{
opus_decoder_ctl(opusDecoder, OPUS_RESET_STATE);
}
COpusDecoder::~COpusDecoder()
{
opus_decoder_destroy(opusDecoder);
}
int COpusDecoder::frameCount(int bufferSize)
{
// seems like bitrate should be required
int bitrate = 16;
int bytesPerSample = (bitrate / 8) * m_channels;
return bufferSize / bytesPerSample;
}
QVector<qint16> COpusDecoder::decode(const QByteArray opusData, int dataLength, int *decodedLength)
{
QVector<qint16> decoded(maxDataBytes, 0);
int count = frameCount(maxDataBytes);
if (! opusData.isEmpty())
{
*decodedLength = opus_decode(opusDecoder, reinterpret_cast<const unsigned char *>(opusData.data()), dataLength, decoded.data(), count, 0);
}
decoded.resize(*decodedLength);
return decoded;
}
void COpusDecoder::resetState()
{
opus_decoder_ctl(opusDecoder, OPUS_RESET_STATE);
}
} // ns
} // ns

View File

@@ -1,30 +1,49 @@
#ifndef OPUSDECODER_H
#define OPUSDECODER_H
/* Copyright (C) 2019
* swift project Community / Contributors
*
* This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level
* directory of this distribution. No part of swift project, including this file, may be copied, modified, propagated,
* or distributed except according to the terms contained in the LICENSE file.
*/
//! \file
#ifndef BLACKSOUND_OPUSDECODER_H
#define BLACKSOUND_OPUSDECODER_H
#include "blacksound/blacksoundexport.h"
#include "opus/opus.h"
#include <QVector>
class BLACKSOUND_EXPORT COpusDecoder
namespace BlackSound
{
public:
COpusDecoder(int sampleRate, int channels);
~COpusDecoder();
namespace Codecs
{
//! OPUS decoder
class BLACKSOUND_EXPORT COpusDecoder
{
public:
//! Ctor
COpusDecoder(int sampleRate, int channels);
int frameCount(int bufferSize);
//! Dtor
~COpusDecoder();
QVector<qint16> decode(const QByteArray opusData, int dataLength, int *decodedLength);
int frameCount(int bufferSize);
void resetState();
QVector<qint16> decode(const QByteArray opusData, int dataLength, int *decodedLength);
private:
OpusDecoder *opusDecoder;
int m_sampleRate;
int m_channels;
void resetState();
static constexpr int maxDataBytes = 4000;
};
private:
OpusDecoder *opusDecoder;
int m_sampleRate;
int m_channels;
#endif // OPUSDECODER_H
static constexpr int maxDataBytes = 4000;
};
} // ns
} // ns
#endif // guard

View File

@@ -1,30 +1,42 @@
/* Copyright (C) 2019
* swift project Community / Contributors
*
* This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level
* directory of this distribution. No part of swift project, including this file, may be copied, modified, propagated,
* or distributed except according to the terms contained in the LICENSE file.
*/
#include "opusencoder.h"
COpusEncoder::COpusEncoder(int sampleRate, int channels, int application) :
m_sampleRate(sampleRate),
m_channels(channels)
namespace BlackSound
{
int error;
opusEncoder = opus_encoder_create(sampleRate, channels, application, &error);
}
namespace Codecs
{
COpusEncoder::COpusEncoder(int sampleRate, int channels, int application) :
m_sampleRate(sampleRate),
m_channels(channels)
{
int error;
opusEncoder = opus_encoder_create(sampleRate, channels, application, &error);
}
COpusEncoder::~COpusEncoder()
{
opus_encoder_destroy(opusEncoder);
}
void COpusEncoder::setBitRate(int bitRate)
{
opus_encoder_ctl(opusEncoder, OPUS_SET_BITRATE(bitRate));
}
QByteArray COpusEncoder::encode(const QVector<qint16> pcmSamples, int samplesLength, int *encodedLength)
{
QByteArray encoded(maxDataBytes, 0);
int length = opus_encode(opusEncoder, reinterpret_cast<const opus_int16 *>(pcmSamples.data()), samplesLength, reinterpret_cast<unsigned char*>(encoded.data()), maxDataBytes);
*encodedLength = length;
encoded.truncate(length);
return encoded;
}
COpusEncoder::~COpusEncoder()
{
opus_encoder_destroy(opusEncoder);
}
void COpusEncoder::setBitRate(int bitRate)
{
opus_encoder_ctl(opusEncoder, OPUS_SET_BITRATE(bitRate));
}
QByteArray COpusEncoder::encode(const QVector<qint16> pcmSamples, int samplesLength, int *encodedLength)
{
QByteArray encoded(maxDataBytes, 0);
int length = opus_encode(opusEncoder, reinterpret_cast<const opus_int16 *>(pcmSamples.data()), samplesLength, reinterpret_cast<unsigned char *>(encoded.data()), maxDataBytes);
*encodedLength = length;
encoded.truncate(length);
return encoded;
}
} // ns
} // ns

View File

@@ -1,5 +1,15 @@
#ifndef OPUSENCODER_H
#define OPUSENCODER_H
/* Copyright (C) 2019
* swift project Community / Contributors
*
* This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level
* directory of this distribution. No part of swift project, including this file, may be copied, modified, propagated,
* or distributed except according to the terms contained in the LICENSE file.
*/
//! \file
#ifndef BLACKSOUND_OPUSENCODER_H
#define BLACKSOUND_OPUSENCODER_H
#include "blacksound/blacksoundexport.h"
#include "opus/opus.h"
@@ -7,28 +17,38 @@
#include <QByteArray>
#include <QVector>
class BLACKSOUND_EXPORT COpusEncoder
namespace BlackSound
{
public:
COpusEncoder(int sampleRate, int channels, int application = OPUS_APPLICATION_VOIP);
~COpusEncoder();
namespace Codecs
{
//! OPUS encoder
class BLACKSOUND_EXPORT COpusEncoder
{
public:
//! Ctor
COpusEncoder(int sampleRate, int channels, int application = OPUS_APPLICATION_VOIP);
void setBitRate(int bitRate);
//! Dtor
~COpusEncoder();
//! \param frameCount Number of audio samples per frame
//! \returns the size of an audio frame in bytes
int frameByteCount(int frameCount);
void setBitRate(int bitRate);
int frameCount(const QVector<qint16> pcmSamples);
//! \param frameCount Number of audio samples per frame
//! \returns the size of an audio frame in bytes
int frameByteCount(int frameCount);
QByteArray encode(const QVector<qint16> pcmSamples, int samplesLength, int *encodedLength);
int frameCount(const QVector<qint16> pcmSamples);
private:
OpusEncoder *opusEncoder;
int m_sampleRate;
int m_channels;
QByteArray encode(const QVector<qint16> pcmSamples, int samplesLength, int *encodedLength);
static constexpr int maxDataBytes = 4000;
};
private:
OpusEncoder *opusEncoder;
int m_sampleRate;
int m_channels;
static constexpr int maxDataBytes = 4000;
};
} // ns
} // ns
#endif // guard