summaryrefslogtreecommitdiff
path: root/pjmedia
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2006-07-29 11:14:47 +0000
committerBenny Prijono <bennylp@teluu.com>2006-07-29 11:14:47 +0000
commitd0c1e54e8d96215f0baad41f59d5ca7a3d1c4a27 (patch)
tree880fe6e1bcd57d3296ddd1c458ed67b7b09154a3 /pjmedia
parent34520eaca94bf5e4edb9fe37301c72f5b57aa7e2 (diff)
Added pjmedia_port_info_init() to fill in pjmedia_port_info structure, avoiding manual initialization and thus improves consistency (and probably reduces size by a tiny bit). This involves modification in quite few places.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@633 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia')
-rw-r--r--pjmedia/include/pjmedia/conference.h53
-rw-r--r--pjmedia/include/pjmedia/port.h10
-rw-r--r--pjmedia/src/pjmedia/conference.c211
-rw-r--r--pjmedia/src/pjmedia/mem_capture.c17
-rw-r--r--pjmedia/src/pjmedia/mem_player.c15
-rw-r--r--pjmedia/src/pjmedia/null_port.c17
-rw-r--r--pjmedia/src/pjmedia/resample_port.c19
-rw-r--r--pjmedia/src/pjmedia/splitcomb.c36
-rw-r--r--pjmedia/src/pjmedia/stream.c28
-rw-r--r--pjmedia/src/pjmedia/wav_player.c25
-rw-r--r--pjmedia/src/pjmedia/wav_writer.c24
11 files changed, 284 insertions, 171 deletions
diff --git a/pjmedia/include/pjmedia/conference.h b/pjmedia/include/pjmedia/conference.h
index 083fc0f1..8b1f2e35 100644
--- a/pjmedia/include/pjmedia/conference.h
+++ b/pjmedia/include/pjmedia/conference.h
@@ -172,12 +172,16 @@ PJ_DECL(pjmedia_port*) pjmedia_conf_get_master_port(pjmedia_conf *conf);
/**
- * Add stream port to the conference bridge. By default, the new conference
- * port will have both TX and RX enabled, but it is not connected to any
- * other ports.
+ * Add media port to the conference bridge.
*
- * Application SHOULD call #pjmedia_conf_connect_port() to enable audio
- * transmission and receipt to/from this port.
+ * By default, the new conference port will have both TX and RX enabled,
+ * but it is not connected to any other ports. Application SHOULD call
+ * #pjmedia_conf_connect_port() to enable audio transmission and receipt
+ * to/from this port.
+ *
+ * Once the media port is connected to other port(s) in the bridge,
+ * the bridge will continuosly call get_frame() and put_frame() to the
+ * port, allowing media to flow to/from the port.
*
* @param conf The conference bridge.
* @param pool Pool to allocate buffers for this port.
@@ -197,6 +201,45 @@ PJ_DECL(pj_status_t) pjmedia_conf_add_port( pjmedia_conf *conf,
unsigned *p_slot );
+/**
+ * Create and add a passive media port to the conference bridge. Unlike
+ * "normal" media port that is added with #pjmedia_conf_add_port(), media
+ * port created with this function will not have its get_frame() and
+ * put_frame() called by the bridge; instead, application MUST continuosly
+ * call these functions to the port, to allow media to flow from/to the
+ * port.
+ *
+ * Upon return of this function, application will be given two objects:
+ * the slot number of the port in the bridge, and pointer to the media
+ * port where application MUST start calling get_frame() and put_frame()
+ * to the port.
+ *
+ * @param conf The conference bridge.
+ * @param pool Pool to allocate buffers etc for this port.
+ * @param name Name to be assigned to the port.
+ * @param clock_rate Clock rate/sampling rate.
+ * @param channel_count Number of channels.
+ * @param samples_per_frame Number of samples per frame.
+ * @param bits_per_sample Number of bits per sample.
+ * @param options Options (should be zero at the moment).
+ * @param p_slot Pointer to receive the slot index of the port in
+ * the conference bridge.
+ * @param p_port Pointer to receive the port instance.
+ *
+ * @return PJ_SUCCESS on success, or the appropriate error
+ * code.
+ */
+PJ_DECL(pj_status_t) pjmedia_conf_add_passive_port( pjmedia_conf *conf,
+ pj_pool_t *pool,
+ const pj_str_t *name,
+ unsigned clock_rate,
+ unsigned channel_count,
+ unsigned samples_per_frame,
+ unsigned bits_per_sample,
+ unsigned options,
+ unsigned *p_slot,
+ pjmedia_port **p_port );
+
/**
* Change TX and RX settings for the port.
diff --git a/pjmedia/include/pjmedia/port.h b/pjmedia/include/pjmedia/port.h
index fb8bd839..a7943667 100644
--- a/pjmedia/include/pjmedia/port.h
+++ b/pjmedia/include/pjmedia/port.h
@@ -291,7 +291,6 @@ typedef struct pjmedia_port_info
typedef enum pjmedia_frame_type
{
PJMEDIA_FRAME_TYPE_NONE, /**< No frame. */
- PJMEDIA_FRAME_TYPE_CNG, /**< Silence audio frame. */
PJMEDIA_FRAME_TYPE_AUDIO /**< Normal audio frame. */
} pjmedia_frame_type;
@@ -332,7 +331,14 @@ typedef struct pjmedia_port pjmedia_port;
struct pjmedia_port
{
pjmedia_port_info info; /**< Port information. */
- void *user_data; /**< User data. */
+
+ /** Port data can be used by the port creator to attach arbitrary
+ * value to be associated with the port.
+ */
+ struct port_data {
+ void *pdata; /**< Pointer data. */
+ long ldata; /**< Long data. */
+ } port_data;
/**
* Sink interface.
diff --git a/pjmedia/src/pjmedia/conference.c b/pjmedia/src/pjmedia/conference.c
index 176541ad..cd465dc6 100644
--- a/pjmedia/src/pjmedia/conference.c
+++ b/pjmedia/src/pjmedia/conference.c
@@ -29,6 +29,7 @@
#include <pj/pool.h>
#include <pj/string.h>
+
/* CONF_DEBUG enables detailed operation of the conference bridge.
* Beware that it prints large amounts of logs (several lines per frame).
*/
@@ -57,6 +58,8 @@ static FILE *fhnd_rec;
#define BYTES_PER_SAMPLE 2
+#define SIGNATURE PJMEDIA_PORT_SIGNATURE('C', 'O', 'N', 'F')
+#define SIGNATURE_PORT PJMEDIA_PORT_SIGNATURE('C', 'O', 'N', 'P')
#define NORMAL_LEVEL 128
#define SLOT_TYPE unsigned
#define INVALID_SLOT ((SLOT_TYPE)-1)
@@ -196,6 +199,8 @@ static pj_status_t put_frame(pjmedia_port *this_port,
const pjmedia_frame *frame);
static pj_status_t get_frame(pjmedia_port *this_port,
pjmedia_frame *frame);
+static pj_status_t get_frame_pasv(pjmedia_port *this_port,
+ pjmedia_frame *frame);
static pj_status_t destroy_port(pjmedia_port *this_port);
@@ -328,40 +333,56 @@ static pj_status_t create_conf_port( pj_pool_t *pool,
return PJ_SUCCESS;
}
+
/*
- * Create port zero for the sound device.
+ * Add passive port.
*/
-static pj_status_t create_sound_port( pj_pool_t *pool,
- pjmedia_conf *conf )
+static pj_status_t create_pasv_port( pjmedia_conf *conf,
+ pj_pool_t *pool,
+ const pj_str_t *name,
+ pjmedia_port *port,
+ struct conf_port **p_conf_port)
{
struct conf_port *conf_port;
- pj_str_t name = { "Master/sound", 12 };
unsigned i;
pj_status_t status;
-
-
/* Create port */
- status = create_conf_port(pool, conf, NULL, &name, &conf_port);
+ status = create_conf_port(pool, conf, port, name, &conf_port);
if (status != PJ_SUCCESS)
- goto on_error;
+ return status;
- /* Sound device has rx buffers. */
+ /* Passive port has rx buffers. */
for (i=0; i<RX_BUF_COUNT; ++i) {
conf_port->snd_buf[i] = pj_pool_zalloc(pool, conf->samples_per_frame *
sizeof(conf_port->snd_buf[0][0]));
if (conf_port->snd_buf[i] == NULL) {
- status = PJ_ENOMEM;
- goto on_error;
+ return PJ_ENOMEM;
}
}
conf_port->snd_write_pos = 0;
conf_port->snd_read_pos = 0;
+ *p_conf_port = conf_port;
+
+ return PJ_SUCCESS;
+}
+
+
+/*
+ * Create port zero for the sound device.
+ */
+static pj_status_t create_sound_port( pj_pool_t *pool,
+ pjmedia_conf *conf )
+{
+ struct conf_port *conf_port;
+ pj_str_t name = { "Master/sound", 12 };
+ pj_status_t status;
- /* Set to port zero */
- conf->ports[0] = conf_port;
- conf->port_cnt++;
+
+ status = create_pasv_port(conf, pool, &name, NULL, &conf_port);
+ if (status != PJ_SUCCESS)
+ return status;
/* Create sound device port: */
@@ -394,12 +415,13 @@ static pj_status_t create_sound_port( pj_pool_t *pool,
}
- PJ_LOG(5,(THIS_FILE, "Sound device successfully created for port 0"));
- return PJ_SUCCESS;
+ /* Add the port to the bridge */
+ conf->ports[0] = conf_port;
+ conf->port_cnt++;
-on_error:
- return status;
+ PJ_LOG(5,(THIS_FILE, "Sound device successfully created for port 0"));
+ return PJ_SUCCESS;
}
/*
@@ -415,6 +437,7 @@ PJ_DEF(pj_status_t) pjmedia_conf_create( pj_pool_t *pool,
pjmedia_conf **p_conf )
{
pjmedia_conf *conf;
+ const pj_str_t name = { "Conf", 4 };
pj_status_t status;
/* Can only accept 16bits per sample, for now.. */
@@ -442,26 +465,17 @@ PJ_DEF(pj_status_t) pjmedia_conf_create( pj_pool_t *pool,
conf->master_port = pj_pool_zalloc(pool, sizeof(pjmedia_port));
PJ_ASSERT_RETURN(conf->master_port, PJ_ENOMEM);
- conf->master_port->info.bits_per_sample = bits_per_sample;
- conf->master_port->info.bytes_per_frame = samples_per_frame *
- bits_per_sample / 8;
- conf->master_port->info.channel_count = channel_count;
- conf->master_port->info.encoding_name = pj_str("pcm");
- conf->master_port->info.has_info = 1;
- conf->master_port->info.name = pj_str("sound-dev");
- conf->master_port->info.need_info = 0;
- conf->master_port->info.pt = 0xFF;
- conf->master_port->info.clock_rate = clock_rate;
- conf->master_port->info.samples_per_frame = samples_per_frame;
- conf->master_port->info.signature = 0;
- conf->master_port->info.type = PJMEDIA_TYPE_AUDIO;
+ pjmedia_port_info_init(&conf->master_port->info, &name, SIGNATURE,
+ clock_rate, channel_count, bits_per_sample,
+ samples_per_frame);
+
+ conf->master_port->port_data.pdata = conf;
+ conf->master_port->port_data.ldata = 0;
conf->master_port->get_frame = &get_frame;
conf->master_port->put_frame = &put_frame;
conf->master_port->on_destroy = &destroy_port;
- conf->master_port->user_data = conf;
-
/* Create port zero for sound device. */
status = create_sound_port(pool, conf);
@@ -544,7 +558,7 @@ PJ_DEF(pj_status_t) pjmedia_conf_destroy( pjmedia_conf *conf )
*/
static pj_status_t destroy_port(pjmedia_port *this_port)
{
- pjmedia_conf *conf = this_port->user_data;
+ pjmedia_conf *conf = this_port->port_data.pdata;
return pjmedia_conf_destroy(conf);
}
@@ -632,6 +646,104 @@ PJ_DEF(pj_status_t) pjmedia_conf_add_port( pjmedia_conf *conf,
/*
+ * Add passive port.
+ */
+PJ_DEF(pj_status_t) pjmedia_conf_add_passive_port( pjmedia_conf *conf,
+ pj_pool_t *pool,
+ const pj_str_t *name,
+ unsigned clock_rate,
+ unsigned channel_count,
+ unsigned samples_per_frame,
+ unsigned bits_per_sample,
+ unsigned options,
+ unsigned *p_slot,
+ pjmedia_port **p_port )
+{
+ struct conf_port *conf_port;
+ pjmedia_port *port;
+ unsigned index;
+ pj_str_t tmp;
+ pj_status_t status;
+
+ PJ_ASSERT_RETURN(conf && pool, PJ_EINVAL);
+
+ /* For this version of PJMEDIA, port MUST have the same number of
+ * PCM channels.
+ */
+ if (channel_count != conf->channel_count) {
+ pj_assert(!"Number of channels mismatch");
+ return PJMEDIA_ENCCHANNEL;
+ }
+
+ /* For this version, options must be zero */
+ PJ_ASSERT_RETURN(options == 0, PJ_EINVAL);
+ PJ_UNUSED_ARG(options);
+
+ pj_mutex_lock(conf->mutex);
+
+ if (conf->port_cnt >= conf->max_ports) {
+ pj_assert(!"Too many ports");
+ pj_mutex_unlock(conf->mutex);
+ return PJ_ETOOMANY;
+ }
+
+ /* Find empty port in the conference bridge. */
+ for (index=0; index < conf->max_ports; ++index) {
+ if (conf->ports[index] == NULL)
+ break;
+ }
+
+ pj_assert(index != conf->max_ports);
+
+ if (name == NULL) {
+ name = &tmp;
+
+ tmp.ptr = pj_pool_alloc(pool, 20);
+ tmp.slen = pj_ansi_sprintf(tmp.ptr, "ConfPort#%d", index);
+ }
+
+ /* Create and initialize the media port structure. */
+ port = pj_pool_zalloc(pool, sizeof(pjmedia_port));
+ PJ_ASSERT_RETURN(port, PJ_ENOMEM);
+
+ pjmedia_port_info_init(&port->info, name, SIGNATURE_PORT,
+ clock_rate, channel_count, bits_per_sample,
+ samples_per_frame);
+
+ port->port_data.pdata = conf;
+ port->port_data.ldata = index;
+
+ port->get_frame = &get_frame_pasv;
+ port->put_frame = &put_frame;
+ port->on_destroy = NULL;
+
+
+ /* Create conf port structure. */
+ status = create_pasv_port(conf, pool, name, port, &conf_port);
+ if (status != PJ_SUCCESS) {
+ pj_mutex_unlock(conf->mutex);
+ return status;
+ }
+
+
+ /* Put the port. */
+ conf->ports[index] = conf_port;
+ conf->port_cnt++;
+
+ /* Done. */
+ if (p_slot)
+ *p_slot = index;
+ if (p_port)
+ *p_port = port;
+
+ pj_mutex_unlock(conf->mutex);
+
+ return PJ_SUCCESS;
+}
+
+
+
+/*
* Change TX and RX settings for the port.
*/
PJ_DECL(pj_status_t) pjmedia_conf_configure_port( pjmedia_conf *conf,
@@ -1362,7 +1474,7 @@ static pj_status_t write_port(pjmedia_conf *conf, struct conf_port *cport,
static pj_status_t get_frame(pjmedia_port *this_port,
pjmedia_frame *frame)
{
- pjmedia_conf *conf = this_port->user_data;
+ pjmedia_conf *conf = this_port->port_data.pdata;
unsigned ci, cj, i, j;
TRACE_((THIS_FILE, "- clock -"));
@@ -1418,10 +1530,10 @@ static pj_status_t get_frame(pjmedia_port *this_port,
}
/* Get frame from this port.
- * For port zero (sound port), get the frame from the rx_buffer
- * instead.
+ * For port zero (sound port) and passive ports, get the frame from
+ * the rx_buffer instead.
*/
- if (i==0) {
+ if (conf_port->port == NULL) {
pj_int16_t *snd_buf;
if (conf_port->snd_read_pos == conf_port->snd_write_pos) {
@@ -1615,13 +1727,24 @@ static pj_status_t get_frame(pjmedia_port *this_port,
/*
+ * get_frame() for passive port
+ */
+static pj_status_t get_frame_pasv(pjmedia_port *this_port,
+ pjmedia_frame *frame)
+{
+ pj_assert(0);
+ return -1;
+}
+
+
+/*
* Recorder callback.
*/
static pj_status_t put_frame(pjmedia_port *this_port,
const pjmedia_frame *frame)
{
- pjmedia_conf *conf = this_port->user_data;
- struct conf_port *snd_port = conf->ports[0];
+ pjmedia_conf *conf = this_port->port_data.pdata;
+ struct conf_port *port = conf->ports[this_port->port_data.ldata];
const pj_int16_t *input = frame->buf;
pj_int16_t *target_snd_buf;
@@ -1631,24 +1754,24 @@ static pj_status_t put_frame(pjmedia_port *this_port,
PJMEDIA_ENCSAMPLESPFRAME);
/* Skip if this port is muted/disabled. */
- if (snd_port->rx_setting != PJMEDIA_PORT_ENABLE) {
+ if (port->rx_setting != PJMEDIA_PORT_ENABLE) {
return PJ_SUCCESS;
}
/* Skip if no port is listening to the microphone */
- if (snd_port->listener_cnt == 0) {
+ if (port->listener_cnt == 0) {
return PJ_SUCCESS;
}
/* Determine which rx_buffer to fill in */
- target_snd_buf = snd_port->snd_buf[snd_port->snd_write_pos];
+ target_snd_buf = port->snd_buf[port->snd_write_pos];
/* Copy samples from audio device to target rx_buffer */
pjmedia_copy_samples(target_snd_buf, input, conf->samples_per_frame);
/* Switch buffer */
- snd_port->snd_write_pos = (snd_port->snd_write_pos+1)%RX_BUF_COUNT;
+ port->snd_write_pos = (port->snd_write_pos+1)%RX_BUF_COUNT;
return PJ_SUCCESS;
diff --git a/pjmedia/src/pjmedia/mem_capture.c b/pjmedia/src/pjmedia/mem_capture.c
index c009f223..e4c26f84 100644
--- a/pjmedia/src/pjmedia/mem_capture.c
+++ b/pjmedia/src/pjmedia/mem_capture.c
@@ -57,6 +57,7 @@ PJ_DECL(pj_status_t) pjmedia_mem_capture_create(pj_pool_t *pool,
pjmedia_port **p_port)
{
struct mem_rec *rec;
+ const pj_str_t name = { "memrec", 6 };
/* Sanity check */
PJ_ASSERT_RETURN(pool && buffer && size && clock_rate && channel_count &&
@@ -71,23 +72,15 @@ PJ_DECL(pj_status_t) pjmedia_mem_capture_create(pj_pool_t *pool,
PJ_ASSERT_RETURN(rec != NULL, PJ_ENOMEM);
/* Create the rec */
- rec->base.info.name = pj_str("memrec");
- rec->base.info.signature = SIGNATURE;
- rec->base.info.type = PJMEDIA_TYPE_AUDIO;
- rec->base.info.has_info = PJ_TRUE;
- rec->base.info.need_info = PJ_FALSE;
- rec->base.info.pt = 0xFF;
- rec->base.info.encoding_name = pj_str("pcm");
+ pjmedia_port_info_init(&rec->base.info, &name, SIGNATURE,
+ clock_rate, channel_count, bits_per_sample,
+ samples_per_frame);
+
rec->base.put_frame = &rec_put_frame;
rec->base.get_frame = &rec_get_frame;
rec->base.on_destroy = &rec_on_destroy;
- rec->base.info.clock_rate = clock_rate;
- rec->base.info.channel_count = channel_count;
- rec->base.info.bits_per_sample = bits_per_sample;
- rec->base.info.samples_per_frame = samples_per_frame;
- rec->base.info.bytes_per_frame = samples_per_frame * bits_per_sample / 2;
/* Save the buffer */
rec->buffer = rec->write_pos = (char*)buffer;
diff --git a/pjmedia/src/pjmedia/mem_player.c b/pjmedia/src/pjmedia/mem_player.c
index 7e7c41df..5bc82caf 100644
--- a/pjmedia/src/pjmedia/mem_player.c
+++ b/pjmedia/src/pjmedia/mem_player.c
@@ -58,6 +58,7 @@ PJ_DEF(pj_status_t) pjmedia_mem_player_create( pj_pool_t *pool,
pjmedia_port **p_port )
{
struct mem_player *port;
+ pj_str_t name = pj_str("memplayer");
/* Sanity check */
PJ_ASSERT_RETURN(pool && buffer && size && clock_rate && channel_count &&
@@ -72,23 +73,13 @@ PJ_DEF(pj_status_t) pjmedia_mem_player_create( pj_pool_t *pool,
PJ_ASSERT_RETURN(port != NULL, PJ_ENOMEM);
/* Create the port */
- port->base.info.name = pj_str("memplayer");
- port->base.info.signature = SIGNATURE;
- port->base.info.type = PJMEDIA_TYPE_AUDIO;
- port->base.info.has_info = PJ_TRUE;
- port->base.info.need_info = PJ_FALSE;
- port->base.info.pt = 0xFF;
- port->base.info.encoding_name = pj_str("pcm");
+ pjmedia_port_info_init(&port->base.info, &name, SIGNATURE, clock_rate,
+ channel_count, bits_per_sample, samples_per_frame);
port->base.put_frame = &mem_put_frame;
port->base.get_frame = &mem_get_frame;
port->base.on_destroy = &mem_on_destroy;
- port->base.info.clock_rate = clock_rate;
- port->base.info.channel_count = channel_count;
- port->base.info.bits_per_sample = bits_per_sample;
- port->base.info.samples_per_frame = samples_per_frame;
- port->base.info.bytes_per_frame = samples_per_frame * bits_per_sample / 2;
/* Save the buffer */
port->buffer = port->read_pos = (char*)buffer;
diff --git a/pjmedia/src/pjmedia/null_port.c b/pjmedia/src/pjmedia/null_port.c
index 497754c9..e345ce8e 100644
--- a/pjmedia/src/pjmedia/null_port.c
+++ b/pjmedia/src/pjmedia/null_port.c
@@ -23,6 +23,8 @@
#include <pj/string.h>
+#define SIGNATURE PJMEDIA_PORT_SIGNATURE('N', 'U', 'L', 'L')
+
static pj_status_t null_get_frame(pjmedia_port *this_port,
pjmedia_frame *frame);
static pj_status_t null_put_frame(pjmedia_port *this_port,
@@ -38,24 +40,15 @@ PJ_DEF(pj_status_t) pjmedia_null_port_create( pj_pool_t *pool,
pjmedia_port **p_port )
{
pjmedia_port *port;
+ const pj_str_t name = pj_str("null-port");
PJ_ASSERT_RETURN(pool && p_port, PJ_EINVAL);
port = pj_pool_zalloc(pool, sizeof(pjmedia_port));
PJ_ASSERT_RETURN(pool != NULL, PJ_ENOMEM);
- port->info.bits_per_sample = bits_per_sample;
- port->info.bytes_per_frame = samples_per_frame * bits_per_sample / 8;
- port->info.encoding_name = pj_str("pcm");
- port->info.has_info = 1;
- port->info.name = pj_str("null-port");
- port->info.need_info = 0;
- port->info.pt = 0xFF;
- port->info.clock_rate = sampling_rate;
- port->info.samples_per_frame = samples_per_frame;
- port->info.channel_count = channel_count;
- port->info.signature = 0x2411;
- port->info.type = PJMEDIA_TYPE_AUDIO;
+ pjmedia_port_info_init(&port->info, &name, SIGNATURE, sampling_rate,
+ channel_count, bits_per_sample, samples_per_frame);
port->get_frame = &null_get_frame;
port->put_frame = &null_put_frame;
diff --git a/pjmedia/src/pjmedia/resample_port.c b/pjmedia/src/pjmedia/resample_port.c
index 62d29d2b..dd1ca31d 100644
--- a/pjmedia/src/pjmedia/resample_port.c
+++ b/pjmedia/src/pjmedia/resample_port.c
@@ -24,6 +24,8 @@
#define BYTES_PER_SAMPLE 2
+#define SIGNATURE PJMEDIA_PORT_SIGNATURE('R','S','M','P')
+
struct resample_port
{
@@ -52,6 +54,7 @@ PJ_DEF(pj_status_t) pjmedia_resample_port_create( pj_pool_t *pool,
unsigned opt,
pjmedia_port **p_port )
{
+ const pj_str_t name = pj_str("resample");
struct resample_port *rport;
unsigned ptime;
pj_status_t status;
@@ -69,19 +72,9 @@ PJ_DEF(pj_status_t) pjmedia_resample_port_create( pj_pool_t *pool,
rport = pj_pool_zalloc(pool, sizeof(struct resample_port));
PJ_ASSERT_RETURN(rport != NULL, PJ_ENOMEM);
- rport->base.info.clock_rate = clock_rate;
- rport->base.info.samples_per_frame = clock_rate * ptime / 1000;
- rport->base.info.bytes_per_frame = rport->base.info.samples_per_frame *
- BYTES_PER_SAMPLE;
- rport->base.info.bits_per_sample = BYTES_PER_SAMPLE * 8;
- rport->base.info.channel_count = dn_port->info.channel_count;
- rport->base.info.encoding_name = pj_str("pcm");
- rport->base.info.has_info = 1;
- rport->base.info.name = pj_str("resample");
- rport->base.info.need_info = 0;
- rport->base.info.pt = 0xFF;
- rport->base.info.signature = PJMEDIA_PORT_SIGNATURE('R','S','M','P');
- rport->base.info.type = PJMEDIA_TYPE_AUDIO;
+ pjmedia_port_info_init(&rport->base.info, &name, SIGNATURE, clock_rate,
+ dn_port->info.channel_count, BYTES_PER_SAMPLE * 8,
+ clock_rate * ptime / 1000);
rport->dn_port = dn_port;
rport->options = opt;
diff --git a/pjmedia/src/pjmedia/splitcomb.c b/pjmedia/src/pjmedia/splitcomb.c
index 5130c73a..c6d6b451 100644
--- a/pjmedia/src/pjmedia/splitcomb.c
+++ b/pjmedia/src/pjmedia/splitcomb.c
@@ -24,6 +24,7 @@
#define SIGNATURE PJMEDIA_PORT_SIGNATURE('S', 'p', 'C', 'b')
+#define SIGNATURE_PORT PJMEDIA_PORT_SIGNATURE('S', 'p', 'C', 'P')
#define THIS_FILE "splitcomb.c"
#define TMP_SAMP_TYPE pj_int16_t
#define MAX_BUF_CNT 8
@@ -128,6 +129,7 @@ PJ_DEF(pj_status_t) pjmedia_splitcomb_create( pj_pool_t *pool,
unsigned options,
pjmedia_port **p_splitcomb)
{
+ const pj_str_t name = pj_str("splitcomb");
struct splitcomb *sc;
/* Sanity check */
@@ -160,18 +162,8 @@ PJ_DEF(pj_status_t) pjmedia_splitcomb_create( pj_pool_t *pool,
sc->options = options;
/* Initialize port */
- sc->base.info.name = pj_str("splitcomb");
- sc->base.info.signature = SIGNATURE;
- sc->base.info.type = PJMEDIA_TYPE_AUDIO;
- sc->base.info.has_info = PJ_TRUE;
- sc->base.info.need_info = PJ_FALSE;
- sc->base.info.pt = 0xFF;
- sc->base.info.encoding_name = pj_str("pcm");
- sc->base.info.clock_rate = clock_rate;
- sc->base.info.channel_count = channel_count;
- sc->base.info.bits_per_sample = bits_per_sample;
- sc->base.info.samples_per_frame = samples_per_frame;
- sc->base.info.bytes_per_frame = samples_per_frame * bits_per_sample / 8;
+ pjmedia_port_info_init(&sc->base.info, &name, SIGNATURE, clock_rate,
+ channel_count, bits_per_sample, samples_per_frame);
sc->base.put_frame = &put_frame;
sc->base.get_frame = &get_frame;
@@ -226,6 +218,7 @@ pjmedia_splitcomb_create_rev_channel( pj_pool_t *pool,
unsigned options,
pjmedia_port **p_chport)
{
+ const pj_str_t name = pj_str("splitcomb-ch");
struct splitcomb *sc = (struct splitcomb*) splitcomb;
struct reverse_port *rport;
unsigned i;
@@ -250,20 +243,11 @@ pjmedia_splitcomb_create_rev_channel( pj_pool_t *pool,
/* Initialize port info... */
port = &rport->base;
- port->info.name = pj_str("splitcomb-ch");
- port->info.signature = 0;
- port->info.type = PJMEDIA_TYPE_AUDIO;
- port->info.has_info = PJ_TRUE;
- port->info.need_info = PJ_FALSE;
- port->info.pt = 0xFF;
- port->info.encoding_name = pj_str("pcm");
- port->info.clock_rate = splitcomb->info.clock_rate;
- port->info.channel_count = 1;
- port->info.bits_per_sample = splitcomb->info.bits_per_sample;
- port->info.samples_per_frame = splitcomb->info.samples_per_frame /
- splitcomb->info.channel_count;
- port->info.bytes_per_frame = port->info.samples_per_frame *
- port->info.bits_per_sample / 8;
+ pjmedia_port_info_init(&port->info, &name, SIGNATURE_PORT,
+ splitcomb->info.clock_rate, 1,
+ splitcomb->info.bits_per_sample,
+ splitcomb->info.samples_per_frame /
+ splitcomb->info.channel_count);
/* ... and the callbacks */
port->put_frame = &rport_put_frame;
diff --git a/pjmedia/src/pjmedia/stream.c b/pjmedia/src/pjmedia/stream.c
index f14683f8..fc0b7cb4 100644
--- a/pjmedia/src/pjmedia/stream.c
+++ b/pjmedia/src/pjmedia/stream.c
@@ -143,7 +143,7 @@ static void stream_perror(const char *sender, const char *title,
*/
static pj_status_t get_frame( pjmedia_port *port, pjmedia_frame *frame)
{
- pjmedia_stream *stream = port->user_data;
+ pjmedia_stream *stream = port->port_data.pdata;
pjmedia_channel *channel = stream->dec;
unsigned samples_count, samples_per_frame, samples_required;
pj_int16_t *p_out_samp;
@@ -438,7 +438,7 @@ static void check_tx_rtcp(pjmedia_stream *stream, pj_uint32_t timestamp)
static pj_status_t put_frame( pjmedia_port *port,
const pjmedia_frame *frame )
{
- pjmedia_stream *stream = port->user_data;
+ pjmedia_stream *stream = port->port_data.pdata;
pjmedia_channel *channel = stream->enc;
pj_status_t status = 0;
struct pjmedia_frame frame_out;
@@ -913,6 +913,7 @@ PJ_DEF(pj_status_t) pjmedia_stream_create( pjmedia_endpt *endpt,
{
pjmedia_stream *stream;
+ pj_str_t name;
unsigned jb_init, jb_max, jb_min_pre, jb_max_pre;
pj_status_t status;
@@ -925,21 +926,24 @@ PJ_DEF(pj_status_t) pjmedia_stream_create( pjmedia_endpt *endpt,
PJ_ASSERT_RETURN(stream != NULL, PJ_ENOMEM);
/* Init stream/port name */
- stream->port.info.name.ptr = pj_pool_alloc(pool, 24);
- pj_ansi_sprintf(stream->port.info.name.ptr,
- "strm%p", stream);
- stream->port.info.name.slen = pj_ansi_strlen(stream->port.info.name.ptr);
+ name.ptr = pj_pool_alloc(pool, 24);
+ name.slen = pj_ansi_snprintf(name.ptr, 24, "strm%p", stream);
+
+
+ /* Init some port-info. Some parts of the info will be set later
+ * once we have more info about the codec.
+ */
+ pjmedia_port_info_init(&stream->port.info, &name,
+ PJMEDIA_PORT_SIGNATURE('S', 'T', 'R', 'M'),
+ info->fmt.clock_rate, info->fmt.channel_cnt,
+ 16, 80);
/* Init port. */
- stream->port.info.signature = ('S'<<3 | 'T'<<2 | 'R'<<1 | 'M');
- stream->port.info.type = PJMEDIA_TYPE_AUDIO;
- stream->port.info.has_info = 1;
- stream->port.info.need_info = 0;
- stream->port.info.pt = info->fmt.pt;
+
pj_strdup(pool, &stream->port.info.encoding_name, &info->fmt.encoding_name);
stream->port.info.clock_rate = info->fmt.clock_rate;
stream->port.info.channel_count = info->fmt.channel_cnt;
- stream->port.user_data = stream;
+ stream->port.port_data.pdata = stream;
stream->port.put_frame = &put_frame;
stream->port.get_frame = &get_frame;
diff --git a/pjmedia/src/pjmedia/wav_player.c b/pjmedia/src/pjmedia/wav_player.c
index 526bf9fe..d2e7204b 100644
--- a/pjmedia/src/pjmedia/wav_player.c
+++ b/pjmedia/src/pjmedia/wav_player.c
@@ -77,33 +77,24 @@ static pj_status_t file_on_destroy(pjmedia_port *this_port);
static struct file_port *create_file_port(pj_pool_t *pool)
{
+ const pj_str_t name = pj_str("file");
struct file_port *port;
port = pj_pool_zalloc(pool, sizeof(struct file_port));
if (!port)
return NULL;
- port->base.info.name = pj_str("file");
- port->base.info.signature = SIGNATURE;
- port->base.info.type = PJMEDIA_TYPE_AUDIO;
- port->base.info.has_info = PJ_TRUE;
- port->base.info.need_info = PJ_FALSE;
- port->base.info.pt = 0xFF;
- port->base.info.encoding_name = pj_str("pcm");
+ /* Put in default values.
+ * These will be overriden once the file is read.
+ */
+ pjmedia_port_info_init(&port->base.info, &name, SIGNATURE,
+ 8000, 1, 16, 80);
port->base.put_frame = &file_put_frame;
port->base.get_frame = &file_get_frame;
port->base.on_destroy = &file_on_destroy;
- /* Put in default values.
- * These will be overriden once the file is read.
- */
- port->base.info.clock_rate = 8000;
- port->base.info.bits_per_sample = 16;
- port->base.info.samples_per_frame = 160;
- port->base.info.bytes_per_frame = 320;
-
return port;
}
@@ -150,7 +141,7 @@ static pj_status_t fill_buffer(struct file_port *fport)
fport->base.info.name.ptr));
fport->eof = PJ_TRUE;
- status = (*fport->cb)(&fport->base, fport->base.user_data);
+ status=(*fport->cb)(&fport->base,fport->base.port_data.pdata);
if (status != PJ_SUCCESS) {
/* This will crash if file port is destroyed in the
* callback, that's why we set the eof flag before
@@ -424,7 +415,7 @@ pjmedia_wav_player_set_eof_cb( pjmedia_port *port,
fport = (struct file_port*) port;
- fport->base.user_data = user_data;
+ fport->base.port_data.pdata = user_data;
fport->cb = cb;
return PJ_SUCCESS;
diff --git a/pjmedia/src/pjmedia/wav_writer.c b/pjmedia/src/pjmedia/wav_writer.c
index d1e4eec8..293c214a 100644
--- a/pjmedia/src/pjmedia/wav_writer.c
+++ b/pjmedia/src/pjmedia/wav_writer.c
@@ -69,6 +69,7 @@ PJ_DEF(pj_status_t) pjmedia_wav_writer_port_create( pj_pool_t *pool,
struct file_port *fport;
pjmedia_wave_hdr wave_hdr;
pj_ssize_t size;
+ pj_str_t name;
pj_status_t status;
PJ_UNUSED_ARG(flags);
@@ -86,20 +87,11 @@ PJ_DEF(pj_status_t) pjmedia_wav_writer_port_create( pj_pool_t *pool,
PJ_ASSERT_RETURN(fport != NULL, PJ_ENOMEM);
/* Initialize port info. */
- fport->base.info.bits_per_sample = bits_per_sample;
- fport->base.info.bytes_per_frame = samples_per_frame * bits_per_sample *
- channel_count / 8;
- fport->base.info.channel_count = channel_count;
- fport->base.info.encoding_name = pj_str("pom");
- fport->base.info.has_info = 1;
- pj_strdup2(pool, &fport->base.info.name, filename);
- fport->base.info.need_info = 0;
- fport->base.info.pt = 0xFF;
- fport->base.info.clock_rate = sampling_rate;
- fport->base.info.samples_per_frame = samples_per_frame;
- fport->base.info.signature = SIGNATURE;
- fport->base.info.type = PJMEDIA_TYPE_AUDIO;
-
+ pj_strdup2(pool, &name, filename);
+ pjmedia_port_info_init(&fport->base.info, &name, SIGNATURE,
+ sampling_rate, channel_count, bits_per_sample,
+ samples_per_frame);
+
fport->base.get_frame = &file_get_frame;
fport->base.put_frame = &file_put_frame;
fport->base.on_destroy = &file_on_destroy;
@@ -220,7 +212,7 @@ pjmedia_wav_writer_port_set_cb( pjmedia_port *port,
fport = (struct file_port*) port;
fport->cb_size = pos;
- fport->base.user_data = user_data;
+ fport->base.port_data.pdata = user_data;
fport->cb = cb;
return PJ_SUCCESS;
@@ -293,7 +285,7 @@ static pj_status_t file_put_frame(pjmedia_port *this_port,
cb = fport->cb;
fport->cb = NULL;
- status = (*cb)(this_port, this_port->user_data);
+ status = (*cb)(this_port, this_port->port_data.pdata);
return status;
}