From 064af246091c9d6475dcdd742b0abf0c3d1a07d8 Mon Sep 17 00:00:00 2001 From: Liong Sauw Ming Date: Tue, 29 Jan 2013 08:09:15 +0000 Subject: Re #1608: Fixed the way codec is initialized, enumerated, and deinit since both NB and WB use the same factory git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4335 74dad513-b988-da41-8d7b-12977e46ad98 --- pjmedia/include/pjmedia-codec/opencore_amr.h | 61 ++++++++++++++++++++-------- pjmedia/src/pjmedia-codec/audio_codecs.c | 13 ++---- pjmedia/src/pjmedia-codec/opencore_amr.c | 57 ++++++++++++++------------ pjmedia/src/test/mips_test.c | 9 ++-- 4 files changed, 83 insertions(+), 57 deletions(-) (limited to 'pjmedia') diff --git a/pjmedia/include/pjmedia-codec/opencore_amr.h b/pjmedia/include/pjmedia-codec/opencore_amr.h index 56816415..647b078f 100644 --- a/pjmedia/include/pjmedia-codec/opencore_amr.h +++ b/pjmedia/include/pjmedia-codec/opencore_amr.h @@ -31,6 +31,15 @@ PJ_BEGIN_DECL +/** + * Bitmask options to be passed during AMR codec factory initialization. + */ +enum pjmedia_amr_options +{ + PJMEDIA_AMR_NO_NB = 1, /**< Disable narrowband mode. */ + PJMEDIA_AMR_NO_WB = 2, /**< Disable wideband mode. */ +}; + /** * Settings. Use #pjmedia_codec_opencore_amrnb/wb_set_config() to * activate. @@ -53,49 +62,67 @@ typedef pjmedia_codec_amr_config pjmedia_codec_amrnb_config; typedef pjmedia_codec_amr_config pjmedia_codec_amrwb_config; /** - * Initialize and register AMR-NB codec factory to pjmedia endpoint. + * Initialize and register AMR codec factory to pjmedia endpoint. * - * @param endpt The pjmedia endpoint. + * @param endpt The pjmedia endpoint. + * @param options Bitmask of pjmedia_amr_options (default=0). * - * @return PJ_SUCCESS on success. + * @return PJ_SUCCESS on success. */ -PJ_DECL(pj_status_t) pjmedia_codec_opencore_amrnb_init(pjmedia_endpt* endpt); +PJ_DECL(pj_status_t) pjmedia_codec_opencore_amr_init(pjmedia_endpt* endpt, + unsigned options); /** - * Unregister AMR-NB codec factory from pjmedia endpoint and deinitialize - * the OpenCORE codec library. + * Initialize and register AMR codec factory using default settings to + * pjmedia endpoint. + * + * @param endpt The pjmedia endpoint. * * @return PJ_SUCCESS on success. */ -PJ_DECL(pj_status_t) pjmedia_codec_opencore_amrnb_deinit(void); - +PJ_DECL(pj_status_t) +pjmedia_codec_opencore_amr_init_default(pjmedia_endpt* endpt); /** - * Set AMR-NB parameters. - * - * @param cfg The settings; + * Unregister AMR codec factory from pjmedia endpoint and deinitialize + * the OpenCORE codec library. * * @return PJ_SUCCESS on success. */ -PJ_DECL(pj_status_t) pjmedia_codec_opencore_amrnb_set_config( - const pjmedia_codec_amrnb_config* cfg); +PJ_DECL(pj_status_t) pjmedia_codec_opencore_amr_deinit(void); /** - * Initialize and register AMR-WB codec factory to pjmedia endpoint. + * Initialize and register AMR-NB codec factory to pjmedia endpoint. Calling + * this function will automatically initialize AMR codec factory without + * the wideband mode (i.e. it is equivalent to calling + * #pjmedia_codec_opencore_amr_init() with PJMEDIA_AMR_NO_WB). Application + * should call #pjmedia_codec_opencore_amr_init() instead if wishing to use + * both modes. * * @param endpt The pjmedia endpoint. * * @return PJ_SUCCESS on success. */ -PJ_DECL(pj_status_t) pjmedia_codec_opencore_amrwb_init(pjmedia_endpt* endpt); +PJ_DECL(pj_status_t) pjmedia_codec_opencore_amrnb_init(pjmedia_endpt* endpt); /** - * Unregister AMR-WB codec factory from pjmedia endpoint and deinitialize + * Unregister AMR-NB codec factory from pjmedia endpoint and deinitialize * the OpenCORE codec library. * * @return PJ_SUCCESS on success. */ -PJ_DECL(pj_status_t) pjmedia_codec_opencore_amrwb_deinit(void); +PJ_DECL(pj_status_t) pjmedia_codec_opencore_amrnb_deinit(void); + + +/** + * Set AMR-NB parameters. + * + * @param cfg The settings; + * + * @return PJ_SUCCESS on success. + */ +PJ_DECL(pj_status_t) pjmedia_codec_opencore_amrnb_set_config( + const pjmedia_codec_amrnb_config* cfg); /** diff --git a/pjmedia/src/pjmedia-codec/audio_codecs.c b/pjmedia/src/pjmedia-codec/audio_codecs.c index 3393fc5b..d8eb555f 100644 --- a/pjmedia/src/pjmedia-codec/audio_codecs.c +++ b/pjmedia/src/pjmedia-codec/audio_codecs.c @@ -107,16 +107,9 @@ pjmedia_codec_register_audio_codecs(pjmedia_endpt *endpt, return status; #endif /* PJMEDIA_HAS_L16_CODEC */ -#if PJMEDIA_HAS_OPENCORE_AMRNB_CODEC - /* Register OpenCORE AMR-NB */ - status = pjmedia_codec_opencore_amrnb_init(endpt); - if (status != PJ_SUCCESS) - return status; -#endif - -#if PJMEDIA_HAS_OPENCORE_AMRWB_CODEC - /* Register OpenCORE AMR-WB */ - status = pjmedia_codec_opencore_amrwb_init(endpt); +#if PJMEDIA_HAS_OPENCORE_AMRNB_CODEC || PJMEDIA_HAS_OPENCORE_AMRWB_CODEC + /* Register OpenCORE AMR */ + status = pjmedia_codec_opencore_amr_init(endpt, 0); if (status != PJ_SUCCESS) return status; #endif diff --git a/pjmedia/src/pjmedia-codec/opencore_amr.c b/pjmedia/src/pjmedia-codec/opencore_amr.c index 0bd3a5f3..cc6a4ab3 100644 --- a/pjmedia/src/pjmedia-codec/opencore_amr.c +++ b/pjmedia/src/pjmedia-codec/opencore_amr.c @@ -198,7 +198,8 @@ static const pj_uint16_t* amr_bitrates[2] = /* * Initialize and register AMR codec factory to pjmedia endpoint. */ -static pj_status_t amr_init( pjmedia_endpt *endpt ) +PJ_DEF(pj_status_t) pjmedia_codec_opencore_amr_init( pjmedia_endpt *endpt, + unsigned options) { pjmedia_codec_mgr *codec_mgr; pj_str_t codec_name; @@ -211,8 +212,18 @@ static pj_status_t amr_init( pjmedia_endpt *endpt ) amr_codec_factory.base.op = &amr_factory_op; amr_codec_factory.base.factory_data = NULL; amr_codec_factory.endpt = endpt; +#ifdef USE_AMRNB + amr_codec_factory.init[IDX_AMR_NB] = ((options & PJMEDIA_AMR_NO_NB) == 0); +#else + amr_codec_factory.init[IDX_AMR_NB] = PJ_FALSE; +#endif +#ifdef USE_AMRWB + amr_codec_factory.init[IDX_AMR_WB] = ((options & PJMEDIA_AMR_NO_WB) == 0); +#else + amr_codec_factory.init[IDX_AMR_WB] = PJ_FALSE; +#endif - amr_codec_factory.pool = pjmedia_endpt_create_pool(endpt, "amr", 1000, + amr_codec_factory.pool = pjmedia_endpt_create_pool(endpt, "amr", 1000, 1000); if (!amr_codec_factory.pool) return PJ_ENOMEM; @@ -247,18 +258,15 @@ on_error: return status; } -PJ_DEF(pj_status_t) pjmedia_codec_opencore_amrnb_init( pjmedia_endpt *endpt ) +PJ_DEF(pj_status_t) +pjmedia_codec_opencore_amr_init_default( pjmedia_endpt *endpt ) { - amr_codec_factory.init[IDX_AMR_NB] = PJ_TRUE; - - return amr_init(endpt); + return pjmedia_codec_opencore_amr_init(endpt, 0); } -PJ_DEF(pj_status_t) pjmedia_codec_opencore_amrwb_init( pjmedia_endpt *endpt ) +PJ_DEF(pj_status_t) pjmedia_codec_opencore_amrnb_init( pjmedia_endpt *endpt ) { - amr_codec_factory.init[IDX_AMR_WB] = PJ_TRUE; - - return amr_init(endpt); + return pjmedia_codec_opencore_amr_init(endpt, PJMEDIA_AMR_NO_WB); } @@ -266,16 +274,13 @@ PJ_DEF(pj_status_t) pjmedia_codec_opencore_amrwb_init( pjmedia_endpt *endpt ) * Unregister AMR codec factory from pjmedia endpoint and deinitialize * the AMR codec library. */ -static pj_status_t amr_deinit(void) +PJ_DEF(pj_status_t) pjmedia_codec_opencore_amr_deinit(void) { pjmedia_codec_mgr *codec_mgr; pj_status_t status; - if (amr_codec_factory.init[IDX_AMR_NB] || - amr_codec_factory.init[IDX_AMR_WB]) - { - return PJ_SUCCESS; - } + amr_codec_factory.init[IDX_AMR_NB] = PJ_FALSE; + amr_codec_factory.init[IDX_AMR_WB] = PJ_FALSE; if (amr_codec_factory.pool == NULL) return PJ_SUCCESS; @@ -301,16 +306,16 @@ static pj_status_t amr_deinit(void) PJ_DEF(pj_status_t) pjmedia_codec_opencore_amrnb_deinit(void) { - amr_codec_factory.init[IDX_AMR_NB] = PJ_FALSE; - - return amr_deinit(); -} - -PJ_DEF(pj_status_t) pjmedia_codec_opencore_amrwb_deinit(void) -{ - amr_codec_factory.init[IDX_AMR_WB] = PJ_FALSE; + if (amr_codec_factory.init[IDX_AMR_NB] && + amr_codec_factory.init[IDX_AMR_WB]) + { + PJ_LOG(4, (THIS_FILE, "Should call " + "pjmedia_codec_opencore_amr_deinit() instead")); + + return PJ_EINVALIDOP; + } - return amr_deinit(); + return pjmedia_codec_opencore_amr_deinit(); } static pj_status_t @@ -447,7 +452,7 @@ static pj_status_t amr_enum_codecs( pjmedia_codec_factory *factory, (*count)++; } - if (amr_codec_factory.init[IDX_AMR_NB]) { + if (amr_codec_factory.init[IDX_AMR_WB]) { pj_bzero(&codecs[*count], sizeof(pjmedia_codec_info)); codecs[*count].encoding_name = pj_str("AMR-WB"); codecs[*count].pt = PJMEDIA_RTP_PT_AMRWB; diff --git a/pjmedia/src/test/mips_test.c b/pjmedia/src/test/mips_test.c index 933b9b3b..9c586cc1 100644 --- a/pjmedia/src/test/mips_test.c +++ b/pjmedia/src/test/mips_test.c @@ -953,8 +953,8 @@ static pjmedia_port* amrwb_encode_decode(pj_pool_t *pool, struct test_entry *te) { return codec_encode_decode(pool, "AMR/16000", - &pjmedia_codec_opencore_amrwb_init, - &pjmedia_codec_opencore_amrwb_deinit, + &pjmedia_codec_opencore_amr_init_default, + &pjmedia_codec_opencore_amr_deinit, clock_rate, channel_count, samples_per_frame, flags, te); } @@ -2052,8 +2052,9 @@ static pjmedia_port* create_stream_amrwb( pj_pool_t *pool, unsigned flags, struct test_entry *te) { - return create_stream(pool, "AMR/16000", &pjmedia_codec_opencore_amrwb_init, - &pjmedia_codec_opencore_amrwb_deinit, + return create_stream(pool, "AMR/16000", + &pjmedia_codec_opencore_amr_init_default, + &pjmedia_codec_opencore_amr_deinit, PJ_FALSE, PJ_FALSE, PJ_FALSE, clock_rate, channel_count, samples_per_frame, flags, te); -- cgit v1.2.3