summaryrefslogtreecommitdiff
path: root/modules/mpa/encode.c
diff options
context:
space:
mode:
Diffstat (limited to 'modules/mpa/encode.c')
-rw-r--r--modules/mpa/encode.c47
1 files changed, 28 insertions, 19 deletions
diff --git a/modules/mpa/encode.c b/modules/mpa/encode.c
index 85e8dd9..0715d67 100644
--- a/modules/mpa/encode.c
+++ b/modules/mpa/encode.c
@@ -13,9 +13,10 @@
struct auenc_state {
twolame_options *enc;
- int channels;
+ int channels, samplerate;
SpeexResamplerState *resampler;
int16_t intermediate_buffer[BARESIP_FRAMESIZE];
+ uint32_t timestamp;
};
@@ -23,10 +24,15 @@ static void destructor(void *arg)
{
struct auenc_state *aes = arg;
+ if (aes->resampler) {
+ speex_resampler_destroy(aes->resampler);
+ aes->resampler = NULL;
+ }
+
if (aes->enc)
twolame_close(&aes->enc);
#ifdef DEBUG
- debug("mpa: encoder destroyed\n");
+ debug("MPA enc destroyed\n");
#endif
}
@@ -44,27 +50,28 @@ int mpa_encode_update(struct auenc_state **aesp, const struct aucodec *ac,
aes = *aesp;
if (aes) {
- info("ever?");
mem_deref(aes);
}
aes = mem_zalloc(sizeof(*aes), destructor);
aes->enc = twolame_init();
if (!aes->enc) {
- error("mpa: encoder create failed");
+ error("MPA enc create failed\n");
mem_deref(aes);
return ENOMEM;
}
- aes->channels = ac->ch;
#ifdef DEBUG
- debug("mpa: encoder created %s\n",fmtp);
+ debug("MPA enc created %s\n",fmtp);
#endif
+ aes->channels = ac->ch;
+ aes->timestamp = rand_u32();
- prm.samplerate = 32000;
+ prm.samplerate = 48000;
prm.bitrate = 128000;
prm.layer = 2;
prm.mode = SINGLE_CHANNEL;
mpa_decode_fmtp(&prm, fmtp);
+ aes->samplerate = prm.samplerate;
result = 0;
#ifdef DEBUG
@@ -85,25 +92,25 @@ int mpa_encode_update(struct auenc_state **aesp, const struct aucodec *ac,
result |= twolame_set_out_samplerate(aes->enc, prm.samplerate);
result |= twolame_set_num_channels(aes->enc, 2);
if (result!=0) {
- error("mpa: encoder set failed\n");
+ error("MPA enc set failed\n");
err=EINVAL;
goto out;
}
result = twolame_init_params(aes->enc);
if (result!=0) {
- error("mpa: encoder init params failed\n");
+ error("MPA enc init params failed\n");
err=EINVAL;
goto out;
}
-
+#ifdef DEBUG
twolame_print_config(aes->enc);
-
- if (prm.samplerate != 48000) {
- aes->resampler = speex_resampler_init(2, 48000,
+#endif
+ if (prm.samplerate != MPA_IORATE) {
+ aes->resampler = speex_resampler_init(2, MPA_IORATE,
prm.samplerate, 3, &result);
if (result!=RESAMPLER_ERR_SUCCESS) {
- error("mpa: resampler init failed %d\n",result);
+ error("MPA enc resampler init failed %d\n",result);
err=EINVAL;
goto out;
}
@@ -139,7 +146,7 @@ int mpa_encode_frm(struct auenc_state *aes, uint8_t *buf, size_t *len,
sampv, &in_len, aes->intermediate_buffer,
&intermediate_len);
if (n!=RESAMPLER_ERR_SUCCESS || in_len != sampc/2) {
- warning("mpa: downsample error: %s %d %d\n",
+ error("MPA enc downsample error: %s %d %d\n",
strerror(n), in_len, sampc/2);
return EPROTO;
}
@@ -147,7 +154,7 @@ int mpa_encode_frm(struct auenc_state *aes, uint8_t *buf, size_t *len,
aes->intermediate_buffer, intermediate_len,
buf+4, (int)(*len)-4);
#ifdef DEBUG
- debug("mpa encode %d %d %d %d %d\n",intermediate_len,sampc,
+ debug("MPA enc %d %d %d %d %d\n",intermediate_len,sampc,
aes->channels,*len,n);
#endif
}
@@ -156,7 +163,7 @@ int mpa_encode_frm(struct auenc_state *aes, uint8_t *buf, size_t *len,
(int)(sampc/2), buf+4, (int)(*len)-4);
if (n < 0) {
- error("mpa: encode error: %s\n", strerror((int)n));
+ error("MPA enc error %s\n", strerror((int)n));
return EPROTO;
}
@@ -168,8 +175,10 @@ int mpa_encode_frm(struct auenc_state *aes, uint8_t *buf, size_t *len,
*len = 0;
#ifdef DEBUG
- debug("mpa encode %d %d %d %d\n",sampc,aes->channels,*len,n);
+ debug("MPA enc done %d %d %d %d\n",sampc,aes->channels,*len,n);
#endif
- return 0;
+ aes->timestamp += ((MPA_FRAMESIZE*MPA_RTPRATE)<<4) / aes->samplerate;
+
+ return 0x00010000 | ((aes->timestamp>>4) & 0x0000ffff);
}