From 345cd27b4a25e0c326ed1efc6f7f8372bde4ed6b Mon Sep 17 00:00:00 2001 From: Benny Prijono Date: Sat, 18 Apr 2009 14:29:28 +0000 Subject: More ticket #774: optimization for siren7/siren14 codecs git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@2616 74dad513-b988-da41-8d7b-12977e46ad98 --- pjmedia/src/pjmedia-codec/g7221.c | 47 +++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 26 deletions(-) (limited to 'pjmedia/src') diff --git a/pjmedia/src/pjmedia-codec/g7221.c b/pjmedia/src/pjmedia-codec/g7221.c index 21edf9f0..e4eb1aee 100644 --- a/pjmedia/src/pjmedia-codec/g7221.c +++ b/pjmedia/src/pjmedia-codec/g7221.c @@ -222,6 +222,19 @@ static pj_bool_t validate_mode(unsigned sample_rate, unsigned bitrate) return PJ_TRUE; } +#if defined(PJ_IS_LITTLE_ENDIAN) && PJ_IS_LITTLE_ENDIAN!=0 +PJ_INLINE(void) swap_bytes(pj_uint16_t *buf, unsigned count) +{ + pj_uint16_t *end = buf + count; + while (buf != end) { + *buf = (pj_uint16_t)((*buf << 8) | (*buf >> 8)); + ++buf; + } +} +#else +#define swap_bytes(buf, count) +#endif + /* * Initialize and register G722.1 codec factory to pjmedia endpoint. */ @@ -774,18 +787,10 @@ static pj_status_t codec_encode( pjmedia_codec *codec, mag_shift, output->buf); -#if defined(PJ_IS_LITTLE_ENDIAN) && PJ_IS_LITTLE_ENDIAN!=0 - { - pj_uint16_t *p, *p_end; - - p = (pj_uint16_t*)output->buf; - p_end = p + codec_data->frame_size/2; - while (p < p_end) { - *p = pj_htons(*p); - ++p; - } - } -#endif + /* Encoder output are in native host byte order, while ITU says + * it must be in network byte order (MSB first). + */ + swap_bytes((pj_uint16_t*)output->buf, codec_data->frame_size/2); output->type = PJMEDIA_FRAME_TYPE_AUDIO; output->size = codec_data->frame_size; @@ -818,21 +823,11 @@ static pj_status_t codec_decode( pjmedia_codec *codec, PJ_ASSERT_RETURN((pj_uint16_t)input->size == codec_data->frame_size, PJMEDIA_CODEC_EFRMINLEN); - /* Decoder requires input of 16-bits array, so we need to take care - * about endianness. + /* Decoder requires input of 16-bits array in native host byte + * order, while the frame received from the network are in + * network byte order (MSB first). */ -#if defined(PJ_IS_LITTLE_ENDIAN) && PJ_IS_LITTLE_ENDIAN!=0 - { - pj_uint16_t *p, *p_end; - - p = (pj_uint16_t*)input->buf; - p_end = p + codec_data->frame_size/2; - while (p < p_end) { - *p = pj_ntohs(*p); - ++p; - } - } -#endif + swap_bytes((pj_uint16_t*)input->buf, codec_data->frame_size/2); bitobj.code_word_ptr = (Word16*)input->buf; bitobj.current_word = *bitobj.code_word_ptr; -- cgit v1.2.3