summaryrefslogtreecommitdiff
path: root/pjmedia/src/pjmedia-codec/gsm.c
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2008-06-05 10:50:40 +0000
committerNanang Izzuddin <nanang@teluu.com>2008-06-05 10:50:40 +0000
commit5f1ff63b18fbf86eaa27798a35ae8979e3a01b11 (patch)
treed7ec5fdb38e021ed5c3d2239db3f49d421fc64c8 /pjmedia/src/pjmedia-codec/gsm.c
parent5c55c6ae827ee835906e48e1657f64fa0a84f309 (diff)
Ticket #473:
- fixed issue on Speex multiple frames (encoding: encoded bits concatenation & decoding: frames parsing) - updated pjmedia stream & codecs on encoding multiple frames - introduced bit_info in pjmedia_frame and jitter buffer git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1983 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia/src/pjmedia-codec/gsm.c')
-rw-r--r--pjmedia/src/pjmedia-codec/gsm.c26
1 files changed, 17 insertions, 9 deletions
diff --git a/pjmedia/src/pjmedia-codec/gsm.c b/pjmedia/src/pjmedia-codec/gsm.c
index 8bc33bb4..555901f8 100644
--- a/pjmedia/src/pjmedia-codec/gsm.c
+++ b/pjmedia/src/pjmedia-codec/gsm.c
@@ -515,14 +515,17 @@ static pj_status_t gsm_codec_encode( pjmedia_codec *codec,
struct pjmedia_frame *output)
{
struct gsm_data *gsm_data = (struct gsm_data*) codec->codec_data;
+ pj_int16_t *pcm_in;
+ unsigned in_size;
- pj_assert(gsm_data != NULL);
- PJ_ASSERT_RETURN(input && output, PJ_EINVAL);
-
- if (output_buf_len < 33)
- return PJMEDIA_CODEC_EFRMTOOSHORT;
+ pj_assert(gsm_data && input && output);
+
+ pcm_in = (pj_int16_t*)input->buf;
+ in_size = input->size;
- PJ_ASSERT_RETURN(input->size==320, PJMEDIA_CODEC_EPCMFRMINLEN);
+ PJ_ASSERT_RETURN(in_size % 320 == 0, PJMEDIA_CODEC_EPCMFRMINLEN);
+ PJ_ASSERT_RETURN(output_buf_len >= 33 * in_size/320,
+ PJMEDIA_CODEC_EFRMTOOSHORT);
/* Detect silence */
if (gsm_data->vad_enabled) {
@@ -551,10 +554,15 @@ static pj_status_t gsm_codec_encode( pjmedia_codec *codec,
}
/* Encode */
- gsm_encode(gsm_data->encoder, (short*)input->buf,
- (unsigned char*)output->buf);
+ output->size = 0;
+ while (in_size >= 320) {
+ gsm_encode(gsm_data->encoder, pcm_in,
+ (unsigned char*)output->buf + output->size);
+ pcm_in += 160;
+ output->size += 33;
+ in_size -= 320;
+ }
- output->size = 33;
output->type = PJMEDIA_FRAME_TYPE_AUDIO;
return PJ_SUCCESS;