diff options
author | Jonas Smedegaard <dr@jones.dk> | 2018-04-30 12:56:52 +0200 |
---|---|---|
committer | Jonas Smedegaard <dr@jones.dk> | 2018-04-30 12:56:52 +0200 |
commit | f24295049f4d58e72b05dacc943d4387fd66cbcb (patch) | |
tree | 985816714d70de11b68fab44231110cdc162300d /modules/opus/decode.c | |
parent | b7869a262cbca2241c70549af9c877529706c15f (diff) | |
parent | a7fd4a25c8a1e0f292d4922f9261e1756e444a28 (diff) |
New upstream version 0.5.9
Diffstat (limited to 'modules/opus/decode.c')
-rw-r--r-- | modules/opus/decode.c | 57 |
1 files changed, 47 insertions, 10 deletions
diff --git a/modules/opus/decode.c b/modules/opus/decode.c index f2d67b1..a4b8721 100644 --- a/modules/opus/decode.c +++ b/modules/opus/decode.c @@ -5,6 +5,7 @@ */ #include <re.h> +#include <rem.h> #include <baresip.h> #include <opus/opus.h> #include "opus.h" @@ -63,7 +64,8 @@ int opus_decode_update(struct audec_state **adsp, const struct aucodec *ac, } -int opus_decode_frm(struct audec_state *ads, int16_t *sampv, size_t *sampc, +int opus_decode_frm(struct audec_state *ads, + int fmt, void *sampv, size_t *sampc, const uint8_t *buf, size_t len) { int n; @@ -71,11 +73,29 @@ int opus_decode_frm(struct audec_state *ads, int16_t *sampv, size_t *sampc, if (!ads || !sampv || !sampc || !buf) return EINVAL; - n = opus_decode(ads->dec, buf, (opus_int32)len, - sampv, (int)(*sampc/ads->ch), 0); - if (n < 0) { - warning("opus: decode error: %s\n", opus_strerror(n)); - return EPROTO; + switch (fmt) { + + case AUFMT_S16LE: + n = opus_decode(ads->dec, buf, (opus_int32)len, + sampv, (int)(*sampc/ads->ch), 0); + if (n < 0) { + warning("opus: decode error: %s\n", opus_strerror(n)); + return EPROTO; + } + break; + + case AUFMT_FLOAT: + n = opus_decode_float(ads->dec, buf, (opus_int32)len, + sampv, (int)(*sampc/ads->ch), 0); + if (n < 0) { + warning("opus: float decode error: %s\n", + opus_strerror(n)); + return EPROTO; + } + break; + + default: + return ENOTSUP; } *sampc = n * ads->ch; @@ -84,16 +104,33 @@ int opus_decode_frm(struct audec_state *ads, int16_t *sampv, size_t *sampc, } -int opus_decode_pkloss(struct audec_state *ads, int16_t *sampv, size_t *sampc) +int opus_decode_pkloss(struct audec_state *ads, + int fmt, void *sampv, size_t *sampc) { int n; if (!ads || !sampv || !sampc) return EINVAL; - n = opus_decode(ads->dec, NULL, 0, sampv, (int)(*sampc/ads->ch), 0); - if (n < 0) - return EPROTO; + switch (fmt) { + + case AUFMT_S16LE: + n = opus_decode(ads->dec, NULL, 0, + sampv, (int)(*sampc/ads->ch), 0); + if (n < 0) + return EPROTO; + break; + + case AUFMT_FLOAT: + n = opus_decode_float(ads->dec, NULL, 0, + sampv, (int)(*sampc/ads->ch), 0); + if (n < 0) + return EPROTO; + break; + + default: + return ENOTSUP; + } *sampc = n * ads->ch; |