From 93002f5be76e578da3f5dbb89326bd5fc19f886f Mon Sep 17 00:00:00 2001 From: Nanang Izzuddin Date: Mon, 6 Apr 2009 13:52:01 +0000 Subject: Ticket #778: Fixed IPP G722.1 codec to aware about endianness in packing/decoding G722.1 RTP payload. git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@2573 74dad513-b988-da41-8d7b-12977e46ad98 --- pjmedia/src/pjmedia-codec/ipp_codecs.c | 63 ++++++++++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 3 deletions(-) diff --git a/pjmedia/src/pjmedia-codec/ipp_codecs.c b/pjmedia/src/pjmedia-codec/ipp_codecs.c index bbc58b73..b22b4f19 100644 --- a/pjmedia/src/pjmedia-codec/ipp_codecs.c +++ b/pjmedia/src/pjmedia-codec/ipp_codecs.c @@ -200,6 +200,11 @@ static pj_status_t parse_amr( ipp_private_t *codec_data, void *pkt, static pj_status_t pack_amr( ipp_private_t *codec_data, void *pkt, pj_size_t *pkt_size, pj_size_t max_pkt_size); +static void predecode_g7221( ipp_private_t *codec_data, + const pjmedia_frame *rtp_frame, + USC_Bitstream *usc_frame); +static pj_status_t pack_g7221( ipp_private_t *codec_data, void *pkt, + pj_size_t *pkt_size, pj_size_t max_pkt_size); /* IPP codec implementation descriptions. */ static struct ipp_codec { @@ -293,17 +298,17 @@ ipp_codec[] = # if PJMEDIA_HAS_INTEL_IPP_CODEC_G722_1 {0, "G7221", PJMEDIA_RTP_PT_G722_1_16, &USC_G722_Fxns, 16000, 1, 320, 16000, 16000, 1, 0, 1, - NULL, NULL, NULL, + predecode_g7221, NULL, pack_g7221, {1, {{{"bitrate", 7}, {"16000", 5}}} } }, {1, "G7221", PJMEDIA_RTP_PT_G722_1_24, &USC_G722_Fxns, 16000, 1, 320, 24000, 24000, 1, 0, 1, - NULL, NULL, NULL, + predecode_g7221, NULL, pack_g7221, {1, {{{"bitrate", 7}, {"24000", 5}}} } }, {1, "G7221", PJMEDIA_RTP_PT_G722_1_32, &USC_G722_Fxns, 16000, 1, 320, 32000, 32000, 1, 0, 1, - NULL, NULL, NULL, + predecode_g7221, NULL, pack_g7221, {1, {{{"bitrate", 7}, {"32000", 5}}} } }, # endif @@ -564,6 +569,58 @@ static pj_status_t parse_amr(ipp_private_t *codec_data, void *pkt, #endif /* PJMEDIA_HAS_INTEL_IPP_CODEC_AMR */ +#if PJMEDIA_HAS_INTEL_IPP_CODEC_G722_1 + +static void predecode_g7221( ipp_private_t *codec_data, + const pjmedia_frame *rtp_frame, + USC_Bitstream *usc_frame) +{ + usc_frame->pBuffer = (char*)rtp_frame->buf; + usc_frame->nbytes = rtp_frame->size; + usc_frame->frametype = 0; + usc_frame->bitrate = codec_data->info->params.modes.bitrate; + +#if defined(PJ_IS_LITTLE_ENDIAN) && PJ_IS_LITTLE_ENDIAN!=0 + { + pj_uint16_t *p, *p_end; + + p = (pj_uint16_t*)rtp_frame->buf; + p_end = p + rtp_frame->size/2; + while (p < p_end) { + *p = pj_ntohs(*p); + ++p; + } + } +#endif +} + +static pj_status_t pack_g7221( ipp_private_t *codec_data, void *pkt, + pj_size_t *pkt_size, pj_size_t max_pkt_size) +{ + PJ_UNUSED_ARG(codec_data); + PJ_UNUSED_ARG(max_pkt_size); + +#if defined(PJ_IS_LITTLE_ENDIAN) && PJ_IS_LITTLE_ENDIAN!=0 + { + pj_uint16_t *p, *p_end; + + p = (pj_uint16_t*)pkt; + p_end = p + *pkt_size/2; + while (p < p_end) { + *p = pj_htons(*p); + ++p; + } + } +#else + PJ_UNUSED_ARG(pkt); + PJ_UNUSED_ARG(pkt_size); +#endif + + return PJ_SUCCESS; +} + +#endif /* PJMEDIA_HAS_INTEL_IPP_CODEC_G722_1 */ + /* * Initialize and register IPP codec factory to pjmedia endpoint. */ -- cgit v1.2.3