uploading current state
This commit is contained in:
parent
3ed2703b74
commit
bb71861348
@ -36,10 +36,10 @@ for sdk_name in SM.sdks:
|
|||||||
|
|
||||||
binary.compiler.cxxincludes += [
|
binary.compiler.cxxincludes += [
|
||||||
os.path.join(SM.sm_root, 'public', 'extensions'),
|
os.path.join(SM.sm_root, 'public', 'extensions'),
|
||||||
os.path.join(builder.sourcePath, 'silk')
|
os.path.join(builder.sourcePath, 'opus')
|
||||||
]
|
]
|
||||||
binary.compiler.linkflags += [
|
binary.compiler.linkflags += [
|
||||||
os.path.join(builder.sourcePath, 'silk', 'libSKP_SILK_SDK.a')
|
os.path.join(builder.sourcePath, 'opus', 'libopus.a')
|
||||||
]
|
]
|
||||||
|
|
||||||
SM.extensions += builder.Add(project)
|
SM.extensions += builder.Add(project)
|
||||||
|
|||||||
172
extension.cpp
172
extension.cpp
@ -38,6 +38,7 @@
|
|||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <poll.h>
|
#include <poll.h>
|
||||||
|
#include <opus.h>
|
||||||
|
|
||||||
#include <iclient.h>
|
#include <iclient.h>
|
||||||
#include <iserver.h>
|
#include <iserver.h>
|
||||||
@ -185,9 +186,8 @@ CVoice::CVoice()
|
|||||||
for(int i = 0; i < MAX_CLIENTS; i++)
|
for(int i = 0; i < MAX_CLIENTS; i++)
|
||||||
m_aClients[i].m_Socket = -1;
|
m_aClients[i].m_Socket = -1;
|
||||||
|
|
||||||
m_AvailableTime = 0.0;
|
m_OpusEncoder = NULL;
|
||||||
|
m_AvailableTime = 0.0;
|
||||||
m_Silk_EncoderState = NULL;
|
|
||||||
|
|
||||||
m_VoiceDetour = NULL;
|
m_VoiceDetour = NULL;
|
||||||
m_SV_BroadcastVoiceData = NULL;
|
m_SV_BroadcastVoiceData = NULL;
|
||||||
@ -298,46 +298,29 @@ bool CVoice::SDK_OnLoad(char *error, size_t maxlength, bool late)
|
|||||||
|
|
||||||
m_VoiceDetour->EnableDetour();
|
m_VoiceDetour->EnableDetour();
|
||||||
|
|
||||||
// Encoder settings
|
//opus edit
|
||||||
m_EncoderSettings.InputSampleRate_kHz = 32; // 8, 12, 16, 24, 32, 44.1, 48
|
int err;
|
||||||
m_EncoderSettings.OutputSampleRate_kHz = 24; // 8, 12, 16, 24
|
m_OpusEncoder = opus_encoder_create(48000, 2, OPUS_APPLICATION_AUDIO, &err);
|
||||||
m_EncoderSettings.TargetBitRate_Kbps = 100; // 6 - 40
|
if (err<0)
|
||||||
m_EncoderSettings.PacketSize_ms = 15; // 20, 40, 60, 80, 100
|
|
||||||
m_EncoderSettings.FrameSize_ms = 15; //
|
|
||||||
m_EncoderSettings.PacketLoss_perc = 0; // 0 - 100
|
|
||||||
m_EncoderSettings.Complexity = 2; // 0 - 2
|
|
||||||
m_EncoderSettings.InBandFEC = 0; // 0, 1
|
|
||||||
m_EncoderSettings.DTX = 0; // 0, 1
|
|
||||||
|
|
||||||
// Init SILK encoder
|
|
||||||
int encoderSize;
|
|
||||||
SKP_Silk_SDK_Get_Encoder_Size(&encoderSize);
|
|
||||||
|
|
||||||
m_Silk_EncoderState = malloc(encoderSize);
|
|
||||||
if(!m_Silk_EncoderState)
|
|
||||||
{
|
{
|
||||||
g_SMAPI->Format(error, maxlength, "Failed to malloc %d bytes for silk encoder.", encoderSize);
|
smutils->LogError(myself, "failed to create encode: %s", opus_strerror(err));
|
||||||
SDK_OnUnload();
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
err = opus_encoder_ctl(m_OpusEncoder, OPUS_SET_BITRATE(64000)); //*(_DWORD *)(v0 + 12) = 32000;
|
||||||
int retEnc = SKP_Silk_SDK_InitEncoder(m_Silk_EncoderState, &m_Silk_EncoderControl);
|
//i dont know if these actually matter.
|
||||||
if(retEnc != SKP_SILK_NO_ERROR)
|
/*
|
||||||
|
err = opus_encoder_ctl(m_OpusEncoder, OPUS_SET_FORCE_CHANNELS(1));
|
||||||
|
err = opus_encoder_ctl(m_OpusEncoder, OPUS_SET_INBAND_FEC(1));
|
||||||
|
err = opus_encoder_ctl(m_OpusEncoder, OPUS_SET_PACKET_LOSS_PERC(10));
|
||||||
|
err = opus_encoder_ctl(m_OpusEncoder, OPUS_SET_COMPLEXITY(10));
|
||||||
|
err = opus_encoder_ctl(m_OpusEncoder, OPUS_SET_SIGNAL(OPUS_SIGNAL_VOICE));
|
||||||
|
*/
|
||||||
|
if (err<0)
|
||||||
{
|
{
|
||||||
g_SMAPI->Format(error, maxlength, "Silk encoder initialization failed with: %d", retEnc);
|
smutils->LogError(myself, "failed to set bitrate: %s\n", opus_strerror(err));
|
||||||
SDK_OnUnload();
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_Silk_EncoderControl.API_sampleRate = m_EncoderSettings.OutputSampleRate_kHz * 1000;
|
|
||||||
m_Silk_EncoderControl.maxInternalSampleRate = m_EncoderSettings.OutputSampleRate_kHz * 1000;
|
|
||||||
m_Silk_EncoderControl.bitRate = m_EncoderSettings.TargetBitRate_Kbps * 1000;
|
|
||||||
m_Silk_EncoderControl.packetSize = m_EncoderSettings.PacketSize_ms * m_EncoderSettings.InputSampleRate_kHz;
|
|
||||||
m_Silk_EncoderControl.packetLossPercentage = m_EncoderSettings.PacketLoss_perc;
|
|
||||||
m_Silk_EncoderControl.complexity = m_EncoderSettings.Complexity;
|
|
||||||
m_Silk_EncoderControl.useInBandFEC = m_EncoderSettings.InBandFEC;
|
|
||||||
m_Silk_EncoderControl.useDTX = m_EncoderSettings.DTX;
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -493,12 +476,7 @@ void CVoice::SDK_OnUnload()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(m_Silk_EncoderState)
|
opus_encoder_destroy(m_OpusEncoder);
|
||||||
{
|
|
||||||
free(m_Silk_EncoderState);
|
|
||||||
m_Silk_EncoderState = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CVoice::OnGameFrame(bool simulating)
|
void CVoice::OnGameFrame(bool simulating)
|
||||||
@ -691,7 +669,7 @@ void CVoice::OnDataReceived(CClient *pClient, int16_t *pData, size_t Samples)
|
|||||||
// Discard empty data if last vaild data was more than a second ago.
|
// Discard empty data if last vaild data was more than a second ago.
|
||||||
if(pClient->m_LastValidData + 1.0 < getTime())
|
if(pClient->m_LastValidData + 1.0 < getTime())
|
||||||
{
|
{
|
||||||
// All empty
|
// All emptyTotalSamplesPerFrame
|
||||||
if(DataStartsAt == -1)
|
if(DataStartsAt == -1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -700,6 +678,8 @@ void CVoice::OnDataReceived(CClient *pClient, int16_t *pData, size_t Samples)
|
|||||||
Samples -= DataStartsAt;
|
Samples -= DataStartsAt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
smutils->LogMessage(myself, "OnDataReceived samples: %d", Samples);
|
||||||
|
|
||||||
if(!m_Buffer.Push(pData, Samples))
|
if(!m_Buffer.Push(pData, Samples))
|
||||||
{
|
{
|
||||||
smutils->LogError(myself, "Buffer push failed!!! Samples: %u, Free: %u\n", Samples, m_Buffer.CurrentFree());
|
smutils->LogError(myself, "Buffer push failed!!! Samples: %u, Free: %u\n", Samples, m_Buffer.CurrentFree());
|
||||||
@ -721,28 +701,42 @@ struct SteamVoiceHeader
|
|||||||
|
|
||||||
void CVoice::HandleVoiceData()
|
void CVoice::HandleVoiceData()
|
||||||
{
|
{
|
||||||
int SamplesPerFrame = (m_EncoderSettings.FrameSize_ms * m_EncoderSettings.InputSampleRate_kHz);
|
//const int SampleRate = 24000;
|
||||||
int FramesAvailable = m_Buffer.TotalLength() / SamplesPerFrame;
|
const int SampleRate = 48000;
|
||||||
float TimeAvailable = (float)m_Buffer.TotalLength() / (m_EncoderSettings.InputSampleRate_kHz * 1000.0);
|
// This MUST be the number of SAMPLES PER CHANNEL (960 samples = 20ms at 48kHz)
|
||||||
|
//const int SamplesPerChannel = 480;
|
||||||
|
const int SamplesPerChannel = 960;
|
||||||
|
const int Channels = 2;
|
||||||
|
|
||||||
if(!FramesAvailable)
|
int FramesAvailable = m_Buffer.TotalLength() / SamplesPerChannel;
|
||||||
return;
|
float TimeAvailable = (float)m_Buffer.TotalLength() / (SampleRate);
|
||||||
|
|
||||||
// Before starting playback we want at least 100ms in the buffer
|
if(!FramesAvailable)
|
||||||
if(m_AvailableTime < getTime() && TimeAvailable < 0.1)
|
return;
|
||||||
return;
|
|
||||||
|
|
||||||
// let the clients have no more than 500ms
|
// Before starting playback we want at least 100ms in the buffer
|
||||||
if(m_AvailableTime > getTime() + 0.5)
|
if(m_AvailableTime < getTime() && TimeAvailable < 0.1)
|
||||||
{
|
{
|
||||||
return;
|
//smutils->LogMessage(myself, "return 1");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//let the clients have no more than 500ms
|
||||||
|
if(m_AvailableTime > getTime() + 0.5)
|
||||||
|
{
|
||||||
|
//smutils->LogMessage(myself, "return 2");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
//smutils->LogMessage(myself, "pre FramesAvailable: %d", FramesAvailable);
|
// The Opus encoder requires a complete frame.
|
||||||
|
int TotalSamplesPerFrame = SamplesPerChannel * Channels;
|
||||||
|
if (m_Buffer.TotalLength() < TotalSamplesPerFrame) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
smutils->LogMessage(myself, "pre FramesAvailable: %d", FramesAvailable);
|
||||||
//smutils->LogMessage(myself, "TotalLength: %d", m_Buffer.TotalLength());
|
//smutils->LogMessage(myself, "TotalLength: %d", m_Buffer.TotalLength());
|
||||||
//smutils->LogMessage(myself, "TimeAvailable: %f", TimeAvailable);
|
smutils->LogMessage(myself, "TimeAvailable: %f", TimeAvailable);
|
||||||
//smutils->LogMessage(myself, "SamplesPerFrame: %d", SamplesPerFrame);
|
|
||||||
|
|
||||||
// 5 = max frames per packet
|
// 5 = max frames per packet
|
||||||
FramesAvailable = min_ext(FramesAvailable, 5);
|
FramesAvailable = min_ext(FramesAvailable, 5);
|
||||||
@ -754,51 +748,48 @@ void CVoice::HandleVoiceData()
|
|||||||
|
|
||||||
SteamVoiceHeader Header;
|
SteamVoiceHeader Header;
|
||||||
size_t HeaderSize = 14;
|
size_t HeaderSize = 14;
|
||||||
|
|
||||||
Header.iSteamAccountID = 1; // Steam Account ID
|
Header.iSteamAccountID = 1; // Steam Account ID
|
||||||
Header.iSteamCommunity = 0x01100001; // Steam Community ID part: 0x01100001 << 32
|
Header.iSteamCommunity = 0x01100001; // Steam Community ID part: 0x01100001 << 32
|
||||||
Header.nPayload1 = 11; // nPayLoad | Type 11 = Samplerate
|
Header.nPayload1 = 11; // nPayLoad | Type 11 =
|
||||||
Header.iSampleRate = m_EncoderSettings.OutputSampleRate_kHz * 1000; // Samplerate
|
Header.iSampleRate = SampleRate; //
|
||||||
Header.nPayload2 = 4; // nPayLoad | Type 4 = Silk Frames
|
Header.nPayload2 = 0x06; //type 6 = opus PLC?
|
||||||
|
//Header.nPayload2 = 4; // nPayLoad | Type 4 = Silk Frames
|
||||||
Header.iDataLength = 0; // Silk Frames total length
|
Header.iDataLength = 0; // Silk Frames total length
|
||||||
|
|
||||||
// Header + Frames + CRC32
|
//unsigned char aFinal[4000]; //max_packet is the maximum number of bytes that can be written in the packet (4000 bytes is recommended).
|
||||||
unsigned char aFinal[HeaderSize + 8192 + sizeof(uint32_t)];
|
|
||||||
//unsigned char aFinal[HeaderSize + SamplesPerFrame + sizeof(uint32_t)];
|
unsigned char aFinal[8192]; // A large buffer for the final packet.
|
||||||
size_t FinalSize = HeaderSize;
|
size_t FinalSize = HeaderSize;
|
||||||
|
|
||||||
//for(int Frame = 0; Frame < 1; Frame++)
|
|
||||||
for(int Frame = 0; Frame < FramesAvailable; Frame++)
|
for(int Frame = 0; Frame < FramesAvailable; Frame++)
|
||||||
{
|
{
|
||||||
// Get data into buffer from ringbuffer.
|
int16_t aBuffer[TotalSamplesPerFrame];
|
||||||
int16_t aBuffer[SamplesPerFrame];
|
|
||||||
if(!m_Buffer.Pop(aBuffer, SamplesPerFrame))
|
size_t OldReadIdx = m_Buffer.m_ReadIndex;
|
||||||
|
size_t OldCurLength = m_Buffer.CurrentLength();
|
||||||
|
size_t OldTotalLength = m_Buffer.TotalLength();
|
||||||
|
|
||||||
|
if(!m_Buffer.Pop(aBuffer, TotalSamplesPerFrame))
|
||||||
{
|
{
|
||||||
printf("Buffer pop failed!!! Samples: %u, Length: %zu\n", SamplesPerFrame, m_Buffer.TotalLength());
|
smutils->LogError(myself, "Buffer pop failed!!! Samples: %u, Length: %zu\n", TotalSamplesPerFrame, m_Buffer.TotalLength());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Frame Size
|
|
||||||
int16_t *pFrameSize = (int16_t *)(&aFinal[FinalSize]);
|
|
||||||
FinalSize += sizeof(int16_t);
|
FinalSize += sizeof(int16_t);
|
||||||
Header.iDataLength += sizeof(int16_t);
|
Header.iDataLength += sizeof(int16_t);
|
||||||
*pFrameSize = sizeof(aFinal) - HeaderSize - sizeof(uint32_t) - FinalSize;
|
|
||||||
|
|
||||||
// Encode it!
|
// opus_int16*: Input signal (interleaved if 2 channels). length is frame_size*channels*sizeof(opus_int16)
|
||||||
int Ret = SKP_Silk_SDK_Encode(m_Silk_EncoderState, &m_Silk_EncoderControl, aBuffer,
|
int nbBytes = opus_encode(m_OpusEncoder, (const opus_int16*)aBuffer, SamplesPerChannel, &aFinal[FinalSize], sizeof(aFinal));
|
||||||
SamplesPerFrame, &aFinal[FinalSize], pFrameSize);
|
// Handle DTX (Discontinuous Transmission). If the length is 1, no data should be sent.
|
||||||
if(Ret)
|
if (nbBytes<=1)
|
||||||
{
|
{
|
||||||
smutils->LogError(myself, "SKP_Silk_SDK_Encode returned %d\n", Ret);
|
smutils->LogError(myself, "encode failed: %s\n", opus_strerror(nbBytes));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
FinalSize += *pFrameSize;
|
|
||||||
Header.iDataLength += *pFrameSize;
|
|
||||||
|
|
||||||
// Check for buffer underruns
|
// Check for buffer underruns
|
||||||
for(int Client = 0; Client < MAX_CLIENTS; Client++)
|
for(int Client = 0; Client < MAX_CLIENTS; Client++)
|
||||||
{
|
{
|
||||||
CClient *pClient = &m_aClients[Client];
|
CClient *pClient = &m_aClients[Client];
|
||||||
if(pClient->m_Socket == -1 || pClient->m_New == true)
|
if(pClient->m_Socket == -1 || pClient->m_New == true)
|
||||||
continue;
|
continue;
|
||||||
@ -812,21 +803,24 @@ void CVoice::HandleVoiceData()
|
|||||||
pClient->m_LastLength = m_Buffer.CurrentLength();
|
pClient->m_LastLength = m_Buffer.CurrentLength();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Header.iDataLength += nbBytes;
|
||||||
|
FinalSize += nbBytes;
|
||||||
}
|
}
|
||||||
// Header
|
memcpy(&aFinal[0], &Header, HeaderSize);
|
||||||
memcpy(aFinal, &Header, HeaderSize);
|
|
||||||
|
|
||||||
// CRC32
|
// Calculate the total packet size for CRC32 calculation.
|
||||||
*(uint32_t *)(&aFinal[FinalSize]) = UTIL_CRC32(aFinal, FinalSize);
|
//these 3 lines are fine
|
||||||
|
uint32_t crc32_value = UTIL_CRC32(aFinal, FinalSize);
|
||||||
|
memcpy(&aFinal[FinalSize], &crc32_value, sizeof(uint32_t));
|
||||||
FinalSize += sizeof(uint32_t);
|
FinalSize += sizeof(uint32_t);
|
||||||
|
|
||||||
//smutils->LogMessage(myself, "FinalSize: %d. length of aFinal: %d", FinalSize, sizeof(aFinal));
|
//18 in distance between finalsize and idatalength, 14 for header bytes and 4 for CRC.
|
||||||
|
smutils->LogMessage(myself, "FinalSize: %d. iDataLength: %d. length of aFinal: %d", FinalSize, Header.iDataLength, sizeof(aFinal));
|
||||||
BroadcastVoiceData(pClient, FinalSize, aFinal);
|
BroadcastVoiceData(pClient, FinalSize, aFinal);
|
||||||
|
|
||||||
if (m_AvailableTime < getTime())
|
if (m_AvailableTime < getTime())
|
||||||
m_AvailableTime = getTime();
|
m_AvailableTime = getTime();
|
||||||
m_AvailableTime += (double)FramesAvailable * ((double)m_EncoderSettings.FrameSize_ms / 1000.0);
|
m_AvailableTime += (double)FramesAvailable * ((double)20 / 1000.0);
|
||||||
//smutils->LogMessage(myself, "m_AvailableTime: %f. FramesAvailable: %d", m_AvailableTime, FramesAvailable);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CVoice::BroadcastVoiceData(IClient *pClient, int nBytes, unsigned char *pData)
|
void CVoice::BroadcastVoiceData(IClient *pClient, int nBytes, unsigned char *pData)
|
||||||
|
|||||||
18
extension.h
18
extension.h
@ -34,7 +34,6 @@
|
|||||||
|
|
||||||
#include <poll.h>
|
#include <poll.h>
|
||||||
#include "smsdk_ext.h"
|
#include "smsdk_ext.h"
|
||||||
#include <SKP_Silk_SDK_API.h>
|
|
||||||
#include "ringbuffer.h"
|
#include "ringbuffer.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -160,23 +159,10 @@ private:
|
|||||||
|
|
||||||
CRingBuffer m_Buffer;
|
CRingBuffer m_Buffer;
|
||||||
|
|
||||||
|
OpusEncoder *m_OpusEncoder;
|
||||||
|
|
||||||
double m_AvailableTime;
|
double m_AvailableTime;
|
||||||
|
|
||||||
struct CEncoderSettings
|
|
||||||
{
|
|
||||||
SKP_int InputSampleRate_kHz;
|
|
||||||
SKP_int OutputSampleRate_kHz;
|
|
||||||
SKP_int TargetBitRate_Kbps;
|
|
||||||
SKP_int PacketSize_ms;
|
|
||||||
SKP_int FrameSize_ms;
|
|
||||||
SKP_int PacketLoss_perc;
|
|
||||||
SKP_int Complexity;
|
|
||||||
SKP_int InBandFEC;
|
|
||||||
SKP_int DTX;
|
|
||||||
} m_EncoderSettings;
|
|
||||||
|
|
||||||
void *m_Silk_EncoderState;
|
|
||||||
SKP_SILK_SDK_EncControlStruct m_Silk_EncoderControl;
|
|
||||||
|
|
||||||
t_SV_BroadcastVoiceData m_SV_BroadcastVoiceData;
|
t_SV_BroadcastVoiceData m_SV_BroadcastVoiceData;
|
||||||
CDetour *m_VoiceDetour;
|
CDetour *m_VoiceDetour;
|
||||||
|
|||||||
BIN
opus/libopus.a
Executable file
BIN
opus/libopus.a
Executable file
Binary file not shown.
13
opus/meson.build
Normal file
13
opus/meson.build
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
opus_headers = [
|
||||||
|
'opus.h',
|
||||||
|
'opus_multistream.h',
|
||||||
|
'opus_projection.h',
|
||||||
|
'opus_types.h',
|
||||||
|
'opus_defines.h',
|
||||||
|
]
|
||||||
|
|
||||||
|
if opt_custom_modes
|
||||||
|
opus_headers += ['opus_custom.h']
|
||||||
|
endif
|
||||||
|
|
||||||
|
install_headers(opus_headers, subdir: 'opus')
|
||||||
1099
opus/opus.h
Normal file
1099
opus/opus.h
Normal file
File diff suppressed because it is too large
Load Diff
343
opus/opus_custom.h
Normal file
343
opus/opus_custom.h
Normal file
@ -0,0 +1,343 @@
|
|||||||
|
/* Copyright (c) 2007-2008 CSIRO
|
||||||
|
Copyright (c) 2007-2009 Xiph.Org Foundation
|
||||||
|
Copyright (c) 2008-2012 Gregory Maxwell
|
||||||
|
Written by Jean-Marc Valin and Gregory Maxwell */
|
||||||
|
/*
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
|
||||||
|
- Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
- Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
@file opus_custom.h
|
||||||
|
@brief Opus-Custom reference implementation API
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef OPUS_CUSTOM_H
|
||||||
|
#define OPUS_CUSTOM_H
|
||||||
|
|
||||||
|
#include "opus_defines.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CUSTOM_MODES
|
||||||
|
# define OPUS_CUSTOM_EXPORT OPUS_EXPORT
|
||||||
|
# define OPUS_CUSTOM_EXPORT_STATIC OPUS_EXPORT
|
||||||
|
#else
|
||||||
|
# define OPUS_CUSTOM_EXPORT
|
||||||
|
# ifdef OPUS_BUILD
|
||||||
|
# define OPUS_CUSTOM_EXPORT_STATIC static OPUS_INLINE
|
||||||
|
# else
|
||||||
|
# define OPUS_CUSTOM_EXPORT_STATIC
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** @defgroup opus_custom Opus Custom
|
||||||
|
* @{
|
||||||
|
* Opus Custom is an optional part of the Opus specification and
|
||||||
|
* reference implementation which uses a distinct API from the regular
|
||||||
|
* API and supports frame sizes that are not normally supported.\ Use
|
||||||
|
* of Opus Custom is discouraged for all but very special applications
|
||||||
|
* for which a frame size different from 2.5, 5, 10, or 20 ms is needed
|
||||||
|
* (for either complexity or latency reasons) and where interoperability
|
||||||
|
* is less important.
|
||||||
|
*
|
||||||
|
* In addition to the interoperability limitations the use of Opus custom
|
||||||
|
* disables a substantial chunk of the codec and generally lowers the
|
||||||
|
* quality available at a given bitrate. Normally when an application needs
|
||||||
|
* a different frame size from the codec it should buffer to match the
|
||||||
|
* sizes but this adds a small amount of delay which may be important
|
||||||
|
* in some very low latency applications. Some transports (especially
|
||||||
|
* constant rate RF transports) may also work best with frames of
|
||||||
|
* particular durations.
|
||||||
|
*
|
||||||
|
* Libopus only supports custom modes if they are enabled at compile time.
|
||||||
|
*
|
||||||
|
* The Opus Custom API is similar to the regular API but the
|
||||||
|
* @ref opus_encoder_create and @ref opus_decoder_create calls take
|
||||||
|
* an additional mode parameter which is a structure produced by
|
||||||
|
* a call to @ref opus_custom_mode_create. Both the encoder and decoder
|
||||||
|
* must create a mode using the same sample rate (fs) and frame size
|
||||||
|
* (frame size) so these parameters must either be signaled out of band
|
||||||
|
* or fixed in a particular implementation.
|
||||||
|
*
|
||||||
|
* Similar to regular Opus the custom modes support on the fly frame size
|
||||||
|
* switching, but the sizes available depend on the particular frame size in
|
||||||
|
* use. For some initial frame sizes on a single on the fly size is available.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** Contains the state of an encoder. One encoder state is needed
|
||||||
|
for each stream. It is initialized once at the beginning of the
|
||||||
|
stream. Do *not* re-initialize the state for every frame.
|
||||||
|
@brief Encoder state
|
||||||
|
*/
|
||||||
|
typedef struct OpusCustomEncoder OpusCustomEncoder;
|
||||||
|
|
||||||
|
/** State of the decoder. One decoder state is needed for each stream.
|
||||||
|
It is initialized once at the beginning of the stream. Do *not*
|
||||||
|
re-initialize the state for every frame.
|
||||||
|
@brief Decoder state
|
||||||
|
*/
|
||||||
|
typedef struct OpusCustomDecoder OpusCustomDecoder;
|
||||||
|
|
||||||
|
/** The mode contains all the information necessary to create an
|
||||||
|
encoder. Both the encoder and decoder need to be initialized
|
||||||
|
with exactly the same mode, otherwise the output will be
|
||||||
|
corrupted. The mode MUST NOT BE DESTROYED until the encoders and
|
||||||
|
decoders that use it are destroyed as well.
|
||||||
|
@brief Mode configuration
|
||||||
|
*/
|
||||||
|
typedef struct OpusCustomMode OpusCustomMode;
|
||||||
|
|
||||||
|
/** Creates a new mode struct. This will be passed to an encoder or
|
||||||
|
* decoder. The mode MUST NOT BE DESTROYED until the encoders and
|
||||||
|
* decoders that use it are destroyed as well.
|
||||||
|
* @param [in] Fs <tt>int</tt>: Sampling rate (8000 to 96000 Hz)
|
||||||
|
* @param [in] frame_size <tt>int</tt>: Number of samples (per channel) to encode in each
|
||||||
|
* packet (64 - 1024, prime factorization must contain zero or more 2s, 3s, or 5s and no other primes)
|
||||||
|
* @param [out] error <tt>int*</tt>: Returned error code (if NULL, no error will be returned)
|
||||||
|
* @return A newly created mode
|
||||||
|
*/
|
||||||
|
OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT OpusCustomMode *opus_custom_mode_create(opus_int32 Fs, int frame_size, int *error);
|
||||||
|
|
||||||
|
/** Destroys a mode struct. Only call this after all encoders and
|
||||||
|
* decoders using this mode are destroyed as well.
|
||||||
|
* @param [in] mode <tt>OpusCustomMode*</tt>: Mode to be freed.
|
||||||
|
*/
|
||||||
|
OPUS_CUSTOM_EXPORT void opus_custom_mode_destroy(OpusCustomMode *mode);
|
||||||
|
|
||||||
|
|
||||||
|
#if !defined(OPUS_BUILD) || defined(CELT_ENCODER_C)
|
||||||
|
|
||||||
|
/* Encoder */
|
||||||
|
/** Gets the size of an OpusCustomEncoder structure.
|
||||||
|
* @param [in] mode <tt>OpusCustomMode *</tt>: Mode configuration
|
||||||
|
* @param [in] channels <tt>int</tt>: Number of channels
|
||||||
|
* @returns size
|
||||||
|
*/
|
||||||
|
OPUS_CUSTOM_EXPORT_STATIC OPUS_WARN_UNUSED_RESULT int opus_custom_encoder_get_size(
|
||||||
|
const OpusCustomMode *mode,
|
||||||
|
int channels
|
||||||
|
) OPUS_ARG_NONNULL(1);
|
||||||
|
|
||||||
|
# ifdef CUSTOM_MODES
|
||||||
|
/** Initializes a previously allocated encoder state
|
||||||
|
* The memory pointed to by st must be the size returned by opus_custom_encoder_get_size.
|
||||||
|
* This is intended for applications which use their own allocator instead of malloc.
|
||||||
|
* @see opus_custom_encoder_create(),opus_custom_encoder_get_size()
|
||||||
|
* To reset a previously initialized state use the OPUS_RESET_STATE CTL.
|
||||||
|
* @param [in] st <tt>OpusCustomEncoder*</tt>: Encoder state
|
||||||
|
* @param [in] mode <tt>OpusCustomMode *</tt>: Contains all the information about the characteristics of
|
||||||
|
* the stream (must be the same characteristics as used for the
|
||||||
|
* decoder)
|
||||||
|
* @param [in] channels <tt>int</tt>: Number of channels
|
||||||
|
* @return OPUS_OK Success or @ref opus_errorcodes
|
||||||
|
*/
|
||||||
|
OPUS_CUSTOM_EXPORT int opus_custom_encoder_init(
|
||||||
|
OpusCustomEncoder *st,
|
||||||
|
const OpusCustomMode *mode,
|
||||||
|
int channels
|
||||||
|
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2);
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/** Creates a new encoder state. Each stream needs its own encoder
|
||||||
|
* state (can't be shared across simultaneous streams).
|
||||||
|
* @param [in] mode <tt>OpusCustomMode*</tt>: Contains all the information about the characteristics of
|
||||||
|
* the stream (must be the same characteristics as used for the
|
||||||
|
* decoder)
|
||||||
|
* @param [in] channels <tt>int</tt>: Number of channels
|
||||||
|
* @param [out] error <tt>int*</tt>: Returns an error code
|
||||||
|
* @return Newly created encoder state.
|
||||||
|
*/
|
||||||
|
OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT OpusCustomEncoder *opus_custom_encoder_create(
|
||||||
|
const OpusCustomMode *mode,
|
||||||
|
int channels,
|
||||||
|
int *error
|
||||||
|
) OPUS_ARG_NONNULL(1);
|
||||||
|
|
||||||
|
|
||||||
|
/** Destroys an encoder state.
|
||||||
|
* @param[in] st <tt>OpusCustomEncoder*</tt>: State to be freed.
|
||||||
|
*/
|
||||||
|
OPUS_CUSTOM_EXPORT void opus_custom_encoder_destroy(OpusCustomEncoder *st);
|
||||||
|
|
||||||
|
/** Encodes a frame of audio.
|
||||||
|
* @param [in] st <tt>OpusCustomEncoder*</tt>: Encoder state
|
||||||
|
* @param [in] pcm <tt>float*</tt>: PCM audio in float format, with a normal range of +/-1.0.
|
||||||
|
* Samples with a range beyond +/-1.0 are supported but will
|
||||||
|
* be clipped by decoders using the integer API and should
|
||||||
|
* only be used if it is known that the far end supports
|
||||||
|
* extended dynamic range. There must be exactly
|
||||||
|
* frame_size samples per channel.
|
||||||
|
* @param [in] frame_size <tt>int</tt>: Number of samples per frame of input signal
|
||||||
|
* @param [out] compressed <tt>char *</tt>: The compressed data is written here. This may not alias pcm and must be at least maxCompressedBytes long.
|
||||||
|
* @param [in] maxCompressedBytes <tt>int</tt>: Maximum number of bytes to use for compressing the frame
|
||||||
|
* (can change from one frame to another)
|
||||||
|
* @return Number of bytes written to "compressed".
|
||||||
|
* If negative, an error has occurred (see error codes). It is IMPORTANT that
|
||||||
|
* the length returned be somehow transmitted to the decoder. Otherwise, no
|
||||||
|
* decoding is possible.
|
||||||
|
*/
|
||||||
|
OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT int opus_custom_encode_float(
|
||||||
|
OpusCustomEncoder *st,
|
||||||
|
const float *pcm,
|
||||||
|
int frame_size,
|
||||||
|
unsigned char *compressed,
|
||||||
|
int maxCompressedBytes
|
||||||
|
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4);
|
||||||
|
|
||||||
|
/** Encodes a frame of audio.
|
||||||
|
* @param [in] st <tt>OpusCustomEncoder*</tt>: Encoder state
|
||||||
|
* @param [in] pcm <tt>opus_int16*</tt>: PCM audio in signed 16-bit format (native endian).
|
||||||
|
* There must be exactly frame_size samples per channel.
|
||||||
|
* @param [in] frame_size <tt>int</tt>: Number of samples per frame of input signal
|
||||||
|
* @param [out] compressed <tt>char *</tt>: The compressed data is written here. This may not alias pcm and must be at least maxCompressedBytes long.
|
||||||
|
* @param [in] maxCompressedBytes <tt>int</tt>: Maximum number of bytes to use for compressing the frame
|
||||||
|
* (can change from one frame to another)
|
||||||
|
* @return Number of bytes written to "compressed".
|
||||||
|
* If negative, an error has occurred (see error codes). It is IMPORTANT that
|
||||||
|
* the length returned be somehow transmitted to the decoder. Otherwise, no
|
||||||
|
* decoding is possible.
|
||||||
|
*/
|
||||||
|
OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT int opus_custom_encode(
|
||||||
|
OpusCustomEncoder *st,
|
||||||
|
const opus_int16 *pcm,
|
||||||
|
int frame_size,
|
||||||
|
unsigned char *compressed,
|
||||||
|
int maxCompressedBytes
|
||||||
|
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4);
|
||||||
|
|
||||||
|
/** Perform a CTL function on an Opus custom encoder.
|
||||||
|
*
|
||||||
|
* Generally the request and subsequent arguments are generated
|
||||||
|
* by a convenience macro.
|
||||||
|
* @see opus_encoderctls
|
||||||
|
*/
|
||||||
|
OPUS_CUSTOM_EXPORT int opus_custom_encoder_ctl(OpusCustomEncoder * OPUS_RESTRICT st, int request, ...) OPUS_ARG_NONNULL(1);
|
||||||
|
|
||||||
|
|
||||||
|
#if !defined(OPUS_BUILD) || defined(CELT_DECODER_C)
|
||||||
|
/* Decoder */
|
||||||
|
|
||||||
|
/** Gets the size of an OpusCustomDecoder structure.
|
||||||
|
* @param [in] mode <tt>OpusCustomMode *</tt>: Mode configuration
|
||||||
|
* @param [in] channels <tt>int</tt>: Number of channels
|
||||||
|
* @returns size
|
||||||
|
*/
|
||||||
|
OPUS_CUSTOM_EXPORT_STATIC OPUS_WARN_UNUSED_RESULT int opus_custom_decoder_get_size(
|
||||||
|
const OpusCustomMode *mode,
|
||||||
|
int channels
|
||||||
|
) OPUS_ARG_NONNULL(1);
|
||||||
|
|
||||||
|
/** Initializes a previously allocated decoder state
|
||||||
|
* The memory pointed to by st must be the size returned by opus_custom_decoder_get_size.
|
||||||
|
* This is intended for applications which use their own allocator instead of malloc.
|
||||||
|
* @see opus_custom_decoder_create(),opus_custom_decoder_get_size()
|
||||||
|
* To reset a previously initialized state use the OPUS_RESET_STATE CTL.
|
||||||
|
* @param [in] st <tt>OpusCustomDecoder*</tt>: Decoder state
|
||||||
|
* @param [in] mode <tt>OpusCustomMode *</tt>: Contains all the information about the characteristics of
|
||||||
|
* the stream (must be the same characteristics as used for the
|
||||||
|
* encoder)
|
||||||
|
* @param [in] channels <tt>int</tt>: Number of channels
|
||||||
|
* @return OPUS_OK Success or @ref opus_errorcodes
|
||||||
|
*/
|
||||||
|
OPUS_CUSTOM_EXPORT_STATIC int opus_custom_decoder_init(
|
||||||
|
OpusCustomDecoder *st,
|
||||||
|
const OpusCustomMode *mode,
|
||||||
|
int channels
|
||||||
|
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/** Creates a new decoder state. Each stream needs its own decoder state (can't
|
||||||
|
* be shared across simultaneous streams).
|
||||||
|
* @param [in] mode <tt>OpusCustomMode</tt>: Contains all the information about the characteristics of the
|
||||||
|
* stream (must be the same characteristics as used for the encoder)
|
||||||
|
* @param [in] channels <tt>int</tt>: Number of channels
|
||||||
|
* @param [out] error <tt>int*</tt>: Returns an error code
|
||||||
|
* @return Newly created decoder state.
|
||||||
|
*/
|
||||||
|
OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT OpusCustomDecoder *opus_custom_decoder_create(
|
||||||
|
const OpusCustomMode *mode,
|
||||||
|
int channels,
|
||||||
|
int *error
|
||||||
|
) OPUS_ARG_NONNULL(1);
|
||||||
|
|
||||||
|
/** Destroys a decoder state.
|
||||||
|
* @param[in] st <tt>OpusCustomDecoder*</tt>: State to be freed.
|
||||||
|
*/
|
||||||
|
OPUS_CUSTOM_EXPORT void opus_custom_decoder_destroy(OpusCustomDecoder *st);
|
||||||
|
|
||||||
|
/** Decode an opus custom frame with floating point output
|
||||||
|
* @param [in] st <tt>OpusCustomDecoder*</tt>: Decoder state
|
||||||
|
* @param [in] data <tt>char*</tt>: Input payload. Use a NULL pointer to indicate packet loss
|
||||||
|
* @param [in] len <tt>int</tt>: Number of bytes in payload
|
||||||
|
* @param [out] pcm <tt>float*</tt>: Output signal (interleaved if 2 channels). length
|
||||||
|
* is frame_size*channels*sizeof(float)
|
||||||
|
* @param [in] frame_size Number of samples per channel of available space in *pcm.
|
||||||
|
* @returns Number of decoded samples or @ref opus_errorcodes
|
||||||
|
*/
|
||||||
|
OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT int opus_custom_decode_float(
|
||||||
|
OpusCustomDecoder *st,
|
||||||
|
const unsigned char *data,
|
||||||
|
int len,
|
||||||
|
float *pcm,
|
||||||
|
int frame_size
|
||||||
|
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);
|
||||||
|
|
||||||
|
/** Decode an opus custom frame
|
||||||
|
* @param [in] st <tt>OpusCustomDecoder*</tt>: Decoder state
|
||||||
|
* @param [in] data <tt>char*</tt>: Input payload. Use a NULL pointer to indicate packet loss
|
||||||
|
* @param [in] len <tt>int</tt>: Number of bytes in payload
|
||||||
|
* @param [out] pcm <tt>opus_int16*</tt>: Output signal (interleaved if 2 channels). length
|
||||||
|
* is frame_size*channels*sizeof(opus_int16)
|
||||||
|
* @param [in] frame_size Number of samples per channel of available space in *pcm.
|
||||||
|
* @returns Number of decoded samples or @ref opus_errorcodes
|
||||||
|
*/
|
||||||
|
OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT int opus_custom_decode(
|
||||||
|
OpusCustomDecoder *st,
|
||||||
|
const unsigned char *data,
|
||||||
|
int len,
|
||||||
|
opus_int16 *pcm,
|
||||||
|
int frame_size
|
||||||
|
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);
|
||||||
|
|
||||||
|
/** Perform a CTL function on an Opus custom decoder.
|
||||||
|
*
|
||||||
|
* Generally the request and subsequent arguments are generated
|
||||||
|
* by a convenience macro.
|
||||||
|
* @see opus_genericctls
|
||||||
|
*/
|
||||||
|
OPUS_CUSTOM_EXPORT int opus_custom_decoder_ctl(OpusCustomDecoder * OPUS_RESTRICT st, int request, ...) OPUS_ARG_NONNULL(1);
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* OPUS_CUSTOM_H */
|
||||||
830
opus/opus_defines.h
Normal file
830
opus/opus_defines.h
Normal file
@ -0,0 +1,830 @@
|
|||||||
|
/* Copyright (c) 2010-2011 Xiph.Org Foundation, Skype Limited
|
||||||
|
Written by Jean-Marc Valin and Koen Vos */
|
||||||
|
/*
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
|
||||||
|
- Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
- Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file opus_defines.h
|
||||||
|
* @brief Opus reference implementation constants
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef OPUS_DEFINES_H
|
||||||
|
#define OPUS_DEFINES_H
|
||||||
|
|
||||||
|
#include "opus_types.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** @defgroup opus_errorcodes Error codes
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/** No error @hideinitializer*/
|
||||||
|
#define OPUS_OK 0
|
||||||
|
/** One or more invalid/out of range arguments @hideinitializer*/
|
||||||
|
#define OPUS_BAD_ARG -1
|
||||||
|
/** Not enough bytes allocated in the buffer @hideinitializer*/
|
||||||
|
#define OPUS_BUFFER_TOO_SMALL -2
|
||||||
|
/** An internal error was detected @hideinitializer*/
|
||||||
|
#define OPUS_INTERNAL_ERROR -3
|
||||||
|
/** The compressed data passed is corrupted @hideinitializer*/
|
||||||
|
#define OPUS_INVALID_PACKET -4
|
||||||
|
/** Invalid/unsupported request number @hideinitializer*/
|
||||||
|
#define OPUS_UNIMPLEMENTED -5
|
||||||
|
/** An encoder or decoder structure is invalid or already freed @hideinitializer*/
|
||||||
|
#define OPUS_INVALID_STATE -6
|
||||||
|
/** Memory allocation has failed @hideinitializer*/
|
||||||
|
#define OPUS_ALLOC_FAIL -7
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
/** @cond OPUS_INTERNAL_DOC */
|
||||||
|
/**Export control for opus functions */
|
||||||
|
|
||||||
|
#ifndef OPUS_EXPORT
|
||||||
|
# if defined(_WIN32)
|
||||||
|
# if defined(OPUS_BUILD) && defined(DLL_EXPORT)
|
||||||
|
# define OPUS_EXPORT __declspec(dllexport)
|
||||||
|
# else
|
||||||
|
# define OPUS_EXPORT
|
||||||
|
# endif
|
||||||
|
# elif defined(__GNUC__) && defined(OPUS_BUILD)
|
||||||
|
# define OPUS_EXPORT __attribute__ ((visibility ("default")))
|
||||||
|
# else
|
||||||
|
# define OPUS_EXPORT
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
# if !defined(OPUS_GNUC_PREREQ)
|
||||||
|
# if defined(__GNUC__)&&defined(__GNUC_MINOR__)
|
||||||
|
# define OPUS_GNUC_PREREQ(_maj,_min) \
|
||||||
|
((__GNUC__<<16)+__GNUC_MINOR__>=((_maj)<<16)+(_min))
|
||||||
|
# else
|
||||||
|
# define OPUS_GNUC_PREREQ(_maj,_min) 0
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) )
|
||||||
|
# if OPUS_GNUC_PREREQ(3,0)
|
||||||
|
# define OPUS_RESTRICT __restrict__
|
||||||
|
# elif (defined(_MSC_VER) && _MSC_VER >= 1400)
|
||||||
|
# define OPUS_RESTRICT __restrict
|
||||||
|
# else
|
||||||
|
# define OPUS_RESTRICT
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# define OPUS_RESTRICT restrict
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) )
|
||||||
|
# if OPUS_GNUC_PREREQ(2,7)
|
||||||
|
# define OPUS_INLINE __inline__
|
||||||
|
# elif (defined(_MSC_VER))
|
||||||
|
# define OPUS_INLINE __inline
|
||||||
|
# else
|
||||||
|
# define OPUS_INLINE
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# define OPUS_INLINE inline
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**Warning attributes for opus functions
|
||||||
|
* NONNULL is not used in OPUS_BUILD to avoid the compiler optimizing out
|
||||||
|
* some paranoid null checks. */
|
||||||
|
#if defined(__GNUC__) && OPUS_GNUC_PREREQ(3, 4)
|
||||||
|
# define OPUS_WARN_UNUSED_RESULT __attribute__ ((__warn_unused_result__))
|
||||||
|
#else
|
||||||
|
# define OPUS_WARN_UNUSED_RESULT
|
||||||
|
#endif
|
||||||
|
#if !defined(OPUS_BUILD) && defined(__GNUC__) && OPUS_GNUC_PREREQ(3, 4)
|
||||||
|
# define OPUS_ARG_NONNULL(_x) __attribute__ ((__nonnull__(_x)))
|
||||||
|
#else
|
||||||
|
# define OPUS_ARG_NONNULL(_x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** These are the actual Encoder CTL ID numbers.
|
||||||
|
* They should not be used directly by applications.
|
||||||
|
* In general, SETs should be even and GETs should be odd.*/
|
||||||
|
#define OPUS_SET_APPLICATION_REQUEST 4000
|
||||||
|
#define OPUS_GET_APPLICATION_REQUEST 4001
|
||||||
|
#define OPUS_SET_BITRATE_REQUEST 4002
|
||||||
|
#define OPUS_GET_BITRATE_REQUEST 4003
|
||||||
|
#define OPUS_SET_MAX_BANDWIDTH_REQUEST 4004
|
||||||
|
#define OPUS_GET_MAX_BANDWIDTH_REQUEST 4005
|
||||||
|
#define OPUS_SET_VBR_REQUEST 4006
|
||||||
|
#define OPUS_GET_VBR_REQUEST 4007
|
||||||
|
#define OPUS_SET_BANDWIDTH_REQUEST 4008
|
||||||
|
#define OPUS_GET_BANDWIDTH_REQUEST 4009
|
||||||
|
#define OPUS_SET_COMPLEXITY_REQUEST 4010
|
||||||
|
#define OPUS_GET_COMPLEXITY_REQUEST 4011
|
||||||
|
#define OPUS_SET_INBAND_FEC_REQUEST 4012
|
||||||
|
#define OPUS_GET_INBAND_FEC_REQUEST 4013
|
||||||
|
#define OPUS_SET_PACKET_LOSS_PERC_REQUEST 4014
|
||||||
|
#define OPUS_GET_PACKET_LOSS_PERC_REQUEST 4015
|
||||||
|
#define OPUS_SET_DTX_REQUEST 4016
|
||||||
|
#define OPUS_GET_DTX_REQUEST 4017
|
||||||
|
#define OPUS_SET_VBR_CONSTRAINT_REQUEST 4020
|
||||||
|
#define OPUS_GET_VBR_CONSTRAINT_REQUEST 4021
|
||||||
|
#define OPUS_SET_FORCE_CHANNELS_REQUEST 4022
|
||||||
|
#define OPUS_GET_FORCE_CHANNELS_REQUEST 4023
|
||||||
|
#define OPUS_SET_SIGNAL_REQUEST 4024
|
||||||
|
#define OPUS_GET_SIGNAL_REQUEST 4025
|
||||||
|
#define OPUS_GET_LOOKAHEAD_REQUEST 4027
|
||||||
|
/* #define OPUS_RESET_STATE 4028 */
|
||||||
|
#define OPUS_GET_SAMPLE_RATE_REQUEST 4029
|
||||||
|
#define OPUS_GET_FINAL_RANGE_REQUEST 4031
|
||||||
|
#define OPUS_GET_PITCH_REQUEST 4033
|
||||||
|
#define OPUS_SET_GAIN_REQUEST 4034
|
||||||
|
#define OPUS_GET_GAIN_REQUEST 4045 /* Should have been 4035 */
|
||||||
|
#define OPUS_SET_LSB_DEPTH_REQUEST 4036
|
||||||
|
#define OPUS_GET_LSB_DEPTH_REQUEST 4037
|
||||||
|
#define OPUS_GET_LAST_PACKET_DURATION_REQUEST 4039
|
||||||
|
#define OPUS_SET_EXPERT_FRAME_DURATION_REQUEST 4040
|
||||||
|
#define OPUS_GET_EXPERT_FRAME_DURATION_REQUEST 4041
|
||||||
|
#define OPUS_SET_PREDICTION_DISABLED_REQUEST 4042
|
||||||
|
#define OPUS_GET_PREDICTION_DISABLED_REQUEST 4043
|
||||||
|
/* Don't use 4045, it's already taken by OPUS_GET_GAIN_REQUEST */
|
||||||
|
#define OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST 4046
|
||||||
|
#define OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST 4047
|
||||||
|
#define OPUS_GET_IN_DTX_REQUEST 4049
|
||||||
|
#define OPUS_SET_DRED_DURATION_REQUEST 4050
|
||||||
|
#define OPUS_GET_DRED_DURATION_REQUEST 4051
|
||||||
|
#define OPUS_SET_DNN_BLOB_REQUEST 4052
|
||||||
|
/*#define OPUS_GET_DNN_BLOB_REQUEST 4053 */
|
||||||
|
|
||||||
|
/** Defines for the presence of extended APIs. */
|
||||||
|
#define OPUS_HAVE_OPUS_PROJECTION_H
|
||||||
|
|
||||||
|
/* Macros to trigger compilation errors when the wrong types are provided to a CTL */
|
||||||
|
#define __opus_check_int(x) (((void)((x) == (opus_int32)0)), (opus_int32)(x))
|
||||||
|
|
||||||
|
#ifdef DISABLE_PTR_CHECK
|
||||||
|
/* Disable checks to prevent ubsan from complaining about NULL checks
|
||||||
|
in test_opus_api. */
|
||||||
|
#define __opus_check_int_ptr(ptr) (ptr)
|
||||||
|
#define __opus_check_uint_ptr(ptr) (ptr)
|
||||||
|
#define __opus_check_uint8_ptr(ptr) (ptr)
|
||||||
|
#define __opus_check_val16_ptr(ptr) (ptr)
|
||||||
|
#define __opus_check_void_ptr(ptr) (ptr)
|
||||||
|
#else
|
||||||
|
#define __opus_check_int_ptr(ptr) ((ptr) + ((ptr) - (opus_int32*)(ptr)))
|
||||||
|
#define __opus_check_uint_ptr(ptr) ((ptr) + ((ptr) - (opus_uint32*)(ptr)))
|
||||||
|
#define __opus_check_uint8_ptr(ptr) ((ptr) + ((ptr) - (opus_uint8*)(ptr)))
|
||||||
|
#define __opus_check_val16_ptr(ptr) ((ptr) + ((ptr) - (opus_val16*)(ptr)))
|
||||||
|
#define __opus_check_void_ptr(x) ((void)((void *)0 == (x)), (x))
|
||||||
|
#endif
|
||||||
|
/** @endcond */
|
||||||
|
|
||||||
|
/** @defgroup opus_ctlvalues Pre-defined values for CTL interface
|
||||||
|
* @see opus_genericctls, opus_encoderctls
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/* Values for the various encoder CTLs */
|
||||||
|
#define OPUS_AUTO -1000 /**<Auto/default setting @hideinitializer*/
|
||||||
|
#define OPUS_BITRATE_MAX -1 /**<Maximum bitrate @hideinitializer*/
|
||||||
|
|
||||||
|
/** Best for most VoIP/videoconference applications where listening quality and intelligibility matter most
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_APPLICATION_VOIP 2048
|
||||||
|
/** Best for broadcast/high-fidelity application where the decoded audio should be as close as possible to the input
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_APPLICATION_AUDIO 2049
|
||||||
|
/** Only use when lowest-achievable latency is what matters most. Voice-optimized modes cannot be used.
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_APPLICATION_RESTRICTED_LOWDELAY 2051
|
||||||
|
|
||||||
|
#define OPUS_SIGNAL_VOICE 3001 /**< Signal being encoded is voice */
|
||||||
|
#define OPUS_SIGNAL_MUSIC 3002 /**< Signal being encoded is music */
|
||||||
|
#define OPUS_BANDWIDTH_NARROWBAND 1101 /**< 4 kHz bandpass @hideinitializer*/
|
||||||
|
#define OPUS_BANDWIDTH_MEDIUMBAND 1102 /**< 6 kHz bandpass @hideinitializer*/
|
||||||
|
#define OPUS_BANDWIDTH_WIDEBAND 1103 /**< 8 kHz bandpass @hideinitializer*/
|
||||||
|
#define OPUS_BANDWIDTH_SUPERWIDEBAND 1104 /**<12 kHz bandpass @hideinitializer*/
|
||||||
|
#define OPUS_BANDWIDTH_FULLBAND 1105 /**<20 kHz bandpass @hideinitializer*/
|
||||||
|
|
||||||
|
#define OPUS_FRAMESIZE_ARG 5000 /**< Select frame size from the argument (default) */
|
||||||
|
#define OPUS_FRAMESIZE_2_5_MS 5001 /**< Use 2.5 ms frames */
|
||||||
|
#define OPUS_FRAMESIZE_5_MS 5002 /**< Use 5 ms frames */
|
||||||
|
#define OPUS_FRAMESIZE_10_MS 5003 /**< Use 10 ms frames */
|
||||||
|
#define OPUS_FRAMESIZE_20_MS 5004 /**< Use 20 ms frames */
|
||||||
|
#define OPUS_FRAMESIZE_40_MS 5005 /**< Use 40 ms frames */
|
||||||
|
#define OPUS_FRAMESIZE_60_MS 5006 /**< Use 60 ms frames */
|
||||||
|
#define OPUS_FRAMESIZE_80_MS 5007 /**< Use 80 ms frames */
|
||||||
|
#define OPUS_FRAMESIZE_100_MS 5008 /**< Use 100 ms frames */
|
||||||
|
#define OPUS_FRAMESIZE_120_MS 5009 /**< Use 120 ms frames */
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup opus_encoderctls Encoder related CTLs
|
||||||
|
*
|
||||||
|
* These are convenience macros for use with the \c opus_encode_ctl
|
||||||
|
* interface. They are used to generate the appropriate series of
|
||||||
|
* arguments for that call, passing the correct type, size and so
|
||||||
|
* on as expected for each particular request.
|
||||||
|
*
|
||||||
|
* Some usage examples:
|
||||||
|
*
|
||||||
|
* @code
|
||||||
|
* int ret;
|
||||||
|
* ret = opus_encoder_ctl(enc_ctx, OPUS_SET_BANDWIDTH(OPUS_AUTO));
|
||||||
|
* if (ret != OPUS_OK) return ret;
|
||||||
|
*
|
||||||
|
* opus_int32 rate;
|
||||||
|
* opus_encoder_ctl(enc_ctx, OPUS_GET_BANDWIDTH(&rate));
|
||||||
|
*
|
||||||
|
* opus_encoder_ctl(enc_ctx, OPUS_RESET_STATE);
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* @see opus_genericctls, opus_encoder
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** Configures the encoder's computational complexity.
|
||||||
|
* The supported range is 0-10 inclusive with 10 representing the highest complexity.
|
||||||
|
* @see OPUS_GET_COMPLEXITY
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: Allowed values: 0-10, inclusive.
|
||||||
|
*
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_COMPLEXITY(x) OPUS_SET_COMPLEXITY_REQUEST, __opus_check_int(x)
|
||||||
|
/** Gets the encoder's complexity configuration.
|
||||||
|
* @see OPUS_SET_COMPLEXITY
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Returns a value in the range 0-10,
|
||||||
|
* inclusive.
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_COMPLEXITY(x) OPUS_GET_COMPLEXITY_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
/** Configures the bitrate in the encoder.
|
||||||
|
* Rates from 500 to 512000 bits per second are meaningful, as well as the
|
||||||
|
* special values #OPUS_AUTO and #OPUS_BITRATE_MAX.
|
||||||
|
* The value #OPUS_BITRATE_MAX can be used to cause the codec to use as much
|
||||||
|
* rate as it can, which is useful for controlling the rate by adjusting the
|
||||||
|
* output buffer size.
|
||||||
|
* @see OPUS_GET_BITRATE
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: Bitrate in bits per second. The default
|
||||||
|
* is determined based on the number of
|
||||||
|
* channels and the input sampling rate.
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_BITRATE(x) OPUS_SET_BITRATE_REQUEST, __opus_check_int(x)
|
||||||
|
/** Gets the encoder's bitrate configuration.
|
||||||
|
* @see OPUS_SET_BITRATE
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Returns the bitrate in bits per second.
|
||||||
|
* The default is determined based on the
|
||||||
|
* number of channels and the input
|
||||||
|
* sampling rate.
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_BITRATE(x) OPUS_GET_BITRATE_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
/** Enables or disables variable bitrate (VBR) in the encoder.
|
||||||
|
* The configured bitrate may not be met exactly because frames must
|
||||||
|
* be an integer number of bytes in length.
|
||||||
|
* @see OPUS_GET_VBR
|
||||||
|
* @see OPUS_SET_VBR_CONSTRAINT
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: Allowed values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>0</dt><dd>Hard CBR. For LPC/hybrid modes at very low bit-rate, this can
|
||||||
|
* cause noticeable quality degradation.</dd>
|
||||||
|
* <dt>1</dt><dd>VBR (default). The exact type of VBR is controlled by
|
||||||
|
* #OPUS_SET_VBR_CONSTRAINT.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_VBR(x) OPUS_SET_VBR_REQUEST, __opus_check_int(x)
|
||||||
|
/** Determine if variable bitrate (VBR) is enabled in the encoder.
|
||||||
|
* @see OPUS_SET_VBR
|
||||||
|
* @see OPUS_GET_VBR_CONSTRAINT
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>0</dt><dd>Hard CBR.</dd>
|
||||||
|
* <dt>1</dt><dd>VBR (default). The exact type of VBR may be retrieved via
|
||||||
|
* #OPUS_GET_VBR_CONSTRAINT.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_VBR(x) OPUS_GET_VBR_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
/** Enables or disables constrained VBR in the encoder.
|
||||||
|
* This setting is ignored when the encoder is in CBR mode.
|
||||||
|
* @warning Only the MDCT mode of Opus currently heeds the constraint.
|
||||||
|
* Speech mode ignores it completely, hybrid mode may fail to obey it
|
||||||
|
* if the LPC layer uses more bitrate than the constraint would have
|
||||||
|
* permitted.
|
||||||
|
* @see OPUS_GET_VBR_CONSTRAINT
|
||||||
|
* @see OPUS_SET_VBR
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: Allowed values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>0</dt><dd>Unconstrained VBR.</dd>
|
||||||
|
* <dt>1</dt><dd>Constrained VBR (default). This creates a maximum of one
|
||||||
|
* frame of buffering delay assuming a transport with a
|
||||||
|
* serialization speed of the nominal bitrate.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_VBR_CONSTRAINT(x) OPUS_SET_VBR_CONSTRAINT_REQUEST, __opus_check_int(x)
|
||||||
|
/** Determine if constrained VBR is enabled in the encoder.
|
||||||
|
* @see OPUS_SET_VBR_CONSTRAINT
|
||||||
|
* @see OPUS_GET_VBR
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>0</dt><dd>Unconstrained VBR.</dd>
|
||||||
|
* <dt>1</dt><dd>Constrained VBR (default).</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_VBR_CONSTRAINT(x) OPUS_GET_VBR_CONSTRAINT_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
/** Configures mono/stereo forcing in the encoder.
|
||||||
|
* This can force the encoder to produce packets encoded as either mono or
|
||||||
|
* stereo, regardless of the format of the input audio. This is useful when
|
||||||
|
* the caller knows that the input signal is currently a mono source embedded
|
||||||
|
* in a stereo stream.
|
||||||
|
* @see OPUS_GET_FORCE_CHANNELS
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: Allowed values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>#OPUS_AUTO</dt><dd>Not forced (default)</dd>
|
||||||
|
* <dt>1</dt> <dd>Forced mono</dd>
|
||||||
|
* <dt>2</dt> <dd>Forced stereo</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_FORCE_CHANNELS(x) OPUS_SET_FORCE_CHANNELS_REQUEST, __opus_check_int(x)
|
||||||
|
/** Gets the encoder's forced channel configuration.
|
||||||
|
* @see OPUS_SET_FORCE_CHANNELS
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>:
|
||||||
|
* <dl>
|
||||||
|
* <dt>#OPUS_AUTO</dt><dd>Not forced (default)</dd>
|
||||||
|
* <dt>1</dt> <dd>Forced mono</dd>
|
||||||
|
* <dt>2</dt> <dd>Forced stereo</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_FORCE_CHANNELS(x) OPUS_GET_FORCE_CHANNELS_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
/** Configures the maximum bandpass that the encoder will select automatically.
|
||||||
|
* Applications should normally use this instead of #OPUS_SET_BANDWIDTH
|
||||||
|
* (leaving that set to the default, #OPUS_AUTO). This allows the
|
||||||
|
* application to set an upper bound based on the type of input it is
|
||||||
|
* providing, but still gives the encoder the freedom to reduce the bandpass
|
||||||
|
* when the bitrate becomes too low, for better overall quality.
|
||||||
|
* @see OPUS_GET_MAX_BANDWIDTH
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: Allowed values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>OPUS_BANDWIDTH_NARROWBAND</dt> <dd>4 kHz passband</dd>
|
||||||
|
* <dt>OPUS_BANDWIDTH_MEDIUMBAND</dt> <dd>6 kHz passband</dd>
|
||||||
|
* <dt>OPUS_BANDWIDTH_WIDEBAND</dt> <dd>8 kHz passband</dd>
|
||||||
|
* <dt>OPUS_BANDWIDTH_SUPERWIDEBAND</dt><dd>12 kHz passband</dd>
|
||||||
|
* <dt>OPUS_BANDWIDTH_FULLBAND</dt> <dd>20 kHz passband (default)</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_MAX_BANDWIDTH(x) OPUS_SET_MAX_BANDWIDTH_REQUEST, __opus_check_int(x)
|
||||||
|
|
||||||
|
/** Gets the encoder's configured maximum allowed bandpass.
|
||||||
|
* @see OPUS_SET_MAX_BANDWIDTH
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Allowed values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>#OPUS_BANDWIDTH_NARROWBAND</dt> <dd>4 kHz passband</dd>
|
||||||
|
* <dt>#OPUS_BANDWIDTH_MEDIUMBAND</dt> <dd>6 kHz passband</dd>
|
||||||
|
* <dt>#OPUS_BANDWIDTH_WIDEBAND</dt> <dd>8 kHz passband</dd>
|
||||||
|
* <dt>#OPUS_BANDWIDTH_SUPERWIDEBAND</dt><dd>12 kHz passband</dd>
|
||||||
|
* <dt>#OPUS_BANDWIDTH_FULLBAND</dt> <dd>20 kHz passband (default)</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_MAX_BANDWIDTH(x) OPUS_GET_MAX_BANDWIDTH_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
/** Sets the encoder's bandpass to a specific value.
|
||||||
|
* This prevents the encoder from automatically selecting the bandpass based
|
||||||
|
* on the available bitrate. If an application knows the bandpass of the input
|
||||||
|
* audio it is providing, it should normally use #OPUS_SET_MAX_BANDWIDTH
|
||||||
|
* instead, which still gives the encoder the freedom to reduce the bandpass
|
||||||
|
* when the bitrate becomes too low, for better overall quality.
|
||||||
|
* @see OPUS_GET_BANDWIDTH
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: Allowed values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>#OPUS_AUTO</dt> <dd>(default)</dd>
|
||||||
|
* <dt>#OPUS_BANDWIDTH_NARROWBAND</dt> <dd>4 kHz passband</dd>
|
||||||
|
* <dt>#OPUS_BANDWIDTH_MEDIUMBAND</dt> <dd>6 kHz passband</dd>
|
||||||
|
* <dt>#OPUS_BANDWIDTH_WIDEBAND</dt> <dd>8 kHz passband</dd>
|
||||||
|
* <dt>#OPUS_BANDWIDTH_SUPERWIDEBAND</dt><dd>12 kHz passband</dd>
|
||||||
|
* <dt>#OPUS_BANDWIDTH_FULLBAND</dt> <dd>20 kHz passband</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_BANDWIDTH(x) OPUS_SET_BANDWIDTH_REQUEST, __opus_check_int(x)
|
||||||
|
|
||||||
|
/** Configures the type of signal being encoded.
|
||||||
|
* This is a hint which helps the encoder's mode selection.
|
||||||
|
* @see OPUS_GET_SIGNAL
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: Allowed values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>#OPUS_AUTO</dt> <dd>(default)</dd>
|
||||||
|
* <dt>#OPUS_SIGNAL_VOICE</dt><dd>Bias thresholds towards choosing LPC or Hybrid modes.</dd>
|
||||||
|
* <dt>#OPUS_SIGNAL_MUSIC</dt><dd>Bias thresholds towards choosing MDCT modes.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_SIGNAL(x) OPUS_SET_SIGNAL_REQUEST, __opus_check_int(x)
|
||||||
|
/** Gets the encoder's configured signal type.
|
||||||
|
* @see OPUS_SET_SIGNAL
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>#OPUS_AUTO</dt> <dd>(default)</dd>
|
||||||
|
* <dt>#OPUS_SIGNAL_VOICE</dt><dd>Bias thresholds towards choosing LPC or Hybrid modes.</dd>
|
||||||
|
* <dt>#OPUS_SIGNAL_MUSIC</dt><dd>Bias thresholds towards choosing MDCT modes.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_SIGNAL(x) OPUS_GET_SIGNAL_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
|
||||||
|
/** Configures the encoder's intended application.
|
||||||
|
* The initial value is a mandatory argument to the encoder_create function.
|
||||||
|
* @see OPUS_GET_APPLICATION
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: Returns one of the following values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>#OPUS_APPLICATION_VOIP</dt>
|
||||||
|
* <dd>Process signal for improved speech intelligibility.</dd>
|
||||||
|
* <dt>#OPUS_APPLICATION_AUDIO</dt>
|
||||||
|
* <dd>Favor faithfulness to the original input.</dd>
|
||||||
|
* <dt>#OPUS_APPLICATION_RESTRICTED_LOWDELAY</dt>
|
||||||
|
* <dd>Configure the minimum possible coding delay by disabling certain modes
|
||||||
|
* of operation.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_APPLICATION(x) OPUS_SET_APPLICATION_REQUEST, __opus_check_int(x)
|
||||||
|
/** Gets the encoder's configured application.
|
||||||
|
* @see OPUS_SET_APPLICATION
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>#OPUS_APPLICATION_VOIP</dt>
|
||||||
|
* <dd>Process signal for improved speech intelligibility.</dd>
|
||||||
|
* <dt>#OPUS_APPLICATION_AUDIO</dt>
|
||||||
|
* <dd>Favor faithfulness to the original input.</dd>
|
||||||
|
* <dt>#OPUS_APPLICATION_RESTRICTED_LOWDELAY</dt>
|
||||||
|
* <dd>Configure the minimum possible coding delay by disabling certain modes
|
||||||
|
* of operation.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_APPLICATION(x) OPUS_GET_APPLICATION_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
/** Gets the total samples of delay added by the entire codec.
|
||||||
|
* This can be queried by the encoder and then the provided number of samples can be
|
||||||
|
* skipped on from the start of the decoder's output to provide time aligned input
|
||||||
|
* and output. From the perspective of a decoding application the real data begins this many
|
||||||
|
* samples late.
|
||||||
|
*
|
||||||
|
* The decoder contribution to this delay is identical for all decoders, but the
|
||||||
|
* encoder portion of the delay may vary from implementation to implementation,
|
||||||
|
* version to version, or even depend on the encoder's initial configuration.
|
||||||
|
* Applications needing delay compensation should call this CTL rather than
|
||||||
|
* hard-coding a value.
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Number of lookahead samples
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_LOOKAHEAD(x) OPUS_GET_LOOKAHEAD_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
/** Configures the encoder's use of inband forward error correction (FEC).
|
||||||
|
* @note This is only applicable to the LPC layer
|
||||||
|
* @see OPUS_GET_INBAND_FEC
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: Allowed values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>0</dt><dd>Disable inband FEC (default).</dd>
|
||||||
|
* <dt>1</dt><dd>Inband FEC enabled. If the packet loss rate is sufficiently high, Opus will automatically switch to SILK even at high rates to enable use of that FEC.</dd>
|
||||||
|
* <dt>2</dt><dd>Inband FEC enabled, but does not necessarily switch to SILK if we have music.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_INBAND_FEC(x) OPUS_SET_INBAND_FEC_REQUEST, __opus_check_int(x)
|
||||||
|
/** Gets encoder's configured use of inband forward error correction.
|
||||||
|
* @see OPUS_SET_INBAND_FEC
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>0</dt><dd>Inband FEC disabled (default).</dd>
|
||||||
|
* <dt>1</dt><dd>Inband FEC enabled. If the packet loss rate is sufficiently high, Opus will automatically switch to SILK even at high rates to enable use of that FEC.</dd>
|
||||||
|
* <dt>2</dt><dd>Inband FEC enabled, but does not necessarily switch to SILK if we have music.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_INBAND_FEC(x) OPUS_GET_INBAND_FEC_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
/** Configures the encoder's expected packet loss percentage.
|
||||||
|
* Higher values trigger progressively more loss resistant behavior in the encoder
|
||||||
|
* at the expense of quality at a given bitrate in the absence of packet loss, but
|
||||||
|
* greater quality under loss.
|
||||||
|
* @see OPUS_GET_PACKET_LOSS_PERC
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: Loss percentage in the range 0-100, inclusive (default: 0).
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_PACKET_LOSS_PERC(x) OPUS_SET_PACKET_LOSS_PERC_REQUEST, __opus_check_int(x)
|
||||||
|
/** Gets the encoder's configured packet loss percentage.
|
||||||
|
* @see OPUS_SET_PACKET_LOSS_PERC
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Returns the configured loss percentage
|
||||||
|
* in the range 0-100, inclusive (default: 0).
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_PACKET_LOSS_PERC(x) OPUS_GET_PACKET_LOSS_PERC_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
/** Configures the encoder's use of discontinuous transmission (DTX).
|
||||||
|
* @note This is only applicable to the LPC layer
|
||||||
|
* @see OPUS_GET_DTX
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: Allowed values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>0</dt><dd>Disable DTX (default).</dd>
|
||||||
|
* <dt>1</dt><dd>Enabled DTX.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_DTX(x) OPUS_SET_DTX_REQUEST, __opus_check_int(x)
|
||||||
|
/** Gets encoder's configured use of discontinuous transmission.
|
||||||
|
* @see OPUS_SET_DTX
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>0</dt><dd>DTX disabled (default).</dd>
|
||||||
|
* <dt>1</dt><dd>DTX enabled.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_DTX(x) OPUS_GET_DTX_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
/** Configures the depth of signal being encoded.
|
||||||
|
*
|
||||||
|
* This is a hint which helps the encoder identify silence and near-silence.
|
||||||
|
* It represents the number of significant bits of linear intensity below
|
||||||
|
* which the signal contains ignorable quantization or other noise.
|
||||||
|
*
|
||||||
|
* For example, OPUS_SET_LSB_DEPTH(14) would be an appropriate setting
|
||||||
|
* for G.711 u-law input. OPUS_SET_LSB_DEPTH(16) would be appropriate
|
||||||
|
* for 16-bit linear pcm input with opus_encode_float().
|
||||||
|
*
|
||||||
|
* When using opus_encode() instead of opus_encode_float(), or when libopus
|
||||||
|
* is compiled for fixed-point, the encoder uses the minimum of the value
|
||||||
|
* set here and the value 16.
|
||||||
|
*
|
||||||
|
* @see OPUS_GET_LSB_DEPTH
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: Input precision in bits, between 8 and 24
|
||||||
|
* (default: 24).
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_LSB_DEPTH(x) OPUS_SET_LSB_DEPTH_REQUEST, __opus_check_int(x)
|
||||||
|
/** Gets the encoder's configured signal depth.
|
||||||
|
* @see OPUS_SET_LSB_DEPTH
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Input precision in bits, between 8 and
|
||||||
|
* 24 (default: 24).
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_LSB_DEPTH(x) OPUS_GET_LSB_DEPTH_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
/** Configures the encoder's use of variable duration frames.
|
||||||
|
* When variable duration is enabled, the encoder is free to use a shorter frame
|
||||||
|
* size than the one requested in the opus_encode*() call.
|
||||||
|
* It is then the user's responsibility
|
||||||
|
* to verify how much audio was encoded by checking the ToC byte of the encoded
|
||||||
|
* packet. The part of the audio that was not encoded needs to be resent to the
|
||||||
|
* encoder for the next call. Do not use this option unless you <b>really</b>
|
||||||
|
* know what you are doing.
|
||||||
|
* @see OPUS_GET_EXPERT_FRAME_DURATION
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: Allowed values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>OPUS_FRAMESIZE_ARG</dt><dd>Select frame size from the argument (default).</dd>
|
||||||
|
* <dt>OPUS_FRAMESIZE_2_5_MS</dt><dd>Use 2.5 ms frames.</dd>
|
||||||
|
* <dt>OPUS_FRAMESIZE_5_MS</dt><dd>Use 5 ms frames.</dd>
|
||||||
|
* <dt>OPUS_FRAMESIZE_10_MS</dt><dd>Use 10 ms frames.</dd>
|
||||||
|
* <dt>OPUS_FRAMESIZE_20_MS</dt><dd>Use 20 ms frames.</dd>
|
||||||
|
* <dt>OPUS_FRAMESIZE_40_MS</dt><dd>Use 40 ms frames.</dd>
|
||||||
|
* <dt>OPUS_FRAMESIZE_60_MS</dt><dd>Use 60 ms frames.</dd>
|
||||||
|
* <dt>OPUS_FRAMESIZE_80_MS</dt><dd>Use 80 ms frames.</dd>
|
||||||
|
* <dt>OPUS_FRAMESIZE_100_MS</dt><dd>Use 100 ms frames.</dd>
|
||||||
|
* <dt>OPUS_FRAMESIZE_120_MS</dt><dd>Use 120 ms frames.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_EXPERT_FRAME_DURATION(x) OPUS_SET_EXPERT_FRAME_DURATION_REQUEST, __opus_check_int(x)
|
||||||
|
/** Gets the encoder's configured use of variable duration frames.
|
||||||
|
* @see OPUS_SET_EXPERT_FRAME_DURATION
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>OPUS_FRAMESIZE_ARG</dt><dd>Select frame size from the argument (default).</dd>
|
||||||
|
* <dt>OPUS_FRAMESIZE_2_5_MS</dt><dd>Use 2.5 ms frames.</dd>
|
||||||
|
* <dt>OPUS_FRAMESIZE_5_MS</dt><dd>Use 5 ms frames.</dd>
|
||||||
|
* <dt>OPUS_FRAMESIZE_10_MS</dt><dd>Use 10 ms frames.</dd>
|
||||||
|
* <dt>OPUS_FRAMESIZE_20_MS</dt><dd>Use 20 ms frames.</dd>
|
||||||
|
* <dt>OPUS_FRAMESIZE_40_MS</dt><dd>Use 40 ms frames.</dd>
|
||||||
|
* <dt>OPUS_FRAMESIZE_60_MS</dt><dd>Use 60 ms frames.</dd>
|
||||||
|
* <dt>OPUS_FRAMESIZE_80_MS</dt><dd>Use 80 ms frames.</dd>
|
||||||
|
* <dt>OPUS_FRAMESIZE_100_MS</dt><dd>Use 100 ms frames.</dd>
|
||||||
|
* <dt>OPUS_FRAMESIZE_120_MS</dt><dd>Use 120 ms frames.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_EXPERT_FRAME_DURATION(x) OPUS_GET_EXPERT_FRAME_DURATION_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
/** If set to 1, disables almost all use of prediction, making frames almost
|
||||||
|
* completely independent. This reduces quality.
|
||||||
|
* @see OPUS_GET_PREDICTION_DISABLED
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: Allowed values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>0</dt><dd>Enable prediction (default).</dd>
|
||||||
|
* <dt>1</dt><dd>Disable prediction.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_PREDICTION_DISABLED(x) OPUS_SET_PREDICTION_DISABLED_REQUEST, __opus_check_int(x)
|
||||||
|
/** Gets the encoder's configured prediction status.
|
||||||
|
* @see OPUS_SET_PREDICTION_DISABLED
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>0</dt><dd>Prediction enabled (default).</dd>
|
||||||
|
* <dt>1</dt><dd>Prediction disabled.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_PREDICTION_DISABLED(x) OPUS_GET_PREDICTION_DISABLED_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
/** If non-zero, enables Deep Redundancy (DRED) and use the specified maximum number of 10-ms redundant frames
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_DRED_DURATION(x) OPUS_SET_DRED_DURATION_REQUEST, __opus_check_int(x)
|
||||||
|
/** Gets the encoder's configured Deep Redundancy (DRED) maximum number of frames.
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_DRED_DURATION(x) OPUS_GET_DRED_DURATION_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
/** Provide external DNN weights from binary object (only when explicitly built without the weights)
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_DNN_BLOB(data, len) OPUS_SET_DNN_BLOB_REQUEST, __opus_check_void_ptr(data), __opus_check_int(len)
|
||||||
|
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
/** @defgroup opus_genericctls Generic CTLs
|
||||||
|
*
|
||||||
|
* These macros are used with the \c opus_decoder_ctl and
|
||||||
|
* \c opus_encoder_ctl calls to generate a particular
|
||||||
|
* request.
|
||||||
|
*
|
||||||
|
* When called on an \c OpusDecoder they apply to that
|
||||||
|
* particular decoder instance. When called on an
|
||||||
|
* \c OpusEncoder they apply to the corresponding setting
|
||||||
|
* on that encoder instance, if present.
|
||||||
|
*
|
||||||
|
* Some usage examples:
|
||||||
|
*
|
||||||
|
* @code
|
||||||
|
* int ret;
|
||||||
|
* opus_int32 pitch;
|
||||||
|
* ret = opus_decoder_ctl(dec_ctx, OPUS_GET_PITCH(&pitch));
|
||||||
|
* if (ret == OPUS_OK) return ret;
|
||||||
|
*
|
||||||
|
* opus_encoder_ctl(enc_ctx, OPUS_RESET_STATE);
|
||||||
|
* opus_decoder_ctl(dec_ctx, OPUS_RESET_STATE);
|
||||||
|
*
|
||||||
|
* opus_int32 enc_bw, dec_bw;
|
||||||
|
* opus_encoder_ctl(enc_ctx, OPUS_GET_BANDWIDTH(&enc_bw));
|
||||||
|
* opus_decoder_ctl(dec_ctx, OPUS_GET_BANDWIDTH(&dec_bw));
|
||||||
|
* if (enc_bw != dec_bw) {
|
||||||
|
* printf("packet bandwidth mismatch!\n");
|
||||||
|
* }
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* @see opus_encoder, opus_decoder_ctl, opus_encoder_ctl, opus_decoderctls, opus_encoderctls
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** Resets the codec state to be equivalent to a freshly initialized state.
|
||||||
|
* This should be called when switching streams in order to prevent
|
||||||
|
* the back to back decoding from giving different results from
|
||||||
|
* one at a time decoding.
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_RESET_STATE 4028
|
||||||
|
|
||||||
|
/** Gets the final state of the codec's entropy coder.
|
||||||
|
* This is used for testing purposes,
|
||||||
|
* The encoder and decoder state should be identical after coding a payload
|
||||||
|
* (assuming no data corruption or software bugs)
|
||||||
|
*
|
||||||
|
* @param[out] x <tt>opus_uint32 *</tt>: Entropy coder state
|
||||||
|
*
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_FINAL_RANGE(x) OPUS_GET_FINAL_RANGE_REQUEST, __opus_check_uint_ptr(x)
|
||||||
|
|
||||||
|
/** Gets the encoder's configured bandpass or the decoder's last bandpass.
|
||||||
|
* @see OPUS_SET_BANDWIDTH
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>#OPUS_AUTO</dt> <dd>(default)</dd>
|
||||||
|
* <dt>#OPUS_BANDWIDTH_NARROWBAND</dt> <dd>4 kHz passband</dd>
|
||||||
|
* <dt>#OPUS_BANDWIDTH_MEDIUMBAND</dt> <dd>6 kHz passband</dd>
|
||||||
|
* <dt>#OPUS_BANDWIDTH_WIDEBAND</dt> <dd>8 kHz passband</dd>
|
||||||
|
* <dt>#OPUS_BANDWIDTH_SUPERWIDEBAND</dt><dd>12 kHz passband</dd>
|
||||||
|
* <dt>#OPUS_BANDWIDTH_FULLBAND</dt> <dd>20 kHz passband</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_BANDWIDTH(x) OPUS_GET_BANDWIDTH_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
/** Gets the sampling rate the encoder or decoder was initialized with.
|
||||||
|
* This simply returns the <code>Fs</code> value passed to opus_encoder_init()
|
||||||
|
* or opus_decoder_init().
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Sampling rate of encoder or decoder.
|
||||||
|
* @hideinitializer
|
||||||
|
*/
|
||||||
|
#define OPUS_GET_SAMPLE_RATE(x) OPUS_GET_SAMPLE_RATE_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
/** If set to 1, disables the use of phase inversion for intensity stereo,
|
||||||
|
* improving the quality of mono downmixes, but slightly reducing normal
|
||||||
|
* stereo quality. Disabling phase inversion in the decoder does not comply
|
||||||
|
* with RFC 6716, although it does not cause any interoperability issue and
|
||||||
|
* is expected to become part of the Opus standard once RFC 6716 is updated
|
||||||
|
* by draft-ietf-codec-opus-update.
|
||||||
|
* @see OPUS_GET_PHASE_INVERSION_DISABLED
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: Allowed values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>0</dt><dd>Enable phase inversion (default).</dd>
|
||||||
|
* <dt>1</dt><dd>Disable phase inversion.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_PHASE_INVERSION_DISABLED(x) OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST, __opus_check_int(x)
|
||||||
|
/** Gets the encoder's configured phase inversion status.
|
||||||
|
* @see OPUS_SET_PHASE_INVERSION_DISABLED
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>0</dt><dd>Stereo phase inversion enabled (default).</dd>
|
||||||
|
* <dt>1</dt><dd>Stereo phase inversion disabled.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_PHASE_INVERSION_DISABLED(x) OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
/** Gets the DTX state of the encoder.
|
||||||
|
* Returns whether the last encoded frame was either a comfort noise update
|
||||||
|
* during DTX or not encoded because of DTX.
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:
|
||||||
|
* <dl>
|
||||||
|
* <dt>0</dt><dd>The encoder is not in DTX.</dd>
|
||||||
|
* <dt>1</dt><dd>The encoder is in DTX.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_IN_DTX(x) OPUS_GET_IN_DTX_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
/** @defgroup opus_decoderctls Decoder related CTLs
|
||||||
|
* @see opus_genericctls, opus_encoderctls, opus_decoder
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** Configures decoder gain adjustment.
|
||||||
|
* Scales the decoded output by a factor specified in Q8 dB units.
|
||||||
|
* This has a maximum range of -32768 to 32767 inclusive, and returns
|
||||||
|
* OPUS_BAD_ARG otherwise. The default is zero indicating no adjustment.
|
||||||
|
* This setting survives decoder reset.
|
||||||
|
*
|
||||||
|
* gain = pow(10, x/(20.0*256))
|
||||||
|
*
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: Amount to scale PCM signal by in Q8 dB units.
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_SET_GAIN(x) OPUS_SET_GAIN_REQUEST, __opus_check_int(x)
|
||||||
|
/** Gets the decoder's configured gain adjustment. @see OPUS_SET_GAIN
|
||||||
|
*
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Amount to scale PCM signal by in Q8 dB units.
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_GAIN(x) OPUS_GET_GAIN_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
/** Gets the duration (in samples) of the last packet successfully decoded or concealed.
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Number of samples (at current sampling rate).
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_LAST_PACKET_DURATION(x) OPUS_GET_LAST_PACKET_DURATION_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
/** Gets the pitch of the last decoded frame, if available.
|
||||||
|
* This can be used for any post-processing algorithm requiring the use of pitch,
|
||||||
|
* e.g. time stretching/shortening. If the last frame was not voiced, or if the
|
||||||
|
* pitch was not coded in the frame, then zero is returned.
|
||||||
|
*
|
||||||
|
* This CTL is only implemented for decoder instances.
|
||||||
|
*
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: pitch period at 48 kHz (or 0 if not available)
|
||||||
|
*
|
||||||
|
* @hideinitializer */
|
||||||
|
#define OPUS_GET_PITCH(x) OPUS_GET_PITCH_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
/** @defgroup opus_libinfo Opus library information functions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** Converts an opus error code into a human readable string.
|
||||||
|
*
|
||||||
|
* @param[in] error <tt>int</tt>: Error number
|
||||||
|
* @returns Error string
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT const char *opus_strerror(int error);
|
||||||
|
|
||||||
|
/** Gets the libopus version string.
|
||||||
|
*
|
||||||
|
* Applications may look for the substring "-fixed" in the version string to
|
||||||
|
* determine whether they have a fixed-point or floating-point build at
|
||||||
|
* runtime.
|
||||||
|
*
|
||||||
|
* @returns Version string
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT const char *opus_get_version_string(void);
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* OPUS_DEFINES_H */
|
||||||
660
opus/opus_multistream.h
Normal file
660
opus/opus_multistream.h
Normal file
@ -0,0 +1,660 @@
|
|||||||
|
/* Copyright (c) 2011 Xiph.Org Foundation
|
||||||
|
Written by Jean-Marc Valin */
|
||||||
|
/*
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
|
||||||
|
- Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
- Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file opus_multistream.h
|
||||||
|
* @brief Opus reference implementation multistream API
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef OPUS_MULTISTREAM_H
|
||||||
|
#define OPUS_MULTISTREAM_H
|
||||||
|
|
||||||
|
#include "opus.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** @cond OPUS_INTERNAL_DOC */
|
||||||
|
|
||||||
|
/** Macros to trigger compilation errors when the wrong types are provided to a
|
||||||
|
* CTL. */
|
||||||
|
/**@{*/
|
||||||
|
#define __opus_check_encstate_ptr(ptr) ((ptr) + ((ptr) - (OpusEncoder**)(ptr)))
|
||||||
|
#define __opus_check_decstate_ptr(ptr) ((ptr) + ((ptr) - (OpusDecoder**)(ptr)))
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
/** These are the actual encoder and decoder CTL ID numbers.
|
||||||
|
* They should not be used directly by applications.
|
||||||
|
* In general, SETs should be even and GETs should be odd.*/
|
||||||
|
/**@{*/
|
||||||
|
#define OPUS_MULTISTREAM_GET_ENCODER_STATE_REQUEST 5120
|
||||||
|
#define OPUS_MULTISTREAM_GET_DECODER_STATE_REQUEST 5122
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
/** @endcond */
|
||||||
|
|
||||||
|
/** @defgroup opus_multistream_ctls Multistream specific encoder and decoder CTLs
|
||||||
|
*
|
||||||
|
* These are convenience macros that are specific to the
|
||||||
|
* opus_multistream_encoder_ctl() and opus_multistream_decoder_ctl()
|
||||||
|
* interface.
|
||||||
|
* The CTLs from @ref opus_genericctls, @ref opus_encoderctls, and
|
||||||
|
* @ref opus_decoderctls may be applied to a multistream encoder or decoder as
|
||||||
|
* well.
|
||||||
|
* In addition, you may retrieve the encoder or decoder state for an specific
|
||||||
|
* stream via #OPUS_MULTISTREAM_GET_ENCODER_STATE or
|
||||||
|
* #OPUS_MULTISTREAM_GET_DECODER_STATE and apply CTLs to it individually.
|
||||||
|
*/
|
||||||
|
/**@{*/
|
||||||
|
|
||||||
|
/** Gets the encoder state for an individual stream of a multistream encoder.
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: The index of the stream whose encoder you
|
||||||
|
* wish to retrieve.
|
||||||
|
* This must be non-negative and less than
|
||||||
|
* the <code>streams</code> parameter used
|
||||||
|
* to initialize the encoder.
|
||||||
|
* @param[out] y <tt>OpusEncoder**</tt>: Returns a pointer to the given
|
||||||
|
* encoder state.
|
||||||
|
* @retval OPUS_BAD_ARG The index of the requested stream was out of range.
|
||||||
|
* @hideinitializer
|
||||||
|
*/
|
||||||
|
#define OPUS_MULTISTREAM_GET_ENCODER_STATE(x,y) OPUS_MULTISTREAM_GET_ENCODER_STATE_REQUEST, __opus_check_int(x), __opus_check_encstate_ptr(y)
|
||||||
|
|
||||||
|
/** Gets the decoder state for an individual stream of a multistream decoder.
|
||||||
|
* @param[in] x <tt>opus_int32</tt>: The index of the stream whose decoder you
|
||||||
|
* wish to retrieve.
|
||||||
|
* This must be non-negative and less than
|
||||||
|
* the <code>streams</code> parameter used
|
||||||
|
* to initialize the decoder.
|
||||||
|
* @param[out] y <tt>OpusDecoder**</tt>: Returns a pointer to the given
|
||||||
|
* decoder state.
|
||||||
|
* @retval OPUS_BAD_ARG The index of the requested stream was out of range.
|
||||||
|
* @hideinitializer
|
||||||
|
*/
|
||||||
|
#define OPUS_MULTISTREAM_GET_DECODER_STATE(x,y) OPUS_MULTISTREAM_GET_DECODER_STATE_REQUEST, __opus_check_int(x), __opus_check_decstate_ptr(y)
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
/** @defgroup opus_multistream Opus Multistream API
|
||||||
|
* @{
|
||||||
|
*
|
||||||
|
* The multistream API allows individual Opus streams to be combined into a
|
||||||
|
* single packet, enabling support for up to 255 channels. Unlike an
|
||||||
|
* elementary Opus stream, the encoder and decoder must negotiate the channel
|
||||||
|
* configuration before the decoder can successfully interpret the data in the
|
||||||
|
* packets produced by the encoder. Some basic information, such as packet
|
||||||
|
* duration, can be computed without any special negotiation.
|
||||||
|
*
|
||||||
|
* The format for multistream Opus packets is defined in
|
||||||
|
* <a href="https://tools.ietf.org/html/rfc7845">RFC 7845</a>
|
||||||
|
* and is based on the self-delimited Opus framing described in Appendix B of
|
||||||
|
* <a href="https://tools.ietf.org/html/rfc6716">RFC 6716</a>.
|
||||||
|
* Normal Opus packets are just a degenerate case of multistream Opus packets,
|
||||||
|
* and can be encoded or decoded with the multistream API by setting
|
||||||
|
* <code>streams</code> to <code>1</code> when initializing the encoder or
|
||||||
|
* decoder.
|
||||||
|
*
|
||||||
|
* Multistream Opus streams can contain up to 255 elementary Opus streams.
|
||||||
|
* These may be either "uncoupled" or "coupled", indicating that the decoder
|
||||||
|
* is configured to decode them to either 1 or 2 channels, respectively.
|
||||||
|
* The streams are ordered so that all coupled streams appear at the
|
||||||
|
* beginning.
|
||||||
|
*
|
||||||
|
* A <code>mapping</code> table defines which decoded channel <code>i</code>
|
||||||
|
* should be used for each input/output (I/O) channel <code>j</code>. This table is
|
||||||
|
* typically provided as an unsigned char array.
|
||||||
|
* Let <code>i = mapping[j]</code> be the index for I/O channel <code>j</code>.
|
||||||
|
* If <code>i < 2*coupled_streams</code>, then I/O channel <code>j</code> is
|
||||||
|
* encoded as the left channel of stream <code>(i/2)</code> if <code>i</code>
|
||||||
|
* is even, or as the right channel of stream <code>(i/2)</code> if
|
||||||
|
* <code>i</code> is odd. Otherwise, I/O channel <code>j</code> is encoded as
|
||||||
|
* mono in stream <code>(i - coupled_streams)</code>, unless it has the special
|
||||||
|
* value 255, in which case it is omitted from the encoding entirely (the
|
||||||
|
* decoder will reproduce it as silence). Each value <code>i</code> must either
|
||||||
|
* be the special value 255 or be less than <code>streams + coupled_streams</code>.
|
||||||
|
*
|
||||||
|
* The output channels specified by the encoder
|
||||||
|
* should use the
|
||||||
|
* <a href="https://www.xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-810004.3.9">Vorbis
|
||||||
|
* channel ordering</a>. A decoder may wish to apply an additional permutation
|
||||||
|
* to the mapping the encoder used to achieve a different output channel
|
||||||
|
* order (e.g. for outputting in WAV order).
|
||||||
|
*
|
||||||
|
* Each multistream packet contains an Opus packet for each stream, and all of
|
||||||
|
* the Opus packets in a single multistream packet must have the same
|
||||||
|
* duration. Therefore the duration of a multistream packet can be extracted
|
||||||
|
* from the TOC sequence of the first stream, which is located at the
|
||||||
|
* beginning of the packet, just like an elementary Opus stream:
|
||||||
|
*
|
||||||
|
* @code
|
||||||
|
* int nb_samples;
|
||||||
|
* int nb_frames;
|
||||||
|
* nb_frames = opus_packet_get_nb_frames(data, len);
|
||||||
|
* if (nb_frames < 1)
|
||||||
|
* return nb_frames;
|
||||||
|
* nb_samples = opus_packet_get_samples_per_frame(data, 48000) * nb_frames;
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* The general encoding and decoding process proceeds exactly the same as in
|
||||||
|
* the normal @ref opus_encoder and @ref opus_decoder APIs.
|
||||||
|
* See their documentation for an overview of how to use the corresponding
|
||||||
|
* multistream functions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** Opus multistream encoder state.
|
||||||
|
* This contains the complete state of a multistream Opus encoder.
|
||||||
|
* It is position independent and can be freely copied.
|
||||||
|
* @see opus_multistream_encoder_create
|
||||||
|
* @see opus_multistream_encoder_init
|
||||||
|
*/
|
||||||
|
typedef struct OpusMSEncoder OpusMSEncoder;
|
||||||
|
|
||||||
|
/** Opus multistream decoder state.
|
||||||
|
* This contains the complete state of a multistream Opus decoder.
|
||||||
|
* It is position independent and can be freely copied.
|
||||||
|
* @see opus_multistream_decoder_create
|
||||||
|
* @see opus_multistream_decoder_init
|
||||||
|
*/
|
||||||
|
typedef struct OpusMSDecoder OpusMSDecoder;
|
||||||
|
|
||||||
|
/**\name Multistream encoder functions */
|
||||||
|
/**@{*/
|
||||||
|
|
||||||
|
/** Gets the size of an OpusMSEncoder structure.
|
||||||
|
* @param streams <tt>int</tt>: The total number of streams to encode from the
|
||||||
|
* input.
|
||||||
|
* This must be no more than 255.
|
||||||
|
* @param coupled_streams <tt>int</tt>: Number of coupled (2 channel) streams
|
||||||
|
* to encode.
|
||||||
|
* This must be no larger than the total
|
||||||
|
* number of streams.
|
||||||
|
* Additionally, The total number of
|
||||||
|
* encoded channels (<code>streams +
|
||||||
|
* coupled_streams</code>) must be no
|
||||||
|
* more than 255.
|
||||||
|
* @returns The size in bytes on success, or a negative error code
|
||||||
|
* (see @ref opus_errorcodes) on error.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_multistream_encoder_get_size(
|
||||||
|
int streams,
|
||||||
|
int coupled_streams
|
||||||
|
);
|
||||||
|
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_multistream_surround_encoder_get_size(
|
||||||
|
int channels,
|
||||||
|
int mapping_family
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
/** Allocates and initializes a multistream encoder state.
|
||||||
|
* Call opus_multistream_encoder_destroy() to release
|
||||||
|
* this object when finished.
|
||||||
|
* @param Fs <tt>opus_int32</tt>: Sampling rate of the input signal (in Hz).
|
||||||
|
* This must be one of 8000, 12000, 16000,
|
||||||
|
* 24000, or 48000.
|
||||||
|
* @param channels <tt>int</tt>: Number of channels in the input signal.
|
||||||
|
* This must be at most 255.
|
||||||
|
* It may be greater than the number of
|
||||||
|
* coded channels (<code>streams +
|
||||||
|
* coupled_streams</code>).
|
||||||
|
* @param streams <tt>int</tt>: The total number of streams to encode from the
|
||||||
|
* input.
|
||||||
|
* This must be no more than the number of channels.
|
||||||
|
* @param coupled_streams <tt>int</tt>: Number of coupled (2 channel) streams
|
||||||
|
* to encode.
|
||||||
|
* This must be no larger than the total
|
||||||
|
* number of streams.
|
||||||
|
* Additionally, The total number of
|
||||||
|
* encoded channels (<code>streams +
|
||||||
|
* coupled_streams</code>) must be no
|
||||||
|
* more than the number of input channels.
|
||||||
|
* @param[in] mapping <code>const unsigned char[channels]</code>: Mapping from
|
||||||
|
* encoded channels to input channels, as described in
|
||||||
|
* @ref opus_multistream. As an extra constraint, the
|
||||||
|
* multistream encoder does not allow encoding coupled
|
||||||
|
* streams for which one channel is unused since this
|
||||||
|
* is never a good idea.
|
||||||
|
* @param application <tt>int</tt>: The target encoder application.
|
||||||
|
* This must be one of the following:
|
||||||
|
* <dl>
|
||||||
|
* <dt>#OPUS_APPLICATION_VOIP</dt>
|
||||||
|
* <dd>Process signal for improved speech intelligibility.</dd>
|
||||||
|
* <dt>#OPUS_APPLICATION_AUDIO</dt>
|
||||||
|
* <dd>Favor faithfulness to the original input.</dd>
|
||||||
|
* <dt>#OPUS_APPLICATION_RESTRICTED_LOWDELAY</dt>
|
||||||
|
* <dd>Configure the minimum possible coding delay by disabling certain modes
|
||||||
|
* of operation.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @param[out] error <tt>int *</tt>: Returns #OPUS_OK on success, or an error
|
||||||
|
* code (see @ref opus_errorcodes) on
|
||||||
|
* failure.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusMSEncoder *opus_multistream_encoder_create(
|
||||||
|
opus_int32 Fs,
|
||||||
|
int channels,
|
||||||
|
int streams,
|
||||||
|
int coupled_streams,
|
||||||
|
const unsigned char *mapping,
|
||||||
|
int application,
|
||||||
|
int *error
|
||||||
|
) OPUS_ARG_NONNULL(5);
|
||||||
|
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusMSEncoder *opus_multistream_surround_encoder_create(
|
||||||
|
opus_int32 Fs,
|
||||||
|
int channels,
|
||||||
|
int mapping_family,
|
||||||
|
int *streams,
|
||||||
|
int *coupled_streams,
|
||||||
|
unsigned char *mapping,
|
||||||
|
int application,
|
||||||
|
int *error
|
||||||
|
) OPUS_ARG_NONNULL(4) OPUS_ARG_NONNULL(5) OPUS_ARG_NONNULL(6);
|
||||||
|
|
||||||
|
/** Initialize a previously allocated multistream encoder state.
|
||||||
|
* The memory pointed to by \a st must be at least the size returned by
|
||||||
|
* opus_multistream_encoder_get_size().
|
||||||
|
* This is intended for applications which use their own allocator instead of
|
||||||
|
* malloc.
|
||||||
|
* To reset a previously initialized state, use the #OPUS_RESET_STATE CTL.
|
||||||
|
* @see opus_multistream_encoder_create
|
||||||
|
* @see opus_multistream_encoder_get_size
|
||||||
|
* @param st <tt>OpusMSEncoder*</tt>: Multistream encoder state to initialize.
|
||||||
|
* @param Fs <tt>opus_int32</tt>: Sampling rate of the input signal (in Hz).
|
||||||
|
* This must be one of 8000, 12000, 16000,
|
||||||
|
* 24000, or 48000.
|
||||||
|
* @param channels <tt>int</tt>: Number of channels in the input signal.
|
||||||
|
* This must be at most 255.
|
||||||
|
* It may be greater than the number of
|
||||||
|
* coded channels (<code>streams +
|
||||||
|
* coupled_streams</code>).
|
||||||
|
* @param streams <tt>int</tt>: The total number of streams to encode from the
|
||||||
|
* input.
|
||||||
|
* This must be no more than the number of channels.
|
||||||
|
* @param coupled_streams <tt>int</tt>: Number of coupled (2 channel) streams
|
||||||
|
* to encode.
|
||||||
|
* This must be no larger than the total
|
||||||
|
* number of streams.
|
||||||
|
* Additionally, The total number of
|
||||||
|
* encoded channels (<code>streams +
|
||||||
|
* coupled_streams</code>) must be no
|
||||||
|
* more than the number of input channels.
|
||||||
|
* @param[in] mapping <code>const unsigned char[channels]</code>: Mapping from
|
||||||
|
* encoded channels to input channels, as described in
|
||||||
|
* @ref opus_multistream. As an extra constraint, the
|
||||||
|
* multistream encoder does not allow encoding coupled
|
||||||
|
* streams for which one channel is unused since this
|
||||||
|
* is never a good idea.
|
||||||
|
* @param application <tt>int</tt>: The target encoder application.
|
||||||
|
* This must be one of the following:
|
||||||
|
* <dl>
|
||||||
|
* <dt>#OPUS_APPLICATION_VOIP</dt>
|
||||||
|
* <dd>Process signal for improved speech intelligibility.</dd>
|
||||||
|
* <dt>#OPUS_APPLICATION_AUDIO</dt>
|
||||||
|
* <dd>Favor faithfulness to the original input.</dd>
|
||||||
|
* <dt>#OPUS_APPLICATION_RESTRICTED_LOWDELAY</dt>
|
||||||
|
* <dd>Configure the minimum possible coding delay by disabling certain modes
|
||||||
|
* of operation.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @returns #OPUS_OK on success, or an error code (see @ref opus_errorcodes)
|
||||||
|
* on failure.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT int opus_multistream_encoder_init(
|
||||||
|
OpusMSEncoder *st,
|
||||||
|
opus_int32 Fs,
|
||||||
|
int channels,
|
||||||
|
int streams,
|
||||||
|
int coupled_streams,
|
||||||
|
const unsigned char *mapping,
|
||||||
|
int application
|
||||||
|
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(6);
|
||||||
|
|
||||||
|
OPUS_EXPORT int opus_multistream_surround_encoder_init(
|
||||||
|
OpusMSEncoder *st,
|
||||||
|
opus_int32 Fs,
|
||||||
|
int channels,
|
||||||
|
int mapping_family,
|
||||||
|
int *streams,
|
||||||
|
int *coupled_streams,
|
||||||
|
unsigned char *mapping,
|
||||||
|
int application
|
||||||
|
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(5) OPUS_ARG_NONNULL(6) OPUS_ARG_NONNULL(7);
|
||||||
|
|
||||||
|
/** Encodes a multistream Opus frame.
|
||||||
|
* @param st <tt>OpusMSEncoder*</tt>: Multistream encoder state.
|
||||||
|
* @param[in] pcm <tt>const opus_int16*</tt>: The input signal as interleaved
|
||||||
|
* samples.
|
||||||
|
* This must contain
|
||||||
|
* <code>frame_size*channels</code>
|
||||||
|
* samples.
|
||||||
|
* @param frame_size <tt>int</tt>: Number of samples per channel in the input
|
||||||
|
* signal.
|
||||||
|
* This must be an Opus frame size for the
|
||||||
|
* encoder's sampling rate.
|
||||||
|
* For example, at 48 kHz the permitted values
|
||||||
|
* are 120, 240, 480, 960, 1920, and 2880.
|
||||||
|
* Passing in a duration of less than 10 ms
|
||||||
|
* (480 samples at 48 kHz) will prevent the
|
||||||
|
* encoder from using the LPC or hybrid modes.
|
||||||
|
* @param[out] data <tt>unsigned char*</tt>: Output payload.
|
||||||
|
* This must contain storage for at
|
||||||
|
* least \a max_data_bytes.
|
||||||
|
* @param [in] max_data_bytes <tt>opus_int32</tt>: Size of the allocated
|
||||||
|
* memory for the output
|
||||||
|
* payload. This may be
|
||||||
|
* used to impose an upper limit on
|
||||||
|
* the instant bitrate, but should
|
||||||
|
* not be used as the only bitrate
|
||||||
|
* control. Use #OPUS_SET_BITRATE to
|
||||||
|
* control the bitrate.
|
||||||
|
* @returns The length of the encoded packet (in bytes) on success or a
|
||||||
|
* negative error code (see @ref opus_errorcodes) on failure.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_multistream_encode(
|
||||||
|
OpusMSEncoder *st,
|
||||||
|
const opus_int16 *pcm,
|
||||||
|
int frame_size,
|
||||||
|
unsigned char *data,
|
||||||
|
opus_int32 max_data_bytes
|
||||||
|
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4);
|
||||||
|
|
||||||
|
/** Encodes a multistream Opus frame from floating point input.
|
||||||
|
* @param st <tt>OpusMSEncoder*</tt>: Multistream encoder state.
|
||||||
|
* @param[in] pcm <tt>const float*</tt>: The input signal as interleaved
|
||||||
|
* samples with a normal range of
|
||||||
|
* +/-1.0.
|
||||||
|
* Samples with a range beyond +/-1.0
|
||||||
|
* are supported but will be clipped by
|
||||||
|
* decoders using the integer API and
|
||||||
|
* should only be used if it is known
|
||||||
|
* that the far end supports extended
|
||||||
|
* dynamic range.
|
||||||
|
* This must contain
|
||||||
|
* <code>frame_size*channels</code>
|
||||||
|
* samples.
|
||||||
|
* @param frame_size <tt>int</tt>: Number of samples per channel in the input
|
||||||
|
* signal.
|
||||||
|
* This must be an Opus frame size for the
|
||||||
|
* encoder's sampling rate.
|
||||||
|
* For example, at 48 kHz the permitted values
|
||||||
|
* are 120, 240, 480, 960, 1920, and 2880.
|
||||||
|
* Passing in a duration of less than 10 ms
|
||||||
|
* (480 samples at 48 kHz) will prevent the
|
||||||
|
* encoder from using the LPC or hybrid modes.
|
||||||
|
* @param[out] data <tt>unsigned char*</tt>: Output payload.
|
||||||
|
* This must contain storage for at
|
||||||
|
* least \a max_data_bytes.
|
||||||
|
* @param [in] max_data_bytes <tt>opus_int32</tt>: Size of the allocated
|
||||||
|
* memory for the output
|
||||||
|
* payload. This may be
|
||||||
|
* used to impose an upper limit on
|
||||||
|
* the instant bitrate, but should
|
||||||
|
* not be used as the only bitrate
|
||||||
|
* control. Use #OPUS_SET_BITRATE to
|
||||||
|
* control the bitrate.
|
||||||
|
* @returns The length of the encoded packet (in bytes) on success or a
|
||||||
|
* negative error code (see @ref opus_errorcodes) on failure.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_multistream_encode_float(
|
||||||
|
OpusMSEncoder *st,
|
||||||
|
const float *pcm,
|
||||||
|
int frame_size,
|
||||||
|
unsigned char *data,
|
||||||
|
opus_int32 max_data_bytes
|
||||||
|
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4);
|
||||||
|
|
||||||
|
/** Frees an <code>OpusMSEncoder</code> allocated by
|
||||||
|
* opus_multistream_encoder_create().
|
||||||
|
* @param st <tt>OpusMSEncoder*</tt>: Multistream encoder state to be freed.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT void opus_multistream_encoder_destroy(OpusMSEncoder *st);
|
||||||
|
|
||||||
|
/** Perform a CTL function on a multistream Opus encoder.
|
||||||
|
*
|
||||||
|
* Generally the request and subsequent arguments are generated by a
|
||||||
|
* convenience macro.
|
||||||
|
* @param st <tt>OpusMSEncoder*</tt>: Multistream encoder state.
|
||||||
|
* @param request This and all remaining parameters should be replaced by one
|
||||||
|
* of the convenience macros in @ref opus_genericctls,
|
||||||
|
* @ref opus_encoderctls, or @ref opus_multistream_ctls.
|
||||||
|
* @see opus_genericctls
|
||||||
|
* @see opus_encoderctls
|
||||||
|
* @see opus_multistream_ctls
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT int opus_multistream_encoder_ctl(OpusMSEncoder *st, int request, ...) OPUS_ARG_NONNULL(1);
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
/**\name Multistream decoder functions */
|
||||||
|
/**@{*/
|
||||||
|
|
||||||
|
/** Gets the size of an <code>OpusMSDecoder</code> structure.
|
||||||
|
* @param streams <tt>int</tt>: The total number of streams coded in the
|
||||||
|
* input.
|
||||||
|
* This must be no more than 255.
|
||||||
|
* @param coupled_streams <tt>int</tt>: Number streams to decode as coupled
|
||||||
|
* (2 channel) streams.
|
||||||
|
* This must be no larger than the total
|
||||||
|
* number of streams.
|
||||||
|
* Additionally, The total number of
|
||||||
|
* coded channels (<code>streams +
|
||||||
|
* coupled_streams</code>) must be no
|
||||||
|
* more than 255.
|
||||||
|
* @returns The size in bytes on success, or a negative error code
|
||||||
|
* (see @ref opus_errorcodes) on error.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_multistream_decoder_get_size(
|
||||||
|
int streams,
|
||||||
|
int coupled_streams
|
||||||
|
);
|
||||||
|
|
||||||
|
/** Allocates and initializes a multistream decoder state.
|
||||||
|
* Call opus_multistream_decoder_destroy() to release
|
||||||
|
* this object when finished.
|
||||||
|
* @param Fs <tt>opus_int32</tt>: Sampling rate to decode at (in Hz).
|
||||||
|
* This must be one of 8000, 12000, 16000,
|
||||||
|
* 24000, or 48000.
|
||||||
|
* @param channels <tt>int</tt>: Number of channels to output.
|
||||||
|
* This must be at most 255.
|
||||||
|
* It may be different from the number of coded
|
||||||
|
* channels (<code>streams +
|
||||||
|
* coupled_streams</code>).
|
||||||
|
* @param streams <tt>int</tt>: The total number of streams coded in the
|
||||||
|
* input.
|
||||||
|
* This must be no more than 255.
|
||||||
|
* @param coupled_streams <tt>int</tt>: Number of streams to decode as coupled
|
||||||
|
* (2 channel) streams.
|
||||||
|
* This must be no larger than the total
|
||||||
|
* number of streams.
|
||||||
|
* Additionally, The total number of
|
||||||
|
* coded channels (<code>streams +
|
||||||
|
* coupled_streams</code>) must be no
|
||||||
|
* more than 255.
|
||||||
|
* @param[in] mapping <code>const unsigned char[channels]</code>: Mapping from
|
||||||
|
* coded channels to output channels, as described in
|
||||||
|
* @ref opus_multistream.
|
||||||
|
* @param[out] error <tt>int *</tt>: Returns #OPUS_OK on success, or an error
|
||||||
|
* code (see @ref opus_errorcodes) on
|
||||||
|
* failure.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusMSDecoder *opus_multistream_decoder_create(
|
||||||
|
opus_int32 Fs,
|
||||||
|
int channels,
|
||||||
|
int streams,
|
||||||
|
int coupled_streams,
|
||||||
|
const unsigned char *mapping,
|
||||||
|
int *error
|
||||||
|
) OPUS_ARG_NONNULL(5);
|
||||||
|
|
||||||
|
/** Intialize a previously allocated decoder state object.
|
||||||
|
* The memory pointed to by \a st must be at least the size returned by
|
||||||
|
* opus_multistream_encoder_get_size().
|
||||||
|
* This is intended for applications which use their own allocator instead of
|
||||||
|
* malloc.
|
||||||
|
* To reset a previously initialized state, use the #OPUS_RESET_STATE CTL.
|
||||||
|
* @see opus_multistream_decoder_create
|
||||||
|
* @see opus_multistream_deocder_get_size
|
||||||
|
* @param st <tt>OpusMSEncoder*</tt>: Multistream encoder state to initialize.
|
||||||
|
* @param Fs <tt>opus_int32</tt>: Sampling rate to decode at (in Hz).
|
||||||
|
* This must be one of 8000, 12000, 16000,
|
||||||
|
* 24000, or 48000.
|
||||||
|
* @param channels <tt>int</tt>: Number of channels to output.
|
||||||
|
* This must be at most 255.
|
||||||
|
* It may be different from the number of coded
|
||||||
|
* channels (<code>streams +
|
||||||
|
* coupled_streams</code>).
|
||||||
|
* @param streams <tt>int</tt>: The total number of streams coded in the
|
||||||
|
* input.
|
||||||
|
* This must be no more than 255.
|
||||||
|
* @param coupled_streams <tt>int</tt>: Number of streams to decode as coupled
|
||||||
|
* (2 channel) streams.
|
||||||
|
* This must be no larger than the total
|
||||||
|
* number of streams.
|
||||||
|
* Additionally, The total number of
|
||||||
|
* coded channels (<code>streams +
|
||||||
|
* coupled_streams</code>) must be no
|
||||||
|
* more than 255.
|
||||||
|
* @param[in] mapping <code>const unsigned char[channels]</code>: Mapping from
|
||||||
|
* coded channels to output channels, as described in
|
||||||
|
* @ref opus_multistream.
|
||||||
|
* @returns #OPUS_OK on success, or an error code (see @ref opus_errorcodes)
|
||||||
|
* on failure.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT int opus_multistream_decoder_init(
|
||||||
|
OpusMSDecoder *st,
|
||||||
|
opus_int32 Fs,
|
||||||
|
int channels,
|
||||||
|
int streams,
|
||||||
|
int coupled_streams,
|
||||||
|
const unsigned char *mapping
|
||||||
|
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(6);
|
||||||
|
|
||||||
|
/** Decode a multistream Opus packet.
|
||||||
|
* @param st <tt>OpusMSDecoder*</tt>: Multistream decoder state.
|
||||||
|
* @param[in] data <tt>const unsigned char*</tt>: Input payload.
|
||||||
|
* Use a <code>NULL</code>
|
||||||
|
* pointer to indicate packet
|
||||||
|
* loss.
|
||||||
|
* @param len <tt>opus_int32</tt>: Number of bytes in payload.
|
||||||
|
* @param[out] pcm <tt>opus_int16*</tt>: Output signal, with interleaved
|
||||||
|
* samples.
|
||||||
|
* This must contain room for
|
||||||
|
* <code>frame_size*channels</code>
|
||||||
|
* samples.
|
||||||
|
* @param frame_size <tt>int</tt>: The number of samples per channel of
|
||||||
|
* available space in \a pcm.
|
||||||
|
* If this is less than the maximum packet duration
|
||||||
|
* (120 ms; 5760 for 48kHz), this function will not be capable
|
||||||
|
* of decoding some packets. In the case of PLC (data==NULL)
|
||||||
|
* or FEC (decode_fec=1), then frame_size needs to be exactly
|
||||||
|
* the duration of audio that is missing, otherwise the
|
||||||
|
* decoder will not be in the optimal state to decode the
|
||||||
|
* next incoming packet. For the PLC and FEC cases, frame_size
|
||||||
|
* <b>must</b> be a multiple of 2.5 ms.
|
||||||
|
* @param decode_fec <tt>int</tt>: Flag (0 or 1) to request that any in-band
|
||||||
|
* forward error correction data be decoded.
|
||||||
|
* If no such data is available, the frame is
|
||||||
|
* decoded as if it were lost.
|
||||||
|
* @returns Number of samples decoded on success or a negative error code
|
||||||
|
* (see @ref opus_errorcodes) on failure.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_multistream_decode(
|
||||||
|
OpusMSDecoder *st,
|
||||||
|
const unsigned char *data,
|
||||||
|
opus_int32 len,
|
||||||
|
opus_int16 *pcm,
|
||||||
|
int frame_size,
|
||||||
|
int decode_fec
|
||||||
|
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);
|
||||||
|
|
||||||
|
/** Decode a multistream Opus packet with floating point output.
|
||||||
|
* @param st <tt>OpusMSDecoder*</tt>: Multistream decoder state.
|
||||||
|
* @param[in] data <tt>const unsigned char*</tt>: Input payload.
|
||||||
|
* Use a <code>NULL</code>
|
||||||
|
* pointer to indicate packet
|
||||||
|
* loss.
|
||||||
|
* @param len <tt>opus_int32</tt>: Number of bytes in payload.
|
||||||
|
* @param[out] pcm <tt>opus_int16*</tt>: Output signal, with interleaved
|
||||||
|
* samples.
|
||||||
|
* This must contain room for
|
||||||
|
* <code>frame_size*channels</code>
|
||||||
|
* samples.
|
||||||
|
* @param frame_size <tt>int</tt>: The number of samples per channel of
|
||||||
|
* available space in \a pcm.
|
||||||
|
* If this is less than the maximum packet duration
|
||||||
|
* (120 ms; 5760 for 48kHz), this function will not be capable
|
||||||
|
* of decoding some packets. In the case of PLC (data==NULL)
|
||||||
|
* or FEC (decode_fec=1), then frame_size needs to be exactly
|
||||||
|
* the duration of audio that is missing, otherwise the
|
||||||
|
* decoder will not be in the optimal state to decode the
|
||||||
|
* next incoming packet. For the PLC and FEC cases, frame_size
|
||||||
|
* <b>must</b> be a multiple of 2.5 ms.
|
||||||
|
* @param decode_fec <tt>int</tt>: Flag (0 or 1) to request that any in-band
|
||||||
|
* forward error correction data be decoded.
|
||||||
|
* If no such data is available, the frame is
|
||||||
|
* decoded as if it were lost.
|
||||||
|
* @returns Number of samples decoded on success or a negative error code
|
||||||
|
* (see @ref opus_errorcodes) on failure.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_multistream_decode_float(
|
||||||
|
OpusMSDecoder *st,
|
||||||
|
const unsigned char *data,
|
||||||
|
opus_int32 len,
|
||||||
|
float *pcm,
|
||||||
|
int frame_size,
|
||||||
|
int decode_fec
|
||||||
|
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);
|
||||||
|
|
||||||
|
/** Perform a CTL function on a multistream Opus decoder.
|
||||||
|
*
|
||||||
|
* Generally the request and subsequent arguments are generated by a
|
||||||
|
* convenience macro.
|
||||||
|
* @param st <tt>OpusMSDecoder*</tt>: Multistream decoder state.
|
||||||
|
* @param request This and all remaining parameters should be replaced by one
|
||||||
|
* of the convenience macros in @ref opus_genericctls,
|
||||||
|
* @ref opus_decoderctls, or @ref opus_multistream_ctls.
|
||||||
|
* @see opus_genericctls
|
||||||
|
* @see opus_decoderctls
|
||||||
|
* @see opus_multistream_ctls
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT int opus_multistream_decoder_ctl(OpusMSDecoder *st, int request, ...) OPUS_ARG_NONNULL(1);
|
||||||
|
|
||||||
|
/** Frees an <code>OpusMSDecoder</code> allocated by
|
||||||
|
* opus_multistream_decoder_create().
|
||||||
|
* @param st <tt>OpusMSDecoder</tt>: Multistream decoder state to be freed.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT void opus_multistream_decoder_destroy(OpusMSDecoder *st);
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* OPUS_MULTISTREAM_H */
|
||||||
568
opus/opus_projection.h
Normal file
568
opus/opus_projection.h
Normal file
@ -0,0 +1,568 @@
|
|||||||
|
/* Copyright (c) 2017 Google Inc.
|
||||||
|
Written by Andrew Allen */
|
||||||
|
/*
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
|
||||||
|
- Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
- Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file opus_projection.h
|
||||||
|
* @brief Opus projection reference API
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef OPUS_PROJECTION_H
|
||||||
|
#define OPUS_PROJECTION_H
|
||||||
|
|
||||||
|
#include "opus_multistream.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** @cond OPUS_INTERNAL_DOC */
|
||||||
|
|
||||||
|
/** These are the actual encoder and decoder CTL ID numbers.
|
||||||
|
* They should not be used directly by applications.c
|
||||||
|
* In general, SETs should be even and GETs should be odd.*/
|
||||||
|
/**@{*/
|
||||||
|
#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_GAIN_REQUEST 6001
|
||||||
|
#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_SIZE_REQUEST 6003
|
||||||
|
#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_REQUEST 6005
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @endcond */
|
||||||
|
|
||||||
|
/** @defgroup opus_projection_ctls Projection specific encoder and decoder CTLs
|
||||||
|
*
|
||||||
|
* These are convenience macros that are specific to the
|
||||||
|
* opus_projection_encoder_ctl() and opus_projection_decoder_ctl()
|
||||||
|
* interface.
|
||||||
|
* The CTLs from @ref opus_genericctls, @ref opus_encoderctls,
|
||||||
|
* @ref opus_decoderctls, and @ref opus_multistream_ctls may be applied to a
|
||||||
|
* projection encoder or decoder as well.
|
||||||
|
*/
|
||||||
|
/**@{*/
|
||||||
|
|
||||||
|
/** Gets the gain (in dB. S7.8-format) of the demixing matrix from the encoder.
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Returns the gain (in dB. S7.8-format)
|
||||||
|
* of the demixing matrix.
|
||||||
|
* @hideinitializer
|
||||||
|
*/
|
||||||
|
#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_GAIN(x) OPUS_PROJECTION_GET_DEMIXING_MATRIX_GAIN_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
|
||||||
|
/** Gets the size in bytes of the demixing matrix from the encoder.
|
||||||
|
* @param[out] x <tt>opus_int32 *</tt>: Returns the size in bytes of the
|
||||||
|
* demixing matrix.
|
||||||
|
* @hideinitializer
|
||||||
|
*/
|
||||||
|
#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_SIZE(x) OPUS_PROJECTION_GET_DEMIXING_MATRIX_SIZE_REQUEST, __opus_check_int_ptr(x)
|
||||||
|
|
||||||
|
|
||||||
|
/** Copies the demixing matrix to the supplied pointer location.
|
||||||
|
* @param[out] x <tt>unsigned char *</tt>: Returns the demixing matrix to the
|
||||||
|
* supplied pointer location.
|
||||||
|
* @param y <tt>opus_int32</tt>: The size in bytes of the reserved memory at the
|
||||||
|
* pointer location.
|
||||||
|
* @hideinitializer
|
||||||
|
*/
|
||||||
|
#define OPUS_PROJECTION_GET_DEMIXING_MATRIX(x,y) OPUS_PROJECTION_GET_DEMIXING_MATRIX_REQUEST, x, __opus_check_int(y)
|
||||||
|
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
/** Opus projection encoder state.
|
||||||
|
* This contains the complete state of a projection Opus encoder.
|
||||||
|
* It is position independent and can be freely copied.
|
||||||
|
* @see opus_projection_ambisonics_encoder_create
|
||||||
|
*/
|
||||||
|
typedef struct OpusProjectionEncoder OpusProjectionEncoder;
|
||||||
|
|
||||||
|
|
||||||
|
/** Opus projection decoder state.
|
||||||
|
* This contains the complete state of a projection Opus decoder.
|
||||||
|
* It is position independent and can be freely copied.
|
||||||
|
* @see opus_projection_decoder_create
|
||||||
|
* @see opus_projection_decoder_init
|
||||||
|
*/
|
||||||
|
typedef struct OpusProjectionDecoder OpusProjectionDecoder;
|
||||||
|
|
||||||
|
|
||||||
|
/**\name Projection encoder functions */
|
||||||
|
/**@{*/
|
||||||
|
|
||||||
|
/** Gets the size of an OpusProjectionEncoder structure.
|
||||||
|
* @param channels <tt>int</tt>: The total number of input channels to encode.
|
||||||
|
* This must be no more than 255.
|
||||||
|
* @param mapping_family <tt>int</tt>: The mapping family to use for selecting
|
||||||
|
* the appropriate projection.
|
||||||
|
* @returns The size in bytes on success, or a negative error code
|
||||||
|
* (see @ref opus_errorcodes) on error.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_projection_ambisonics_encoder_get_size(
|
||||||
|
int channels,
|
||||||
|
int mapping_family
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
/** Allocates and initializes a projection encoder state.
|
||||||
|
* Call opus_projection_encoder_destroy() to release
|
||||||
|
* this object when finished.
|
||||||
|
* @param Fs <tt>opus_int32</tt>: Sampling rate of the input signal (in Hz).
|
||||||
|
* This must be one of 8000, 12000, 16000,
|
||||||
|
* 24000, or 48000.
|
||||||
|
* @param channels <tt>int</tt>: Number of channels in the input signal.
|
||||||
|
* This must be at most 255.
|
||||||
|
* It may be greater than the number of
|
||||||
|
* coded channels (<code>streams +
|
||||||
|
* coupled_streams</code>).
|
||||||
|
* @param mapping_family <tt>int</tt>: The mapping family to use for selecting
|
||||||
|
* the appropriate projection.
|
||||||
|
* @param[out] streams <tt>int *</tt>: The total number of streams that will
|
||||||
|
* be encoded from the input.
|
||||||
|
* @param[out] coupled_streams <tt>int *</tt>: Number of coupled (2 channel)
|
||||||
|
* streams that will be encoded from the input.
|
||||||
|
* @param application <tt>int</tt>: The target encoder application.
|
||||||
|
* This must be one of the following:
|
||||||
|
* <dl>
|
||||||
|
* <dt>#OPUS_APPLICATION_VOIP</dt>
|
||||||
|
* <dd>Process signal for improved speech intelligibility.</dd>
|
||||||
|
* <dt>#OPUS_APPLICATION_AUDIO</dt>
|
||||||
|
* <dd>Favor faithfulness to the original input.</dd>
|
||||||
|
* <dt>#OPUS_APPLICATION_RESTRICTED_LOWDELAY</dt>
|
||||||
|
* <dd>Configure the minimum possible coding delay by disabling certain modes
|
||||||
|
* of operation.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @param[out] error <tt>int *</tt>: Returns #OPUS_OK on success, or an error
|
||||||
|
* code (see @ref opus_errorcodes) on
|
||||||
|
* failure.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusProjectionEncoder *opus_projection_ambisonics_encoder_create(
|
||||||
|
opus_int32 Fs,
|
||||||
|
int channels,
|
||||||
|
int mapping_family,
|
||||||
|
int *streams,
|
||||||
|
int *coupled_streams,
|
||||||
|
int application,
|
||||||
|
int *error
|
||||||
|
) OPUS_ARG_NONNULL(4) OPUS_ARG_NONNULL(5);
|
||||||
|
|
||||||
|
|
||||||
|
/** Initialize a previously allocated projection encoder state.
|
||||||
|
* The memory pointed to by \a st must be at least the size returned by
|
||||||
|
* opus_projection_ambisonics_encoder_get_size().
|
||||||
|
* This is intended for applications which use their own allocator instead of
|
||||||
|
* malloc.
|
||||||
|
* To reset a previously initialized state, use the #OPUS_RESET_STATE CTL.
|
||||||
|
* @see opus_projection_ambisonics_encoder_create
|
||||||
|
* @see opus_projection_ambisonics_encoder_get_size
|
||||||
|
* @param st <tt>OpusProjectionEncoder*</tt>: Projection encoder state to initialize.
|
||||||
|
* @param Fs <tt>opus_int32</tt>: Sampling rate of the input signal (in Hz).
|
||||||
|
* This must be one of 8000, 12000, 16000,
|
||||||
|
* 24000, or 48000.
|
||||||
|
* @param channels <tt>int</tt>: Number of channels in the input signal.
|
||||||
|
* This must be at most 255.
|
||||||
|
* It may be greater than the number of
|
||||||
|
* coded channels (<code>streams +
|
||||||
|
* coupled_streams</code>).
|
||||||
|
* @param streams <tt>int</tt>: The total number of streams to encode from the
|
||||||
|
* input.
|
||||||
|
* This must be no more than the number of channels.
|
||||||
|
* @param coupled_streams <tt>int</tt>: Number of coupled (2 channel) streams
|
||||||
|
* to encode.
|
||||||
|
* This must be no larger than the total
|
||||||
|
* number of streams.
|
||||||
|
* Additionally, The total number of
|
||||||
|
* encoded channels (<code>streams +
|
||||||
|
* coupled_streams</code>) must be no
|
||||||
|
* more than the number of input channels.
|
||||||
|
* @param application <tt>int</tt>: The target encoder application.
|
||||||
|
* This must be one of the following:
|
||||||
|
* <dl>
|
||||||
|
* <dt>#OPUS_APPLICATION_VOIP</dt>
|
||||||
|
* <dd>Process signal for improved speech intelligibility.</dd>
|
||||||
|
* <dt>#OPUS_APPLICATION_AUDIO</dt>
|
||||||
|
* <dd>Favor faithfulness to the original input.</dd>
|
||||||
|
* <dt>#OPUS_APPLICATION_RESTRICTED_LOWDELAY</dt>
|
||||||
|
* <dd>Configure the minimum possible coding delay by disabling certain modes
|
||||||
|
* of operation.</dd>
|
||||||
|
* </dl>
|
||||||
|
* @returns #OPUS_OK on success, or an error code (see @ref opus_errorcodes)
|
||||||
|
* on failure.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT int opus_projection_ambisonics_encoder_init(
|
||||||
|
OpusProjectionEncoder *st,
|
||||||
|
opus_int32 Fs,
|
||||||
|
int channels,
|
||||||
|
int mapping_family,
|
||||||
|
int *streams,
|
||||||
|
int *coupled_streams,
|
||||||
|
int application
|
||||||
|
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(5) OPUS_ARG_NONNULL(6);
|
||||||
|
|
||||||
|
|
||||||
|
/** Encodes a projection Opus frame.
|
||||||
|
* @param st <tt>OpusProjectionEncoder*</tt>: Projection encoder state.
|
||||||
|
* @param[in] pcm <tt>const opus_int16*</tt>: The input signal as interleaved
|
||||||
|
* samples.
|
||||||
|
* This must contain
|
||||||
|
* <code>frame_size*channels</code>
|
||||||
|
* samples.
|
||||||
|
* @param frame_size <tt>int</tt>: Number of samples per channel in the input
|
||||||
|
* signal.
|
||||||
|
* This must be an Opus frame size for the
|
||||||
|
* encoder's sampling rate.
|
||||||
|
* For example, at 48 kHz the permitted values
|
||||||
|
* are 120, 240, 480, 960, 1920, and 2880.
|
||||||
|
* Passing in a duration of less than 10 ms
|
||||||
|
* (480 samples at 48 kHz) will prevent the
|
||||||
|
* encoder from using the LPC or hybrid modes.
|
||||||
|
* @param[out] data <tt>unsigned char*</tt>: Output payload.
|
||||||
|
* This must contain storage for at
|
||||||
|
* least \a max_data_bytes.
|
||||||
|
* @param [in] max_data_bytes <tt>opus_int32</tt>: Size of the allocated
|
||||||
|
* memory for the output
|
||||||
|
* payload. This may be
|
||||||
|
* used to impose an upper limit on
|
||||||
|
* the instant bitrate, but should
|
||||||
|
* not be used as the only bitrate
|
||||||
|
* control. Use #OPUS_SET_BITRATE to
|
||||||
|
* control the bitrate.
|
||||||
|
* @returns The length of the encoded packet (in bytes) on success or a
|
||||||
|
* negative error code (see @ref opus_errorcodes) on failure.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_encode(
|
||||||
|
OpusProjectionEncoder *st,
|
||||||
|
const opus_int16 *pcm,
|
||||||
|
int frame_size,
|
||||||
|
unsigned char *data,
|
||||||
|
opus_int32 max_data_bytes
|
||||||
|
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4);
|
||||||
|
|
||||||
|
|
||||||
|
/** Encodes a projection Opus frame from floating point input.
|
||||||
|
* @param st <tt>OpusProjectionEncoder*</tt>: Projection encoder state.
|
||||||
|
* @param[in] pcm <tt>const float*</tt>: The input signal as interleaved
|
||||||
|
* samples with a normal range of
|
||||||
|
* +/-1.0.
|
||||||
|
* Samples with a range beyond +/-1.0
|
||||||
|
* are supported but will be clipped by
|
||||||
|
* decoders using the integer API and
|
||||||
|
* should only be used if it is known
|
||||||
|
* that the far end supports extended
|
||||||
|
* dynamic range.
|
||||||
|
* This must contain
|
||||||
|
* <code>frame_size*channels</code>
|
||||||
|
* samples.
|
||||||
|
* @param frame_size <tt>int</tt>: Number of samples per channel in the input
|
||||||
|
* signal.
|
||||||
|
* This must be an Opus frame size for the
|
||||||
|
* encoder's sampling rate.
|
||||||
|
* For example, at 48 kHz the permitted values
|
||||||
|
* are 120, 240, 480, 960, 1920, and 2880.
|
||||||
|
* Passing in a duration of less than 10 ms
|
||||||
|
* (480 samples at 48 kHz) will prevent the
|
||||||
|
* encoder from using the LPC or hybrid modes.
|
||||||
|
* @param[out] data <tt>unsigned char*</tt>: Output payload.
|
||||||
|
* This must contain storage for at
|
||||||
|
* least \a max_data_bytes.
|
||||||
|
* @param [in] max_data_bytes <tt>opus_int32</tt>: Size of the allocated
|
||||||
|
* memory for the output
|
||||||
|
* payload. This may be
|
||||||
|
* used to impose an upper limit on
|
||||||
|
* the instant bitrate, but should
|
||||||
|
* not be used as the only bitrate
|
||||||
|
* control. Use #OPUS_SET_BITRATE to
|
||||||
|
* control the bitrate.
|
||||||
|
* @returns The length of the encoded packet (in bytes) on success or a
|
||||||
|
* negative error code (see @ref opus_errorcodes) on failure.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_encode_float(
|
||||||
|
OpusProjectionEncoder *st,
|
||||||
|
const float *pcm,
|
||||||
|
int frame_size,
|
||||||
|
unsigned char *data,
|
||||||
|
opus_int32 max_data_bytes
|
||||||
|
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4);
|
||||||
|
|
||||||
|
|
||||||
|
/** Frees an <code>OpusProjectionEncoder</code> allocated by
|
||||||
|
* opus_projection_ambisonics_encoder_create().
|
||||||
|
* @param st <tt>OpusProjectionEncoder*</tt>: Projection encoder state to be freed.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT void opus_projection_encoder_destroy(OpusProjectionEncoder *st);
|
||||||
|
|
||||||
|
|
||||||
|
/** Perform a CTL function on a projection Opus encoder.
|
||||||
|
*
|
||||||
|
* Generally the request and subsequent arguments are generated by a
|
||||||
|
* convenience macro.
|
||||||
|
* @param st <tt>OpusProjectionEncoder*</tt>: Projection encoder state.
|
||||||
|
* @param request This and all remaining parameters should be replaced by one
|
||||||
|
* of the convenience macros in @ref opus_genericctls,
|
||||||
|
* @ref opus_encoderctls, @ref opus_multistream_ctls, or
|
||||||
|
* @ref opus_projection_ctls
|
||||||
|
* @see opus_genericctls
|
||||||
|
* @see opus_encoderctls
|
||||||
|
* @see opus_multistream_ctls
|
||||||
|
* @see opus_projection_ctls
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT int opus_projection_encoder_ctl(OpusProjectionEncoder *st, int request, ...) OPUS_ARG_NONNULL(1);
|
||||||
|
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
/**\name Projection decoder functions */
|
||||||
|
/**@{*/
|
||||||
|
|
||||||
|
/** Gets the size of an <code>OpusProjectionDecoder</code> structure.
|
||||||
|
* @param channels <tt>int</tt>: The total number of output channels.
|
||||||
|
* This must be no more than 255.
|
||||||
|
* @param streams <tt>int</tt>: The total number of streams coded in the
|
||||||
|
* input.
|
||||||
|
* This must be no more than 255.
|
||||||
|
* @param coupled_streams <tt>int</tt>: Number streams to decode as coupled
|
||||||
|
* (2 channel) streams.
|
||||||
|
* This must be no larger than the total
|
||||||
|
* number of streams.
|
||||||
|
* Additionally, The total number of
|
||||||
|
* coded channels (<code>streams +
|
||||||
|
* coupled_streams</code>) must be no
|
||||||
|
* more than 255.
|
||||||
|
* @returns The size in bytes on success, or a negative error code
|
||||||
|
* (see @ref opus_errorcodes) on error.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_projection_decoder_get_size(
|
||||||
|
int channels,
|
||||||
|
int streams,
|
||||||
|
int coupled_streams
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
/** Allocates and initializes a projection decoder state.
|
||||||
|
* Call opus_projection_decoder_destroy() to release
|
||||||
|
* this object when finished.
|
||||||
|
* @param Fs <tt>opus_int32</tt>: Sampling rate to decode at (in Hz).
|
||||||
|
* This must be one of 8000, 12000, 16000,
|
||||||
|
* 24000, or 48000.
|
||||||
|
* @param channels <tt>int</tt>: Number of channels to output.
|
||||||
|
* This must be at most 255.
|
||||||
|
* It may be different from the number of coded
|
||||||
|
* channels (<code>streams +
|
||||||
|
* coupled_streams</code>).
|
||||||
|
* @param streams <tt>int</tt>: The total number of streams coded in the
|
||||||
|
* input.
|
||||||
|
* This must be no more than 255.
|
||||||
|
* @param coupled_streams <tt>int</tt>: Number of streams to decode as coupled
|
||||||
|
* (2 channel) streams.
|
||||||
|
* This must be no larger than the total
|
||||||
|
* number of streams.
|
||||||
|
* Additionally, The total number of
|
||||||
|
* coded channels (<code>streams +
|
||||||
|
* coupled_streams</code>) must be no
|
||||||
|
* more than 255.
|
||||||
|
* @param[in] demixing_matrix <tt>const unsigned char[demixing_matrix_size]</tt>: Demixing matrix
|
||||||
|
* that mapping from coded channels to output channels,
|
||||||
|
* as described in @ref opus_projection and
|
||||||
|
* @ref opus_projection_ctls.
|
||||||
|
* @param demixing_matrix_size <tt>opus_int32</tt>: The size in bytes of the
|
||||||
|
* demixing matrix, as
|
||||||
|
* described in @ref
|
||||||
|
* opus_projection_ctls.
|
||||||
|
* @param[out] error <tt>int *</tt>: Returns #OPUS_OK on success, or an error
|
||||||
|
* code (see @ref opus_errorcodes) on
|
||||||
|
* failure.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusProjectionDecoder *opus_projection_decoder_create(
|
||||||
|
opus_int32 Fs,
|
||||||
|
int channels,
|
||||||
|
int streams,
|
||||||
|
int coupled_streams,
|
||||||
|
unsigned char *demixing_matrix,
|
||||||
|
opus_int32 demixing_matrix_size,
|
||||||
|
int *error
|
||||||
|
) OPUS_ARG_NONNULL(5);
|
||||||
|
|
||||||
|
|
||||||
|
/** Intialize a previously allocated projection decoder state object.
|
||||||
|
* The memory pointed to by \a st must be at least the size returned by
|
||||||
|
* opus_projection_decoder_get_size().
|
||||||
|
* This is intended for applications which use their own allocator instead of
|
||||||
|
* malloc.
|
||||||
|
* To reset a previously initialized state, use the #OPUS_RESET_STATE CTL.
|
||||||
|
* @see opus_projection_decoder_create
|
||||||
|
* @see opus_projection_deocder_get_size
|
||||||
|
* @param st <tt>OpusProjectionDecoder*</tt>: Projection encoder state to initialize.
|
||||||
|
* @param Fs <tt>opus_int32</tt>: Sampling rate to decode at (in Hz).
|
||||||
|
* This must be one of 8000, 12000, 16000,
|
||||||
|
* 24000, or 48000.
|
||||||
|
* @param channels <tt>int</tt>: Number of channels to output.
|
||||||
|
* This must be at most 255.
|
||||||
|
* It may be different from the number of coded
|
||||||
|
* channels (<code>streams +
|
||||||
|
* coupled_streams</code>).
|
||||||
|
* @param streams <tt>int</tt>: The total number of streams coded in the
|
||||||
|
* input.
|
||||||
|
* This must be no more than 255.
|
||||||
|
* @param coupled_streams <tt>int</tt>: Number of streams to decode as coupled
|
||||||
|
* (2 channel) streams.
|
||||||
|
* This must be no larger than the total
|
||||||
|
* number of streams.
|
||||||
|
* Additionally, The total number of
|
||||||
|
* coded channels (<code>streams +
|
||||||
|
* coupled_streams</code>) must be no
|
||||||
|
* more than 255.
|
||||||
|
* @param[in] demixing_matrix <tt>const unsigned char[demixing_matrix_size]</tt>: Demixing matrix
|
||||||
|
* that mapping from coded channels to output channels,
|
||||||
|
* as described in @ref opus_projection and
|
||||||
|
* @ref opus_projection_ctls.
|
||||||
|
* @param demixing_matrix_size <tt>opus_int32</tt>: The size in bytes of the
|
||||||
|
* demixing matrix, as
|
||||||
|
* described in @ref
|
||||||
|
* opus_projection_ctls.
|
||||||
|
* @returns #OPUS_OK on success, or an error code (see @ref opus_errorcodes)
|
||||||
|
* on failure.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT int opus_projection_decoder_init(
|
||||||
|
OpusProjectionDecoder *st,
|
||||||
|
opus_int32 Fs,
|
||||||
|
int channels,
|
||||||
|
int streams,
|
||||||
|
int coupled_streams,
|
||||||
|
unsigned char *demixing_matrix,
|
||||||
|
opus_int32 demixing_matrix_size
|
||||||
|
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(6);
|
||||||
|
|
||||||
|
|
||||||
|
/** Decode a projection Opus packet.
|
||||||
|
* @param st <tt>OpusProjectionDecoder*</tt>: Projection decoder state.
|
||||||
|
* @param[in] data <tt>const unsigned char*</tt>: Input payload.
|
||||||
|
* Use a <code>NULL</code>
|
||||||
|
* pointer to indicate packet
|
||||||
|
* loss.
|
||||||
|
* @param len <tt>opus_int32</tt>: Number of bytes in payload.
|
||||||
|
* @param[out] pcm <tt>opus_int16*</tt>: Output signal, with interleaved
|
||||||
|
* samples.
|
||||||
|
* This must contain room for
|
||||||
|
* <code>frame_size*channels</code>
|
||||||
|
* samples.
|
||||||
|
* @param frame_size <tt>int</tt>: The number of samples per channel of
|
||||||
|
* available space in \a pcm.
|
||||||
|
* If this is less than the maximum packet duration
|
||||||
|
* (120 ms; 5760 for 48kHz), this function will not be capable
|
||||||
|
* of decoding some packets. In the case of PLC (data==NULL)
|
||||||
|
* or FEC (decode_fec=1), then frame_size needs to be exactly
|
||||||
|
* the duration of audio that is missing, otherwise the
|
||||||
|
* decoder will not be in the optimal state to decode the
|
||||||
|
* next incoming packet. For the PLC and FEC cases, frame_size
|
||||||
|
* <b>must</b> be a multiple of 2.5 ms.
|
||||||
|
* @param decode_fec <tt>int</tt>: Flag (0 or 1) to request that any in-band
|
||||||
|
* forward error correction data be decoded.
|
||||||
|
* If no such data is available, the frame is
|
||||||
|
* decoded as if it were lost.
|
||||||
|
* @returns Number of samples decoded on success or a negative error code
|
||||||
|
* (see @ref opus_errorcodes) on failure.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_decode(
|
||||||
|
OpusProjectionDecoder *st,
|
||||||
|
const unsigned char *data,
|
||||||
|
opus_int32 len,
|
||||||
|
opus_int16 *pcm,
|
||||||
|
int frame_size,
|
||||||
|
int decode_fec
|
||||||
|
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);
|
||||||
|
|
||||||
|
|
||||||
|
/** Decode a projection Opus packet with floating point output.
|
||||||
|
* @param st <tt>OpusProjectionDecoder*</tt>: Projection decoder state.
|
||||||
|
* @param[in] data <tt>const unsigned char*</tt>: Input payload.
|
||||||
|
* Use a <code>NULL</code>
|
||||||
|
* pointer to indicate packet
|
||||||
|
* loss.
|
||||||
|
* @param len <tt>opus_int32</tt>: Number of bytes in payload.
|
||||||
|
* @param[out] pcm <tt>opus_int16*</tt>: Output signal, with interleaved
|
||||||
|
* samples.
|
||||||
|
* This must contain room for
|
||||||
|
* <code>frame_size*channels</code>
|
||||||
|
* samples.
|
||||||
|
* @param frame_size <tt>int</tt>: The number of samples per channel of
|
||||||
|
* available space in \a pcm.
|
||||||
|
* If this is less than the maximum packet duration
|
||||||
|
* (120 ms; 5760 for 48kHz), this function will not be capable
|
||||||
|
* of decoding some packets. In the case of PLC (data==NULL)
|
||||||
|
* or FEC (decode_fec=1), then frame_size needs to be exactly
|
||||||
|
* the duration of audio that is missing, otherwise the
|
||||||
|
* decoder will not be in the optimal state to decode the
|
||||||
|
* next incoming packet. For the PLC and FEC cases, frame_size
|
||||||
|
* <b>must</b> be a multiple of 2.5 ms.
|
||||||
|
* @param decode_fec <tt>int</tt>: Flag (0 or 1) to request that any in-band
|
||||||
|
* forward error correction data be decoded.
|
||||||
|
* If no such data is available, the frame is
|
||||||
|
* decoded as if it were lost.
|
||||||
|
* @returns Number of samples decoded on success or a negative error code
|
||||||
|
* (see @ref opus_errorcodes) on failure.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_decode_float(
|
||||||
|
OpusProjectionDecoder *st,
|
||||||
|
const unsigned char *data,
|
||||||
|
opus_int32 len,
|
||||||
|
float *pcm,
|
||||||
|
int frame_size,
|
||||||
|
int decode_fec
|
||||||
|
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);
|
||||||
|
|
||||||
|
|
||||||
|
/** Perform a CTL function on a projection Opus decoder.
|
||||||
|
*
|
||||||
|
* Generally the request and subsequent arguments are generated by a
|
||||||
|
* convenience macro.
|
||||||
|
* @param st <tt>OpusProjectionDecoder*</tt>: Projection decoder state.
|
||||||
|
* @param request This and all remaining parameters should be replaced by one
|
||||||
|
* of the convenience macros in @ref opus_genericctls,
|
||||||
|
* @ref opus_decoderctls, @ref opus_multistream_ctls, or
|
||||||
|
* @ref opus_projection_ctls.
|
||||||
|
* @see opus_genericctls
|
||||||
|
* @see opus_decoderctls
|
||||||
|
* @see opus_multistream_ctls
|
||||||
|
* @see opus_projection_ctls
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT int opus_projection_decoder_ctl(OpusProjectionDecoder *st, int request, ...) OPUS_ARG_NONNULL(1);
|
||||||
|
|
||||||
|
|
||||||
|
/** Frees an <code>OpusProjectionDecoder</code> allocated by
|
||||||
|
* opus_projection_decoder_create().
|
||||||
|
* @param st <tt>OpusProjectionDecoder</tt>: Projection decoder state to be freed.
|
||||||
|
*/
|
||||||
|
OPUS_EXPORT void opus_projection_decoder_destroy(OpusProjectionDecoder *st);
|
||||||
|
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* OPUS_PROJECTION_H */
|
||||||
166
opus/opus_types.h
Normal file
166
opus/opus_types.h
Normal file
@ -0,0 +1,166 @@
|
|||||||
|
/* (C) COPYRIGHT 1994-2002 Xiph.Org Foundation */
|
||||||
|
/* Modified by Jean-Marc Valin */
|
||||||
|
/*
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
|
||||||
|
- Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
- Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
/* opus_types.h based on ogg_types.h from libogg */
|
||||||
|
|
||||||
|
/**
|
||||||
|
@file opus_types.h
|
||||||
|
@brief Opus reference implementation types
|
||||||
|
*/
|
||||||
|
#ifndef OPUS_TYPES_H
|
||||||
|
#define OPUS_TYPES_H
|
||||||
|
|
||||||
|
#define opus_int int /* used for counters etc; at least 16 bits */
|
||||||
|
#define opus_int64 long long
|
||||||
|
#define opus_int8 signed char
|
||||||
|
|
||||||
|
#define opus_uint unsigned int /* used for counters etc; at least 16 bits */
|
||||||
|
#define opus_uint64 unsigned long long
|
||||||
|
#define opus_uint8 unsigned char
|
||||||
|
|
||||||
|
/* Use the real stdint.h if it's there (taken from Paul Hsieh's pstdint.h) */
|
||||||
|
#if (defined(__STDC__) && __STDC__ && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || (defined(__GNUC__) && (defined(_STDINT_H) || defined(_STDINT_H_)) || defined (HAVE_STDINT_H))
|
||||||
|
#include <stdint.h>
|
||||||
|
# undef opus_int64
|
||||||
|
# undef opus_int8
|
||||||
|
# undef opus_uint64
|
||||||
|
# undef opus_uint8
|
||||||
|
typedef int8_t opus_int8;
|
||||||
|
typedef uint8_t opus_uint8;
|
||||||
|
typedef int16_t opus_int16;
|
||||||
|
typedef uint16_t opus_uint16;
|
||||||
|
typedef int32_t opus_int32;
|
||||||
|
typedef uint32_t opus_uint32;
|
||||||
|
typedef int64_t opus_int64;
|
||||||
|
typedef uint64_t opus_uint64;
|
||||||
|
#elif defined(_WIN32)
|
||||||
|
|
||||||
|
# if defined(__CYGWIN__)
|
||||||
|
# include <_G_config.h>
|
||||||
|
typedef _G_int32_t opus_int32;
|
||||||
|
typedef _G_uint32_t opus_uint32;
|
||||||
|
typedef _G_int16 opus_int16;
|
||||||
|
typedef _G_uint16 opus_uint16;
|
||||||
|
# elif defined(__MINGW32__)
|
||||||
|
typedef short opus_int16;
|
||||||
|
typedef unsigned short opus_uint16;
|
||||||
|
typedef int opus_int32;
|
||||||
|
typedef unsigned int opus_uint32;
|
||||||
|
# elif defined(__MWERKS__)
|
||||||
|
typedef int opus_int32;
|
||||||
|
typedef unsigned int opus_uint32;
|
||||||
|
typedef short opus_int16;
|
||||||
|
typedef unsigned short opus_uint16;
|
||||||
|
# else
|
||||||
|
/* MSVC/Borland */
|
||||||
|
typedef __int32 opus_int32;
|
||||||
|
typedef unsigned __int32 opus_uint32;
|
||||||
|
typedef __int16 opus_int16;
|
||||||
|
typedef unsigned __int16 opus_uint16;
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined(__MACOS__)
|
||||||
|
|
||||||
|
# include <sys/types.h>
|
||||||
|
typedef SInt16 opus_int16;
|
||||||
|
typedef UInt16 opus_uint16;
|
||||||
|
typedef SInt32 opus_int32;
|
||||||
|
typedef UInt32 opus_uint32;
|
||||||
|
|
||||||
|
#elif (defined(__APPLE__) && defined(__MACH__)) /* MacOS X Framework build */
|
||||||
|
|
||||||
|
# include <sys/types.h>
|
||||||
|
typedef int16_t opus_int16;
|
||||||
|
typedef u_int16_t opus_uint16;
|
||||||
|
typedef int32_t opus_int32;
|
||||||
|
typedef u_int32_t opus_uint32;
|
||||||
|
|
||||||
|
#elif defined(__BEOS__)
|
||||||
|
|
||||||
|
/* Be */
|
||||||
|
# include <inttypes.h>
|
||||||
|
typedef int16 opus_int16;
|
||||||
|
typedef u_int16 opus_uint16;
|
||||||
|
typedef int32_t opus_int32;
|
||||||
|
typedef u_int32_t opus_uint32;
|
||||||
|
|
||||||
|
#elif defined (__EMX__)
|
||||||
|
|
||||||
|
/* OS/2 GCC */
|
||||||
|
typedef short opus_int16;
|
||||||
|
typedef unsigned short opus_uint16;
|
||||||
|
typedef int opus_int32;
|
||||||
|
typedef unsigned int opus_uint32;
|
||||||
|
|
||||||
|
#elif defined (DJGPP)
|
||||||
|
|
||||||
|
/* DJGPP */
|
||||||
|
typedef short opus_int16;
|
||||||
|
typedef unsigned short opus_uint16;
|
||||||
|
typedef int opus_int32;
|
||||||
|
typedef unsigned int opus_uint32;
|
||||||
|
|
||||||
|
#elif defined(R5900)
|
||||||
|
|
||||||
|
/* PS2 EE */
|
||||||
|
typedef int opus_int32;
|
||||||
|
typedef unsigned opus_uint32;
|
||||||
|
typedef short opus_int16;
|
||||||
|
typedef unsigned short opus_uint16;
|
||||||
|
|
||||||
|
#elif defined(__SYMBIAN32__)
|
||||||
|
|
||||||
|
/* Symbian GCC */
|
||||||
|
typedef signed short opus_int16;
|
||||||
|
typedef unsigned short opus_uint16;
|
||||||
|
typedef signed int opus_int32;
|
||||||
|
typedef unsigned int opus_uint32;
|
||||||
|
|
||||||
|
#elif defined(CONFIG_TI_C54X) || defined (CONFIG_TI_C55X)
|
||||||
|
|
||||||
|
typedef short opus_int16;
|
||||||
|
typedef unsigned short opus_uint16;
|
||||||
|
typedef long opus_int32;
|
||||||
|
typedef unsigned long opus_uint32;
|
||||||
|
|
||||||
|
#elif defined(CONFIG_TI_C6X)
|
||||||
|
|
||||||
|
typedef short opus_int16;
|
||||||
|
typedef unsigned short opus_uint16;
|
||||||
|
typedef int opus_int32;
|
||||||
|
typedef unsigned int opus_uint32;
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* Give up, take a reasonable guess */
|
||||||
|
typedef short opus_int16;
|
||||||
|
typedef unsigned short opus_uint16;
|
||||||
|
typedef int opus_int32;
|
||||||
|
typedef unsigned int opus_uint32;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* OPUS_TYPES_H */
|
||||||
Binary file not shown.
@ -1,152 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
Copyright (c) 2006-2012, Skype Limited. All rights reserved.
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, (subject to the limitations in the disclaimer below)
|
|
||||||
are permitted provided that the following conditions are met:
|
|
||||||
- Redistributions of source code must retain the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer.
|
|
||||||
- Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in the
|
|
||||||
documentation and/or other materials provided with the distribution.
|
|
||||||
- Neither the name of Skype Limited, nor the names of specific
|
|
||||||
contributors, may be used to endorse or promote products derived from
|
|
||||||
this software without specific prior written permission.
|
|
||||||
NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
|
|
||||||
BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
|
||||||
CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
|
|
||||||
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
||||||
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
|
||||||
USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
|
||||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
#ifndef SKP_SILK_SDK_API_H
|
|
||||||
#define SKP_SILK_SDK_API_H
|
|
||||||
|
|
||||||
#include "SKP_Silk_control.h"
|
|
||||||
#include "SKP_Silk_typedef.h"
|
|
||||||
#include "SKP_Silk_errors.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C"
|
|
||||||
{
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SILK_MAX_FRAMES_PER_PACKET 5
|
|
||||||
|
|
||||||
/* Struct for TOC (Table of Contents) */
|
|
||||||
typedef struct {
|
|
||||||
SKP_int framesInPacket; /* Number of 20 ms frames in packet */
|
|
||||||
SKP_int fs_kHz; /* Sampling frequency in packet */
|
|
||||||
SKP_int inbandLBRR; /* Does packet contain LBRR information */
|
|
||||||
SKP_int corrupt; /* Packet is corrupt */
|
|
||||||
SKP_int vadFlags[ SILK_MAX_FRAMES_PER_PACKET ]; /* VAD flag for each frame in packet */
|
|
||||||
SKP_int sigtypeFlags[ SILK_MAX_FRAMES_PER_PACKET ]; /* Signal type for each frame in packet */
|
|
||||||
} SKP_Silk_TOC_struct;
|
|
||||||
|
|
||||||
/****************************************/
|
|
||||||
/* Encoder functions */
|
|
||||||
/****************************************/
|
|
||||||
|
|
||||||
/***********************************************/
|
|
||||||
/* Get size in bytes of the Silk encoder state */
|
|
||||||
/***********************************************/
|
|
||||||
SKP_int SKP_Silk_SDK_Get_Encoder_Size(
|
|
||||||
SKP_int32 *encSizeBytes /* O: Number of bytes in SILK encoder state */
|
|
||||||
);
|
|
||||||
|
|
||||||
/*************************/
|
|
||||||
/* Init or reset encoder */
|
|
||||||
/*************************/
|
|
||||||
SKP_int SKP_Silk_SDK_InitEncoder(
|
|
||||||
void *encState, /* I/O: State */
|
|
||||||
SKP_SILK_SDK_EncControlStruct *encStatus /* O: Encoder Status */
|
|
||||||
);
|
|
||||||
|
|
||||||
/***************************************/
|
|
||||||
/* Read control structure from encoder */
|
|
||||||
/***************************************/
|
|
||||||
SKP_int SKP_Silk_SDK_QueryEncoder(
|
|
||||||
const void *encState, /* I: State */
|
|
||||||
SKP_SILK_SDK_EncControlStruct *encStatus /* O: Encoder Status */
|
|
||||||
);
|
|
||||||
|
|
||||||
/**************************/
|
|
||||||
/* Encode frame with Silk */
|
|
||||||
/**************************/
|
|
||||||
SKP_int SKP_Silk_SDK_Encode(
|
|
||||||
void *encState, /* I/O: State */
|
|
||||||
const SKP_SILK_SDK_EncControlStruct *encControl, /* I: Control status */
|
|
||||||
const SKP_int16 *samplesIn, /* I: Speech sample input vector */
|
|
||||||
SKP_int nSamplesIn, /* I: Number of samples in input vector */
|
|
||||||
SKP_uint8 *outData, /* O: Encoded output vector */
|
|
||||||
SKP_int16 *nBytesOut /* I/O: Number of bytes in outData (input: Max bytes) */
|
|
||||||
);
|
|
||||||
|
|
||||||
/****************************************/
|
|
||||||
/* Decoder functions */
|
|
||||||
/****************************************/
|
|
||||||
|
|
||||||
/***********************************************/
|
|
||||||
/* Get size in bytes of the Silk decoder state */
|
|
||||||
/***********************************************/
|
|
||||||
SKP_int SKP_Silk_SDK_Get_Decoder_Size(
|
|
||||||
SKP_int32 *decSizeBytes /* O: Number of bytes in SILK decoder state */
|
|
||||||
);
|
|
||||||
|
|
||||||
/*************************/
|
|
||||||
/* Init or Reset decoder */
|
|
||||||
/*************************/
|
|
||||||
SKP_int SKP_Silk_SDK_InitDecoder(
|
|
||||||
void *decState /* I/O: State */
|
|
||||||
);
|
|
||||||
|
|
||||||
/******************/
|
|
||||||
/* Decode a frame */
|
|
||||||
/******************/
|
|
||||||
SKP_int SKP_Silk_SDK_Decode(
|
|
||||||
void* decState, /* I/O: State */
|
|
||||||
SKP_SILK_SDK_DecControlStruct* decControl, /* I/O: Control Structure */
|
|
||||||
SKP_int lostFlag, /* I: 0: no loss, 1 loss */
|
|
||||||
const SKP_uint8 *inData, /* I: Encoded input vector */
|
|
||||||
const SKP_int nBytesIn, /* I: Number of input bytes */
|
|
||||||
SKP_int16 *samplesOut, /* O: Decoded output speech vector */
|
|
||||||
SKP_int16 *nSamplesOut /* I/O: Number of samples (vector/decoded) */
|
|
||||||
);
|
|
||||||
|
|
||||||
/***************************************************************/
|
|
||||||
/* Find Low Bit Rate Redundancy (LBRR) information in a packet */
|
|
||||||
/***************************************************************/
|
|
||||||
void SKP_Silk_SDK_search_for_LBRR(
|
|
||||||
const SKP_uint8 *inData, /* I: Encoded input vector */
|
|
||||||
const SKP_int nBytesIn, /* I: Number of input Bytes */
|
|
||||||
SKP_int lost_offset, /* I: Offset from lost packet */
|
|
||||||
SKP_uint8 *LBRRData, /* O: LBRR payload */
|
|
||||||
SKP_int16 *nLBRRBytes /* O: Number of LBRR Bytes */
|
|
||||||
);
|
|
||||||
|
|
||||||
/**************************************/
|
|
||||||
/* Get table of contents for a packet */
|
|
||||||
/**************************************/
|
|
||||||
void SKP_Silk_SDK_get_TOC(
|
|
||||||
const SKP_uint8 *inData, /* I: Encoded input vector */
|
|
||||||
const SKP_int nBytesIn, /* I: Number of input bytes */
|
|
||||||
SKP_Silk_TOC_struct *Silk_TOC /* O: Table of contents */
|
|
||||||
);
|
|
||||||
|
|
||||||
/**************************/
|
|
||||||
/* Get the version number */
|
|
||||||
/**************************/
|
|
||||||
/* Return a pointer to string specifying the version */
|
|
||||||
const char *SKP_Silk_SDK_get_version();
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@ -1,91 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
Copyright (c) 2006-2012, Skype Limited. All rights reserved.
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, (subject to the limitations in the disclaimer below)
|
|
||||||
are permitted provided that the following conditions are met:
|
|
||||||
- Redistributions of source code must retain the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer.
|
|
||||||
- Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in the
|
|
||||||
documentation and/or other materials provided with the distribution.
|
|
||||||
- Neither the name of Skype Limited, nor the names of specific
|
|
||||||
contributors, may be used to endorse or promote products derived from
|
|
||||||
this software without specific prior written permission.
|
|
||||||
NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
|
|
||||||
BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
|
||||||
CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
|
|
||||||
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
||||||
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
|
||||||
USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
|
||||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
#ifndef SKP_SILK_CONTROL_H
|
|
||||||
#define SKP_SILK_CONTROL_H
|
|
||||||
|
|
||||||
#include "SKP_Silk_typedef.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C"
|
|
||||||
{
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/***********************************************/
|
|
||||||
/* Structure for controlling encoder operation */
|
|
||||||
/***********************************************/
|
|
||||||
typedef struct {
|
|
||||||
/* I: Input signal sampling rate in Hertz; 8000/12000/16000/24000 */
|
|
||||||
SKP_int32 API_sampleRate;
|
|
||||||
|
|
||||||
/* I: Maximum internal sampling rate in Hertz; 8000/12000/16000/24000 */
|
|
||||||
SKP_int32 maxInternalSampleRate;
|
|
||||||
|
|
||||||
/* I: Number of samples per packet; must be equivalent of 20, 40, 60, 80 or 100 ms */
|
|
||||||
SKP_int packetSize;
|
|
||||||
|
|
||||||
/* I: Bitrate during active speech in bits/second; internally limited */
|
|
||||||
SKP_int32 bitRate;
|
|
||||||
|
|
||||||
/* I: Uplink packet loss in percent (0-100) */
|
|
||||||
SKP_int packetLossPercentage;
|
|
||||||
|
|
||||||
/* I: Complexity mode; 0 is lowest; 1 is medium and 2 is highest complexity */
|
|
||||||
SKP_int complexity;
|
|
||||||
|
|
||||||
/* I: Flag to enable in-band Forward Error Correction (FEC); 0/1 */
|
|
||||||
SKP_int useInBandFEC;
|
|
||||||
|
|
||||||
/* I: Flag to enable discontinuous transmission (DTX); 0/1 */
|
|
||||||
SKP_int useDTX;
|
|
||||||
} SKP_SILK_SDK_EncControlStruct;
|
|
||||||
|
|
||||||
/**************************************************************************/
|
|
||||||
/* Structure for controlling decoder operation and reading decoder status */
|
|
||||||
/**************************************************************************/
|
|
||||||
typedef struct {
|
|
||||||
/* I: Output signal sampling rate in Hertz; 8000/12000/16000/24000 */
|
|
||||||
SKP_int32 API_sampleRate;
|
|
||||||
|
|
||||||
/* O: Number of samples per frame */
|
|
||||||
SKP_int frameSize;
|
|
||||||
|
|
||||||
/* O: Frames per packet 1, 2, 3, 4, 5 */
|
|
||||||
SKP_int framesPerPacket;
|
|
||||||
|
|
||||||
/* O: Flag to indicate that the decoder has remaining payloads internally */
|
|
||||||
SKP_int moreInternalDecoderFrames;
|
|
||||||
|
|
||||||
/* O: Distance between main payload and redundant payload in packets */
|
|
||||||
SKP_int inBandFECOffset;
|
|
||||||
} SKP_SILK_SDK_DecControlStruct;
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@ -1,89 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
Copyright (c) 2006-2012, Skype Limited. All rights reserved.
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, (subject to the limitations in the disclaimer below)
|
|
||||||
are permitted provided that the following conditions are met:
|
|
||||||
- Redistributions of source code must retain the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer.
|
|
||||||
- Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in the
|
|
||||||
documentation and/or other materials provided with the distribution.
|
|
||||||
- Neither the name of Skype Limited, nor the names of specific
|
|
||||||
contributors, may be used to endorse or promote products derived from
|
|
||||||
this software without specific prior written permission.
|
|
||||||
NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
|
|
||||||
BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
|
||||||
CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
|
|
||||||
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
||||||
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
|
||||||
USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
|
||||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
#ifndef SKP_SILK_ERRORS_H
|
|
||||||
#define SKP_SILK_ERRORS_H
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C"
|
|
||||||
{
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/******************/
|
|
||||||
/* Error messages */
|
|
||||||
/******************/
|
|
||||||
#define SKP_SILK_NO_ERROR 0
|
|
||||||
|
|
||||||
/**************************/
|
|
||||||
/* Encoder error messages */
|
|
||||||
/**************************/
|
|
||||||
|
|
||||||
/* Input length is not a multiplum of 10 ms, or length is longer than the packet length */
|
|
||||||
#define SKP_SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES -1
|
|
||||||
|
|
||||||
/* Sampling frequency not 8000, 12000, 16000 or 24000 Hertz */
|
|
||||||
#define SKP_SILK_ENC_FS_NOT_SUPPORTED -2
|
|
||||||
|
|
||||||
/* Packet size not 20, 40, 60, 80 or 100 ms */
|
|
||||||
#define SKP_SILK_ENC_PACKET_SIZE_NOT_SUPPORTED -3
|
|
||||||
|
|
||||||
/* Allocated payload buffer too short */
|
|
||||||
#define SKP_SILK_ENC_PAYLOAD_BUF_TOO_SHORT -4
|
|
||||||
|
|
||||||
/* Loss rate not between 0 and 100 percent */
|
|
||||||
#define SKP_SILK_ENC_INVALID_LOSS_RATE -5
|
|
||||||
|
|
||||||
/* Complexity setting not valid, use 0, 1 or 2 */
|
|
||||||
#define SKP_SILK_ENC_INVALID_COMPLEXITY_SETTING -6
|
|
||||||
|
|
||||||
/* Inband FEC setting not valid, use 0 or 1 */
|
|
||||||
#define SKP_SILK_ENC_INVALID_INBAND_FEC_SETTING -7
|
|
||||||
|
|
||||||
/* DTX setting not valid, use 0 or 1 */
|
|
||||||
#define SKP_SILK_ENC_INVALID_DTX_SETTING -8
|
|
||||||
|
|
||||||
/* Internal encoder error */
|
|
||||||
#define SKP_SILK_ENC_INTERNAL_ERROR -9
|
|
||||||
|
|
||||||
/**************************/
|
|
||||||
/* Decoder error messages */
|
|
||||||
/**************************/
|
|
||||||
|
|
||||||
/* Output sampling frequency lower than internal decoded sampling frequency */
|
|
||||||
#define SKP_SILK_DEC_INVALID_SAMPLING_FREQUENCY -10
|
|
||||||
|
|
||||||
/* Payload size exceeded the maximum allowed 1024 bytes */
|
|
||||||
#define SKP_SILK_DEC_PAYLOAD_TOO_LARGE -11
|
|
||||||
|
|
||||||
/* Payload has bit errors */
|
|
||||||
#define SKP_SILK_DEC_PAYLOAD_ERROR -12
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@ -1,107 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
Copyright (c) 2006-2012, Skype Limited. All rights reserved.
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, (subject to the limitations in the disclaimer below)
|
|
||||||
are permitted provided that the following conditions are met:
|
|
||||||
- Redistributions of source code must retain the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer.
|
|
||||||
- Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in the
|
|
||||||
documentation and/or other materials provided with the distribution.
|
|
||||||
- Neither the name of Skype Limited, nor the names of specific
|
|
||||||
contributors, may be used to endorse or promote products derived from
|
|
||||||
this software without specific prior written permission.
|
|
||||||
NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
|
|
||||||
BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
|
||||||
CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
|
|
||||||
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
||||||
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
|
||||||
USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
|
||||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
#ifndef _SKP_SILK_API_TYPDEF_H_
|
|
||||||
#define _SKP_SILK_API_TYPDEF_H_
|
|
||||||
|
|
||||||
#ifndef SKP_USE_DOUBLE_PRECISION_FLOATS
|
|
||||||
#define SKP_USE_DOUBLE_PRECISION_FLOATS 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <float.h>
|
|
||||||
#if defined( __GNUC__ )
|
|
||||||
#include <stdint.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SKP_int int /* used for counters etc; at least 16 bits */
|
|
||||||
#ifdef __GNUC__
|
|
||||||
# define SKP_int64 int64_t
|
|
||||||
#else
|
|
||||||
# define SKP_int64 long long
|
|
||||||
#endif
|
|
||||||
#define SKP_int32 int
|
|
||||||
#define SKP_int16 short
|
|
||||||
#define SKP_int8 signed char
|
|
||||||
|
|
||||||
#define SKP_uint unsigned int /* used for counters etc; at least 16 bits */
|
|
||||||
#ifdef __GNUC__
|
|
||||||
# define SKP_uint64 uint64_t
|
|
||||||
#else
|
|
||||||
# define SKP_uint64 unsigned long long
|
|
||||||
#endif
|
|
||||||
#define SKP_uint32 unsigned int
|
|
||||||
#define SKP_uint16 unsigned short
|
|
||||||
#define SKP_uint8 unsigned char
|
|
||||||
|
|
||||||
#define SKP_int_ptr_size intptr_t
|
|
||||||
|
|
||||||
#if SKP_USE_DOUBLE_PRECISION_FLOATS
|
|
||||||
# define SKP_float double
|
|
||||||
# define SKP_float_MAX DBL_MAX
|
|
||||||
#else
|
|
||||||
# define SKP_float float
|
|
||||||
# define SKP_float_MAX FLT_MAX
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SKP_INLINE static __inline
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
# define SKP_STR_CASEINSENSITIVE_COMPARE(x, y) _stricmp(x, y)
|
|
||||||
#else
|
|
||||||
# define SKP_STR_CASEINSENSITIVE_COMPARE(x, y) strcasecmp(x, y)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SKP_int64_MAX ((SKP_int64)0x7FFFFFFFFFFFFFFFLL) /* 2^63 - 1 */
|
|
||||||
#define SKP_int64_MIN ((SKP_int64)0x8000000000000000LL) /* -2^63 */
|
|
||||||
#define SKP_int32_MAX 0x7FFFFFFF /* 2^31 - 1 = 2147483647*/
|
|
||||||
#define SKP_int32_MIN ((SKP_int32)0x80000000) /* -2^31 = -2147483648*/
|
|
||||||
#define SKP_int16_MAX 0x7FFF /* 2^15 - 1 = 32767*/
|
|
||||||
#define SKP_int16_MIN ((SKP_int16)0x8000) /* -2^15 = -32768*/
|
|
||||||
#define SKP_int8_MAX 0x7F /* 2^7 - 1 = 127*/
|
|
||||||
#define SKP_int8_MIN ((SKP_int8)0x80) /* -2^7 = -128*/
|
|
||||||
|
|
||||||
#define SKP_uint32_MAX 0xFFFFFFFF /* 2^32 - 1 = 4294967295 */
|
|
||||||
#define SKP_uint32_MIN 0x00000000
|
|
||||||
#define SKP_uint16_MAX 0xFFFF /* 2^16 - 1 = 65535 */
|
|
||||||
#define SKP_uint16_MIN 0x0000
|
|
||||||
#define SKP_uint8_MAX 0xFF /* 2^8 - 1 = 255 */
|
|
||||||
#define SKP_uint8_MIN 0x00
|
|
||||||
|
|
||||||
#define SKP_TRUE 1
|
|
||||||
#define SKP_FALSE 0
|
|
||||||
|
|
||||||
/* assertions */
|
|
||||||
#if (defined _WIN32 && !defined _WINCE && !defined(__GNUC__) && !defined(NO_ASSERTS))
|
|
||||||
# ifndef SKP_assert
|
|
||||||
# include <crtdbg.h> /* ASSERTE() */
|
|
||||||
# define SKP_assert(COND) _ASSERTE(COND)
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# define SKP_assert(COND)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
Binary file not shown.
Loading…
Reference in New Issue
Block a user