mirror of
https://github.com/Qortal/Qortal-Hub.git
synced 2026-06-13 22:39:22 +00:00
45 lines
1.3 KiB
C
45 lines
1.3 KiB
C
/**
|
|
* Minimal libopus decoder bindings for group-call FEC/PLC (mono, WebCodecs-compatible rates).
|
|
* Built with Emscripten; see build.sh.
|
|
*/
|
|
#include <opus.h>
|
|
#include <emscripten/emscripten.h>
|
|
|
|
EMSCRIPTEN_KEEPALIVE
|
|
void *gcall_opus_decoder_create(int sample_rate, int channels) {
|
|
int err = OPUS_OK;
|
|
OpusDecoder *dec = opus_decoder_create(sample_rate, channels, &err);
|
|
if (err != OPUS_OK || !dec) {
|
|
return NULL;
|
|
}
|
|
return (void *)dec;
|
|
}
|
|
|
|
EMSCRIPTEN_KEEPALIVE
|
|
void gcall_opus_decoder_destroy(void *st) {
|
|
if (st) {
|
|
opus_decoder_destroy((OpusDecoder *)st);
|
|
}
|
|
}
|
|
|
|
/** Max samples per channel for one Opus packet at 48 kHz (120 ms). */
|
|
#define GCALL_OPUS_MAX_FRAME_SAMPLES 5760
|
|
|
|
/**
|
|
* Wraps opus_decode_float. Pass len==0 and data ignored for PLC (NULL packet).
|
|
* decode_fec: 0 = normal, 1 = extract FEC for previous frame from this packet.
|
|
*/
|
|
EMSCRIPTEN_KEEPALIVE
|
|
int gcall_opus_decode_float(void *st, const unsigned char *data, int len,
|
|
float *pcm, int frame_size, int decode_fec) {
|
|
if (!st || !pcm) {
|
|
return OPUS_BAD_ARG;
|
|
}
|
|
if (frame_size <= 0 || frame_size > GCALL_OPUS_MAX_FRAME_SAMPLES) {
|
|
return OPUS_BAD_ARG;
|
|
}
|
|
const unsigned char *payload = (len > 0) ? data : NULL;
|
|
return opus_decode_float((OpusDecoder *)st, payload, len, pcm, frame_size,
|
|
decode_fec);
|
|
}
|