summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiong Sauw Ming <ming@teluu.com>2013-01-29 08:09:15 +0000
committerLiong Sauw Ming <ming@teluu.com>2013-01-29 08:09:15 +0000
commit064af246091c9d6475dcdd742b0abf0c3d1a07d8 (patch)
tree3e79ea209c9e36ea41f4d42d8f22aef227c753a0
parentc3814751455d7cfcb854970344e952f0a88ba4d9 (diff)
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
-rw-r--r--pjmedia/include/pjmedia-codec/opencore_amr.h61
-rw-r--r--pjmedia/src/pjmedia-codec/audio_codecs.c13
-rw-r--r--pjmedia/src/pjmedia-codec/opencore_amr.c57
-rw-r--r--pjmedia/src/test/mips_test.c9
4 files changed, 83 insertions, 57 deletions
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
@@ -32,6 +32,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);