diff options
Diffstat (limited to 'modules/mpa/encode.c')
-rw-r--r-- | modules/mpa/encode.c | 47 |
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); } |