= Release 0.9 = == New Features and Enhancements == Many new features have been implemented on this release. === Audio quality improvements === This release contains many improvements to stability, latency, and in general quality of audio: * Implementation of Waveform Similarity Based Overlap-Add (WSOLA) algorithm (ticket #497) which provides the base algorithm for buffer expansion/compression and packet loss concealment. * Ticket #438 fixed many problems related to audio impairments: - fixed the click noise produced by splitcomb or conference bridge upon underflow/overflow situation (which normally happens when there is drift in audio device) - much better buffering in splitcomb and conference bridge, with the ability to learn the optimal buffer length and shrinking/extending the buffer as necessary without degrading audio quality too much. * New conference mixing algorithm which does not weaken the signal unlike to old algorithm (ticket #449) * New packet loss concealment for G.711 and GSM codec (ticket #502) * Boost the priority of master port/splitcomb to avoid audio disruption because of CPU usage (ticket #501) * Optimize the delay in the jitter buffer (ticket #505) * Much better stereo support all the way, including support for mixing ports with different channel number in the conference bridge (ticket #504) === Secure RTP (SRTP) === SRTP have been implemented and it is available for all platforms including Symbian and Windows Mobile. The implementation uses [http://srtp.sourceforge.net/srtp.html libsrtp], and SDES is used for the key exchange. === G.722 codec === The G.722 codec is now included in the standard source distribution and it is available for all platforms. === TURN Relay support === TURN has been implemented. The implementation is based on [http://tools.ietf.org/html/draft-ietf-behave-turn-07 draft-ietf-behave-turn-07] draft and with the default settings should be compatible with the newly released [http://tools.ietf.org/html/draft-ietf-behave-turn-08 draft-ietf-behave-turn-08] draft. In addition to integration with ICE all the way up to PJSUA-LIB and pjsua sample application, simple command line TURN client and server implementation samples are provided. === ICE enhancements === The SDP offer/answer procedures related to ICE have been enhanced and should now comply to the latest [http://tools.ietf.org/html/draft-ietf-mmusic-ice-19 draft-ietf-mmusic-ice-19] draft. === IPv6 Support === Support for IPv6 has been added in PJLIB, PJSIP, and PJMEDIA libraries. However some features are still missing, such as asynchronous DNS AAAA resolution and IPv6 support in pjsua sample application. === RTCP XR support === Support for subset of RTCP XR (RFC 3611) has been implemented (see ticket #513) === Improved Windows Mobile sample application === A new and more usable sample application !PocketPJ has been provided for !PocketPC/Windows Mobile based platforms. === Improved Symbian support === Carbide C++ is now supported, and a [wiki:DevelopingSymbianAppWithCarbide tutorial on developing PJSIP application with Carbide C++] is provided. More codecs have been ported to Symbian, including GSM and Speex. === !ActiveSocket Framework === The new [http://www.pjsip.org/pjlib/docs/html/group__PJ__ACTIVESOCK.htm ActiveSocket] framework in PJLIB provides higher and easier to use abstraction to create asynchronous sockets, utilizing PJLIB's [http://www.pjsip.org/pjlib/docs/html/group__PJ__IOQUEUE.htm ioqueue]. === More Thorough Tests === Last but not least, in addition to existing tests for each library, 100+ automated test scripts have been added to test PJSUA-LIB to test functionality, conformance, and quality of various parts of the library. [[BR]] [[BR]] == (In)Compatibility Info == #changes === PJLIB === [http://www.pjsip.org/pjlib/docs/html/group__pj__config.htm Config] ({{{config.h}}}): :: - New settings: - PJ_HAS_IPV6 (default 0) - PJ_IOQUEUE_DEFAULT_ALLOW_CONCURRENCY - PJ_FD_SETSIZE_SETABLE [http://www.pjsip.org/pjlib/docs/html/group__pj__math.htm Math and statistic functions] ({{{math.h}}}): :: - New file [http://www.pjsip.org/pjlib/docs/html/group__PJ__SOCK.htm Socket] ({{{sock.h}}}): :: - The {{{struct pj_in6_addr}}} has been changed to {{{union pj_in6_addr}}}. - Member names changes in {{{struct pj_sockaddr_in6}}}. - New functions: - pj_sockaddr_init() - pj_inet_pton() - pj_inet_ntop() - pj_inet_ntop2() - pj_sockaddr_print() - pj_sockaddr_cmp() - pj_sockaddr_get_addr() - pj_sockaddr_has_addr() - pj_sockaddr_get_addr_len() - pj_sockaddr_get_len() - pj_sockaddr_copy_addr() - pj_sockaddr_cp() - pj_sockaddr_set_str_addr() - and pj_sockaddr_get_port() - New constants: - PJ_INET_ADDRSTRLEN - PJ_INET6_ADDRSTRLEN. [http://www.pjsip.org/pjlib/docs/html/group__PJ__ACTIVESOCK.htm ActiveSocket] ({{{activesock.h.h}}}): :: - New file [http://www.pjsip.org/pjlib/docs/html/group__pj__addr__resolve.htm Address resolution] ({{{addr_resolv.h}}}): :: - {{{pj_gethostip()}}} now takes additional address family parameter - New functions: - pj_getdefaultipinterface() - pj_getaddrinfo() [http://www.pjsip.org/pjlib/docs/html/group__PJ__PSTR.htm String] ({{{string.h}}}): :: - New functions: - pj_strstr() - pj_stristr() [http://www.pjsip.org/pjlib/docs/html/group__PJ__THREAD.htm Thread] ({{{os.h}}}): :: - New functions: - pj_thread_get_prio() - pj_thread_set_prio() - pj_thread_get_prio_min() - pj_thread_get_prio_max() - pj_thread_get_os_handle() [http://www.pjsip.org/pjlib/docs/html/group__pj__ip__helper.htm IP Helper] ({{{ip_helper.h}}}): :: - The {{{pj_enum_ip_interface()}}} now takes additional address family parameter [http://www.pjsip.org/pjlib/docs/html/group__PJ__IOQUEUE.htm IOqueue] ({{{ioqueue.h}}}): :: - New functions: - pj_ioqueue_set_default_concurrency() - pj_ioqueue_set_concurrency() - pj_ioqueue_lock_key() - pj_ioqueue_unlock_key() === PJLIB-UTIL === [http://www.pjsip.org/pjlib-util/docs/html/group__PJ__DNS__SERVER.htm DNS Server] ({{{dns_server.h}}}): :: - New file [http://www.pjsip.org/pjlib-util/docs/html/group__PJ__PCAP.htm PCAP File Format Support] ({{{pcap.h}}}): :: - New file [http://www.pjsip.org/pjlib-util/docs/html/group__PJ__DNS__PARSING.htm DNS] ({{{dns.h}}}): :: - New helper functions: - pj_dns_init_srv_rr() - pj_dns_init_cname_rr() - pj_dns_init_a_rr() === PJNATH === [http://www.pjsip.org/pjnath/docs/html/group__PJNATH__TURN__SESSION.htm Transport Independent TURN Session] ({{{turn_session.h}}}): :: - New file [http://www.pjsip.org/pjnath/docs/html/group__PJNATH__TURN__SOCK.htm TURN Client Socket/Transport] ({{{turn_sock.h}}}): :: - New file [http://www.pjsip.org/pjnath/docs/html/group__PJNATH__STUN__SOCK.htm STUN Client Socket/Transport] ({{{stun_sock.h}}}): :: - New file [http://www.pjsip.org/pjnath/docs/html/group__PJNATH__ICE__STREAM__TRANSPORT.htm ICE Stream Transport] ({{{ice_strans.h}}}): :: - Initialization sequence has changed. Now all required parameters (STUN and TURN settings) are wrapped in {{{struct pj_ice_strans_cfg}}} and passed to {{{pj_ice_strans_create()}}}. The {{{pj_ice_strans_set_stun_domain()}}} and {{{pj_ice_strans_set_stun_srv()}}} functions have been removed. - The {{{struct pj_ice_strans}}} is no longer visible in the API, and various accessor functions have been added [http://www.pjsip.org/pjnath/docs/html/group__PJNATH__STUN__AUTH.htm STUN Authentication] ({{{stun_auth.h}}}): :: - API change [http://www.pjsip.org/pjnath/docs/html/group__PJNATH__STUN__SESSION.htm Transport Independent STUN Session] ({{{stun_session.h}}}): :: - Changes to all API's [http://www.pjsip.org/pjnath/docs/html/group__PJNATH__STUN__MSG.htm STUN Messaging] ({{{stun_msg.h}}}): :: - Addition and removal of STUN methods and attributes to support latest STUN, TURN, and ICE drafts. - Minor changes to parameter types in {{{pj_stun_msg_encode()}}} - Minor changes to parameter types in {{{pj_stun_msg_check()}}} - Minor changes to parameter types in {{{pj_stun_msg_decode()}}} - New functions: - pj_stun_msg_init() - pj_stun_msg_clone() - pj_stun_attr_clone() - pj_stun_sockaddr_attr_init() - pj_stun_string_attr_init() - pj_stun_binary_attr_init() [http://www.pjsip.org/pjnath/docs/html/group__PJNATH__ICE__SESSION.htm Transport Independent ICE Session] ({{{ice_sess.h}}}): :: - The addition of {{{transport_id}}} parameter in: - {{{pj_ice_sess_add_cand()}}} - {{{pj_ice_sess_on_rx_pkt()}}} - {{{on_tx_pkt()}}} callback - {{{on_rx_data()}}} callback [http://www.pjsip.org/pjnath/docs/html/group__PJNATH__CONFIG.htm Configuration] ({{{config.h}}}): :: - New settings: - PJ_STUN_SOCK_PKT_LEN - PJ_STUN_KEEP_ALIVE_SEC - PJ_TURN_MAX_DNS_SRV_CNT - PJ_TURN_MAX_PKT_LEN - PJ_TURN_PERM_TIMEOUT - PJ_TURN_CHANNEL_TIMEOUT - PJ_TURN_REFRESH_SEC_BEFORE - PJ_TURN_KEEP_ALIVE_SEC - PJ_ICE_COMP_BITS - PJ_ICE_CAND_TYPE_PREF_BITS - PJ_ICE_LOCAL_PREF_BITS - New settings to control pool size: - PJNATH_POOL_LEN_ICE_SESS - PJNATH_POOL_INC_ICE_SESS - PJNATH_POOL_LEN_ICE_STRANS - PJNATH_POOL_INC_ICE_STRANS - PJNATH_POOL_LEN_NATCK - PJNATH_POOL_INC_NATCK - PJNATH_POOL_LEN_STUN_SESS - PJNATH_POOL_INC_STUN_SESS - PJNATH_POOL_LEN_STUN_TDATA - PJNATH_POOL_INC_STUN_TDATA === PJMEDIA === [http://www.pjsip.org/pjmedia/docs/html/group__PJMEDIA__CONFIG.htm Configurations] ({{{config.h}}}): :: - The value of {{{PJMEDIA_CODEC_MAX_SILENCE_PERIOD}}} has been changed from timestamps to milliseconds. - Deprecated settings: - PJMEDIA_PASOUND_MAX_LATENCY - PJMEDIA_HAS_STEVEU_PLC - New settings: - PJMEDIA_SND_DEFAULT_REC_LATENCY (100) - PJMEDIA_SND_DEFAULT_PLAY_LATENCY (100) - PJMEDIA_SOUND_USE_DELAYBUF (0) - PJMEDIA_WSOLA_IMP (1) - PJMEDIA_HAS_RTCP_XR (0) - PJMEDIA_STREAM_ENABLE_XR (0) - PJMEDIA_USE_HIGH_QUALITY_TONEGEN (1) - PJMEDIA_HAS_SRTP (1) - PJMEDIA_HANDLE_G722_MPEG_BUG (1) - PJMEDIA_TRANSPORT_SPECIFIC_INFO_MAXCNT (4) - PJMEDIA_TRANSPORT_SPECIFIC_INFO_MAXSIZE (16*sizeof(long)) [http://www.pjsip.org/pjmedia/docs/html/group__PJMEDIA__STEREO.htm Mono-Stereo-Multichannel Frame Converter] ({{{stereo.h}}}): :: - New file [http://www.pjsip.org/pjmedia/docs/html/group__PJMED__RTCP__XR.htm RTCP XR/Extended Report] ({{{rtcp_xr.h}}}): :: - New file [http://www.pjsip.org/pjmedia/docs/html/group__PJMED__WSOLA.htm Waveform Similarity Overlap-Add] ({{{wsola.h}}}): :: - New file [http://www.pjsip.org/pjmedia/docs/html/group__PJMED__DELAYBUF.htm Adaptive Delay Buffer] ({{{delaybuf.h}}}): :: - New file [http://www.pjsip.org/pjmedia/docs/html/group__PJMEDIA__CLOCK.htm Clock Generator] ({{{clock.h}}}): :: - Added {{{channel_count}}} parameter to {{{pjmedia_clock_create()}}} [http://www.pjsip.org/pjmedia/docs/html/group__PJMEDIA__TRANSPORT.htm Media Transport] ({{{transport.h}}}): :: - The media transport API has been changed. New functions to interact with SDP have been added. - The {{{pjmedia_transport_get_info()}}} parameter has changed. - New functions: - pjmedia_transport_send_rtcp2() - pjmedia_transport_media_create() - pjmedia_transport_encode_sdp() - pjmedia_transport_media_start() - pjmedia_transport_media_stop() - pjmedia_transport_simulate_lost() [http://www.pjsip.org/pjmedia/docs/html/group__PJMEDIA__TRANSPORT__UDP.htm UDP Transport] ({{{transport_udp.h}}}): :: - Added {{{pjmedia_transport_udp_create3()}}} to specify address family when creating the media transport. This is to support IPv6. - Removed these functions as they are now part of media transport API: - pjmedia_transport_udp_simulate_lost() - pjmedia_transport_udp_close() [http://www.pjsip.org/pjmedia/docs/html/group__PJMEDIA__TRANSPORT__SRTP.htm Secure RTP (SRTP) Transport] ({{{transport_srtp.h}}}): :: - New file [http://www.pjsip.org/pjmedia/docs/html/group__PJMEDIA__TRANSPORT__ICE.htm ICE Media Transport] ({{{transport_ice.h}}}): :: - Major modifications - The {{{pjmedia_ice_create()}}} function has changed. - The {{{on_ice_complete()}}} callback has changed. - The following functions have been removed since they are now part of the transport API: - pjmedia_ice_destroy() - pjmedia_ice_start_init() - pjmedia_ice_get_init_status() - pjmedia_ice_get_comp() - pjmedia_ice_init_ice() - pjmedia_ice_modify_sdp() - pjmedia_ice_start_ice() - pjmedia_ice_stop_ice() - pjmedia_ice_simulate_lost() [http://www.pjsip.org/pjmedia/docs/html/group__PJMEDIA__CODEC.htm Codec] ({{{codec.h}}}): :: - Added {{{max_bps}}} member in {{{pjmedia_codec_param.info}}} to support VBR. [http://www.pjsip.org/pjmedia/docs/html/group__PJMEDIA__PORT.htm Ports] ({{{port.h}}}): :: - Added {{{bit_info}}} member in {{{struct pjmedia_frame}}} to support representing audio frame that is not bit-aligned to byte boundary. [http://www.pjsip.org/pjmedia/docs/html/group__PJMEDIA__SDP.htm SDP] ({{{sdp.h}}}): :: - New functions: - pjmedia_sdp_attr_create_rtcp() - pjmedia_sdp_transport_cmp() - pjmedia_sdp_media_deactivate() [http://www.pjsip.org/pjmedia/docs/html/group__PJMED__JBUF.htm Adaptive Jitter Buffer] ({{{jbuf.h}}}): :: - New functions: - pjmedia_jbuf_put_frame2() - pjmedia_jbuf_get_frame2() - Added more members in {{{struct pjmedia_jb_state}}}: - avg_delay - min_delay - max_delay - dev_delay [http://www.pjsip.org/pjmedia/docs/html/group__PJMED__SND.htm Sound device abstraction] ({{{sound.h}}}): :: - New function: - pjmedia_snd_set_latency() [http://www.pjsip.org/pjmedia/docs/html/group__PJMED__STRM.htm Stream] ({{{stream.h}}}): :: - Changes in {{{pjmedia_stream_info}}}: - type of {{{rem_addr}}} and {{{rem_rtcp}}} have been changed from {{{pj_sockaddr_in}}} to the more generic {{{pj_sockaddr}}} to support IPv6. - added RTCP XR related settings - New function: - pjmedia_stream_get_stat_xr() [http://www.pjsip.org/pjmedia/docs/html/group__PJMEDIA__MF__DTMF__TONE__GENERATOR.htm Tone Generator] ({{{tonegen.h}}}): :: - New function: - pjmedia_tonegen_rewind() [http://www.pjsip.org/pjmedia/docs/html/group__PJMEDIA__FILE__PLAY.htm WAV File Player] ({{{wav_port.h}}}): :: - New function: - pjmedia_wav_player_get_len() [http://www.pjsip.org/pjmedia/docs/html/group__PJMED__RTP.htm RTP Session] ({{{rtp.h}}}): :: - New function: - pjmedia_rtp_session_update2() [http://www.pjsip.org/pjmedia/docs/html/group__PJMED__RTCP.htm RTCP Session] ({{{rtcp.h}}}): :: - New functions: - pjmedia_rtcp_rx_rtp2() - pjmedia_rtcp_enable_xr() [http://www.pjsip.org/pjmedia/docs/html/group__PJMED__ENDPT.htm Endpoint] ({{{endpoint.h}}}): :: - New functions: - pjmedia_endpt_get_thread_count() - pjmedia_endpt_get_thread() [http://www.pjsip.org/pjmedia/docs/html/group__PJMEDIA__MEM__PLAYER.htm Memory Based Playback] ({{{endpoint.h}}}): :: - New option: - PJMEDIA_MEM_NO_LOOP [http://www.pjsip.org/pjmedia/docs/html/group__PJMEDIA__SESSION.htm Session] ({{{session.h}}}): :: - New function: - pjmedia_session_get_user_data() === PJSIP === [http://www.pjsip.org/pjsip/docs/html/group__PJSIP__ENDPT.htm Endpoint] ({{{sip_endpoint.h}}}): :: - The {{{pjsip_endpt_create_tsx()}}} declaration has been removed [http://www.pjsip.org/pjsip/docs/html/group__PJSIP__TRANSACT.htm Transaction Layer] ({{{sip_transaction.h}}}): :: - New function: - pjsip_tsx_layer_get_tsx_count() [http://www.pjsip.org/pjsip/docs/html/group__PJSIP__MSG.htm Message Representation Layer] ({{{sip_msg.h}}}): :: - Added {{{pjsip_retry_after_hdr}}} header field. [http://www.pjsip.org/pjsip/docs/html/group__PJSIP__UA.htm Dialog Layer] ({{{sip_dialog.h}}}): :: - New function: - pjsip_ua_get_dlg_set_count() [http://www.pjsip.org/pjsip/docs/html/group__PJSIP__TRANSPORT.htm Transport Layer] ({{{sip_transport.h}}}): :: - New IPv6 transport types: - PJSIP_TRANSPORT_UDP6 - PJSIP_TRANSPORT_TCP6 - New functions: - pjsip_transport_type_get_af() - pjsip_transport_get_type_desc() [http://www.pjsip.org/pjsip/docs/html/group__PJSIP__TRANSPORT__UDP.htm UDP Transport] ({{{sip_transport_udp.h}}}): :: - New functions to support IPv6: - pjsip_udp_transport_start6() - pjsip_udp_transport_attach2() [http://www.pjsip.org/pjsip/docs/html/group__PJSIP__TRANSPORT__TLS.htm TLS Transport] ({{{sip_transport_tls.h}}}): :: - Default TLS method has been changed from SSLv23 to TLSv1. [http://www.pjsip.org/pjsip/docs/html/group__PJSIP__CONFIG.htm Configurations] ({{{sip_config.h}}}): :: - Support for run-time configuration change by using new function {{{pjsip_cfg()}}} [http://www.pjsip.org/pjsip/docs/html/group__PJSIP__ENDPT__STATELESS.htm Core Stateless Operations] ({{{sip_util.h}}}): :: - New function: - pjsip_restore_strict_route_set() === PJSIP-UA === [http://www.pjsip.org/pjsip/docs/html/group__PJSUA__REGC.htm Client Registration] ({{{sip_regc.h}}}): :: - Added {{{token}}} member in {{{pjsip_regc_cbparam}}} [http://www.pjsip.org/pjsip/docs/html/group__PJSIP__INV.htm Invite Session] ({{{sip_inv.h}}}): :: - Added {{{on_send_ack()}}} callback and {{{pjsip_inv_create_ack()}}} function to allow application to construct and send ACK request manually. === PJSIP-SIMPLE === No changes to the API. === PJSUA-LIB === [http://www.pjsip.org/pjsip/docs/html/group__PJSUA__LIB.htm PJSUA API] ({{{pjsua.h}}}): :: - New callbacks: - on_stream_created() - on_stream_destroyed() - Changes in {{{struct pjsua_config}}}: - Removed {{{stun_relay_host}}} (replaced with TURN settings below). - Added {{{use_srtp}}} - Added {{{srtp_secure_signaling}}} - Changes in {{{struct pjsua_acc_config}}}: - Renamed to {{{auto_update_nat}}} to {{{allow_contact_rewrite}}} - Added {{{use_srtp}}} - Added {{{srtp_secure_signaling}}} - Changes in {{{struct pjsua_media_config}}}: - Added {{{snd_clock_rate}}} - Added {{{channel_count}}} - Added {{{snd_auto_close_time}}} - TURN settings in {{{struct pjsua_media_config}}}: - Renamed {{{enable_relay}}} to {{{enable_turn}}} - Added {{{ice_no_host_cands}}} - Added {{{turn_server}}} - Added {{{turn_conn_type}}} - Added {{{turn_auth_cred}}} - New compile time settings: - PJSUA_DEFAULT_AUDIO_FRAME_PTIME (20) - Changed default compile time settings value: - PJSUA_DEFAULT_CODEC_QUALITY (8 (prev=5)) - PJSUA_DEFAULT_ILBC_MODE (30 (prev=20)) [[BR]] [[BR]] == Known Issues == #known-issues Apart from general known issues documented in [milestone:Known-Issues], there is a specific issue related to ICE on Symbian, as it raises E32USER CBase 46 exception. ---- == List of Enhancements == === common === [[TicketQuery(type=enhancement&milestone=release-0.9.0&version=trunk&component=common)]] === pjlib === [[TicketQuery(type=enhancement&milestone=release-0.9.0&version=trunk&component=pjlib)]] === pjlib-util === [[TicketQuery(type=enhancement&milestone=release-0.9.0&version=trunk&component=pjlib-util)]] === pjnath === [[TicketQuery(type=enhancement&milestone=release-0.9.0&version=trunk&component=pjnath)]] === pjmedia === [[TicketQuery(type=enhancement&milestone=release-0.9.0&version=trunk&component=pjmedia)]] === pjsip === [[TicketQuery(type=enhancement&milestone=release-0.9.0&version=trunk&component=pjsip)]] === pjsua-lib === [[TicketQuery(type=enhancement&milestone=release-0.9.0&version=trunk&component=pjsua-lib)]] === applications === [[TicketQuery(type=enhancement&milestone=release-0.9.0&version=trunk&component=applications)]] == List of Bugs == === common === [[TicketQuery(type=defect&milestone=release-0.9.0&version=trunk&component=common)]] === pjlib === [[TicketQuery(type=defect&milestone=release-0.9.0&version=trunk&component=pjlib)]] === pjlib-util === [[TicketQuery(type=defect&milestone=release-0.9.0&version=trunk&component=pjlib-util)]] === pjnath === [[TicketQuery(type=defect&milestone=release-0.9.0&version=trunk&component=pjnath)]] === pjmedia === [[TicketQuery(type=defect&milestone=release-0.9.0&version=trunk&component=pjmedia)]] === pjsip === [[TicketQuery(type=defect&milestone=release-0.9.0&version=trunk&component=pjsip)]] === pjsua-lib === [[TicketQuery(type=defect&milestone=release-0.9.0&version=trunk&component=pjsua-lib)]] === applications === [[TicketQuery(type=defect&milestone=release-0.9.0&version=trunk&component=applications)]]