Home --> Documentations --> PJMEDIA Reference
Extensible framework for media terminations.
More...
|
#define | DEPRECATED_FOR_TICKET_2251 0 |
|
#define | PJMEDIA_PORT_SIG(a, b, c, d) PJMEDIA_OBJ_SIG(a,b,c,d) |
|
|
unsigned | PJMEDIA_PIA_SRATE (const pjmedia_port_info *pia) |
|
unsigned | PJMEDIA_PIA_CCNT (const pjmedia_port_info *pia) |
|
unsigned | PJMEDIA_PIA_BITS (const pjmedia_port_info *pia) |
|
unsigned | PJMEDIA_PIA_PTIME (const pjmedia_port_info *pia) |
|
unsigned | PJMEDIA_PIA_SPF (const pjmedia_port_info *pia) |
|
unsigned | PJMEDIA_PIA_AVG_BPS (const pjmedia_port_info *pia) |
|
unsigned | PJMEDIA_PIA_MAX_BPS (const pjmedia_port_info *pia) |
|
unsigned | PJMEDIA_PIA_AVG_FSZ (const pjmedia_port_info *pia) |
|
unsigned | PJMEDIA_PIA_MAX_FSZ (const pjmedia_port_info *pia) |
|
pj_status_t | pjmedia_port_info_init (pjmedia_port_info *info, const pj_str_t *name, unsigned signature, unsigned clock_rate, unsigned channel_count, unsigned bits_per_sample, unsigned samples_per_frame) |
|
pj_status_t | pjmedia_port_info_init2 (pjmedia_port_info *info, const pj_str_t *name, unsigned signature, pjmedia_dir dir, const pjmedia_format *fmt) |
|
pjmedia_clock_src * | pjmedia_port_get_clock_src (pjmedia_port *port, pjmedia_dir dir) |
|
pj_status_t | pjmedia_port_get_frame (pjmedia_port *port, pjmedia_frame *frame) |
|
pj_status_t | pjmedia_port_put_frame (pjmedia_port *port, pjmedia_frame *frame) |
|
pj_status_t | pjmedia_port_destroy (pjmedia_port *port) |
|
pj_status_t | pjmedia_port_init_grp_lock (pjmedia_port *port, pj_pool_t *pool, pj_grp_lock_t *glock) |
|
pj_status_t | pjmedia_port_add_ref (pjmedia_port *port) |
|
pj_status_t | pjmedia_port_dec_ref (pjmedia_port *port) |
|
Media Port Concepts
Media Port
A media port (represented with pjmedia_port "class") provides a generic and extensible framework for implementing media elements. Media element itself could be a media source, sink, or processing element. A media port interface basically has the following properties:
- media port information (pjmedia_port_info) to describe the media port properties (sampling rate, number of channels, etc.),
- optional pointer to function to acquire frames from the port (the
get_frame() interface), which will be called by pjmedia_port_get_frame() public API, and
- optional pointer to function to store frames to the port (the
put_frame() interface) which will be called by pjmedia_port_put_frame() public API.
The get_frame() and put_frame() interface of course would only need to be implemented if the media port emits and/or takes media frames respectively.
Media ports are passive "objects". By default, there is no worker thread to run the media flow. Applications (or other PJMEDIA components, as explained in Clock/Timing) must actively call pjmedia_port_get_frame() or pjmedia_port_put_frame() from/to the media port in order to retrieve/store media frames.
Some media ports (such as Conference Bridge and Resample Port) may be interconnected with (or encapsulate) other port, to perform the combined task of the ports, while some others represent the ultimate source/sink termination for the media. Interconnection means the upstream media port will call get_frame() and put_frame() to its downstream media port. For this to happen, the media ports need to have the same format, where format is defined as combination of sample format, clock rate, channel count, bits per sample, and samples per frame for audio media.
Example: Manual Resampling
For example, suppose application wants to convert the sampling rate of one WAV file to another. In this case, application would create and arrange media ports connection as follows:
Application would setup the media ports using the following pseudo- code:
"Input.WAV",
20,
0,
NULL,
&player );
0, &resample);
"Output.WAV",
resample-> info.clock_rate,
resample-> info.channel_count,
resample-> info.samples_per_frame,
resample-> info.bits_per_sample,
0,
0,
NULL,
&writer);
#define PJ_ASSERT_RETURN(expr, retval)
After the ports have been set up, application can perform the conversion process by running this loop:
while (1) {
frame. size = sizeof(samplebuf);
break;
}
break;
}
}
For the sake of completeness, after the resampling process is done, application would need to destroy the ports:
The above steps are okay for our simple purpose of changing file's sampling rate. But for other purposes, the process of reading and writing frames need to be done in timely manner (for example, sending RTP packets to remote stream). And more over, as the application's scope goes bigger, the same pattern of manually reading/writing frames comes up more and more often, thus perhaps it would be better if PJMEDIA provides mechanism to automate this process.
And indeed PJMEDIA does provide such mechanism, which is described in Clock/Timing section.
Automating Media Flow
PJMEDIA provides few mechanisms to make media flows automatically among media ports. This concept is described in Clock/Timing section.
◆ PJMEDIA_PORT_SIG
#define PJMEDIA_PORT_SIG |
( |
|
a, |
|
|
|
b, |
|
|
|
c, |
|
|
|
d |
|
) |
| PJMEDIA_OBJ_SIG(a,b,c,d) |
Create 32bit port signature from ASCII characters.
◆ pjmedia_port_op
Port operation setting.
Enumerator |
---|
PJMEDIA_PORT_NO_CHANGE | No change to the port TX or RX settings.
|
PJMEDIA_PORT_DISABLE | TX or RX is disabled from the port. It means get_frame() or put_frame() WILL NOT be called for this port.
|
PJMEDIA_PORT_MUTE | TX or RX is muted, which means that get_frame() or put_frame() will still be called, but the audio frame is discarded.
|
PJMEDIA_PORT_ENABLE | Enable TX and RX to/from this port.
|
◆ PJMEDIA_PIA_SRATE()
◆ PJMEDIA_PIA_CCNT()
◆ PJMEDIA_PIA_BITS()
◆ PJMEDIA_PIA_PTIME()
◆ PJMEDIA_PIA_SPF()
◆ PJMEDIA_PIA_AVG_BPS()
This is a utility routine to retrieve the average bitrate value from port info.
- Parameters
-
pia | Pointer to port info containing audio format. |
- Returns
- Bitrate, in bits per second.
References pjmedia_format::aud, pjmedia_audio_format_detail::avg_bps, pjmedia_format::det, pjmedia_format::detail_type, pjmedia_port_info::fmt, pj_assert, PJ_INLINE, PJMEDIA_FORMAT_DETAIL_AUDIO, PJMEDIA_TYPE_AUDIO, and pjmedia_format::type.
◆ PJMEDIA_PIA_MAX_BPS()
This is a utility routine to retrieve the maximum bitrate value from port info.
- Parameters
-
pia | Pointer to port info containing audio format. |
- Returns
- Bitrate, in bits per second.
References pjmedia_format::aud, pjmedia_format::det, pjmedia_format::detail_type, pjmedia_port_info::fmt, pjmedia_audio_format_detail::max_bps, pj_assert, PJ_INLINE, PJMEDIA_FORMAT_DETAIL_AUDIO, PJMEDIA_TYPE_AUDIO, and pjmedia_format::type.
◆ PJMEDIA_PIA_AVG_FSZ()
◆ PJMEDIA_PIA_MAX_FSZ()
◆ pjmedia_port_info_init()
pj_status_t pjmedia_port_info_init |
( |
pjmedia_port_info * |
info, |
|
|
const pj_str_t * |
name, |
|
|
unsigned |
signature, |
|
|
unsigned |
clock_rate, |
|
|
unsigned |
channel_count, |
|
|
unsigned |
bits_per_sample, |
|
|
unsigned |
samples_per_frame |
|
) |
| |
This is an auxiliary function to initialize port info for ports which deal with PCM audio.
- Parameters
-
info | The port info to be initialized. |
name | Port name. |
signature | Port signature. |
clock_rate | Port's clock rate. |
channel_count | Number of channels. |
bits_per_sample | Bits per sample. |
samples_per_frame | Number of samples per frame. |
- Returns
- PJ_SUCCESS on success.
◆ pjmedia_port_info_init2()
This is an auxiliary function to initialize port info for ports which deal with PCM audio.
- Parameters
-
info | The port info to be initialized. |
name | Port name. |
signature | Port signature. |
dir | Port's direction. |
fmt | Port's media format. |
- Returns
- PJ_SUCCESS on success.
◆ pjmedia_port_get_clock_src()
Get a clock source from the port.
- Parameters
-
port | The media port. |
dir | Media port's direction. |
- Returns
- The clock source or NULL if clock source is not present in the port.
◆ pjmedia_port_get_frame()
Get a frame from the port (and subsequent downstream ports).
- Parameters
-
port | The media port. |
frame | Frame to store samples. |
- Returns
- PJ_SUCCESS on success, or the appropriate error code.
◆ pjmedia_port_put_frame()
Put a frame to the port (and subsequent downstream ports).
- Parameters
-
port | The media port. |
frame | Frame to the put to the port. |
- Returns
- PJ_SUCCESS on success, or the appropriate error code.
◆ pjmedia_port_destroy()
Destroy port (and subsequent downstream ports).
Note that if the port has group lock, instead of destroying the port immediately, this function will just decrease the reference counter.
- Parameters
-
- Returns
- PJ_SUCCESS on success, or the appropriate error code.
◆ pjmedia_port_init_grp_lock()
This is a helper function to initialize the port's group lock. This function will create a group lock if NULL is passed, initialize the group lock by adding the port's destructor to the group lock handler list, and increment the reference counter.
This function should only be called by a media port implementation and after port's on_destroy() function has been assigned.
- Parameters
-
port | The pjmedia port to be initialized. |
pool | The pool, this can be a temporary pool as group lock will create and use its internal pool. |
glock | The group lock, or create a new one if NULL. |
- Returns
- PJ_SUCCESS on success, PJ_EEXISTS if group lock is already initialized, or the other appropriate error code.
◆ pjmedia_port_add_ref()
This is a helper function to increase the port reference counter.
- Parameters
-
- Returns
- PJ_SUCCESS on success.
◆ pjmedia_port_dec_ref()
This is a helper function to decrease the port reference counter.
- Parameters
-
- Returns
- PJ_SUCCESS on success.
References PJ_END_DECL.
PJMEDIA small footprint Open Source media stack
Copyright (C) 2006-2008 Teluu Inc.
|