diff options
Diffstat (limited to 'modules/mpa')
-rw-r--r-- | modules/mpa/decode.c | 9 | ||||
-rw-r--r-- | modules/mpa/encode.c | 25 | ||||
-rw-r--r-- | modules/mpa/mpa.c | 5 | ||||
-rw-r--r-- | modules/mpa/mpa.h | 4 |
4 files changed, 25 insertions, 18 deletions
diff --git a/modules/mpa/decode.c b/modules/mpa/decode.c index 3a1c0a2..b71a335 100644 --- a/modules/mpa/decode.c +++ b/modules/mpa/decode.c @@ -40,6 +40,7 @@ int mpa_decode_update(struct audec_state **adsp, const struct aucodec *ac, { struct audec_state *ads; int result, err=0; + (void)fmtp; if (!adsp || !ac || !ac->ch) return EINVAL; @@ -62,7 +63,7 @@ int mpa_decode_update(struct audec_state **adsp, const struct aucodec *ac, ads->dec = mpg123_new(NULL,&result); if (!ads->dec) { - error("mpa: decoder create: %s\n", + error("MPA dec create: %s\n", mpg123_plain_strerror(result)); err = ENOMEM; goto out; @@ -135,12 +136,10 @@ int mpa_decode_frm(struct audec_state *ads, int16_t *sampv, size_t *sampc, (unsigned char*)ads->intermediate_buffer, sizeof(ads->intermediate_buffer), &n); /* n counts bytes */ - #ifdef DEBUG debug("MPA dec %d %d %d %d\n",result, len-4, n, ads->channels); #endif - if (result == MPG123_NEW_FORMAT) { mpg123_getformat(ads->dec, &samplerate, &channels, &encoding); info("MPA dec format change %d %d %04X\n",samplerate @@ -150,9 +149,9 @@ int mpa_decode_frm(struct audec_state *ads, int16_t *sampv, size_t *sampc, ads->start = 0; if (ads->resampler) speex_resampler_destroy(ads->resampler); - if (samplerate != 48000) { + if (samplerate != MPA_IORATE) { ads->resampler = speex_resampler_init(channels, - samplerate, 48000, 3, &result); + (uint32_t)samplerate, MPA_IORATE, 3, &result); if (result!=RESAMPLER_ERR_SUCCESS || ads->resampler==NULL) { error("MPA dec upsampler failed %d\n",result); diff --git a/modules/mpa/encode.c b/modules/mpa/encode.c index 6504c38..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; }; @@ -59,16 +60,18 @@ int mpa_encode_update(struct auenc_state **aesp, const struct aucodec *ac, mem_deref(aes); return ENOMEM; } - aes->channels = ac->ch; #ifdef DEBUG 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 @@ -103,8 +106,8 @@ int mpa_encode_update(struct auenc_state **aesp, const struct aucodec *ac, #ifdef DEBUG twolame_print_config(aes->enc); #endif - if (prm.samplerate != 48000) { - aes->resampler = speex_resampler_init(2, 48000, + if (prm.samplerate != MPA_IORATE) { + aes->resampler = speex_resampler_init(2, MPA_IORATE, prm.samplerate, 3, &result); if (result!=RESAMPLER_ERR_SUCCESS) { error("MPA enc resampler init failed %d\n",result); @@ -136,7 +139,7 @@ int mpa_encode_frm(struct auenc_state *aes, uint8_t *buf, size_t *len, return EINVAL; if (aes->resampler) { - in_len = sampc/2; + in_len = (uint32_t)sampc/2; intermediate_len = sizeof(aes->intermediate_buffer) / sizeof(aes->intermediate_buffer[0]); n=speex_resampler_process_interleaved_int(aes->resampler, @@ -149,7 +152,7 @@ int mpa_encode_frm(struct auenc_state *aes, uint8_t *buf, size_t *len, } n = twolame_encode_buffer_interleaved(aes->enc, aes->intermediate_buffer, intermediate_len, - buf+4, (*len)-4); + buf+4, (int)(*len)-4); #ifdef DEBUG debug("MPA enc %d %d %d %d %d\n",intermediate_len,sampc, aes->channels,*len,n); @@ -157,7 +160,7 @@ int mpa_encode_frm(struct auenc_state *aes, uint8_t *buf, size_t *len, } else n = twolame_encode_buffer_interleaved(aes->enc, sampv, - (int)(sampc/2), buf+4, (*len)-4); + (int)(sampc/2), buf+4, (int)(*len)-4); if (n < 0) { error("MPA enc error %s\n", strerror((int)n)); @@ -165,7 +168,7 @@ int mpa_encode_frm(struct auenc_state *aes, uint8_t *buf, size_t *len, } if (n > 0) { - *(uint32_t*)buf = 0; + *(uint32_t*)(void *)buf = 0; *len = n+4; } else @@ -174,6 +177,8 @@ int mpa_encode_frm(struct auenc_state *aes, uint8_t *buf, size_t *len, #ifdef DEBUG 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); } diff --git a/modules/mpa/mpa.c b/modules/mpa/mpa.c index 7771ff6..2c75625 100644 --- a/modules/mpa/mpa.c +++ b/modules/mpa/mpa.c @@ -81,9 +81,10 @@ static struct aucodec mpa = { .pt = "14", .name = "MPA", - .srate = 90000, + .srate = MPA_IORATE, + .crate = MPA_RTPRATE, .ch = 1, -/* MPA does not expect channels count, even thoes it is stereo */ +/* MPA does not expect channels count, even those it is stereo */ .fmtp = "layer=2", .encupdh = mpa_encode_update, .ench = mpa_encode_frm, diff --git a/modules/mpa/mpa.h b/modules/mpa/mpa.h index 35055b6..0db2528 100644 --- a/modules/mpa/mpa.h +++ b/modules/mpa/mpa.h @@ -5,7 +5,9 @@ */ #define MPA_FRAMESIZE 1152 -#define BARESIP_FRAMESIZE (48000/50*2) +#define MPA_IORATE 48000 +#define MPA_RTPRATE 90000 +#define BARESIP_FRAMESIZE (MPA_IORATE/50*2) #undef DEBUG |