# This file was automatically generated by SWIG (https://www.swig.org).
# Version 4.4.1
#
# Do not make changes to this file unless you know what you are doing - modify
# the SWIG interface file instead.

from sys import version_info as _swig_python_version_info
# Import the low-level C/C++ module
if getattr(globals().get("__spec__"), "parent", None) or __package__ or "." in __name__:
    from . import _pjsua2
else:
    import _pjsua2

try:
    import builtins as __builtin__
except ImportError:
    import __builtin__

def _swig_repr(self):
    try:
        strthis = "proxy of " + self.this.__repr__()
    except __builtin__.Exception:
        strthis = ""
    return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,)


def _swig_setattr_nondynamic_instance_variable(set):
    def set_instance_attr(self, name, value):
        if name == "this":
            set(self, name, value)
        elif name == "thisown":
            self.this.own(value)
        elif hasattr(self, name) and isinstance(getattr(type(self), name), property):
            set(self, name, value)
        else:
            raise AttributeError("You cannot add instance attributes to %s" % self)
    return set_instance_attr


def _swig_setattr_nondynamic_class_variable(set):
    def set_class_attr(cls, name, value):
        if hasattr(cls, name) and not isinstance(getattr(cls, name), property):
            set(cls, name, value)
        else:
            raise AttributeError("You cannot add class attributes to %s" % cls)
    return set_class_attr


def _swig_add_metaclass(metaclass):
    """Class decorator for adding a metaclass to a SWIG wrapped class - a slimmed down version of six.add_metaclass"""
    def wrapper(cls):
        return metaclass(cls.__name__, cls.__bases__, cls.__dict__.copy())
    return wrapper


class _SwigNonDynamicMeta(type):
    """Meta class to enforce nondynamic attributes (no new attributes) for a class"""
    __setattr__ = _swig_setattr_nondynamic_class_variable(type.__setattr__)


import weakref

class SwigPyIterator(object):
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")

    def __init__(self, *args, **kwargs):
        raise AttributeError("No constructor defined - class is abstract")
    __repr__ = _swig_repr
    __swig_destroy__ = _pjsua2.delete_SwigPyIterator

    def value(self):
        return _pjsua2.SwigPyIterator_value(self)

    def incr(self, n=1):
        return _pjsua2.SwigPyIterator_incr(self, n)

    def decr(self, n=1):
        return _pjsua2.SwigPyIterator_decr(self, n)

    def distance(self, x):
        return _pjsua2.SwigPyIterator_distance(self, x)

    def equal(self, x):
        return _pjsua2.SwigPyIterator_equal(self, x)

    def copy(self):
        return _pjsua2.SwigPyIterator_copy(self)

    def next(self):
        return _pjsua2.SwigPyIterator_next(self)

    def __next__(self):
        return _pjsua2.SwigPyIterator___next__(self)

    def previous(self):
        return _pjsua2.SwigPyIterator_previous(self)

    def advance(self, n):
        return _pjsua2.SwigPyIterator_advance(self, n)

    def __eq__(self, x):
        return _pjsua2.SwigPyIterator___eq__(self, x)

    def __ne__(self, x):
        return _pjsua2.SwigPyIterator___ne__(self, x)

    def __iadd__(self, n):
        return _pjsua2.SwigPyIterator___iadd__(self, n)

    def __isub__(self, n):
        return _pjsua2.SwigPyIterator___isub__(self, n)

    def __add__(self, n):
        return _pjsua2.SwigPyIterator___add__(self, n)

    def __sub__(self, *args):
        return _pjsua2.SwigPyIterator___sub__(self, *args)
    def __iter__(self):
        return self

# Register SwigPyIterator in _pjsua2:
_pjsua2.SwigPyIterator_swigregister(SwigPyIterator)
class StringVector(object):
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def iterator(self):
        return _pjsua2.StringVector_iterator(self)
    def __iter__(self):
        return self.iterator()

    def __nonzero__(self):
        return _pjsua2.StringVector___nonzero__(self)

    def __bool__(self):
        return _pjsua2.StringVector___bool__(self)

    def __len__(self):
        return _pjsua2.StringVector___len__(self)

    def __getslice__(self, i, j):
        return _pjsua2.StringVector___getslice__(self, i, j)

    def __setslice__(self, *args):
        return _pjsua2.StringVector___setslice__(self, *args)

    def __delslice__(self, i, j):
        return _pjsua2.StringVector___delslice__(self, i, j)

    def __delitem__(self, *args):
        return _pjsua2.StringVector___delitem__(self, *args)

    def __getitem__(self, *args):
        return _pjsua2.StringVector___getitem__(self, *args)

    def __setitem__(self, *args):
        return _pjsua2.StringVector___setitem__(self, *args)

    def pop(self):
        return _pjsua2.StringVector_pop(self)

    def append(self, x):
        return _pjsua2.StringVector_append(self, x)

    def empty(self):
        return _pjsua2.StringVector_empty(self)

    def size(self):
        return _pjsua2.StringVector_size(self)

    def swap(self, v):
        return _pjsua2.StringVector_swap(self, v)

    def begin(self):
        return _pjsua2.StringVector_begin(self)

    def end(self):
        return _pjsua2.StringVector_end(self)

    def rbegin(self):
        return _pjsua2.StringVector_rbegin(self)

    def rend(self):
        return _pjsua2.StringVector_rend(self)

    def clear(self):
        return _pjsua2.StringVector_clear(self)

    def get_allocator(self):
        return _pjsua2.StringVector_get_allocator(self)

    def pop_back(self):
        return _pjsua2.StringVector_pop_back(self)

    def erase(self, *args):
        return _pjsua2.StringVector_erase(self, *args)

    def __init__(self, *args):
        _pjsua2.StringVector_swiginit(self, _pjsua2.new_StringVector(*args))

    def push_back(self, x):
        return _pjsua2.StringVector_push_back(self, x)

    def front(self):
        return _pjsua2.StringVector_front(self)

    def back(self):
        return _pjsua2.StringVector_back(self)

    def assign(self, n, x):
        return _pjsua2.StringVector_assign(self, n, x)

    def resize(self, *args):
        return _pjsua2.StringVector_resize(self, *args)

    def insert(self, *args):
        return _pjsua2.StringVector_insert(self, *args)

    def reserve(self, n):
        return _pjsua2.StringVector_reserve(self, n)

    def capacity(self):
        return _pjsua2.StringVector_capacity(self)
    __swig_destroy__ = _pjsua2.delete_StringVector

# Register StringVector in _pjsua2:
_pjsua2.StringVector_swigregister(StringVector)
class IntVector(object):
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def iterator(self):
        return _pjsua2.IntVector_iterator(self)
    def __iter__(self):
        return self.iterator()

    def __nonzero__(self):
        return _pjsua2.IntVector___nonzero__(self)

    def __bool__(self):
        return _pjsua2.IntVector___bool__(self)

    def __len__(self):
        return _pjsua2.IntVector___len__(self)

    def __getslice__(self, i, j):
        return _pjsua2.IntVector___getslice__(self, i, j)

    def __setslice__(self, *args):
        return _pjsua2.IntVector___setslice__(self, *args)

    def __delslice__(self, i, j):
        return _pjsua2.IntVector___delslice__(self, i, j)

    def __delitem__(self, *args):
        return _pjsua2.IntVector___delitem__(self, *args)

    def __getitem__(self, *args):
        return _pjsua2.IntVector___getitem__(self, *args)

    def __setitem__(self, *args):
        return _pjsua2.IntVector___setitem__(self, *args)

    def pop(self):
        return _pjsua2.IntVector_pop(self)

    def append(self, x):
        return _pjsua2.IntVector_append(self, x)

    def empty(self):
        return _pjsua2.IntVector_empty(self)

    def size(self):
        return _pjsua2.IntVector_size(self)

    def swap(self, v):
        return _pjsua2.IntVector_swap(self, v)

    def begin(self):
        return _pjsua2.IntVector_begin(self)

    def end(self):
        return _pjsua2.IntVector_end(self)

    def rbegin(self):
        return _pjsua2.IntVector_rbegin(self)

    def rend(self):
        return _pjsua2.IntVector_rend(self)

    def clear(self):
        return _pjsua2.IntVector_clear(self)

    def get_allocator(self):
        return _pjsua2.IntVector_get_allocator(self)

    def pop_back(self):
        return _pjsua2.IntVector_pop_back(self)

    def erase(self, *args):
        return _pjsua2.IntVector_erase(self, *args)

    def __init__(self, *args):
        _pjsua2.IntVector_swiginit(self, _pjsua2.new_IntVector(*args))

    def push_back(self, x):
        return _pjsua2.IntVector_push_back(self, x)

    def front(self):
        return _pjsua2.IntVector_front(self)

    def back(self):
        return _pjsua2.IntVector_back(self)

    def assign(self, n, x):
        return _pjsua2.IntVector_assign(self, n, x)

    def resize(self, *args):
        return _pjsua2.IntVector_resize(self, *args)

    def insert(self, *args):
        return _pjsua2.IntVector_insert(self, *args)

    def reserve(self, n):
        return _pjsua2.IntVector_reserve(self, n)

    def capacity(self):
        return _pjsua2.IntVector_capacity(self)
    __swig_destroy__ = _pjsua2.delete_IntVector

# Register IntVector in _pjsua2:
_pjsua2.IntVector_swigregister(IntVector)
class ByteVector(object):
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def iterator(self):
        return _pjsua2.ByteVector_iterator(self)
    def __iter__(self):
        return self.iterator()

    def __nonzero__(self):
        return _pjsua2.ByteVector___nonzero__(self)

    def __bool__(self):
        return _pjsua2.ByteVector___bool__(self)

    def __len__(self):
        return _pjsua2.ByteVector___len__(self)

    def __getslice__(self, i, j):
        return _pjsua2.ByteVector___getslice__(self, i, j)

    def __setslice__(self, *args):
        return _pjsua2.ByteVector___setslice__(self, *args)

    def __delslice__(self, i, j):
        return _pjsua2.ByteVector___delslice__(self, i, j)

    def __delitem__(self, *args):
        return _pjsua2.ByteVector___delitem__(self, *args)

    def __getitem__(self, *args):
        return _pjsua2.ByteVector___getitem__(self, *args)

    def __setitem__(self, *args):
        return _pjsua2.ByteVector___setitem__(self, *args)

    def pop(self):
        return _pjsua2.ByteVector_pop(self)

    def append(self, x):
        return _pjsua2.ByteVector_append(self, x)

    def empty(self):
        return _pjsua2.ByteVector_empty(self)

    def size(self):
        return _pjsua2.ByteVector_size(self)

    def swap(self, v):
        return _pjsua2.ByteVector_swap(self, v)

    def begin(self):
        return _pjsua2.ByteVector_begin(self)

    def end(self):
        return _pjsua2.ByteVector_end(self)

    def rbegin(self):
        return _pjsua2.ByteVector_rbegin(self)

    def rend(self):
        return _pjsua2.ByteVector_rend(self)

    def clear(self):
        return _pjsua2.ByteVector_clear(self)

    def get_allocator(self):
        return _pjsua2.ByteVector_get_allocator(self)

    def pop_back(self):
        return _pjsua2.ByteVector_pop_back(self)

    def erase(self, *args):
        return _pjsua2.ByteVector_erase(self, *args)

    def __init__(self, *args):
        _pjsua2.ByteVector_swiginit(self, _pjsua2.new_ByteVector(*args))

    def push_back(self, x):
        return _pjsua2.ByteVector_push_back(self, x)

    def front(self):
        return _pjsua2.ByteVector_front(self)

    def back(self):
        return _pjsua2.ByteVector_back(self)

    def assign(self, n, x):
        return _pjsua2.ByteVector_assign(self, n, x)

    def resize(self, *args):
        return _pjsua2.ByteVector_resize(self, *args)

    def insert(self, *args):
        return _pjsua2.ByteVector_insert(self, *args)

    def reserve(self, n):
        return _pjsua2.ByteVector_reserve(self, n)

    def capacity(self):
        return _pjsua2.ByteVector_capacity(self)

    def assign_from_bytes(self, obj):
        return _pjsua2.ByteVector_assign_from_bytes(self, obj)

    def copy_to_bytearray(self, obj):
        return _pjsua2.ByteVector_copy_to_bytearray(self, obj)
    __swig_destroy__ = _pjsua2.delete_ByteVector

# Register ByteVector in _pjsua2:
_pjsua2.ByteVector_swigregister(ByteVector)
class StringToStringMap(object):
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def iterator(self):
        return _pjsua2.StringToStringMap_iterator(self)
    def __iter__(self):
        return self.iterator()

    def __nonzero__(self):
        return _pjsua2.StringToStringMap___nonzero__(self)

    def __bool__(self):
        return _pjsua2.StringToStringMap___bool__(self)

    def __len__(self):
        return _pjsua2.StringToStringMap___len__(self)
    def __iter__(self):
        return self.key_iterator()
    def iterkeys(self):
        return self.key_iterator()
    def itervalues(self):
        return self.value_iterator()
    def iteritems(self):
        return self.iterator()

    def __getitem__(self, key):
        return _pjsua2.StringToStringMap___getitem__(self, key)

    def __delitem__(self, key):
        return _pjsua2.StringToStringMap___delitem__(self, key)

    def has_key(self, key):
        return _pjsua2.StringToStringMap_has_key(self, key)

    def keys(self):
        return _pjsua2.StringToStringMap_keys(self)

    def values(self):
        return _pjsua2.StringToStringMap_values(self)

    def items(self):
        return _pjsua2.StringToStringMap_items(self)

    def __contains__(self, key):
        return _pjsua2.StringToStringMap___contains__(self, key)

    def key_iterator(self):
        return _pjsua2.StringToStringMap_key_iterator(self)

    def value_iterator(self):
        return _pjsua2.StringToStringMap_value_iterator(self)

    def __setitem__(self, *args):
        return _pjsua2.StringToStringMap___setitem__(self, *args)

    def asdict(self):
        return _pjsua2.StringToStringMap_asdict(self)

    def __init__(self, *args):
        _pjsua2.StringToStringMap_swiginit(self, _pjsua2.new_StringToStringMap(*args))

    def empty(self):
        return _pjsua2.StringToStringMap_empty(self)

    def size(self):
        return _pjsua2.StringToStringMap_size(self)

    def swap(self, v):
        return _pjsua2.StringToStringMap_swap(self, v)

    def begin(self):
        return _pjsua2.StringToStringMap_begin(self)

    def end(self):
        return _pjsua2.StringToStringMap_end(self)

    def rbegin(self):
        return _pjsua2.StringToStringMap_rbegin(self)

    def rend(self):
        return _pjsua2.StringToStringMap_rend(self)

    def clear(self):
        return _pjsua2.StringToStringMap_clear(self)

    def get_allocator(self):
        return _pjsua2.StringToStringMap_get_allocator(self)

    def count(self, x):
        return _pjsua2.StringToStringMap_count(self, x)

    def erase(self, *args):
        return _pjsua2.StringToStringMap_erase(self, *args)

    def find(self, x):
        return _pjsua2.StringToStringMap_find(self, x)

    def lower_bound(self, x):
        return _pjsua2.StringToStringMap_lower_bound(self, x)

    def upper_bound(self, x):
        return _pjsua2.StringToStringMap_upper_bound(self, x)
    __swig_destroy__ = _pjsua2.delete_StringToStringMap

# Register StringToStringMap in _pjsua2:
_pjsua2.StringToStringMap_swigregister(StringToStringMap)
PJ_O_RDONLY = _pjsua2.PJ_O_RDONLY
PJ_O_WRONLY = _pjsua2.PJ_O_WRONLY
PJ_O_RDWR = _pjsua2.PJ_O_RDWR
PJ_O_APPEND = _pjsua2.PJ_O_APPEND
PJ_O_CLOEXEC = _pjsua2.PJ_O_CLOEXEC
PJ_O_ASYNC = _pjsua2.PJ_O_ASYNC
PJ_O_SEQUENTIAL = _pjsua2.PJ_O_SEQUENTIAL
PJ_O_RANDOM = _pjsua2.PJ_O_RANDOM
PJ_LOG_HAS_DAY_NAME = _pjsua2.PJ_LOG_HAS_DAY_NAME
PJ_LOG_HAS_YEAR = _pjsua2.PJ_LOG_HAS_YEAR
PJ_LOG_HAS_MONTH = _pjsua2.PJ_LOG_HAS_MONTH
PJ_LOG_HAS_DAY_OF_MON = _pjsua2.PJ_LOG_HAS_DAY_OF_MON
PJ_LOG_HAS_TIME = _pjsua2.PJ_LOG_HAS_TIME
PJ_LOG_HAS_MICRO_SEC = _pjsua2.PJ_LOG_HAS_MICRO_SEC
PJ_LOG_HAS_SENDER = _pjsua2.PJ_LOG_HAS_SENDER
PJ_LOG_HAS_NEWLINE = _pjsua2.PJ_LOG_HAS_NEWLINE
PJ_LOG_HAS_CR = _pjsua2.PJ_LOG_HAS_CR
PJ_LOG_HAS_SPACE = _pjsua2.PJ_LOG_HAS_SPACE
PJ_LOG_HAS_COLOR = _pjsua2.PJ_LOG_HAS_COLOR
PJ_LOG_HAS_LEVEL_TEXT = _pjsua2.PJ_LOG_HAS_LEVEL_TEXT
PJ_LOG_HAS_THREAD_ID = _pjsua2.PJ_LOG_HAS_THREAD_ID
PJ_LOG_HAS_THREAD_SWC = _pjsua2.PJ_LOG_HAS_THREAD_SWC
PJ_LOG_HAS_INDENT = _pjsua2.PJ_LOG_HAS_INDENT
PJ_QOS_TYPE_BEST_EFFORT = _pjsua2.PJ_QOS_TYPE_BEST_EFFORT
PJ_QOS_TYPE_BACKGROUND = _pjsua2.PJ_QOS_TYPE_BACKGROUND
PJ_QOS_TYPE_VIDEO = _pjsua2.PJ_QOS_TYPE_VIDEO
PJ_QOS_TYPE_VOICE = _pjsua2.PJ_QOS_TYPE_VOICE
PJ_QOS_TYPE_CONTROL = _pjsua2.PJ_QOS_TYPE_CONTROL
PJ_QOS_TYPE_SIGNALLING = _pjsua2.PJ_QOS_TYPE_SIGNALLING
PJ_QOS_PARAM_HAS_DSCP = _pjsua2.PJ_QOS_PARAM_HAS_DSCP
PJ_QOS_PARAM_HAS_SO_PRIO = _pjsua2.PJ_QOS_PARAM_HAS_SO_PRIO
PJ_QOS_PARAM_HAS_WMM = _pjsua2.PJ_QOS_PARAM_HAS_WMM
PJ_QOS_WMM_PRIO_BULK_EFFORT = _pjsua2.PJ_QOS_WMM_PRIO_BULK_EFFORT
PJ_QOS_WMM_PRIO_BULK = _pjsua2.PJ_QOS_WMM_PRIO_BULK
PJ_QOS_WMM_PRIO_VIDEO = _pjsua2.PJ_QOS_WMM_PRIO_VIDEO
PJ_QOS_WMM_PRIO_VOICE = _pjsua2.PJ_QOS_WMM_PRIO_VOICE
class pj_qos_params(object):
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    flags = property(_pjsua2.pj_qos_params_flags_get, _pjsua2.pj_qos_params_flags_set)
    dscp_val = property(_pjsua2.pj_qos_params_dscp_val_get, _pjsua2.pj_qos_params_dscp_val_set)
    so_prio = property(_pjsua2.pj_qos_params_so_prio_get, _pjsua2.pj_qos_params_so_prio_set)
    wmm_prio = property(_pjsua2.pj_qos_params_wmm_prio_get, _pjsua2.pj_qos_params_wmm_prio_set)

    def __init__(self):
        _pjsua2.pj_qos_params_swiginit(self, _pjsua2.new_pj_qos_params())
    __swig_destroy__ = _pjsua2.delete_pj_qos_params

# Register pj_qos_params in _pjsua2:
_pjsua2.pj_qos_params_swigregister(pj_qos_params)
PJ_TLS_UNKNOWN_CIPHER = _pjsua2.PJ_TLS_UNKNOWN_CIPHER
PJ_TLS_NULL_WITH_NULL_NULL = _pjsua2.PJ_TLS_NULL_WITH_NULL_NULL
PJ_TLS_RSA_WITH_NULL_MD5 = _pjsua2.PJ_TLS_RSA_WITH_NULL_MD5
PJ_TLS_RSA_WITH_NULL_SHA = _pjsua2.PJ_TLS_RSA_WITH_NULL_SHA
PJ_TLS_RSA_WITH_NULL_SHA256 = _pjsua2.PJ_TLS_RSA_WITH_NULL_SHA256
PJ_TLS_RSA_WITH_RC4_128_MD5 = _pjsua2.PJ_TLS_RSA_WITH_RC4_128_MD5
PJ_TLS_RSA_WITH_RC4_128_SHA = _pjsua2.PJ_TLS_RSA_WITH_RC4_128_SHA
PJ_TLS_RSA_WITH_3DES_EDE_CBC_SHA = _pjsua2.PJ_TLS_RSA_WITH_3DES_EDE_CBC_SHA
PJ_TLS_RSA_WITH_AES_128_CBC_SHA = _pjsua2.PJ_TLS_RSA_WITH_AES_128_CBC_SHA
PJ_TLS_RSA_WITH_AES_256_CBC_SHA = _pjsua2.PJ_TLS_RSA_WITH_AES_256_CBC_SHA
PJ_TLS_RSA_WITH_AES_128_CBC_SHA256 = _pjsua2.PJ_TLS_RSA_WITH_AES_128_CBC_SHA256
PJ_TLS_RSA_WITH_AES_256_CBC_SHA256 = _pjsua2.PJ_TLS_RSA_WITH_AES_256_CBC_SHA256
PJ_TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA = _pjsua2.PJ_TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA
PJ_TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA = _pjsua2.PJ_TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA
PJ_TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA = _pjsua2.PJ_TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA
PJ_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA = _pjsua2.PJ_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
PJ_TLS_DH_DSS_WITH_AES_128_CBC_SHA = _pjsua2.PJ_TLS_DH_DSS_WITH_AES_128_CBC_SHA
PJ_TLS_DH_RSA_WITH_AES_128_CBC_SHA = _pjsua2.PJ_TLS_DH_RSA_WITH_AES_128_CBC_SHA
PJ_TLS_DHE_DSS_WITH_AES_128_CBC_SHA = _pjsua2.PJ_TLS_DHE_DSS_WITH_AES_128_CBC_SHA
PJ_TLS_DHE_RSA_WITH_AES_128_CBC_SHA = _pjsua2.PJ_TLS_DHE_RSA_WITH_AES_128_CBC_SHA
PJ_TLS_DH_DSS_WITH_AES_256_CBC_SHA = _pjsua2.PJ_TLS_DH_DSS_WITH_AES_256_CBC_SHA
PJ_TLS_DH_RSA_WITH_AES_256_CBC_SHA = _pjsua2.PJ_TLS_DH_RSA_WITH_AES_256_CBC_SHA
PJ_TLS_DHE_DSS_WITH_AES_256_CBC_SHA = _pjsua2.PJ_TLS_DHE_DSS_WITH_AES_256_CBC_SHA
PJ_TLS_DHE_RSA_WITH_AES_256_CBC_SHA = _pjsua2.PJ_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
PJ_TLS_DH_DSS_WITH_AES_128_CBC_SHA256 = _pjsua2.PJ_TLS_DH_DSS_WITH_AES_128_CBC_SHA256
PJ_TLS_DH_RSA_WITH_AES_128_CBC_SHA256 = _pjsua2.PJ_TLS_DH_RSA_WITH_AES_128_CBC_SHA256
PJ_TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 = _pjsua2.PJ_TLS_DHE_DSS_WITH_AES_128_CBC_SHA256
PJ_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 = _pjsua2.PJ_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
PJ_TLS_DH_DSS_WITH_AES_256_CBC_SHA256 = _pjsua2.PJ_TLS_DH_DSS_WITH_AES_256_CBC_SHA256
PJ_TLS_DH_RSA_WITH_AES_256_CBC_SHA256 = _pjsua2.PJ_TLS_DH_RSA_WITH_AES_256_CBC_SHA256
PJ_TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 = _pjsua2.PJ_TLS_DHE_DSS_WITH_AES_256_CBC_SHA256
PJ_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 = _pjsua2.PJ_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
PJ_TLS_DH_anon_WITH_RC4_128_MD5 = _pjsua2.PJ_TLS_DH_anon_WITH_RC4_128_MD5
PJ_TLS_DH_anon_WITH_3DES_EDE_CBC_SHA = _pjsua2.PJ_TLS_DH_anon_WITH_3DES_EDE_CBC_SHA
PJ_TLS_DH_anon_WITH_AES_128_CBC_SHA = _pjsua2.PJ_TLS_DH_anon_WITH_AES_128_CBC_SHA
PJ_TLS_DH_anon_WITH_AES_256_CBC_SHA = _pjsua2.PJ_TLS_DH_anon_WITH_AES_256_CBC_SHA
PJ_TLS_DH_anon_WITH_AES_128_CBC_SHA256 = _pjsua2.PJ_TLS_DH_anon_WITH_AES_128_CBC_SHA256
PJ_TLS_DH_anon_WITH_AES_256_CBC_SHA256 = _pjsua2.PJ_TLS_DH_anon_WITH_AES_256_CBC_SHA256
PJ_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 = _pjsua2.PJ_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
PJ_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 = _pjsua2.PJ_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
PJ_TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 = _pjsua2.PJ_TLS_DHE_DSS_WITH_AES_256_GCM_SHA384
PJ_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 = _pjsua2.PJ_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
PJ_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = _pjsua2.PJ_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
PJ_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 = _pjsua2.PJ_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
PJ_TLS_AES_128_GCM_SHA256 = _pjsua2.PJ_TLS_AES_128_GCM_SHA256
PJ_TLS_AES_256_GCM_SHA384 = _pjsua2.PJ_TLS_AES_256_GCM_SHA384
PJ_TLS_CHACHA20_POLY1305_SHA256 = _pjsua2.PJ_TLS_CHACHA20_POLY1305_SHA256
PJ_TLS_RSA_EXPORT_WITH_RC4_40_MD5 = _pjsua2.PJ_TLS_RSA_EXPORT_WITH_RC4_40_MD5
PJ_TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 = _pjsua2.PJ_TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5
PJ_TLS_RSA_WITH_IDEA_CBC_SHA = _pjsua2.PJ_TLS_RSA_WITH_IDEA_CBC_SHA
PJ_TLS_RSA_EXPORT_WITH_DES40_CBC_SHA = _pjsua2.PJ_TLS_RSA_EXPORT_WITH_DES40_CBC_SHA
PJ_TLS_RSA_WITH_DES_CBC_SHA = _pjsua2.PJ_TLS_RSA_WITH_DES_CBC_SHA
PJ_TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA = _pjsua2.PJ_TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA
PJ_TLS_DH_DSS_WITH_DES_CBC_SHA = _pjsua2.PJ_TLS_DH_DSS_WITH_DES_CBC_SHA
PJ_TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA = _pjsua2.PJ_TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA
PJ_TLS_DH_RSA_WITH_DES_CBC_SHA = _pjsua2.PJ_TLS_DH_RSA_WITH_DES_CBC_SHA
PJ_TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA = _pjsua2.PJ_TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA
PJ_TLS_DHE_DSS_WITH_DES_CBC_SHA = _pjsua2.PJ_TLS_DHE_DSS_WITH_DES_CBC_SHA
PJ_TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA = _pjsua2.PJ_TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA
PJ_TLS_DHE_RSA_WITH_DES_CBC_SHA = _pjsua2.PJ_TLS_DHE_RSA_WITH_DES_CBC_SHA
PJ_TLS_DH_anon_EXPORT_WITH_RC4_40_MD5 = _pjsua2.PJ_TLS_DH_anon_EXPORT_WITH_RC4_40_MD5
PJ_TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA = _pjsua2.PJ_TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA
PJ_TLS_DH_anon_WITH_DES_CBC_SHA = _pjsua2.PJ_TLS_DH_anon_WITH_DES_CBC_SHA
PJ_SSL_FORTEZZA_KEA_WITH_NULL_SHA = _pjsua2.PJ_SSL_FORTEZZA_KEA_WITH_NULL_SHA
PJ_SSL_FORTEZZA_KEA_WITH_FORTEZZA_CBC_SHA = _pjsua2.PJ_SSL_FORTEZZA_KEA_WITH_FORTEZZA_CBC_SHA
PJ_SSL_FORTEZZA_KEA_WITH_RC4_128_SHA = _pjsua2.PJ_SSL_FORTEZZA_KEA_WITH_RC4_128_SHA
PJ_SSL_CK_RC4_128_WITH_MD5 = _pjsua2.PJ_SSL_CK_RC4_128_WITH_MD5
PJ_SSL_CK_RC4_128_EXPORT40_WITH_MD5 = _pjsua2.PJ_SSL_CK_RC4_128_EXPORT40_WITH_MD5
PJ_SSL_CK_RC2_128_CBC_WITH_MD5 = _pjsua2.PJ_SSL_CK_RC2_128_CBC_WITH_MD5
PJ_SSL_CK_RC2_128_CBC_EXPORT40_WITH_MD5 = _pjsua2.PJ_SSL_CK_RC2_128_CBC_EXPORT40_WITH_MD5
PJ_SSL_CK_IDEA_128_CBC_WITH_MD5 = _pjsua2.PJ_SSL_CK_IDEA_128_CBC_WITH_MD5
PJ_SSL_CK_DES_64_CBC_WITH_MD5 = _pjsua2.PJ_SSL_CK_DES_64_CBC_WITH_MD5
PJ_SSL_CK_DES_192_EDE3_CBC_WITH_MD5 = _pjsua2.PJ_SSL_CK_DES_192_EDE3_CBC_WITH_MD5
PJ_SSL_SOCK_PROTO_DEFAULT = _pjsua2.PJ_SSL_SOCK_PROTO_DEFAULT
PJ_SSL_SOCK_PROTO_SSL2 = _pjsua2.PJ_SSL_SOCK_PROTO_SSL2
PJ_SSL_SOCK_PROTO_SSL3 = _pjsua2.PJ_SSL_SOCK_PROTO_SSL3
PJ_SSL_SOCK_PROTO_TLS1 = _pjsua2.PJ_SSL_SOCK_PROTO_TLS1
PJ_SSL_SOCK_PROTO_TLS1_1 = _pjsua2.PJ_SSL_SOCK_PROTO_TLS1_1
PJ_SSL_SOCK_PROTO_TLS1_2 = _pjsua2.PJ_SSL_SOCK_PROTO_TLS1_2
PJ_SSL_SOCK_PROTO_TLS1_3 = _pjsua2.PJ_SSL_SOCK_PROTO_TLS1_3
PJ_SSL_SOCK_PROTO_SSL23 = _pjsua2.PJ_SSL_SOCK_PROTO_SSL23
PJ_SSL_SOCK_PROTO_ALL = _pjsua2.PJ_SSL_SOCK_PROTO_ALL
PJ_SSL_SOCK_PROTO_DTLS1 = _pjsua2.PJ_SSL_SOCK_PROTO_DTLS1
PJ_SSL_CERT_NAME_UNKNOWN = _pjsua2.PJ_SSL_CERT_NAME_UNKNOWN
PJ_SSL_CERT_NAME_RFC822 = _pjsua2.PJ_SSL_CERT_NAME_RFC822
PJ_SSL_CERT_NAME_DNS = _pjsua2.PJ_SSL_CERT_NAME_DNS
PJ_SSL_CERT_NAME_URI = _pjsua2.PJ_SSL_CERT_NAME_URI
PJ_SSL_CERT_NAME_IP = _pjsua2.PJ_SSL_CERT_NAME_IP
PJ_SSL_CERT_ESUCCESS = _pjsua2.PJ_SSL_CERT_ESUCCESS
PJ_SSL_CERT_EISSUER_NOT_FOUND = _pjsua2.PJ_SSL_CERT_EISSUER_NOT_FOUND
PJ_SSL_CERT_EUNTRUSTED = _pjsua2.PJ_SSL_CERT_EUNTRUSTED
PJ_SSL_CERT_EVALIDITY_PERIOD = _pjsua2.PJ_SSL_CERT_EVALIDITY_PERIOD
PJ_SSL_CERT_EINVALID_FORMAT = _pjsua2.PJ_SSL_CERT_EINVALID_FORMAT
PJ_SSL_CERT_EINVALID_PURPOSE = _pjsua2.PJ_SSL_CERT_EINVALID_PURPOSE
PJ_SSL_CERT_EISSUER_MISMATCH = _pjsua2.PJ_SSL_CERT_EISSUER_MISMATCH
PJ_SSL_CERT_ECRL_FAILURE = _pjsua2.PJ_SSL_CERT_ECRL_FAILURE
PJ_SSL_CERT_EREVOKED = _pjsua2.PJ_SSL_CERT_EREVOKED
PJ_SSL_CERT_ECHAIN_TOO_LONG = _pjsua2.PJ_SSL_CERT_ECHAIN_TOO_LONG
PJ_SSL_CERT_EWEAK_SIGNATURE = _pjsua2.PJ_SSL_CERT_EWEAK_SIGNATURE
PJ_SSL_CERT_EIDENTITY_NOT_MATCH = _pjsua2.PJ_SSL_CERT_EIDENTITY_NOT_MATCH
PJ_SSL_CERT_EUNKNOWN = _pjsua2.PJ_SSL_CERT_EUNKNOWN
PJ_SSL_CERT_LOOKUP_NONE = _pjsua2.PJ_SSL_CERT_LOOKUP_NONE
PJ_SSL_CERT_LOOKUP_SUBJECT = _pjsua2.PJ_SSL_CERT_LOOKUP_SUBJECT
PJ_SSL_CERT_LOOKUP_FINGERPRINT = _pjsua2.PJ_SSL_CERT_LOOKUP_FINGERPRINT
PJ_SSL_CERT_LOOKUP_FRIENDLY_NAME = _pjsua2.PJ_SSL_CERT_LOOKUP_FRIENDLY_NAME
PJ_SSL_CERT_DIRECT_NONE = _pjsua2.PJ_SSL_CERT_DIRECT_NONE
PJ_SSL_CERT_DIRECT_OPENSSL_EVP_PKEY = _pjsua2.PJ_SSL_CERT_DIRECT_OPENSSL_EVP_PKEY
PJ_SSL_CERT_DIRECT_OPENSSL_X509_CERT = _pjsua2.PJ_SSL_CERT_DIRECT_OPENSSL_X509_CERT
PJ_SUCCESS = _pjsua2.PJ_SUCCESS
PJ_TRUE = _pjsua2.PJ_TRUE
PJ_FALSE = _pjsua2.PJ_FALSE
PJ_ICE_SESS_TRICKLE_DISABLED = _pjsua2.PJ_ICE_SESS_TRICKLE_DISABLED
PJ_ICE_SESS_TRICKLE_HALF = _pjsua2.PJ_ICE_SESS_TRICKLE_HALF
PJ_ICE_SESS_TRICKLE_FULL = _pjsua2.PJ_ICE_SESS_TRICKLE_FULL
PJ_STUN_NAT_TYPE_UNKNOWN = _pjsua2.PJ_STUN_NAT_TYPE_UNKNOWN
PJ_STUN_NAT_TYPE_ERR_UNKNOWN = _pjsua2.PJ_STUN_NAT_TYPE_ERR_UNKNOWN
PJ_STUN_NAT_TYPE_OPEN = _pjsua2.PJ_STUN_NAT_TYPE_OPEN
PJ_STUN_NAT_TYPE_BLOCKED = _pjsua2.PJ_STUN_NAT_TYPE_BLOCKED
PJ_STUN_NAT_TYPE_SYMMETRIC_UDP = _pjsua2.PJ_STUN_NAT_TYPE_SYMMETRIC_UDP
PJ_STUN_NAT_TYPE_FULL_CONE = _pjsua2.PJ_STUN_NAT_TYPE_FULL_CONE
PJ_STUN_NAT_TYPE_SYMMETRIC = _pjsua2.PJ_STUN_NAT_TYPE_SYMMETRIC
PJ_STUN_NAT_TYPE_RESTRICTED = _pjsua2.PJ_STUN_NAT_TYPE_RESTRICTED
PJ_STUN_NAT_TYPE_PORT_RESTRICTED = _pjsua2.PJ_STUN_NAT_TYPE_PORT_RESTRICTED
PJ_TURN_TP_UDP = _pjsua2.PJ_TURN_TP_UDP
PJ_TURN_TP_TCP = _pjsua2.PJ_TURN_TP_TCP
PJ_TURN_TP_TLS = _pjsua2.PJ_TURN_TP_TLS
PJMEDIA_CONF_OP_UNKNOWN = _pjsua2.PJMEDIA_CONF_OP_UNKNOWN
PJMEDIA_CONF_OP_ADD_PORT = _pjsua2.PJMEDIA_CONF_OP_ADD_PORT
PJMEDIA_CONF_OP_REMOVE_PORT = _pjsua2.PJMEDIA_CONF_OP_REMOVE_PORT
PJMEDIA_CONF_OP_CONNECT_PORTS = _pjsua2.PJMEDIA_CONF_OP_CONNECT_PORTS
PJMEDIA_CONF_OP_DISCONNECT_PORTS = _pjsua2.PJMEDIA_CONF_OP_DISCONNECT_PORTS
PJMEDIA_CONF_OP_ADJUST_CONN_LEVEL = _pjsua2.PJMEDIA_CONF_OP_ADJUST_CONN_LEVEL
PJMEDIA_ECHO_DEFAULT = _pjsua2.PJMEDIA_ECHO_DEFAULT
PJMEDIA_ECHO_SPEEX = _pjsua2.PJMEDIA_ECHO_SPEEX
PJMEDIA_ECHO_SIMPLE = _pjsua2.PJMEDIA_ECHO_SIMPLE
PJMEDIA_ECHO_WEBRTC = _pjsua2.PJMEDIA_ECHO_WEBRTC
PJMEDIA_ECHO_WEBRTC_AEC3 = _pjsua2.PJMEDIA_ECHO_WEBRTC_AEC3
PJMEDIA_ECHO_ALGO_MASK = _pjsua2.PJMEDIA_ECHO_ALGO_MASK
PJMEDIA_ECHO_NO_LOCK = _pjsua2.PJMEDIA_ECHO_NO_LOCK
PJMEDIA_ECHO_USE_SIMPLE_FIFO = _pjsua2.PJMEDIA_ECHO_USE_SIMPLE_FIFO
PJMEDIA_ECHO_USE_SW_ECHO = _pjsua2.PJMEDIA_ECHO_USE_SW_ECHO
PJMEDIA_ECHO_USE_NOISE_SUPPRESSOR = _pjsua2.PJMEDIA_ECHO_USE_NOISE_SUPPRESSOR
PJMEDIA_ECHO_USE_GAIN_CONTROLLER = _pjsua2.PJMEDIA_ECHO_USE_GAIN_CONTROLLER
PJMEDIA_ECHO_AGGRESSIVENESS_DEFAULT = _pjsua2.PJMEDIA_ECHO_AGGRESSIVENESS_DEFAULT
PJMEDIA_ECHO_AGGRESSIVENESS_CONSERVATIVE = _pjsua2.PJMEDIA_ECHO_AGGRESSIVENESS_CONSERVATIVE
PJMEDIA_ECHO_AGGRESSIVENESS_MODERATE = _pjsua2.PJMEDIA_ECHO_AGGRESSIVENESS_MODERATE
PJMEDIA_ECHO_AGGRESSIVENESS_AGGRESSIVE = _pjsua2.PJMEDIA_ECHO_AGGRESSIVENESS_AGGRESSIVE
PJMEDIA_ECHO_AGGRESSIVENESS_MASK = _pjsua2.PJMEDIA_ECHO_AGGRESSIVENESS_MASK
PJMEDIA_EVENT_NONE = _pjsua2.PJMEDIA_EVENT_NONE
PJMEDIA_EVENT_FMT_CHANGED = _pjsua2.PJMEDIA_EVENT_FMT_CHANGED
PJMEDIA_EVENT_WND_CLOSING = _pjsua2.PJMEDIA_EVENT_WND_CLOSING
PJMEDIA_EVENT_WND_CLOSED = _pjsua2.PJMEDIA_EVENT_WND_CLOSED
PJMEDIA_EVENT_WND_RESIZED = _pjsua2.PJMEDIA_EVENT_WND_RESIZED
PJMEDIA_EVENT_MOUSE_BTN_DOWN = _pjsua2.PJMEDIA_EVENT_MOUSE_BTN_DOWN
PJMEDIA_EVENT_KEYFRAME_FOUND = _pjsua2.PJMEDIA_EVENT_KEYFRAME_FOUND
PJMEDIA_EVENT_KEYFRAME_MISSING = _pjsua2.PJMEDIA_EVENT_KEYFRAME_MISSING
PJMEDIA_EVENT_ORIENT_CHANGED = _pjsua2.PJMEDIA_EVENT_ORIENT_CHANGED
PJMEDIA_EVENT_RX_RTCP_FB = _pjsua2.PJMEDIA_EVENT_RX_RTCP_FB
PJMEDIA_EVENT_AUD_DEV_ERROR = _pjsua2.PJMEDIA_EVENT_AUD_DEV_ERROR
PJMEDIA_EVENT_VID_DEV_ERROR = _pjsua2.PJMEDIA_EVENT_VID_DEV_ERROR
PJMEDIA_EVENT_MEDIA_TP_ERR = _pjsua2.PJMEDIA_EVENT_MEDIA_TP_ERR
PJMEDIA_EVENT_CALLBACK = _pjsua2.PJMEDIA_EVENT_CALLBACK
PJMEDIA_FORMAT_L16 = _pjsua2.PJMEDIA_FORMAT_L16
PJMEDIA_FORMAT_PCM = _pjsua2.PJMEDIA_FORMAT_PCM
PJMEDIA_FORMAT_PCMA = _pjsua2.PJMEDIA_FORMAT_PCMA
PJMEDIA_FORMAT_ALAW = _pjsua2.PJMEDIA_FORMAT_ALAW
PJMEDIA_FORMAT_PCMU = _pjsua2.PJMEDIA_FORMAT_PCMU
PJMEDIA_FORMAT_ULAW = _pjsua2.PJMEDIA_FORMAT_ULAW
PJMEDIA_FORMAT_AMR = _pjsua2.PJMEDIA_FORMAT_AMR
PJMEDIA_FORMAT_G722 = _pjsua2.PJMEDIA_FORMAT_G722
PJMEDIA_FORMAT_G729 = _pjsua2.PJMEDIA_FORMAT_G729
PJMEDIA_FORMAT_ILBC = _pjsua2.PJMEDIA_FORMAT_ILBC
PJMEDIA_FORMAT_RGB24 = _pjsua2.PJMEDIA_FORMAT_RGB24
PJMEDIA_FORMAT_RGBA = _pjsua2.PJMEDIA_FORMAT_RGBA
PJMEDIA_FORMAT_BGRA = _pjsua2.PJMEDIA_FORMAT_BGRA
PJMEDIA_FORMAT_RGB32 = _pjsua2.PJMEDIA_FORMAT_RGB32
PJMEDIA_FORMAT_DIB = _pjsua2.PJMEDIA_FORMAT_DIB
PJMEDIA_FORMAT_GBRP = _pjsua2.PJMEDIA_FORMAT_GBRP
PJMEDIA_FORMAT_AYUV = _pjsua2.PJMEDIA_FORMAT_AYUV
PJMEDIA_FORMAT_YUY2 = _pjsua2.PJMEDIA_FORMAT_YUY2
PJMEDIA_FORMAT_UYVY = _pjsua2.PJMEDIA_FORMAT_UYVY
PJMEDIA_FORMAT_YVYU = _pjsua2.PJMEDIA_FORMAT_YVYU
PJMEDIA_FORMAT_I420 = _pjsua2.PJMEDIA_FORMAT_I420
PJMEDIA_FORMAT_IYUV = _pjsua2.PJMEDIA_FORMAT_IYUV
PJMEDIA_FORMAT_YV12 = _pjsua2.PJMEDIA_FORMAT_YV12
PJMEDIA_FORMAT_NV12 = _pjsua2.PJMEDIA_FORMAT_NV12
PJMEDIA_FORMAT_NV21 = _pjsua2.PJMEDIA_FORMAT_NV21
PJMEDIA_FORMAT_I422 = _pjsua2.PJMEDIA_FORMAT_I422
PJMEDIA_FORMAT_I420JPEG = _pjsua2.PJMEDIA_FORMAT_I420JPEG
PJMEDIA_FORMAT_I422JPEG = _pjsua2.PJMEDIA_FORMAT_I422JPEG
PJMEDIA_FORMAT_H261 = _pjsua2.PJMEDIA_FORMAT_H261
PJMEDIA_FORMAT_H263 = _pjsua2.PJMEDIA_FORMAT_H263
PJMEDIA_FORMAT_H263P = _pjsua2.PJMEDIA_FORMAT_H263P
PJMEDIA_FORMAT_H264 = _pjsua2.PJMEDIA_FORMAT_H264
PJMEDIA_FORMAT_VP8 = _pjsua2.PJMEDIA_FORMAT_VP8
PJMEDIA_FORMAT_VP9 = _pjsua2.PJMEDIA_FORMAT_VP9
PJMEDIA_FORMAT_MJPEG = _pjsua2.PJMEDIA_FORMAT_MJPEG
PJMEDIA_FORMAT_MPEG1VIDEO = _pjsua2.PJMEDIA_FORMAT_MPEG1VIDEO
PJMEDIA_FORMAT_MPEG2VIDEO = _pjsua2.PJMEDIA_FORMAT_MPEG2VIDEO
PJMEDIA_FORMAT_MPEG4 = _pjsua2.PJMEDIA_FORMAT_MPEG4
PJMEDIA_FORMAT_INVALID = _pjsua2.PJMEDIA_FORMAT_INVALID
PJMEDIA_FRAME_TYPE_NONE = _pjsua2.PJMEDIA_FRAME_TYPE_NONE
PJMEDIA_FRAME_TYPE_AUDIO = _pjsua2.PJMEDIA_FRAME_TYPE_AUDIO
PJMEDIA_FRAME_TYPE_EXTENDED = _pjsua2.PJMEDIA_FRAME_TYPE_EXTENDED
PJMEDIA_FRAME_TYPE_VIDEO = _pjsua2.PJMEDIA_FRAME_TYPE_VIDEO
PJMEDIA_JB_DISCARD_NONE = _pjsua2.PJMEDIA_JB_DISCARD_NONE
PJMEDIA_JB_DISCARD_STATIC = _pjsua2.PJMEDIA_JB_DISCARD_STATIC
PJMEDIA_JB_DISCARD_PROGRESSIVE = _pjsua2.PJMEDIA_JB_DISCARD_PROGRESSIVE
PJMEDIA_RTCP_FB_ACK = _pjsua2.PJMEDIA_RTCP_FB_ACK
PJMEDIA_RTCP_FB_NACK = _pjsua2.PJMEDIA_RTCP_FB_NACK
PJMEDIA_RTCP_FB_TRR_INT = _pjsua2.PJMEDIA_RTCP_FB_TRR_INT
PJMEDIA_RTCP_FB_OTHER = _pjsua2.PJMEDIA_RTCP_FB_OTHER
class pjmedia_tone_digit(object):
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    digit = property(_pjsua2.pjmedia_tone_digit_digit_get, _pjsua2.pjmedia_tone_digit_digit_set)
    on_msec = property(_pjsua2.pjmedia_tone_digit_on_msec_get, _pjsua2.pjmedia_tone_digit_on_msec_set)
    off_msec = property(_pjsua2.pjmedia_tone_digit_off_msec_get, _pjsua2.pjmedia_tone_digit_off_msec_set)
    volume = property(_pjsua2.pjmedia_tone_digit_volume_get, _pjsua2.pjmedia_tone_digit_volume_set)

    def __init__(self):
        _pjsua2.pjmedia_tone_digit_swiginit(self, _pjsua2.new_pjmedia_tone_digit())
    __swig_destroy__ = _pjsua2.delete_pjmedia_tone_digit

# Register pjmedia_tone_digit in _pjsua2:
_pjsua2.pjmedia_tone_digit_swigregister(pjmedia_tone_digit)
class pjmedia_tone_digit_map(object):
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    count = property(_pjsua2.pjmedia_tone_digit_map_count_get, _pjsua2.pjmedia_tone_digit_map_count_set)

    def __init__(self):
        _pjsua2.pjmedia_tone_digit_map_swiginit(self, _pjsua2.new_pjmedia_tone_digit_map())
    __swig_destroy__ = _pjsua2.delete_pjmedia_tone_digit_map

# Register pjmedia_tone_digit_map in _pjsua2:
_pjsua2.pjmedia_tone_digit_map_swigregister(pjmedia_tone_digit_map)
class pjmedia_tone_desc(object):
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    freq1 = property(_pjsua2.pjmedia_tone_desc_freq1_get, _pjsua2.pjmedia_tone_desc_freq1_set)
    freq2 = property(_pjsua2.pjmedia_tone_desc_freq2_get, _pjsua2.pjmedia_tone_desc_freq2_set)
    on_msec = property(_pjsua2.pjmedia_tone_desc_on_msec_get, _pjsua2.pjmedia_tone_desc_on_msec_set)
    off_msec = property(_pjsua2.pjmedia_tone_desc_off_msec_get, _pjsua2.pjmedia_tone_desc_off_msec_set)
    volume = property(_pjsua2.pjmedia_tone_desc_volume_get, _pjsua2.pjmedia_tone_desc_volume_set)
    flags = property(_pjsua2.pjmedia_tone_desc_flags_get, _pjsua2.pjmedia_tone_desc_flags_set)

    def __init__(self):
        _pjsua2.pjmedia_tone_desc_swiginit(self, _pjsua2.new_pjmedia_tone_desc())
    __swig_destroy__ = _pjsua2.delete_pjmedia_tone_desc

# Register pjmedia_tone_desc in _pjsua2:
_pjsua2.pjmedia_tone_desc_swigregister(pjmedia_tone_desc)
PJMEDIA_SRTP_DISABLED = _pjsua2.PJMEDIA_SRTP_DISABLED
PJMEDIA_SRTP_UNKNOWN = _pjsua2.PJMEDIA_SRTP_UNKNOWN
PJMEDIA_SRTP_OPTIONAL = _pjsua2.PJMEDIA_SRTP_OPTIONAL
PJMEDIA_SRTP_MANDATORY = _pjsua2.PJMEDIA_SRTP_MANDATORY
PJMEDIA_SRTP_NO_ENCRYPTION = _pjsua2.PJMEDIA_SRTP_NO_ENCRYPTION
PJMEDIA_SRTP_NO_AUTHENTICATION = _pjsua2.PJMEDIA_SRTP_NO_AUTHENTICATION
PJMEDIA_SRTP_KEYING_SDES = _pjsua2.PJMEDIA_SRTP_KEYING_SDES
PJMEDIA_SRTP_KEYING_DTLS_SRTP = _pjsua2.PJMEDIA_SRTP_KEYING_DTLS_SRTP
PJMEDIA_SRTP_KEYINGS_COUNT = _pjsua2.PJMEDIA_SRTP_KEYINGS_COUNT
PJMEDIA_TYPE_NONE = _pjsua2.PJMEDIA_TYPE_NONE
PJMEDIA_TYPE_AUDIO = _pjsua2.PJMEDIA_TYPE_AUDIO
PJMEDIA_TYPE_VIDEO = _pjsua2.PJMEDIA_TYPE_VIDEO
PJMEDIA_TYPE_TEXT = _pjsua2.PJMEDIA_TYPE_TEXT
PJMEDIA_TYPE_APPLICATION = _pjsua2.PJMEDIA_TYPE_APPLICATION
PJMEDIA_TYPE_UNKNOWN = _pjsua2.PJMEDIA_TYPE_UNKNOWN
PJMEDIA_DIR_NONE = _pjsua2.PJMEDIA_DIR_NONE
PJMEDIA_DIR_ENCODING = _pjsua2.PJMEDIA_DIR_ENCODING
PJMEDIA_DIR_CAPTURE = _pjsua2.PJMEDIA_DIR_CAPTURE
PJMEDIA_DIR_DECODING = _pjsua2.PJMEDIA_DIR_DECODING
PJMEDIA_DIR_PLAYBACK = _pjsua2.PJMEDIA_DIR_PLAYBACK
PJMEDIA_DIR_RENDER = _pjsua2.PJMEDIA_DIR_RENDER
PJMEDIA_DIR_ENCODING_DECODING = _pjsua2.PJMEDIA_DIR_ENCODING_DECODING
PJMEDIA_DIR_CAPTURE_PLAYBACK = _pjsua2.PJMEDIA_DIR_CAPTURE_PLAYBACK
PJMEDIA_DIR_CAPTURE_RENDER = _pjsua2.PJMEDIA_DIR_CAPTURE_RENDER
PJMEDIA_TP_PROTO_NONE = _pjsua2.PJMEDIA_TP_PROTO_NONE
PJMEDIA_TP_PROTO_UNKNOWN = _pjsua2.PJMEDIA_TP_PROTO_UNKNOWN
PJMEDIA_TP_PROTO_UDP = _pjsua2.PJMEDIA_TP_PROTO_UDP
PJMEDIA_TP_PROTO_RTP = _pjsua2.PJMEDIA_TP_PROTO_RTP
PJMEDIA_TP_PROTO_DTLS = _pjsua2.PJMEDIA_TP_PROTO_DTLS
PJMEDIA_TP_PROFILE_RTCP_FB = _pjsua2.PJMEDIA_TP_PROFILE_RTCP_FB
PJMEDIA_TP_PROFILE_SRTP = _pjsua2.PJMEDIA_TP_PROFILE_SRTP
PJMEDIA_TP_PROFILE_AVP = _pjsua2.PJMEDIA_TP_PROFILE_AVP
PJMEDIA_TP_PROTO_RTP_AVP = _pjsua2.PJMEDIA_TP_PROTO_RTP_AVP
PJMEDIA_TP_PROTO_RTP_SAVP = _pjsua2.PJMEDIA_TP_PROTO_RTP_SAVP
PJMEDIA_TP_PROTO_DTLS_SRTP = _pjsua2.PJMEDIA_TP_PROTO_DTLS_SRTP
PJMEDIA_TP_PROTO_RTP_AVPF = _pjsua2.PJMEDIA_TP_PROTO_RTP_AVPF
PJMEDIA_TP_PROTO_RTP_SAVPF = _pjsua2.PJMEDIA_TP_PROTO_RTP_SAVPF
PJMEDIA_TP_PROTO_DTLS_SRTPF = _pjsua2.PJMEDIA_TP_PROTO_DTLS_SRTPF
PJMEDIA_ORIENT_UNKNOWN = _pjsua2.PJMEDIA_ORIENT_UNKNOWN
PJMEDIA_ORIENT_NATURAL = _pjsua2.PJMEDIA_ORIENT_NATURAL
PJMEDIA_ORIENT_ROTATE_90DEG = _pjsua2.PJMEDIA_ORIENT_ROTATE_90DEG
PJMEDIA_ORIENT_ROTATE_180DEG = _pjsua2.PJMEDIA_ORIENT_ROTATE_180DEG
PJMEDIA_ORIENT_ROTATE_270DEG = _pjsua2.PJMEDIA_ORIENT_ROTATE_270DEG
PJMEDIA_VID_DEV_HWND_TYPE_NONE = _pjsua2.PJMEDIA_VID_DEV_HWND_TYPE_NONE
PJMEDIA_VID_DEV_HWND_TYPE_WINDOWS = _pjsua2.PJMEDIA_VID_DEV_HWND_TYPE_WINDOWS
PJMEDIA_VID_DEV_HWND_TYPE_COCOA = _pjsua2.PJMEDIA_VID_DEV_HWND_TYPE_COCOA
PJMEDIA_VID_DEV_HWND_TYPE_IOS = _pjsua2.PJMEDIA_VID_DEV_HWND_TYPE_IOS
PJMEDIA_VID_DEV_HWND_TYPE_ANDROID = _pjsua2.PJMEDIA_VID_DEV_HWND_TYPE_ANDROID
PJMEDIA_VID_PACKING_UNKNOWN = _pjsua2.PJMEDIA_VID_PACKING_UNKNOWN
PJMEDIA_VID_PACKING_PACKETS = _pjsua2.PJMEDIA_VID_PACKING_PACKETS
PJMEDIA_VID_PACKING_WHOLE = _pjsua2.PJMEDIA_VID_PACKING_WHOLE
PJMEDIA_VID_CONF_OP_UNKNOWN = _pjsua2.PJMEDIA_VID_CONF_OP_UNKNOWN
PJMEDIA_VID_CONF_OP_ADD_PORT = _pjsua2.PJMEDIA_VID_CONF_OP_ADD_PORT
PJMEDIA_VID_CONF_OP_REMOVE_PORT = _pjsua2.PJMEDIA_VID_CONF_OP_REMOVE_PORT
PJMEDIA_VID_CONF_OP_CONNECT_PORTS = _pjsua2.PJMEDIA_VID_CONF_OP_CONNECT_PORTS
PJMEDIA_VID_CONF_OP_DISCONNECT_PORTS = _pjsua2.PJMEDIA_VID_CONF_OP_DISCONNECT_PORTS
PJMEDIA_VID_CONF_OP_UPDATE_PORT = _pjsua2.PJMEDIA_VID_CONF_OP_UPDATE_PORT
PJMEDIA_VID_STREAM_RC_NONE = _pjsua2.PJMEDIA_VID_STREAM_RC_NONE
PJMEDIA_VID_STREAM_RC_SIMPLE_BLOCKING = _pjsua2.PJMEDIA_VID_STREAM_RC_SIMPLE_BLOCKING
PJMEDIA_VID_STREAM_RC_SEND_THREAD = _pjsua2.PJMEDIA_VID_STREAM_RC_SEND_THREAD
PJMEDIA_AI_EVENT_CONNECTED = _pjsua2.PJMEDIA_AI_EVENT_CONNECTED
PJMEDIA_AI_EVENT_DISCONNECTED = _pjsua2.PJMEDIA_AI_EVENT_DISCONNECTED
PJMEDIA_AI_EVENT_TRANSCRIPT = _pjsua2.PJMEDIA_AI_EVENT_TRANSCRIPT
PJMEDIA_AI_EVENT_RESPONSE_START = _pjsua2.PJMEDIA_AI_EVENT_RESPONSE_START
PJMEDIA_AI_EVENT_RESPONSE_DONE = _pjsua2.PJMEDIA_AI_EVENT_RESPONSE_DONE
PJMEDIA_AI_EVENT_SPEECH_STARTED = _pjsua2.PJMEDIA_AI_EVENT_SPEECH_STARTED
PJMEDIA_AI_EVENT_SPEECH_STOPPED = _pjsua2.PJMEDIA_AI_EVENT_SPEECH_STOPPED
PJMEDIA_FILE_WRITE_PCM = _pjsua2.PJMEDIA_FILE_WRITE_PCM
PJMEDIA_FILE_WRITE_ALAW = _pjsua2.PJMEDIA_FILE_WRITE_ALAW
PJMEDIA_FILE_WRITE_ULAW = _pjsua2.PJMEDIA_FILE_WRITE_ULAW
PJMEDIA_FILE_NO_LOOP = _pjsua2.PJMEDIA_FILE_NO_LOOP
PJMEDIA_FILE_NO_LOCK = _pjsua2.PJMEDIA_FILE_NO_LOCK
PJMEDIA_AUD_DEV_ROUTE_DEFAULT = _pjsua2.PJMEDIA_AUD_DEV_ROUTE_DEFAULT
PJMEDIA_AUD_DEV_ROUTE_LOUDSPEAKER = _pjsua2.PJMEDIA_AUD_DEV_ROUTE_LOUDSPEAKER
PJMEDIA_AUD_DEV_ROUTE_EARPIECE = _pjsua2.PJMEDIA_AUD_DEV_ROUTE_EARPIECE
PJMEDIA_AUD_DEV_ROUTE_BLUETOOTH = _pjsua2.PJMEDIA_AUD_DEV_ROUTE_BLUETOOTH
PJMEDIA_AUD_DEV_ROUTE_CUSTOM = _pjsua2.PJMEDIA_AUD_DEV_ROUTE_CUSTOM
PJMEDIA_AUD_DEV_CAP_EXT_FORMAT = _pjsua2.PJMEDIA_AUD_DEV_CAP_EXT_FORMAT
PJMEDIA_AUD_DEV_CAP_INPUT_LATENCY = _pjsua2.PJMEDIA_AUD_DEV_CAP_INPUT_LATENCY
PJMEDIA_AUD_DEV_CAP_OUTPUT_LATENCY = _pjsua2.PJMEDIA_AUD_DEV_CAP_OUTPUT_LATENCY
PJMEDIA_AUD_DEV_CAP_INPUT_VOLUME_SETTING = _pjsua2.PJMEDIA_AUD_DEV_CAP_INPUT_VOLUME_SETTING
PJMEDIA_AUD_DEV_CAP_OUTPUT_VOLUME_SETTING = _pjsua2.PJMEDIA_AUD_DEV_CAP_OUTPUT_VOLUME_SETTING
PJMEDIA_AUD_DEV_CAP_INPUT_SIGNAL_METER = _pjsua2.PJMEDIA_AUD_DEV_CAP_INPUT_SIGNAL_METER
PJMEDIA_AUD_DEV_CAP_OUTPUT_SIGNAL_METER = _pjsua2.PJMEDIA_AUD_DEV_CAP_OUTPUT_SIGNAL_METER
PJMEDIA_AUD_DEV_CAP_INPUT_ROUTE = _pjsua2.PJMEDIA_AUD_DEV_CAP_INPUT_ROUTE
PJMEDIA_AUD_DEV_CAP_INPUT_SOURCE = _pjsua2.PJMEDIA_AUD_DEV_CAP_INPUT_SOURCE
PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE = _pjsua2.PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE
PJMEDIA_AUD_DEV_CAP_EC = _pjsua2.PJMEDIA_AUD_DEV_CAP_EC
PJMEDIA_AUD_DEV_CAP_EC_TAIL = _pjsua2.PJMEDIA_AUD_DEV_CAP_EC_TAIL
PJMEDIA_AUD_DEV_CAP_VAD = _pjsua2.PJMEDIA_AUD_DEV_CAP_VAD
PJMEDIA_AUD_DEV_CAP_CNG = _pjsua2.PJMEDIA_AUD_DEV_CAP_CNG
PJMEDIA_AUD_DEV_CAP_PLC = _pjsua2.PJMEDIA_AUD_DEV_CAP_PLC
PJMEDIA_AUD_DEV_CAP_MAX = _pjsua2.PJMEDIA_AUD_DEV_CAP_MAX
PJMEDIA_VID_DEFAULT_CAPTURE_DEV = _pjsua2.PJMEDIA_VID_DEFAULT_CAPTURE_DEV
PJMEDIA_VID_DEFAULT_RENDER_DEV = _pjsua2.PJMEDIA_VID_DEFAULT_RENDER_DEV
PJMEDIA_VID_INVALID_DEV = _pjsua2.PJMEDIA_VID_INVALID_DEV
PJMEDIA_VID_DEV_CAP_FORMAT = _pjsua2.PJMEDIA_VID_DEV_CAP_FORMAT
PJMEDIA_VID_DEV_CAP_INPUT_SCALE = _pjsua2.PJMEDIA_VID_DEV_CAP_INPUT_SCALE
PJMEDIA_VID_DEV_CAP_OUTPUT_WINDOW = _pjsua2.PJMEDIA_VID_DEV_CAP_OUTPUT_WINDOW
PJMEDIA_VID_DEV_CAP_OUTPUT_RESIZE = _pjsua2.PJMEDIA_VID_DEV_CAP_OUTPUT_RESIZE
PJMEDIA_VID_DEV_CAP_OUTPUT_POSITION = _pjsua2.PJMEDIA_VID_DEV_CAP_OUTPUT_POSITION
PJMEDIA_VID_DEV_CAP_OUTPUT_HIDE = _pjsua2.PJMEDIA_VID_DEV_CAP_OUTPUT_HIDE
PJMEDIA_VID_DEV_CAP_INPUT_PREVIEW = _pjsua2.PJMEDIA_VID_DEV_CAP_INPUT_PREVIEW
PJMEDIA_VID_DEV_CAP_ORIENTATION = _pjsua2.PJMEDIA_VID_DEV_CAP_ORIENTATION
PJMEDIA_VID_DEV_CAP_SWITCH = _pjsua2.PJMEDIA_VID_DEV_CAP_SWITCH
PJMEDIA_VID_DEV_CAP_OUTPUT_WINDOW_FLAGS = _pjsua2.PJMEDIA_VID_DEV_CAP_OUTPUT_WINDOW_FLAGS
PJMEDIA_VID_DEV_CAP_OUTPUT_FULLSCREEN = _pjsua2.PJMEDIA_VID_DEV_CAP_OUTPUT_FULLSCREEN
PJMEDIA_VID_DEV_CAP_MAX = _pjsua2.PJMEDIA_VID_DEV_CAP_MAX
PJMEDIA_VID_DEV_WINDOWED = _pjsua2.PJMEDIA_VID_DEV_WINDOWED
PJMEDIA_VID_DEV_FULLSCREEN = _pjsua2.PJMEDIA_VID_DEV_FULLSCREEN
PJMEDIA_VID_DEV_FULLSCREEN_DESKTOP = _pjsua2.PJMEDIA_VID_DEV_FULLSCREEN_DESKTOP
PJSIP_CRED_DATA_PLAIN_PASSWD = _pjsua2.PJSIP_CRED_DATA_PLAIN_PASSWD
PJSIP_CRED_DATA_DIGEST = _pjsua2.PJSIP_CRED_DATA_DIGEST
PJSIP_CRED_DATA_EXT_AKA = _pjsua2.PJSIP_CRED_DATA_EXT_AKA
PJSIP_AUTH_ALGORITHM_NOT_SET = _pjsua2.PJSIP_AUTH_ALGORITHM_NOT_SET
PJSIP_AUTH_ALGORITHM_MD5 = _pjsua2.PJSIP_AUTH_ALGORITHM_MD5
PJSIP_AUTH_ALGORITHM_SHA256 = _pjsua2.PJSIP_AUTH_ALGORITHM_SHA256
PJSIP_AUTH_ALGORITHM_SHA512_256 = _pjsua2.PJSIP_AUTH_ALGORITHM_SHA512_256
PJSIP_AUTH_ALGORITHM_AKAV1_MD5 = _pjsua2.PJSIP_AUTH_ALGORITHM_AKAV1_MD5
PJSIP_AUTH_ALGORITHM_AKAV2_MD5 = _pjsua2.PJSIP_AUTH_ALGORITHM_AKAV2_MD5
PJSIP_AUTH_ALGORITHM_COUNT = _pjsua2.PJSIP_AUTH_ALGORITHM_COUNT
PJSIP_DIALOG_CAP_UNSUPPORTED = _pjsua2.PJSIP_DIALOG_CAP_UNSUPPORTED
PJSIP_DIALOG_CAP_SUPPORTED = _pjsua2.PJSIP_DIALOG_CAP_SUPPORTED
PJSIP_DIALOG_CAP_UNKNOWN = _pjsua2.PJSIP_DIALOG_CAP_UNKNOWN
PJSIP_EVENT_UNKNOWN = _pjsua2.PJSIP_EVENT_UNKNOWN
PJSIP_EVENT_TIMER = _pjsua2.PJSIP_EVENT_TIMER
PJSIP_EVENT_TX_MSG = _pjsua2.PJSIP_EVENT_TX_MSG
PJSIP_EVENT_RX_MSG = _pjsua2.PJSIP_EVENT_RX_MSG
PJSIP_EVENT_TRANSPORT_ERROR = _pjsua2.PJSIP_EVENT_TRANSPORT_ERROR
PJSIP_EVENT_TSX_STATE = _pjsua2.PJSIP_EVENT_TSX_STATE
PJSIP_EVENT_USER = _pjsua2.PJSIP_EVENT_USER
PJSIP_SC_NULL = _pjsua2.PJSIP_SC_NULL
PJSIP_SC_TRYING = _pjsua2.PJSIP_SC_TRYING
PJSIP_SC_RINGING = _pjsua2.PJSIP_SC_RINGING
PJSIP_SC_CALL_BEING_FORWARDED = _pjsua2.PJSIP_SC_CALL_BEING_FORWARDED
PJSIP_SC_QUEUED = _pjsua2.PJSIP_SC_QUEUED
PJSIP_SC_PROGRESS = _pjsua2.PJSIP_SC_PROGRESS
PJSIP_SC_EARLY_DIALOG_TERMINATED = _pjsua2.PJSIP_SC_EARLY_DIALOG_TERMINATED
PJSIP_SC_OK = _pjsua2.PJSIP_SC_OK
PJSIP_SC_ACCEPTED = _pjsua2.PJSIP_SC_ACCEPTED
PJSIP_SC_NO_NOTIFICATION = _pjsua2.PJSIP_SC_NO_NOTIFICATION
PJSIP_SC_MULTIPLE_CHOICES = _pjsua2.PJSIP_SC_MULTIPLE_CHOICES
PJSIP_SC_MOVED_PERMANENTLY = _pjsua2.PJSIP_SC_MOVED_PERMANENTLY
PJSIP_SC_MOVED_TEMPORARILY = _pjsua2.PJSIP_SC_MOVED_TEMPORARILY
PJSIP_SC_USE_PROXY = _pjsua2.PJSIP_SC_USE_PROXY
PJSIP_SC_ALTERNATIVE_SERVICE = _pjsua2.PJSIP_SC_ALTERNATIVE_SERVICE
PJSIP_SC_BAD_REQUEST = _pjsua2.PJSIP_SC_BAD_REQUEST
PJSIP_SC_UNAUTHORIZED = _pjsua2.PJSIP_SC_UNAUTHORIZED
PJSIP_SC_PAYMENT_REQUIRED = _pjsua2.PJSIP_SC_PAYMENT_REQUIRED
PJSIP_SC_FORBIDDEN = _pjsua2.PJSIP_SC_FORBIDDEN
PJSIP_SC_NOT_FOUND = _pjsua2.PJSIP_SC_NOT_FOUND
PJSIP_SC_METHOD_NOT_ALLOWED = _pjsua2.PJSIP_SC_METHOD_NOT_ALLOWED
PJSIP_SC_NOT_ACCEPTABLE = _pjsua2.PJSIP_SC_NOT_ACCEPTABLE
PJSIP_SC_PROXY_AUTHENTICATION_REQUIRED = _pjsua2.PJSIP_SC_PROXY_AUTHENTICATION_REQUIRED
PJSIP_SC_REQUEST_TIMEOUT = _pjsua2.PJSIP_SC_REQUEST_TIMEOUT
PJSIP_SC_CONFLICT = _pjsua2.PJSIP_SC_CONFLICT
PJSIP_SC_GONE = _pjsua2.PJSIP_SC_GONE
PJSIP_SC_LENGTH_REQUIRED = _pjsua2.PJSIP_SC_LENGTH_REQUIRED
PJSIP_SC_CONDITIONAL_REQUEST_FAILED = _pjsua2.PJSIP_SC_CONDITIONAL_REQUEST_FAILED
PJSIP_SC_REQUEST_ENTITY_TOO_LARGE = _pjsua2.PJSIP_SC_REQUEST_ENTITY_TOO_LARGE
PJSIP_SC_REQUEST_URI_TOO_LONG = _pjsua2.PJSIP_SC_REQUEST_URI_TOO_LONG
PJSIP_SC_UNSUPPORTED_MEDIA_TYPE = _pjsua2.PJSIP_SC_UNSUPPORTED_MEDIA_TYPE
PJSIP_SC_UNSUPPORTED_URI_SCHEME = _pjsua2.PJSIP_SC_UNSUPPORTED_URI_SCHEME
PJSIP_SC_UNKNOWN_RESOURCE_PRIORITY = _pjsua2.PJSIP_SC_UNKNOWN_RESOURCE_PRIORITY
PJSIP_SC_BAD_EXTENSION = _pjsua2.PJSIP_SC_BAD_EXTENSION
PJSIP_SC_EXTENSION_REQUIRED = _pjsua2.PJSIP_SC_EXTENSION_REQUIRED
PJSIP_SC_SESSION_TIMER_TOO_SMALL = _pjsua2.PJSIP_SC_SESSION_TIMER_TOO_SMALL
PJSIP_SC_INTERVAL_TOO_BRIEF = _pjsua2.PJSIP_SC_INTERVAL_TOO_BRIEF
PJSIP_SC_BAD_LOCATION_INFORMATION = _pjsua2.PJSIP_SC_BAD_LOCATION_INFORMATION
PJSIP_SC_USE_IDENTITY_HEADER = _pjsua2.PJSIP_SC_USE_IDENTITY_HEADER
PJSIP_SC_PROVIDE_REFERRER_HEADER = _pjsua2.PJSIP_SC_PROVIDE_REFERRER_HEADER
PJSIP_SC_FLOW_FAILED = _pjsua2.PJSIP_SC_FLOW_FAILED
PJSIP_SC_ANONIMITY_DISALLOWED = _pjsua2.PJSIP_SC_ANONIMITY_DISALLOWED
PJSIP_SC_BAD_IDENTITY_INFO = _pjsua2.PJSIP_SC_BAD_IDENTITY_INFO
PJSIP_SC_UNSUPPORTED_CERTIFICATE = _pjsua2.PJSIP_SC_UNSUPPORTED_CERTIFICATE
PJSIP_SC_INVALID_IDENTITY_HEADER = _pjsua2.PJSIP_SC_INVALID_IDENTITY_HEADER
PJSIP_SC_FIRST_HOP_LACKS_OUTBOUND_SUPPORT = _pjsua2.PJSIP_SC_FIRST_HOP_LACKS_OUTBOUND_SUPPORT
PJSIP_SC_MAX_BREADTH_EXCEEDED = _pjsua2.PJSIP_SC_MAX_BREADTH_EXCEEDED
PJSIP_SC_BAD_INFO_PACKAGE = _pjsua2.PJSIP_SC_BAD_INFO_PACKAGE
PJSIP_SC_CONSENT_NEEDED = _pjsua2.PJSIP_SC_CONSENT_NEEDED
PJSIP_SC_TEMPORARILY_UNAVAILABLE = _pjsua2.PJSIP_SC_TEMPORARILY_UNAVAILABLE
PJSIP_SC_CALL_TSX_DOES_NOT_EXIST = _pjsua2.PJSIP_SC_CALL_TSX_DOES_NOT_EXIST
PJSIP_SC_LOOP_DETECTED = _pjsua2.PJSIP_SC_LOOP_DETECTED
PJSIP_SC_TOO_MANY_HOPS = _pjsua2.PJSIP_SC_TOO_MANY_HOPS
PJSIP_SC_ADDRESS_INCOMPLETE = _pjsua2.PJSIP_SC_ADDRESS_INCOMPLETE
PJSIP_AC_AMBIGUOUS = _pjsua2.PJSIP_AC_AMBIGUOUS
PJSIP_SC_BUSY_HERE = _pjsua2.PJSIP_SC_BUSY_HERE
PJSIP_SC_REQUEST_TERMINATED = _pjsua2.PJSIP_SC_REQUEST_TERMINATED
PJSIP_SC_NOT_ACCEPTABLE_HERE = _pjsua2.PJSIP_SC_NOT_ACCEPTABLE_HERE
PJSIP_SC_BAD_EVENT = _pjsua2.PJSIP_SC_BAD_EVENT
PJSIP_SC_REQUEST_UPDATED = _pjsua2.PJSIP_SC_REQUEST_UPDATED
PJSIP_SC_REQUEST_PENDING = _pjsua2.PJSIP_SC_REQUEST_PENDING
PJSIP_SC_UNDECIPHERABLE = _pjsua2.PJSIP_SC_UNDECIPHERABLE
PJSIP_SC_SECURITY_AGREEMENT_NEEDED = _pjsua2.PJSIP_SC_SECURITY_AGREEMENT_NEEDED
PJSIP_SC_INTERNAL_SERVER_ERROR = _pjsua2.PJSIP_SC_INTERNAL_SERVER_ERROR
PJSIP_SC_NOT_IMPLEMENTED = _pjsua2.PJSIP_SC_NOT_IMPLEMENTED
PJSIP_SC_BAD_GATEWAY = _pjsua2.PJSIP_SC_BAD_GATEWAY
PJSIP_SC_SERVICE_UNAVAILABLE = _pjsua2.PJSIP_SC_SERVICE_UNAVAILABLE
PJSIP_SC_SERVER_TIMEOUT = _pjsua2.PJSIP_SC_SERVER_TIMEOUT
PJSIP_SC_VERSION_NOT_SUPPORTED = _pjsua2.PJSIP_SC_VERSION_NOT_SUPPORTED
PJSIP_SC_MESSAGE_TOO_LARGE = _pjsua2.PJSIP_SC_MESSAGE_TOO_LARGE
PJSIP_SC_PUSH_NOTIFICATION_SERVICE_NOT_SUPPORTED = _pjsua2.PJSIP_SC_PUSH_NOTIFICATION_SERVICE_NOT_SUPPORTED
PJSIP_SC_PRECONDITION_FAILURE = _pjsua2.PJSIP_SC_PRECONDITION_FAILURE
PJSIP_SC_BUSY_EVERYWHERE = _pjsua2.PJSIP_SC_BUSY_EVERYWHERE
PJSIP_SC_DECLINE = _pjsua2.PJSIP_SC_DECLINE
PJSIP_SC_DOES_NOT_EXIST_ANYWHERE = _pjsua2.PJSIP_SC_DOES_NOT_EXIST_ANYWHERE
PJSIP_SC_NOT_ACCEPTABLE_ANYWHERE = _pjsua2.PJSIP_SC_NOT_ACCEPTABLE_ANYWHERE
PJSIP_SC_UNWANTED = _pjsua2.PJSIP_SC_UNWANTED
PJSIP_SC_REJECTED = _pjsua2.PJSIP_SC_REJECTED
PJSIP_SC_TSX_TIMEOUT = _pjsua2.PJSIP_SC_TSX_TIMEOUT
PJSIP_SC_TSX_TRANSPORT_ERROR = _pjsua2.PJSIP_SC_TSX_TRANSPORT_ERROR
PJSIP_SC__force_32bit = _pjsua2.PJSIP_SC__force_32bit
PJSIP_H_ACCEPT = _pjsua2.PJSIP_H_ACCEPT
PJSIP_H_ACCEPT_ENCODING_UNIMP = _pjsua2.PJSIP_H_ACCEPT_ENCODING_UNIMP
PJSIP_H_ACCEPT_LANGUAGE_UNIMP = _pjsua2.PJSIP_H_ACCEPT_LANGUAGE_UNIMP
PJSIP_H_ALERT_INFO_UNIMP = _pjsua2.PJSIP_H_ALERT_INFO_UNIMP
PJSIP_H_ALLOW = _pjsua2.PJSIP_H_ALLOW
PJSIP_H_AUTHENTICATION_INFO_UNIMP = _pjsua2.PJSIP_H_AUTHENTICATION_INFO_UNIMP
PJSIP_H_AUTHORIZATION = _pjsua2.PJSIP_H_AUTHORIZATION
PJSIP_H_CALL_ID = _pjsua2.PJSIP_H_CALL_ID
PJSIP_H_CALL_INFO_UNIMP = _pjsua2.PJSIP_H_CALL_INFO_UNIMP
PJSIP_H_CONTACT = _pjsua2.PJSIP_H_CONTACT
PJSIP_H_CONTENT_DISPOSITION_UNIMP = _pjsua2.PJSIP_H_CONTENT_DISPOSITION_UNIMP
PJSIP_H_CONTENT_ENCODING_UNIMP = _pjsua2.PJSIP_H_CONTENT_ENCODING_UNIMP
PJSIP_H_CONTENT_LANGUAGE_UNIMP = _pjsua2.PJSIP_H_CONTENT_LANGUAGE_UNIMP
PJSIP_H_CONTENT_LENGTH = _pjsua2.PJSIP_H_CONTENT_LENGTH
PJSIP_H_CONTENT_TYPE = _pjsua2.PJSIP_H_CONTENT_TYPE
PJSIP_H_CSEQ = _pjsua2.PJSIP_H_CSEQ
PJSIP_H_DATE_UNIMP = _pjsua2.PJSIP_H_DATE_UNIMP
PJSIP_H_ERROR_INFO_UNIMP = _pjsua2.PJSIP_H_ERROR_INFO_UNIMP
PJSIP_H_EXPIRES = _pjsua2.PJSIP_H_EXPIRES
PJSIP_H_FROM = _pjsua2.PJSIP_H_FROM
PJSIP_H_IN_REPLY_TO_UNIMP = _pjsua2.PJSIP_H_IN_REPLY_TO_UNIMP
PJSIP_H_MAX_FORWARDS = _pjsua2.PJSIP_H_MAX_FORWARDS
PJSIP_H_MIME_VERSION_UNIMP = _pjsua2.PJSIP_H_MIME_VERSION_UNIMP
PJSIP_H_MIN_EXPIRES = _pjsua2.PJSIP_H_MIN_EXPIRES
PJSIP_H_ORGANIZATION_UNIMP = _pjsua2.PJSIP_H_ORGANIZATION_UNIMP
PJSIP_H_PRIORITY_UNIMP = _pjsua2.PJSIP_H_PRIORITY_UNIMP
PJSIP_H_PROXY_AUTHENTICATE = _pjsua2.PJSIP_H_PROXY_AUTHENTICATE
PJSIP_H_PROXY_AUTHORIZATION = _pjsua2.PJSIP_H_PROXY_AUTHORIZATION
PJSIP_H_PROXY_REQUIRE_UNIMP = _pjsua2.PJSIP_H_PROXY_REQUIRE_UNIMP
PJSIP_H_RECORD_ROUTE = _pjsua2.PJSIP_H_RECORD_ROUTE
PJSIP_H_REPLY_TO_UNIMP = _pjsua2.PJSIP_H_REPLY_TO_UNIMP
PJSIP_H_REQUIRE = _pjsua2.PJSIP_H_REQUIRE
PJSIP_H_RETRY_AFTER = _pjsua2.PJSIP_H_RETRY_AFTER
PJSIP_H_ROUTE = _pjsua2.PJSIP_H_ROUTE
PJSIP_H_SERVER_UNIMP = _pjsua2.PJSIP_H_SERVER_UNIMP
PJSIP_H_SUBJECT_UNIMP = _pjsua2.PJSIP_H_SUBJECT_UNIMP
PJSIP_H_SUPPORTED = _pjsua2.PJSIP_H_SUPPORTED
PJSIP_H_TIMESTAMP_UNIMP = _pjsua2.PJSIP_H_TIMESTAMP_UNIMP
PJSIP_H_TO = _pjsua2.PJSIP_H_TO
PJSIP_H_UNSUPPORTED = _pjsua2.PJSIP_H_UNSUPPORTED
PJSIP_H_USER_AGENT_UNIMP = _pjsua2.PJSIP_H_USER_AGENT_UNIMP
PJSIP_H_VIA = _pjsua2.PJSIP_H_VIA
PJSIP_H_WARNING_UNIMP = _pjsua2.PJSIP_H_WARNING_UNIMP
PJSIP_H_WWW_AUTHENTICATE = _pjsua2.PJSIP_H_WWW_AUTHENTICATE
PJSIP_H_OTHER = _pjsua2.PJSIP_H_OTHER
PJSIP_TSX_STATE_NULL = _pjsua2.PJSIP_TSX_STATE_NULL
PJSIP_TSX_STATE_CALLING = _pjsua2.PJSIP_TSX_STATE_CALLING
PJSIP_TSX_STATE_TRYING = _pjsua2.PJSIP_TSX_STATE_TRYING
PJSIP_TSX_STATE_PROCEEDING = _pjsua2.PJSIP_TSX_STATE_PROCEEDING
PJSIP_TSX_STATE_COMPLETED = _pjsua2.PJSIP_TSX_STATE_COMPLETED
PJSIP_TSX_STATE_CONFIRMED = _pjsua2.PJSIP_TSX_STATE_CONFIRMED
PJSIP_TSX_STATE_TERMINATED = _pjsua2.PJSIP_TSX_STATE_TERMINATED
PJSIP_TSX_STATE_DESTROYED = _pjsua2.PJSIP_TSX_STATE_DESTROYED
PJSIP_TSX_STATE_MAX = _pjsua2.PJSIP_TSX_STATE_MAX
PJSIP_TRANSPORT_UNSPECIFIED = _pjsua2.PJSIP_TRANSPORT_UNSPECIFIED
PJSIP_TRANSPORT_UDP = _pjsua2.PJSIP_TRANSPORT_UDP
PJSIP_TRANSPORT_TCP = _pjsua2.PJSIP_TRANSPORT_TCP
PJSIP_TRANSPORT_TLS = _pjsua2.PJSIP_TRANSPORT_TLS
PJSIP_TRANSPORT_DTLS = _pjsua2.PJSIP_TRANSPORT_DTLS
PJSIP_TRANSPORT_SCTP = _pjsua2.PJSIP_TRANSPORT_SCTP
PJSIP_TRANSPORT_LOOP = _pjsua2.PJSIP_TRANSPORT_LOOP
PJSIP_TRANSPORT_LOOP_DGRAM = _pjsua2.PJSIP_TRANSPORT_LOOP_DGRAM
PJSIP_TRANSPORT_START_OTHER = _pjsua2.PJSIP_TRANSPORT_START_OTHER
PJSIP_TRANSPORT_IPV6 = _pjsua2.PJSIP_TRANSPORT_IPV6
PJSIP_TRANSPORT_UDP6 = _pjsua2.PJSIP_TRANSPORT_UDP6
PJSIP_TRANSPORT_TCP6 = _pjsua2.PJSIP_TRANSPORT_TCP6
PJSIP_TRANSPORT_TLS6 = _pjsua2.PJSIP_TRANSPORT_TLS6
PJSIP_TRANSPORT_DTLS6 = _pjsua2.PJSIP_TRANSPORT_DTLS6
PJSIP_TRANSPORT_RELIABLE = _pjsua2.PJSIP_TRANSPORT_RELIABLE
PJSIP_TRANSPORT_SECURE = _pjsua2.PJSIP_TRANSPORT_SECURE
PJSIP_TRANSPORT_DATAGRAM = _pjsua2.PJSIP_TRANSPORT_DATAGRAM
PJSIP_TP_STATE_CONNECTED = _pjsua2.PJSIP_TP_STATE_CONNECTED
PJSIP_TP_STATE_DISCONNECTED = _pjsua2.PJSIP_TP_STATE_DISCONNECTED
PJSIP_TP_STATE_SHUTDOWN = _pjsua2.PJSIP_TP_STATE_SHUTDOWN
PJSIP_TP_STATE_DESTROY = _pjsua2.PJSIP_TP_STATE_DESTROY
PJSIP_SSL_UNSPECIFIED_METHOD = _pjsua2.PJSIP_SSL_UNSPECIFIED_METHOD
PJSIP_SSLV2_METHOD = _pjsua2.PJSIP_SSLV2_METHOD
PJSIP_SSLV3_METHOD = _pjsua2.PJSIP_SSLV3_METHOD
PJSIP_TLSV1_METHOD = _pjsua2.PJSIP_TLSV1_METHOD
PJSIP_TLSV1_1_METHOD = _pjsua2.PJSIP_TLSV1_1_METHOD
PJSIP_TLSV1_2_METHOD = _pjsua2.PJSIP_TLSV1_2_METHOD
PJSIP_TLSV1_3_METHOD = _pjsua2.PJSIP_TLSV1_3_METHOD
PJSIP_SSLV23_METHOD = _pjsua2.PJSIP_SSLV23_METHOD
PJSIP_ROLE_UAC = _pjsua2.PJSIP_ROLE_UAC
PJSIP_ROLE_UAS = _pjsua2.PJSIP_ROLE_UAS
PJSIP_UAC_ROLE = _pjsua2.PJSIP_UAC_ROLE
PJSIP_UAS_ROLE = _pjsua2.PJSIP_UAS_ROLE
PJSIP_REDIRECT_REJECT = _pjsua2.PJSIP_REDIRECT_REJECT
PJSIP_REDIRECT_ACCEPT = _pjsua2.PJSIP_REDIRECT_ACCEPT
PJSIP_REDIRECT_ACCEPT_REPLACE = _pjsua2.PJSIP_REDIRECT_ACCEPT_REPLACE
PJSIP_REDIRECT_PENDING = _pjsua2.PJSIP_REDIRECT_PENDING
PJSIP_REDIRECT_STOP = _pjsua2.PJSIP_REDIRECT_STOP
PJSIP_EVSUB_STATE_NULL = _pjsua2.PJSIP_EVSUB_STATE_NULL
PJSIP_EVSUB_STATE_SENT = _pjsua2.PJSIP_EVSUB_STATE_SENT
PJSIP_EVSUB_STATE_ACCEPTED = _pjsua2.PJSIP_EVSUB_STATE_ACCEPTED
PJSIP_EVSUB_STATE_PENDING = _pjsua2.PJSIP_EVSUB_STATE_PENDING
PJSIP_EVSUB_STATE_ACTIVE = _pjsua2.PJSIP_EVSUB_STATE_ACTIVE
PJSIP_EVSUB_STATE_TERMINATED = _pjsua2.PJSIP_EVSUB_STATE_TERMINATED
PJSIP_EVSUB_STATE_UNKNOWN = _pjsua2.PJSIP_EVSUB_STATE_UNKNOWN
PJRPID_ACTIVITY_UNKNOWN = _pjsua2.PJRPID_ACTIVITY_UNKNOWN
PJRPID_ACTIVITY_AWAY = _pjsua2.PJRPID_ACTIVITY_AWAY
PJRPID_ACTIVITY_BUSY = _pjsua2.PJRPID_ACTIVITY_BUSY
PJSIP_INV_STATE_NULL = _pjsua2.PJSIP_INV_STATE_NULL
PJSIP_INV_STATE_CALLING = _pjsua2.PJSIP_INV_STATE_CALLING
PJSIP_INV_STATE_INCOMING = _pjsua2.PJSIP_INV_STATE_INCOMING
PJSIP_INV_STATE_EARLY = _pjsua2.PJSIP_INV_STATE_EARLY
PJSIP_INV_STATE_CONNECTING = _pjsua2.PJSIP_INV_STATE_CONNECTING
PJSIP_INV_STATE_CONFIRMED = _pjsua2.PJSIP_INV_STATE_CONFIRMED
PJSIP_INV_STATE_DISCONNECTED = _pjsua2.PJSIP_INV_STATE_DISCONNECTED
PJSUA_INVALID_ID = _pjsua2.PJSUA_INVALID_ID
PJSUA_STATE_NULL = _pjsua2.PJSUA_STATE_NULL
PJSUA_STATE_CREATED = _pjsua2.PJSUA_STATE_CREATED
PJSUA_STATE_INIT = _pjsua2.PJSUA_STATE_INIT
PJSUA_STATE_STARTING = _pjsua2.PJSUA_STATE_STARTING
PJSUA_STATE_RUNNING = _pjsua2.PJSUA_STATE_RUNNING
PJSUA_STATE_CLOSING = _pjsua2.PJSUA_STATE_CLOSING
PJSUA_STUN_USE_DEFAULT = _pjsua2.PJSUA_STUN_USE_DEFAULT
PJSUA_STUN_USE_DISABLED = _pjsua2.PJSUA_STUN_USE_DISABLED
PJSUA_STUN_RETRY_ON_FAILURE = _pjsua2.PJSUA_STUN_RETRY_ON_FAILURE
PJSUA_UPNP_USE_DEFAULT = _pjsua2.PJSUA_UPNP_USE_DEFAULT
PJSUA_UPNP_USE_DISABLED = _pjsua2.PJSUA_UPNP_USE_DISABLED
PJSUA_CALL_HOLD_TYPE_RFC3264 = _pjsua2.PJSUA_CALL_HOLD_TYPE_RFC3264
PJSUA_CALL_HOLD_TYPE_RFC2543 = _pjsua2.PJSUA_CALL_HOLD_TYPE_RFC2543
PJSUA_DESTROY_NO_RX_MSG = _pjsua2.PJSUA_DESTROY_NO_RX_MSG
PJSUA_DESTROY_NO_TX_MSG = _pjsua2.PJSUA_DESTROY_NO_TX_MSG
PJSUA_DESTROY_NO_NETWORK = _pjsua2.PJSUA_DESTROY_NO_NETWORK
PJSUA_100REL_NOT_USED = _pjsua2.PJSUA_100REL_NOT_USED
PJSUA_100REL_MANDATORY = _pjsua2.PJSUA_100REL_MANDATORY
PJSUA_100REL_OPTIONAL = _pjsua2.PJSUA_100REL_OPTIONAL
PJSUA_SIP_TIMER_INACTIVE = _pjsua2.PJSUA_SIP_TIMER_INACTIVE
PJSUA_SIP_TIMER_OPTIONAL = _pjsua2.PJSUA_SIP_TIMER_OPTIONAL
PJSUA_SIP_TIMER_REQUIRED = _pjsua2.PJSUA_SIP_TIMER_REQUIRED
PJSUA_SIP_TIMER_ALWAYS = _pjsua2.PJSUA_SIP_TIMER_ALWAYS
PJSUA_IPV6_DISABLED = _pjsua2.PJSUA_IPV6_DISABLED
PJSUA_IPV6_ENABLED = _pjsua2.PJSUA_IPV6_ENABLED
PJSUA_IPV6_ENABLED_NO_PREFERENCE = _pjsua2.PJSUA_IPV6_ENABLED_NO_PREFERENCE
PJSUA_IPV6_ENABLED_PREFER_IPV4 = _pjsua2.PJSUA_IPV6_ENABLED_PREFER_IPV4
PJSUA_IPV6_ENABLED_PREFER_IPV6 = _pjsua2.PJSUA_IPV6_ENABLED_PREFER_IPV6
PJSUA_IPV6_ENABLED_USE_IPV6_ONLY = _pjsua2.PJSUA_IPV6_ENABLED_USE_IPV6_ONLY
PJSUA_NAT64_DISABLED = _pjsua2.PJSUA_NAT64_DISABLED
PJSUA_NAT64_ENABLED = _pjsua2.PJSUA_NAT64_ENABLED
PJSUA_BUDDY_STATUS_UNKNOWN = _pjsua2.PJSUA_BUDDY_STATUS_UNKNOWN
PJSUA_BUDDY_STATUS_ONLINE = _pjsua2.PJSUA_BUDDY_STATUS_ONLINE
PJSUA_BUDDY_STATUS_OFFLINE = _pjsua2.PJSUA_BUDDY_STATUS_OFFLINE
PJSUA_CALL_MEDIA_NONE = _pjsua2.PJSUA_CALL_MEDIA_NONE
PJSUA_CALL_MEDIA_ACTIVE = _pjsua2.PJSUA_CALL_MEDIA_ACTIVE
PJSUA_CALL_MEDIA_LOCAL_HOLD = _pjsua2.PJSUA_CALL_MEDIA_LOCAL_HOLD
PJSUA_CALL_MEDIA_REMOTE_HOLD = _pjsua2.PJSUA_CALL_MEDIA_REMOTE_HOLD
PJSUA_CALL_MEDIA_ERROR = _pjsua2.PJSUA_CALL_MEDIA_ERROR
PJSUA_MED_TP_NULL = _pjsua2.PJSUA_MED_TP_NULL
PJSUA_MED_TP_CREATING = _pjsua2.PJSUA_MED_TP_CREATING
PJSUA_MED_TP_IDLE = _pjsua2.PJSUA_MED_TP_IDLE
PJSUA_MED_TP_INIT = _pjsua2.PJSUA_MED_TP_INIT
PJSUA_MED_TP_RUNNING = _pjsua2.PJSUA_MED_TP_RUNNING
PJSUA_MED_TP_DISABLED = _pjsua2.PJSUA_MED_TP_DISABLED
PJSUA_CALL_VID_STRM_NO_OP = _pjsua2.PJSUA_CALL_VID_STRM_NO_OP
PJSUA_CALL_VID_STRM_ADD = _pjsua2.PJSUA_CALL_VID_STRM_ADD
PJSUA_CALL_VID_STRM_REMOVE = _pjsua2.PJSUA_CALL_VID_STRM_REMOVE
PJSUA_CALL_VID_STRM_CHANGE_DIR = _pjsua2.PJSUA_CALL_VID_STRM_CHANGE_DIR
PJSUA_CALL_VID_STRM_CHANGE_CAP_DEV = _pjsua2.PJSUA_CALL_VID_STRM_CHANGE_CAP_DEV
PJSUA_CALL_VID_STRM_START_TRANSMIT = _pjsua2.PJSUA_CALL_VID_STRM_START_TRANSMIT
PJSUA_CALL_VID_STRM_STOP_TRANSMIT = _pjsua2.PJSUA_CALL_VID_STRM_STOP_TRANSMIT
PJSUA_CALL_VID_STRM_SEND_KEYFRAME = _pjsua2.PJSUA_CALL_VID_STRM_SEND_KEYFRAME
PJSUA_VID_REQ_KEYFRAME_SIP_INFO = _pjsua2.PJSUA_VID_REQ_KEYFRAME_SIP_INFO
PJSUA_VID_REQ_KEYFRAME_RTCP_PLI = _pjsua2.PJSUA_VID_REQ_KEYFRAME_RTCP_PLI
PJSUA_CALL_UNHOLD = _pjsua2.PJSUA_CALL_UNHOLD
PJSUA_CALL_UPDATE_CONTACT = _pjsua2.PJSUA_CALL_UPDATE_CONTACT
PJSUA_CALL_INCLUDE_DISABLED_MEDIA = _pjsua2.PJSUA_CALL_INCLUDE_DISABLED_MEDIA
PJSUA_CALL_NO_SDP_OFFER = _pjsua2.PJSUA_CALL_NO_SDP_OFFER
PJSUA_CALL_REINIT_MEDIA = _pjsua2.PJSUA_CALL_REINIT_MEDIA
PJSUA_CALL_UPDATE_VIA = _pjsua2.PJSUA_CALL_UPDATE_VIA
PJSUA_CALL_UPDATE_TARGET = _pjsua2.PJSUA_CALL_UPDATE_TARGET
PJSUA_CALL_SET_MEDIA_DIR = _pjsua2.PJSUA_CALL_SET_MEDIA_DIR
PJSUA_CALL_NO_MEDIA_SYNC = _pjsua2.PJSUA_CALL_NO_MEDIA_SYNC
PJSUA_MED_TP_CLOSE_MEMBER = _pjsua2.PJSUA_MED_TP_CLOSE_MEMBER
PJSUA_SND_DEFAULT_CAPTURE_DEV = _pjsua2.PJSUA_SND_DEFAULT_CAPTURE_DEV
PJSUA_SND_DEFAULT_PLAYBACK_DEV = _pjsua2.PJSUA_SND_DEFAULT_PLAYBACK_DEV
PJSUA_SND_NO_DEV = _pjsua2.PJSUA_SND_NO_DEV
PJSUA_SND_NULL_DEV = _pjsua2.PJSUA_SND_NULL_DEV
PJSUA_SND_DEV_SPEAKER_ONLY = _pjsua2.PJSUA_SND_DEV_SPEAKER_ONLY
PJSUA_SND_DEV_NO_IMMEDIATE_OPEN = _pjsua2.PJSUA_SND_DEV_NO_IMMEDIATE_OPEN
PJSUA_IP_CHANGE_OP_NULL = _pjsua2.PJSUA_IP_CHANGE_OP_NULL
PJSUA_IP_CHANGE_OP_SHUTDOWN_TP = _pjsua2.PJSUA_IP_CHANGE_OP_SHUTDOWN_TP
PJSUA_IP_CHANGE_OP_RESTART_LIS = _pjsua2.PJSUA_IP_CHANGE_OP_RESTART_LIS
PJSUA_IP_CHANGE_OP_ACC_SHUTDOWN_TP = _pjsua2.PJSUA_IP_CHANGE_OP_ACC_SHUTDOWN_TP
PJSUA_IP_CHANGE_OP_ACC_UPDATE_CONTACT = _pjsua2.PJSUA_IP_CHANGE_OP_ACC_UPDATE_CONTACT
PJSUA_IP_CHANGE_OP_ACC_HANGUP_CALLS = _pjsua2.PJSUA_IP_CHANGE_OP_ACC_HANGUP_CALLS
PJSUA_IP_CHANGE_OP_ACC_REINVITE_CALLS = _pjsua2.PJSUA_IP_CHANGE_OP_ACC_REINVITE_CALLS
PJSUA_IP_CHANGE_OP_COMPLETED = _pjsua2.PJSUA_IP_CHANGE_OP_COMPLETED
PJSUA_DTMF_METHOD_RFC2833 = _pjsua2.PJSUA_DTMF_METHOD_RFC2833
PJSUA_DTMF_METHOD_SIP_INFO = _pjsua2.PJSUA_DTMF_METHOD_SIP_INFO
PJSUA_SIP_SIPREC_INACTIVE = _pjsua2.PJSUA_SIP_SIPREC_INACTIVE
PJSUA_SIP_SIPREC_OPTIONAL = _pjsua2.PJSUA_SIP_SIPREC_OPTIONAL
PJSUA_SIP_SIPREC_MANDATORY = _pjsua2.PJSUA_SIP_SIPREC_MANDATORY
INVALID_ID = _pjsua2.INVALID_ID
r"""Invalid ID, equal to PJSUA_INVALID_ID"""
SUCCESS = _pjsua2.SUCCESS
r"""Success, equal to PJ_SUCCESS"""
class Error(Exception):
    r"""
    This structure contains information about an error that is thrown
    as an exception.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    status = property(_pjsua2.Error_status_get, _pjsua2.Error_status_set, doc=r"""The error code.""")
    title = property(_pjsua2.Error_title_get, _pjsua2.Error_title_set, doc=r"""The PJSUA API operation that throws the error.""")
    reason = property(_pjsua2.Error_reason_get, _pjsua2.Error_reason_set, doc=r"""The error message""")
    srcFile = property(_pjsua2.Error_srcFile_get, _pjsua2.Error_srcFile_set, doc=r"""The PJSUA source file that throws the error""")
    srcLine = property(_pjsua2.Error_srcLine_get, _pjsua2.Error_srcLine_set, doc=r"""The line number of PJSUA source file that throws the error""")

    def info(self, multi_line=False):
        r"""Build error string."""
        return _pjsua2.Error_info(self, multi_line)

    def __init__(self, *args):
        r"""
        *Overload 1:*
         Default constructor

        |

        *Overload 2:*

        Construct an Error instance from the specified parameters. If
        *prm_reason* is empty, it will be filled with the error description
         for the status code.
        """
        _pjsua2.Error_swiginit(self, _pjsua2.new_Error(*args))
    __swig_destroy__ = _pjsua2.delete_Error

# Register Error in _pjsua2:
_pjsua2.Error_swigregister(Error)
class Version(object):
    r"""
     Raise Error exception if the expression fails  Raise Error exception if the status fails  Raise Error exception if the expression fails  Run the statement and catch and ignore Error exception
    Version information.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    major = property(_pjsua2.Version_major_get, _pjsua2.Version_major_set, doc=r"""Major number""")
    minor = property(_pjsua2.Version_minor_get, _pjsua2.Version_minor_set, doc=r"""Minor number""")
    rev = property(_pjsua2.Version_rev_get, _pjsua2.Version_rev_set, doc=r"""Additional revision number""")
    suffix = property(_pjsua2.Version_suffix_get, _pjsua2.Version_suffix_set, doc=r"""Version suffix (e.g. "-svn")""")
    full = property(_pjsua2.Version_full_get, _pjsua2.Version_full_set, doc=r"""The full version info (e.g. "2.1.0-svn")""")
    numeric = property(_pjsua2.Version_numeric_get, _pjsua2.Version_numeric_set, doc=r"""
    PJLIB version number as three bytes with the following format:
    0xMMIIRR00, where MM: major number, II: minor number, RR: revision
    number, 00: always zero for now.
    """)

    def __init__(self):
        _pjsua2.Version_swiginit(self, _pjsua2.new_Version())
    __swig_destroy__ = _pjsua2.delete_Version

# Register Version in _pjsua2:
_pjsua2.Version_swigregister(Version)
class TimeVal(object):
    r"""Representation of time value."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    sec = property(_pjsua2.TimeVal_sec_get, _pjsua2.TimeVal_sec_set, doc=r"""The seconds part of the time.""")
    msec = property(_pjsua2.TimeVal_msec_get, _pjsua2.TimeVal_msec_set, doc=r"""The miliseconds fraction of the time.""")

    def __init__(self):
        _pjsua2.TimeVal_swiginit(self, _pjsua2.new_TimeVal())
    __swig_destroy__ = _pjsua2.delete_TimeVal

# Register TimeVal in _pjsua2:
_pjsua2.TimeVal_swigregister(TimeVal)
class PersistentObject(object):
    r"""
    This is the abstract base class of objects that can be serialized to/from
    persistent document.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")

    def __init__(self, *args, **kwargs):
        raise AttributeError("No constructor defined - class is abstract")
    __repr__ = _swig_repr
    __swig_destroy__ = _pjsua2.delete_PersistentObject

    def readObject(self, node):
        r"""
        Read this object from a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to read values from.
        """
        return _pjsua2.PersistentObject_readObject(self, node)

    def writeObject(self, node):
        r"""
        Write this object to a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to write values to.
        """
        return _pjsua2.PersistentObject_writeObject(self, node)

# Register PersistentObject in _pjsua2:
_pjsua2.PersistentObject_swigregister(PersistentObject)
class PersistentDocument(object):
    r"""
    This a the abstract base class for a persistent document. A document
    is created either by loading from a string or a file, or by constructing
    it manually when writing data to it. The document then can be saved
    to either string or to a file. A document contains one root ContainerNode
    where all data are stored under.

    Document is read and written serially, hence the order of reading must be
    the same as the order of writing. The PersistentDocument class provides
    API to read and write to the root node, but for more flexible operations
    application can use the ContainerNode methods instead. Indeed the read
    and write API in PersistentDocument is just a shorthand which calls the
    relevant methods in the ContainerNode. As a tip, normally application only
    uses the readObject() and writeObject() methods declared here to read/write
    top level objects, and use the macros that are explained in ContainerNode
    documentation to read/write more detailed data.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")

    def __init__(self, *args, **kwargs):
        raise AttributeError("No constructor defined - class is abstract")
    __repr__ = _swig_repr
    __swig_destroy__ = _pjsua2.delete_PersistentDocument

    def loadFile(self, filename):
        r"""
        Load this document from a file.

        :type filename: string
        :param filename:  The file name.
        """
        return _pjsua2.PersistentDocument_loadFile(self, filename)

    def loadString(self, input):
        r"""
        Load this document from string.

        :type input: string
        :param input:     The string.
        """
        return _pjsua2.PersistentDocument_loadString(self, input)

    def saveFile(self, filename):
        r"""
        Write this document to a file.

        :type filename: string
        :param filename:  The file name.
        """
        return _pjsua2.PersistentDocument_saveFile(self, filename)

    def saveString(self):
        r"""
        Write this document to string.

        :rtype: string
        :return: The string document.
        """
        return _pjsua2.PersistentDocument_saveString(self)

    def getRootContainer(self):
        r"""
        Get the root container node for this document

        :rtype: :py:class:`ContainerNode`
        :return: The root node.
        """
        return _pjsua2.PersistentDocument_getRootContainer(self)

    def hasUnread(self):
        r"""
        Determine if there is unread element. If yes, then app can use one of
        the readXxx() functions to read it.

        :rtype: boolean
        :return: True if there is.
        """
        return _pjsua2.PersistentDocument_hasUnread(self)

    def unreadName(self):
        r"""
        Get the name of the next unread element. It will throw Error if there
        is no more element to read.

        :rtype: string
        :return: The name of the next element .
        """
        return _pjsua2.PersistentDocument_unreadName(self)

    def readInt(self, *args):
        r"""
        Read an integer value from the document and return the value.
        This will throw Error if the current element is not a number.
        The read position will be advanced to the next element.

        :type name: string, optional
        :param name:      If specified, then the function will check if the
                             name of the next element matches the specified
                             name and throw Error if it doesn't match.

        :rtype: int
        :return: The value.
        """
        return _pjsua2.PersistentDocument_readInt(self, *args)

    def readNumber(self, *args):
        r"""
        Read a float value from the document and return the value.
        This will throw Error if the current element is not a number.
        The read position will be advanced to the next element.

        :type name: string, optional
        :param name:      If specified, then the function will check if the
                             name of the next element matches the specified
                             name and throw Error if it doesn't match.

        :rtype: float
        :return: The value.
        """
        return _pjsua2.PersistentDocument_readNumber(self, *args)

    def readBool(self, *args):
        r"""
        Read a boolean value from the container and return the value.
        This will throw Error if the current element is not a boolean.
        The read position will be advanced to the next element.

        :type name: string, optional
        :param name:      If specified, then the function will check if the
                             name of the next element matches the specified
                             name and throw Error if it doesn't match.

        :rtype: boolean
        :return: The value.
        """
        return _pjsua2.PersistentDocument_readBool(self, *args)

    def readString(self, *args):
        r"""
        Read a string value from the container and return the value.
        This will throw Error if the current element is not a string.
        The read position will be advanced to the next element.

        :type name: string, optional
        :param name:      If specified, then the function will check if the
                             name of the next element matches the specified
                             name and throw Error if it doesn't match.

        :rtype: string
        :return: The value.
        """
        return _pjsua2.PersistentDocument_readString(self, *args)

    def readStringVector(self, *args):
        r"""
        Read a string array from the container. This will throw Error
        if the current element is not a string array. The read position
        will be advanced to the next element.

        :type name: string, optional
        :param name:      If specified, then the function will check if the
                             name of the next element matches the specified
                             name and throw Error if it doesn't match.

        :rtype: :py:class:`StringVector`
        :return: The value.
        """
        return _pjsua2.PersistentDocument_readStringVector(self, *args)

    def readObject(self, obj):
        r"""
        Read the specified object from the container. This is equal to
        calling PersistentObject.readObject(ContainerNode);

        :type obj: :py:class:`PersistentObject`
        :param obj:       The object to read.
        """
        return _pjsua2.PersistentDocument_readObject(self, obj)

    def readContainer(self, *args):
        r"""
        Read a container from the container. This will throw Error if the
        current element is not an object. The read position will be advanced
        to the next element.

        :type name: string, optional
        :param name:      If specified, then the function will check if the
                             name of the next element matches the specified
                             name and throw Error if it doesn't match.

        :rtype: :py:class:`ContainerNode`
        :return: Container object.
        """
        return _pjsua2.PersistentDocument_readContainer(self, *args)

    def readArray(self, *args):
        r"""
        Read array container from the container. This will throw Error if the
        current element is not an array. The read position will be advanced
        to the next element.

        :type name: string, optional
        :param name:      If specified, then the function will check if the
                             name of the next element matches the specified
                             name and throw Error if it doesn't match.

        :rtype: :py:class:`ContainerNode`
        :return: Container object.
        """
        return _pjsua2.PersistentDocument_readArray(self, *args)

    def writeNumber(self, name, num):
        r"""
        Write a number value to the container.

        :type name: string
        :param name:      The name for the value in the container.
        :type num: float
        :param num:       The value to be written.
        """
        return _pjsua2.PersistentDocument_writeNumber(self, name, num)

    def writeInt(self, name, num):
        r"""
        Write a number value to the container.

        :type name: string
        :param name:      The name for the value in the container.
        :type num: int
        :param num:       The value to be written.
        """
        return _pjsua2.PersistentDocument_writeInt(self, name, num)

    def writeBool(self, name, value):
        r"""
        Write a boolean value to the container.

        :type name: string
        :param name:      The name for the value in the container.
        :type value: boolean
        :param value:     The value to be written.
        """
        return _pjsua2.PersistentDocument_writeBool(self, name, value)

    def writeString(self, name, value):
        r"""
        Write a string value to the container.

        :type name: string
        :param name:      The name for the value in the container.
        :type value: string
        :param value:     The value to be written.
        """
        return _pjsua2.PersistentDocument_writeString(self, name, value)

    def writeStringVector(self, name, arr):
        r"""
        Write string vector to the container.

        :type name: string
        :param name:      The name for the value in the container.
        :type arr: :py:class:`StringVector`
        :param arr:       The vector to be written.
        """
        return _pjsua2.PersistentDocument_writeStringVector(self, name, arr)

    def writeObject(self, obj):
        r"""
        Write an object to the container. This is equal to calling
        PersistentObject.writeObject(ContainerNode);

        :type obj: :py:class:`PersistentObject`
        :param obj:       The object to be written
        """
        return _pjsua2.PersistentDocument_writeObject(self, obj)

    def writeNewContainer(self, name):
        r"""
        Create and write an empty Object node that can be used as parent
        for subsequent write operations.

        :type name: string
        :param name:      The name for the new container in the container.

        :rtype: :py:class:`ContainerNode`
        :return: A sub-container.
        """
        return _pjsua2.PersistentDocument_writeNewContainer(self, name)

    def writeNewArray(self, name):
        r"""
        Create and write an empty array node that can be used as parent
        for subsequent write operations.

        :type name: string
        :param name:      The name for the array.

        :rtype: :py:class:`ContainerNode`
        :return: A sub-container.
        """
        return _pjsua2.PersistentDocument_writeNewArray(self, name)

# Register PersistentDocument in _pjsua2:
_pjsua2.PersistentDocument_swigregister(PersistentDocument)
class ContainerNode(object):
    r"""
    A container node is a placeholder for storing other data elements, which
    could be boolean, number, string, array of strings, or another container.
    Each data in the container is basically a name/value pair, with a type
    internally associated with it so that written data can be read in the
    correct type. Data is read and written serially, hence the order of
    reading must be the same as the order of writing.

    Application can read data from it by using the various read methods, and
    write data to it using the various write methods. Alternatively, it
    may be more convenient to use the provided macros below to read and write
    the data, because these macros set the name automatically:
         - NODE_READ_BOOL(node,item)
         - NODE_READ_UNSIGNED(node,item)
         - NODE_READ_INT(node,item)
         - NODE_READ_FLOAT(node,item)
         - NODE_READ_NUM_T(node,type,item)
         - NODE_READ_STRING(node,item)
         - NODE_READ_STRINGV(node,item)
         - NODE_READ_OBJ(node,item)
         - NODE_WRITE_BOOL(node,item)
         - NODE_WRITE_UNSIGNED(node,item)
         - NODE_WRITE_INT(node,item)
         - NODE_WRITE_FLOAT(node,item)
         - NODE_WRITE_NUM_T(node,type,item)
         - NODE_WRITE_STRING(node,item)
         - NODE_WRITE_STRINGV(node,item)
         - NODE_WRITE_OBJ(node,item)

    Implementation notes:

    The ContainerNode class is subclass-able, but not in the usual C++ way.
    With the usual C++ inheritance, some methods will be made pure virtual
    and must be implemented by the actual class. However, doing so will
    require dynamic instantiation of the ContainerNode class, which means
    we will need to pass around the class as pointer, for example as the
    return value of readContainer() and writeNewContainer() methods. Then
    we will need to establish who needs or how to delete these objects, or
    use shared pointer mechanism, each of which is considered too inconvenient
    or complicated for the purpose.

    So hence we use C style "inheritance", where the methods are declared in
    container_node_op and the data in container_node_internal_data structures.
    An implementation of ContainerNode class will need to set up these members
    with values that makes sense to itself. The methods in container_node_op
    contains the pointer to the actual implementation of the operation, which
    would be specific according to the format of the document. The methods in
    this ContainerNode class are just thin wrappers which call the
    implementation in the container_node_op structure.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def hasUnread(self):
        r"""
        Determine if there is unread element. If yes, then app can use one of
        the readXxx() functions to read it.
        """
        return _pjsua2.ContainerNode_hasUnread(self)

    def unreadName(self):
        r"""Get the name of the next unread element."""
        return _pjsua2.ContainerNode_unreadName(self)

    def readInt(self, *args):
        r"""
        Read an integer value from the document and return the value.
        This will throw Error if the current element is not a number.
        The read position will be advanced to the next element.

        :type name: string, optional
        :param name:      If specified, then the function will check if the
                             name of the next element matches the specified
                             name and throw Error if it doesn't match.

        :rtype: int
        :return: The value.
        """
        return _pjsua2.ContainerNode_readInt(self, *args)

    def readNumber(self, *args):
        r"""
        Read a number value from the document and return the value.
        This will throw Error if the current element is not a number.
        The read position will be advanced to the next element.

        :type name: string, optional
        :param name:      If specified, then the function will check if the
                             name of the next element matches the specified
                             name and throw Error if it doesn't match.

        :rtype: float
        :return: The value.
        """
        return _pjsua2.ContainerNode_readNumber(self, *args)

    def readBool(self, *args):
        r"""
        Read a boolean value from the container and return the value.
        This will throw Error if the current element is not a boolean.
        The read position will be advanced to the next element.

        :type name: string, optional
        :param name:      If specified, then the function will check if the
                             name of the next element matches the specified
                             name and throw Error if it doesn't match.

        :rtype: boolean
        :return: The value.
        """
        return _pjsua2.ContainerNode_readBool(self, *args)

    def readString(self, *args):
        r"""
        Read a string value from the container and return the value.
        This will throw Error if the current element is not a string.
        The read position will be advanced to the next element.

        :type name: string, optional
        :param name:      If specified, then the function will check if the
                             name of the next element matches the specified
                             name and throw Error if it doesn't match.

        :rtype: string
        :return: The value.
        """
        return _pjsua2.ContainerNode_readString(self, *args)

    def readStringVector(self, *args):
        r"""
        Read a string array from the container. This will throw Error
        if the current element is not a string array. The read position
        will be advanced to the next element.

        :type name: string, optional
        :param name:      If specified, then the function will check if the
                             name of the next element matches the specified
                             name and throw Error if it doesn't match.

        :rtype: :py:class:`StringVector`
        :return: The value.
        """
        return _pjsua2.ContainerNode_readStringVector(self, *args)

    def readObject(self, obj):
        r"""
        Read the specified object from the container. This is equal to
        calling PersistentObject.readObject(ContainerNode);

        :type obj: :py:class:`PersistentObject`
        :param obj:       The object to read.
        """
        return _pjsua2.ContainerNode_readObject(self, obj)

    def readContainer(self, *args):
        r"""
        Read a container from the container. This will throw Error if the
        current element is not a container. The read position will be advanced
        to the next element.

        :type name: string, optional
        :param name:      If specified, then the function will check if the
                             name of the next element matches the specified
                             name and throw Error if it doesn't match.

        :rtype: :py:class:`ContainerNode`
        :return: Container object.
        """
        return _pjsua2.ContainerNode_readContainer(self, *args)

    def readArray(self, *args):
        r"""
        Read array container from the container. This will throw Error if the
        current element is not an array. The read position will be advanced
        to the next element.

        :type name: string, optional
        :param name:      If specified, then the function will check if the
                             name of the next element matches the specified
                             name and throw Error if it doesn't match.

        :rtype: :py:class:`ContainerNode`
        :return: Container object.
        """
        return _pjsua2.ContainerNode_readArray(self, *args)

    def writeNumber(self, name, num):
        r"""
        Write a number value to the container.

        :type name: string
        :param name:      The name for the value in the container.
        :type num: float
        :param num:       The value to be written.
        """
        return _pjsua2.ContainerNode_writeNumber(self, name, num)

    def writeInt(self, name, num):
        r"""
        Write a number value to the container.

        :type name: string
        :param name:      The name for the value in the container.
        :type num: int
        :param num:       The value to be written.
        """
        return _pjsua2.ContainerNode_writeInt(self, name, num)

    def writeBool(self, name, value):
        r"""
        Write a boolean value to the container.

        :type name: string
        :param name:      The name for the value in the container.
        :type value: boolean
        :param value:     The value to be written.
        """
        return _pjsua2.ContainerNode_writeBool(self, name, value)

    def writeString(self, name, value):
        r"""
        Write a string value to the container.

        :type name: string
        :param name:      The name for the value in the container.
        :type value: string
        :param value:     The value to be written.
        """
        return _pjsua2.ContainerNode_writeString(self, name, value)

    def writeStringVector(self, name, arr):
        r"""
        Write string vector to the container.

        :type name: string
        :param name:      The name for the value in the container.
        :type arr: :py:class:`StringVector`
        :param arr:       The vector to be written.
        """
        return _pjsua2.ContainerNode_writeStringVector(self, name, arr)

    def writeObject(self, obj):
        r"""
        Write an object to the container. This is equal to calling
        PersistentObject.writeObject(ContainerNode);

        :type obj: :py:class:`PersistentObject`
        :param obj:       The object to be written
        """
        return _pjsua2.ContainerNode_writeObject(self, obj)

    def writeNewContainer(self, name):
        r"""
        Create and write an empty Object node that can be used as parent
        for subsequent write operations.

        :type name: string
        :param name:      The name for the new container in the container.

        :rtype: :py:class:`ContainerNode`
        :return: A sub-container.
        """
        return _pjsua2.ContainerNode_writeNewContainer(self, name)

    def writeNewArray(self, name):
        r"""
        Create and write an empty array node that can be used as parent
        for subsequent write operations.

        :type name: string
        :param name:      The name for the array.

        :rtype: :py:class:`ContainerNode`
        :return: A sub-container.
        """
        return _pjsua2.ContainerNode_writeNewArray(self, name)

    def __init__(self):
        _pjsua2.ContainerNode_swiginit(self, _pjsua2.new_ContainerNode())
    __swig_destroy__ = _pjsua2.delete_ContainerNode

# Register ContainerNode in _pjsua2:
_pjsua2.ContainerNode_swigregister(ContainerNode)
class AuthCredInfo(PersistentObject):
    r"""
    Credential information. Credential contains information to authenticate
    against a service.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    scheme = property(_pjsua2.AuthCredInfo_scheme_get, _pjsua2.AuthCredInfo_scheme_set, doc=r"""The authentication scheme (e.g. "digest").""")
    realm = property(_pjsua2.AuthCredInfo_realm_get, _pjsua2.AuthCredInfo_realm_set, doc=r"""
    Realm on which this credential is to be used. Use "*" to make
    a credential that can be used to authenticate against any challenges.
    """)
    username = property(_pjsua2.AuthCredInfo_username_get, _pjsua2.AuthCredInfo_username_set, doc=r"""Authentication user name.""")
    dataType = property(_pjsua2.AuthCredInfo_dataType_get, _pjsua2.AuthCredInfo_dataType_set, doc=r"""
    Type of data that is contained in the "data" field. Use 0 if the data
    contains plain text password.
    """)
    data = property(_pjsua2.AuthCredInfo_data_get, _pjsua2.AuthCredInfo_data_set, doc=r"""The data, which can be a plain text password or a hashed digest.""")
    algoType = property(_pjsua2.AuthCredInfo_algoType_get, _pjsua2.AuthCredInfo_algoType_set, doc=r"""Digest algorithm type.""")
    akaK = property(_pjsua2.AuthCredInfo_akaK_get, _pjsua2.AuthCredInfo_akaK_set, doc=r"""Permanent subscriber key.""")
    akaOp = property(_pjsua2.AuthCredInfo_akaOp_get, _pjsua2.AuthCredInfo_akaOp_set, doc=r"""Operator variant key.""")
    akaAmf = property(_pjsua2.AuthCredInfo_akaAmf_get, _pjsua2.AuthCredInfo_akaAmf_set, doc=r"""Authentication Management Field""")

    def __init__(self, *args):
        r"""
        *Overload 1:*
        Default constructor

        |

        *Overload 2:*
        Construct a credential with the specified parameters
        """
        _pjsua2.AuthCredInfo_swiginit(self, _pjsua2.new_AuthCredInfo(*args))

    def readObject(self, node):
        r"""
        Read this object from a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to read values from.
        """
        return _pjsua2.AuthCredInfo_readObject(self, node)

    def writeObject(self, node):
        r"""
        Write this object to a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to write values to.
        """
        return _pjsua2.AuthCredInfo_writeObject(self, node)
    __swig_destroy__ = _pjsua2.delete_AuthCredInfo

# Register AuthCredInfo in _pjsua2:
_pjsua2.AuthCredInfo_swigregister(AuthCredInfo)
class SockOpt(object):
    r"""Socket option type."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    level = property(_pjsua2.SockOpt_level_get, _pjsua2.SockOpt_level_set, doc=r"""The level at which the option is defined.""")
    optName = property(_pjsua2.SockOpt_optName_get, _pjsua2.SockOpt_optName_set, doc=r"""Option name.""")

    def __init__(self, *args):
        r"""
        *Overload 1:*
        Default constructor.

        |

        *Overload 2:*
        Construct a socket option with the specified parameters.
        """
        _pjsua2.SockOpt_swiginit(self, _pjsua2.new_SockOpt(*args))

    def setOptValInt(self, opt_val):
        r"""
        Set option value of type integer.

        :type opt_val: int
        :param opt_val:           Option value.
        """
        return _pjsua2.SockOpt_setOptValInt(self, opt_val)
    __swig_destroy__ = _pjsua2.delete_SockOpt

# Register SockOpt in _pjsua2:
_pjsua2.SockOpt_swigregister(SockOpt)
class SockOptParams(PersistentObject):
    r"""Socket option parameters, to be specified in TransportConfig."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    sockOpts = property(_pjsua2.SockOptParams_sockOpts_get, _pjsua2.SockOptParams_sockOpts_set, doc=r"""Array of socket options.""")

    def __init__(self):
        r"""Default constructor initialises with default values"""
        _pjsua2.SockOptParams_swiginit(self, _pjsua2.new_SockOptParams())

    def readObject(self, node):
        r"""
        Read this object from a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to read values from.
        """
        return _pjsua2.SockOptParams_readObject(self, node)

    def writeObject(self, node):
        r"""
        Write this object to a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to write values to.
        """
        return _pjsua2.SockOptParams_writeObject(self, node)
    __swig_destroy__ = _pjsua2.delete_SockOptParams

# Register SockOptParams in _pjsua2:
_pjsua2.SockOptParams_swigregister(SockOptParams)
class TlsConfig(PersistentObject):
    r"""TLS transport settings, to be specified in TransportConfig."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    CaListFile = property(_pjsua2.TlsConfig_CaListFile_get, _pjsua2.TlsConfig_CaListFile_set, doc=r"""Certificate of Authority (CA) list file.""")
    certFile = property(_pjsua2.TlsConfig_certFile_get, _pjsua2.TlsConfig_certFile_set, doc=r"""
    Public endpoint certificate file, which will be used as client-
    side  certificate for outgoing TLS connection, and server-side
    certificate for incoming TLS connection.
    """)
    privKeyFile = property(_pjsua2.TlsConfig_privKeyFile_get, _pjsua2.TlsConfig_privKeyFile_set, doc=r"""Optional private key of the endpoint certificate to be used.""")
    password = property(_pjsua2.TlsConfig_password_get, _pjsua2.TlsConfig_password_set, doc=r"""Password to open private key.""")
    CaBuf = property(_pjsua2.TlsConfig_CaBuf_get, _pjsua2.TlsConfig_CaBuf_set, doc=r"""
    Certificate of Authority (CA) buffer. If CaListFile, certFile or
    privKeyFile are set, this setting will be ignored.
    """)
    certBuf = property(_pjsua2.TlsConfig_certBuf_get, _pjsua2.TlsConfig_certBuf_set, doc=r"""
    Public endpoint certificate buffer, which will be used as client-
    side  certificate for outgoing TLS connection, and server-side
    certificate for incoming TLS connection. If CaListFile, certFile or
    privKeyFile are set, this setting will be ignored.
    """)
    privKeyBuf = property(_pjsua2.TlsConfig_privKeyBuf_get, _pjsua2.TlsConfig_privKeyBuf_set, doc=r"""
    Optional private key buffer of the endpoint certificate to be used.
    If CaListFile, certFile or privKeyFile are set, this setting will
    be ignored.
    """)
    certLookupType = property(_pjsua2.TlsConfig_certLookupType_get, _pjsua2.TlsConfig_certLookupType_set, doc=r"""
    Lookup certificate from OS certificate store, this setting will
    specify the field type to lookup.

    Currently only used by Windows Schannel backend, see also
    *pj_ssl_cert_load_from_store()* for more info.
    """)
    certLookupKeyword = property(_pjsua2.TlsConfig_certLookupKeyword_get, _pjsua2.TlsConfig_certLookupKeyword_set, doc=r"""
    Lookup certificate from OS certificate store, this setting will
    specify the keyword to match on the field specified in
    *certLookupType* above.

    Currently only used by Windows Schannel backend, see also
    *pj_ssl_cert_load_from_store()* for more info.
    """)
    credDirectType = property(_pjsua2.TlsConfig_credDirectType_get, _pjsua2.TlsConfig_credDirectType_set, doc=r"""
    When using backend specific credentials objects, specify the backend
    object types using this bit flag, see also 'pj_ssl_cert_direct_type'.
    """)
    privKeyDirect = property(_pjsua2.TlsConfig_privKeyDirect_get, _pjsua2.TlsConfig_privKeyDirect_set, doc=r"""
    Optional backend specific private key. See also
    *pj_ssl_cert_load_direct()*.

    Currently only the OpenSSL backend is supported. This setting
    corresponds to an OpenSSL EVP_PKEY instance. When this is set,
    specify PJ_SSL_CERT_DIRECT_OPENSSL_EVP_PKEY flag in *certDirectType*.
    """)
    certDirect = property(_pjsua2.TlsConfig_certDirect_get, _pjsua2.TlsConfig_certDirect_set, doc=r"""
    Optional backend specific certificate. See also
    *pj_ssl_cert_load_direct()*.

    Currently only the OpenSSL backend is supported, this setting
    corresponds to an OpenSSL X509 instance. When this is set,
    specify PJ_SSL_CERT_DIRECT_OPENSSL_X509_CERT flag in *certDirectType*.
    """)
    method = property(_pjsua2.TlsConfig_method_get, _pjsua2.TlsConfig_method_set, doc=r"""
    TLS protocol method from #pjsip_ssl_method. In the future, this field
    might be deprecated in favor of **proto** field. For now, this field
    is only applicable only when **proto** field is set to zero.

    Default is PJSIP_SSL_UNSPECIFIED_METHOD (0), which in turn will
    use PJSIP_SSL_DEFAULT_METHOD, which default value is PJSIP_TLSV1_METHOD.
    """)
    proto = property(_pjsua2.TlsConfig_proto_get, _pjsua2.TlsConfig_proto_set, doc=r"""
    TLS protocol type from #pj_ssl_sock_proto. Use this field to enable
    specific protocol type. Use bitwise OR operation to combine the protocol
    type.

    Default is PJSIP_SSL_DEFAULT_PROTO.
    """)
    ciphers = property(_pjsua2.TlsConfig_ciphers_get, _pjsua2.TlsConfig_ciphers_set, doc=r"""
    Ciphers and order preference. The Endpoint::utilSslGetAvailableCiphers()
    can be used to check the available ciphers supported by backend.
    If the array is empty, then default cipher list of the backend
    will be used.
    """)
    verifyServer = property(_pjsua2.TlsConfig_verifyServer_get, _pjsua2.TlsConfig_verifyServer_set, doc=r"""
    Specifies TLS transport behavior on the server TLS certificate
    verification result:
    - If *verifyServer* is disabled, TLS transport will just notify
      the application via pjsip_tp_state_callback with state
      PJSIP_TP_STATE_CONNECTED regardless TLS verification result.
    - If *verifyServer* is enabled, TLS transport will be shutdown
      and application will be notified with state
      PJSIP_TP_STATE_DISCONNECTED whenever there is any TLS verification
      error, otherwise PJSIP_TP_STATE_CONNECTED will be notified.

    In any cases, application can inspect pjsip_tls_state_info in the
    callback to see the verification detail.

    Default value is false.
    """)
    verifyClient = property(_pjsua2.TlsConfig_verifyClient_get, _pjsua2.TlsConfig_verifyClient_set, doc=r"""
    Specifies TLS transport behavior on the client TLS certificate
    verification result:
    - If *verifyClient* is disabled, TLS transport will just notify
      the application via pjsip_tp_state_callback with state
      PJSIP_TP_STATE_CONNECTED regardless TLS verification result.
    - If *verifyClient* is enabled, TLS transport will be shutdown
      and application will be notified with state
      PJSIP_TP_STATE_DISCONNECTED whenever there is any TLS verification
      error, otherwise PJSIP_TP_STATE_CONNECTED will be notified.

    In any cases, application can inspect pjsip_tls_state_info in the
    callback to see the verification detail.

    Default value is PJ_FALSE.
    """)
    requireClientCert = property(_pjsua2.TlsConfig_requireClientCert_get, _pjsua2.TlsConfig_requireClientCert_set, doc=r"""
    When acting as server (incoming TLS connections), reject incoming
    connection if client doesn't supply a TLS certificate.

    This setting corresponds to SSL_VERIFY_FAIL_IF_NO_PEER_CERT flag.
    Default value is PJ_FALSE.
    """)
    msecTimeout = property(_pjsua2.TlsConfig_msecTimeout_get, _pjsua2.TlsConfig_msecTimeout_set, doc=r"""
    TLS negotiation timeout to be applied for both outgoing and incoming
    connection, in milliseconds. If zero, the SSL negotiation doesn't
    have a timeout.

    Default: zero
    """)
    qosType = property(_pjsua2.TlsConfig_qosType_get, _pjsua2.TlsConfig_qosType_set, doc=r"""
    QoS traffic type to be set on this transport. When application wants
    to apply QoS tagging to the transport, it's preferable to set this
    field rather than *qosParam* fields since this is more portable.

    Default value is PJ_QOS_TYPE_BEST_EFFORT.
    """)
    qosParams = property(_pjsua2.TlsConfig_qosParams_get, _pjsua2.TlsConfig_qosParams_set, doc=r"""
    Set the low level QoS parameters to the transport. This is a lower
    level operation than setting the *qosType* field and may not be
    supported on all platforms.

    By default all settings in this structure are disabled.
    """)
    qosIgnoreError = property(_pjsua2.TlsConfig_qosIgnoreError_get, _pjsua2.TlsConfig_qosIgnoreError_set, doc=r"""
    Specify if the transport should ignore any errors when setting the QoS
    traffic type/parameters.

    Default: PJ_TRUE
    """)
    sockOptParams = property(_pjsua2.TlsConfig_sockOptParams_get, _pjsua2.TlsConfig_sockOptParams_set, doc=r"""
    Specify options to be set on the transport.

    By default, this is unset, which means that the underlying sockopt
    params as returned by #pj_ssl_sock_param_default() will be used.
    """)
    sockOptIgnoreError = property(_pjsua2.TlsConfig_sockOptIgnoreError_get, _pjsua2.TlsConfig_sockOptIgnoreError_set, doc=r"""
    Specify if the transport should ignore any errors when setting the
    sockopt parameters.

    Default: true
    """)
    enableRenegotiation = property(_pjsua2.TlsConfig_enableRenegotiation_get, _pjsua2.TlsConfig_enableRenegotiation_set, doc=r"""
    Specify if renegotiation is enabled for TLSv1.2 or earlier.

    Default: PJ_TRUE
    """)

    def __init__(self):
        r"""Default constructor initialises with default values"""
        _pjsua2.TlsConfig_swiginit(self, _pjsua2.new_TlsConfig())

    def readObject(self, node):
        r"""
        Read this object from a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to read values from.
        """
        return _pjsua2.TlsConfig_readObject(self, node)

    def writeObject(self, node):
        r"""
        Write this object to a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to write values to.
        """
        return _pjsua2.TlsConfig_writeObject(self, node)
    __swig_destroy__ = _pjsua2.delete_TlsConfig

# Register TlsConfig in _pjsua2:
_pjsua2.TlsConfig_swigregister(TlsConfig)
class TransportConfig(PersistentObject):
    r"""Parameters to create a transport instance."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    port = property(_pjsua2.TransportConfig_port_get, _pjsua2.TransportConfig_port_set, doc=r"""
    UDP port number to bind locally. This setting MUST be specified
    even when default port is desired. If the value is zero, the
    transport will be bound to any available port, and application
    can query the port by querying the transport info.
    """)
    portRange = property(_pjsua2.TransportConfig_portRange_get, _pjsua2.TransportConfig_portRange_set, doc=r"""
    Specify the port range for socket binding, relative to the start
    port number specified in *port*. Note that this setting is only
    applicable for media transport when the start port number is non zero.
    Media transport is configurable via account setting,
    i.e: AccountMediaConfig::transportConfig, please check the media
    transport config docs for more info.

    Available ports are in the range of [*port*, *port* + *portRange]*.

    Default value is zero.
    """)
    randomizePort = property(_pjsua2.TransportConfig_randomizePort_get, _pjsua2.TransportConfig_randomizePort_set, doc=r"""
    Specify whether to randomly pick the starting port number from
    the range of [*port*, *port* + *port_range]*. This setting is
    used only if both port and port_range are non-zero, and only
    applicable for the port selection of UDP and loop media transport.

    Default is PJ_FALSE.
    """)
    publicAddress = property(_pjsua2.TransportConfig_publicAddress_get, _pjsua2.TransportConfig_publicAddress_set, doc=r"""
    Optional address to advertise as the address of this transport.
    Application can specify any address or hostname for this field,
    for example it can point to one of the interface address in the
    system, or it can point to the public address of a NAT router
    where port mappings have been configured for the application.

    Note: this option can be used for both UDP and TCP as well!
    """)
    boundAddress = property(_pjsua2.TransportConfig_boundAddress_get, _pjsua2.TransportConfig_boundAddress_set, doc=r"""
    Optional address where the socket should be bound to. This option
    SHOULD only be used to selectively bind the socket to particular
    interface (instead of 0.0.0.0), and SHOULD NOT be used to set the
    published address of a transport (the public_addr field should be
    used for that purpose).

    Note that unlike public_addr field, the address (or hostname) here
    MUST correspond to the actual interface address in the host, since
    this address will be specified as bind() argument.
    """)
    tlsConfig = property(_pjsua2.TransportConfig_tlsConfig_get, _pjsua2.TransportConfig_tlsConfig_set, doc=r"""
    This specifies TLS settings for TLS transport.
    It's only used when creating a SIP TLS transport.
    """)
    qosType = property(_pjsua2.TransportConfig_qosType_get, _pjsua2.TransportConfig_qosType_set, doc=r"""
    QoS traffic type to be set on this transport. When application wants
    to apply QoS tagging to the transport, it's preferable to set this
    field rather than *qosParam* fields since this is more portable.

    For TLS transport, this field will be ignored, the QoS traffic type
    can be set via tlsConfig.

    Default is QoS not set.
    """)
    qosParams = property(_pjsua2.TransportConfig_qosParams_get, _pjsua2.TransportConfig_qosParams_set, doc=r"""
    Set the low level QoS parameters to the transport. This is a lower
    level operation than setting the *qosType* field and may not be
    supported on all platforms.

    For TLS transport, this field will be ignored, the low level QoS
    parameters can be set via tlsConfig.

    Default is QoS not set.
    """)
    sockOptParams = property(_pjsua2.TransportConfig_sockOptParams_get, _pjsua2.TransportConfig_sockOptParams_set, doc=r"""
    Set the low level socket options to the transport.

    For TLS transport, this field will be ignored, the socket options
    can be set via tlsConfig.

    Default is no socket option set.
    """)

    def __init__(self):
        r"""Default constructor initialises with default values"""
        _pjsua2.TransportConfig_swiginit(self, _pjsua2.new_TransportConfig())

    def readObject(self, node):
        r"""
        Read this object from a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to read values from.
        """
        return _pjsua2.TransportConfig_readObject(self, node)

    def writeObject(self, node):
        r"""
        Write this object to a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to write values to.
        """
        return _pjsua2.TransportConfig_writeObject(self, node)
    __swig_destroy__ = _pjsua2.delete_TransportConfig

# Register TransportConfig in _pjsua2:
_pjsua2.TransportConfig_swigregister(TransportConfig)
class TransportInfo(object):
    r"""
    This structure describes transport information returned by
    Endpoint::transportGetInfo() function.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    id = property(_pjsua2.TransportInfo_id_get, _pjsua2.TransportInfo_id_set, doc=r"""PJSUA transport identification.""")
    type = property(_pjsua2.TransportInfo_type_get, _pjsua2.TransportInfo_type_set, doc=r"""Transport type.""")
    typeName = property(_pjsua2.TransportInfo_typeName_get, _pjsua2.TransportInfo_typeName_set, doc=r"""Transport type name.""")
    info = property(_pjsua2.TransportInfo_info_get, _pjsua2.TransportInfo_info_set, doc=r"""Transport string info/description.""")
    flags = property(_pjsua2.TransportInfo_flags_get, _pjsua2.TransportInfo_flags_set, doc=r"""Transport flags (see pjsip_transport_flags_e).""")
    localAddress = property(_pjsua2.TransportInfo_localAddress_get, _pjsua2.TransportInfo_localAddress_set, doc=r"""Local/bound address.""")
    localName = property(_pjsua2.TransportInfo_localName_get, _pjsua2.TransportInfo_localName_set, doc=r"""Published address (or transport address name).""")
    usageCount = property(_pjsua2.TransportInfo_usageCount_get, _pjsua2.TransportInfo_usageCount_set, doc=r"""Current number of objects currently referencing this transport.""")

    def __init__(self):
        r"""Default constructor."""
        _pjsua2.TransportInfo_swiginit(self, _pjsua2.new_TransportInfo())
    __swig_destroy__ = _pjsua2.delete_TransportInfo

# Register TransportInfo in _pjsua2:
_pjsua2.TransportInfo_swigregister(TransportInfo)
class SipRxData(object):
    r"""
    This structure describes an incoming SIP message. It corresponds to the
    pjsip_rx_data structure in PJSIP library.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    info = property(_pjsua2.SipRxData_info_get, _pjsua2.SipRxData_info_set, doc=r"""
    A short info string describing the request, which normally contains
    the request method and its CSeq.
    """)
    wholeMsg = property(_pjsua2.SipRxData_wholeMsg_get, _pjsua2.SipRxData_wholeMsg_set, doc=r"""
    The whole message data as a string, containing both the header section
    and message body section.
    """)
    srcAddress = property(_pjsua2.SipRxData_srcAddress_get, _pjsua2.SipRxData_srcAddress_set, doc=r"""Source address of the message.""")
    pjRxData = property(_pjsua2.SipRxData_pjRxData_get, _pjsua2.SipRxData_pjRxData_set, doc=r"""
    Pointer to original pjsip_rx_data. Only valid when the struct
    is constructed from PJSIP's pjsip_rx_data.
    """)

    def __init__(self):
        r"""Default constructor."""
        _pjsua2.SipRxData_swiginit(self, _pjsua2.new_SipRxData())
    __swig_destroy__ = _pjsua2.delete_SipRxData

# Register SipRxData in _pjsua2:
_pjsua2.SipRxData_swigregister(SipRxData)
class SipTxData(object):
    r"""
    This structure describes an outgoing SIP message. It corresponds to the
    pjsip_tx_data structure in PJSIP library.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    info = property(_pjsua2.SipTxData_info_get, _pjsua2.SipTxData_info_set, doc=r"""
    A short info string describing the request, which normally contains
    the request method and its CSeq.
    """)
    wholeMsg = property(_pjsua2.SipTxData_wholeMsg_get, _pjsua2.SipTxData_wholeMsg_set, doc=r"""
    The whole message data as a string, containing both the header section
    and message body section.
    """)
    dstAddress = property(_pjsua2.SipTxData_dstAddress_get, _pjsua2.SipTxData_dstAddress_set, doc=r"""Destination address of the message.""")
    pjTxData = property(_pjsua2.SipTxData_pjTxData_get, _pjsua2.SipTxData_pjTxData_set, doc=r"""
    Pointer to original pjsip_tx_data. Only valid when the struct
    is constructed from PJSIP's pjsip_tx_data.
    """)

    def __init__(self):
        r"""Default constructor."""
        _pjsua2.SipTxData_swiginit(self, _pjsua2.new_SipTxData())
    __swig_destroy__ = _pjsua2.delete_SipTxData

# Register SipTxData in _pjsua2:
_pjsua2.SipTxData_swigregister(SipTxData)
class SipTransaction(object):
    r"""
    This structure describes SIP transaction object. It corresponds to the
    pjsip_transaction structure in PJSIP library.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    role = property(_pjsua2.SipTransaction_role_get, _pjsua2.SipTransaction_role_set, doc=r"""Role (UAS or UAC)""")
    method = property(_pjsua2.SipTransaction_method_get, _pjsua2.SipTransaction_method_set, doc=r"""The method.""")
    statusCode = property(_pjsua2.SipTransaction_statusCode_get, _pjsua2.SipTransaction_statusCode_set, doc=r"""Last status code seen.""")
    statusText = property(_pjsua2.SipTransaction_statusText_get, _pjsua2.SipTransaction_statusText_set, doc=r"""Last reason phrase.""")
    state = property(_pjsua2.SipTransaction_state_get, _pjsua2.SipTransaction_state_set, doc=r"""State.""")
    lastTx = property(_pjsua2.SipTransaction_lastTx_get, _pjsua2.SipTransaction_lastTx_set, doc=r"""Msg kept for retrans.""")
    pjTransaction = property(_pjsua2.SipTransaction_pjTransaction_get, _pjsua2.SipTransaction_pjTransaction_set, doc=r"""pjsip_transaction.""")

    def __init__(self):
        r"""Default constructor."""
        _pjsua2.SipTransaction_swiginit(self, _pjsua2.new_SipTransaction())
    __swig_destroy__ = _pjsua2.delete_SipTransaction

# Register SipTransaction in _pjsua2:
_pjsua2.SipTransaction_swigregister(SipTransaction)
class TimerEvent(object):
    r"""This structure describes timer event."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    entry = property(_pjsua2.TimerEvent_entry_get, _pjsua2.TimerEvent_entry_set, doc=r"""The timer entry.""")

    def __init__(self):
        _pjsua2.TimerEvent_swiginit(self, _pjsua2.new_TimerEvent())
    __swig_destroy__ = _pjsua2.delete_TimerEvent

# Register TimerEvent in _pjsua2:
_pjsua2.TimerEvent_swigregister(TimerEvent)
class TsxStateEventSrc(object):
    r"""This structure describes transaction state event source."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    rdata = property(_pjsua2.TsxStateEventSrc_rdata_get, _pjsua2.TsxStateEventSrc_rdata_set, doc=r"""The incoming message.""")
    tdata = property(_pjsua2.TsxStateEventSrc_tdata_get, _pjsua2.TsxStateEventSrc_tdata_set, doc=r"""The outgoing message.""")
    timer = property(_pjsua2.TsxStateEventSrc_timer_get, _pjsua2.TsxStateEventSrc_timer_set, doc=r"""The timer.""")
    status = property(_pjsua2.TsxStateEventSrc_status_get, _pjsua2.TsxStateEventSrc_status_set, doc=r"""Transport error status.""")
    data = property(_pjsua2.TsxStateEventSrc_data_get, _pjsua2.TsxStateEventSrc_data_set, doc=r"""Generic data.""")

    def __init__(self):
        _pjsua2.TsxStateEventSrc_swiginit(self, _pjsua2.new_TsxStateEventSrc())
    __swig_destroy__ = _pjsua2.delete_TsxStateEventSrc

# Register TsxStateEventSrc in _pjsua2:
_pjsua2.TsxStateEventSrc_swigregister(TsxStateEventSrc)
class TsxStateEvent(object):
    r"""This structure describes transaction state changed event."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    src = property(_pjsua2.TsxStateEvent_src_get, _pjsua2.TsxStateEvent_src_set, doc=r"""Event source.""")
    tsx = property(_pjsua2.TsxStateEvent_tsx_get, _pjsua2.TsxStateEvent_tsx_set, doc=r"""The transaction.""")
    prevState = property(_pjsua2.TsxStateEvent_prevState_get, _pjsua2.TsxStateEvent_prevState_set, doc=r"""Previous state.""")
    type = property(_pjsua2.TsxStateEvent_type_get, _pjsua2.TsxStateEvent_type_set, doc=r"""
    Type of event source:
       - PJSIP_EVENT_TX_MSG
       - PJSIP_EVENT_RX_MSG,
       - PJSIP_EVENT_TRANSPORT_ERROR
       - PJSIP_EVENT_TIMER
       - PJSIP_EVENT_USER
    """)

    def __init__(self):
        _pjsua2.TsxStateEvent_swiginit(self, _pjsua2.new_TsxStateEvent())
    __swig_destroy__ = _pjsua2.delete_TsxStateEvent

# Register TsxStateEvent in _pjsua2:
_pjsua2.TsxStateEvent_swigregister(TsxStateEvent)
class TxMsgEvent(object):
    r"""This structure describes message transmission event."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    tdata = property(_pjsua2.TxMsgEvent_tdata_get, _pjsua2.TxMsgEvent_tdata_set, doc=r"""The transmit data buffer.""")

    def __init__(self):
        _pjsua2.TxMsgEvent_swiginit(self, _pjsua2.new_TxMsgEvent())
    __swig_destroy__ = _pjsua2.delete_TxMsgEvent

# Register TxMsgEvent in _pjsua2:
_pjsua2.TxMsgEvent_swigregister(TxMsgEvent)
class TxErrorEvent(object):
    r"""This structure describes transmission error event."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    tdata = property(_pjsua2.TxErrorEvent_tdata_get, _pjsua2.TxErrorEvent_tdata_set, doc=r"""The transmit data.""")
    tsx = property(_pjsua2.TxErrorEvent_tsx_get, _pjsua2.TxErrorEvent_tsx_set, doc=r"""The transaction.""")

    def __init__(self):
        _pjsua2.TxErrorEvent_swiginit(self, _pjsua2.new_TxErrorEvent())
    __swig_destroy__ = _pjsua2.delete_TxErrorEvent

# Register TxErrorEvent in _pjsua2:
_pjsua2.TxErrorEvent_swigregister(TxErrorEvent)
class RxMsgEvent(object):
    r"""This structure describes message arrival event."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    rdata = property(_pjsua2.RxMsgEvent_rdata_get, _pjsua2.RxMsgEvent_rdata_set, doc=r"""The receive data buffer.""")

    def __init__(self):
        _pjsua2.RxMsgEvent_swiginit(self, _pjsua2.new_RxMsgEvent())
    __swig_destroy__ = _pjsua2.delete_RxMsgEvent

# Register RxMsgEvent in _pjsua2:
_pjsua2.RxMsgEvent_swigregister(RxMsgEvent)
class UserEvent(object):
    r"""This structure describes user event."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    user1 = property(_pjsua2.UserEvent_user1_get, _pjsua2.UserEvent_user1_set, doc=r"""User data 1.""")
    user2 = property(_pjsua2.UserEvent_user2_get, _pjsua2.UserEvent_user2_set, doc=r"""User data 2.""")
    user3 = property(_pjsua2.UserEvent_user3_get, _pjsua2.UserEvent_user3_set, doc=r"""User data 3.""")
    user4 = property(_pjsua2.UserEvent_user4_get, _pjsua2.UserEvent_user4_set, doc=r"""User data 4.""")

    def __init__(self):
        _pjsua2.UserEvent_swiginit(self, _pjsua2.new_UserEvent())
    __swig_destroy__ = _pjsua2.delete_UserEvent

# Register UserEvent in _pjsua2:
_pjsua2.UserEvent_swigregister(UserEvent)
class SipEventBody(object):
    r"""The event body."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    timer = property(_pjsua2.SipEventBody_timer_get, _pjsua2.SipEventBody_timer_set, doc=r"""Timer event.""")
    tsxState = property(_pjsua2.SipEventBody_tsxState_get, _pjsua2.SipEventBody_tsxState_set, doc=r"""Transaction state has changed event.""")
    txMsg = property(_pjsua2.SipEventBody_txMsg_get, _pjsua2.SipEventBody_txMsg_set, doc=r"""Message transmission event.""")
    txError = property(_pjsua2.SipEventBody_txError_get, _pjsua2.SipEventBody_txError_set, doc=r"""Transmission error event.""")
    rxMsg = property(_pjsua2.SipEventBody_rxMsg_get, _pjsua2.SipEventBody_rxMsg_set, doc=r"""Message arrival event.""")
    user = property(_pjsua2.SipEventBody_user_get, _pjsua2.SipEventBody_user_set, doc=r"""User event.""")

    def __init__(self):
        _pjsua2.SipEventBody_swiginit(self, _pjsua2.new_SipEventBody())
    __swig_destroy__ = _pjsua2.delete_SipEventBody

# Register SipEventBody in _pjsua2:
_pjsua2.SipEventBody_swigregister(SipEventBody)
class SipEvent(object):
    r"""
    This structure describe event descriptor to fully identify a SIP event. It
    corresponds to the pjsip_event structure in PJSIP library.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    type = property(_pjsua2.SipEvent_type_get, _pjsua2.SipEvent_type_set, doc=r"""The event type, can be any value of **pjsip_event_id_e**.""")
    body = property(_pjsua2.SipEvent_body_get, _pjsua2.SipEvent_body_set, doc=r"""The event body, which fields depends on the event type.""")
    pjEvent = property(_pjsua2.SipEvent_pjEvent_get, _pjsua2.SipEvent_pjEvent_set, doc=r"""
    Pointer to its original pjsip_event. Only valid when the struct is
    constructed from PJSIP's pjsip_event.
    """)

    def __init__(self):
        r"""Default constructor."""
        _pjsua2.SipEvent_swiginit(self, _pjsua2.new_SipEvent())
    __swig_destroy__ = _pjsua2.delete_SipEvent

# Register SipEvent in _pjsua2:
_pjsua2.SipEvent_swigregister(SipEvent)
class SipMediaType(object):
    r"""
    SIP media type containing type and subtype. For example, for
    "application/sdp", the type is "application" and the subtype is "sdp".
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    type = property(_pjsua2.SipMediaType_type_get, _pjsua2.SipMediaType_type_set, doc=r"""Media type.""")
    subType = property(_pjsua2.SipMediaType_subType_get, _pjsua2.SipMediaType_subType_set, doc=r"""Media subtype.""")

    def __init__(self):
        _pjsua2.SipMediaType_swiginit(self, _pjsua2.new_SipMediaType())
    __swig_destroy__ = _pjsua2.delete_SipMediaType

# Register SipMediaType in _pjsua2:
_pjsua2.SipMediaType_swigregister(SipMediaType)
class SipHeader(object):
    r"""Simple SIP header."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    hName = property(_pjsua2.SipHeader_hName_get, _pjsua2.SipHeader_hName_set, doc=r"""Header name.""")
    hValue = property(_pjsua2.SipHeader_hValue_get, _pjsua2.SipHeader_hValue_set, doc=r"""Header value.""")

    def __init__(self):
        r"""Default constructor."""
        _pjsua2.SipHeader_swiginit(self, _pjsua2.new_SipHeader())
    __swig_destroy__ = _pjsua2.delete_SipHeader

# Register SipHeader in _pjsua2:
_pjsua2.SipHeader_swigregister(SipHeader)
class SipMultipartPart(object):
    r"""This describes each multipart part."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    headers = property(_pjsua2.SipMultipartPart_headers_get, _pjsua2.SipMultipartPart_headers_set, doc=r"""Optional headers to be put in this multipart part.""")
    contentType = property(_pjsua2.SipMultipartPart_contentType_get, _pjsua2.SipMultipartPart_contentType_set, doc=r"""The MIME type of the body part of this multipart part.""")
    body = property(_pjsua2.SipMultipartPart_body_get, _pjsua2.SipMultipartPart_body_set, doc=r"""The body part of tthis multipart part.""")

    def __init__(self):
        _pjsua2.SipMultipartPart_swiginit(self, _pjsua2.new_SipMultipartPart())
    __swig_destroy__ = _pjsua2.delete_SipMultipartPart

# Register SipMultipartPart in _pjsua2:
_pjsua2.SipMultipartPart_swigregister(SipMultipartPart)
class SipTxOption(object):
    r"""
    Additional options when sending outgoing SIP message. This corresponds to
    pjsua_msg_data structure in PJSIP library.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    targetUri = property(_pjsua2.SipTxOption_targetUri_get, _pjsua2.SipTxOption_targetUri_set, doc=r"""
    Optional remote target URI (i.e. Target header). If empty (""), the
    target will be set to the remote URI (To header). At the moment this
    field is only used when sending initial INVITE and MESSAGE requests.
    """)
    localUri = property(_pjsua2.SipTxOption_localUri_get, _pjsua2.SipTxOption_localUri_set, doc=r"""
    Optional local URI (i.e. From header). If empty (""), the
    *AccountConfig::idUri* is used for the From header. At the moment this
    field is only used when sending initial INVITE and MESSAGE requests.
    """)
    contactUri = property(_pjsua2.SipTxOption_contactUri_get, _pjsua2.SipTxOption_contactUri_set, doc=r"""
    Optional contact URI to be used for this call. If empty (""), the
    contact will be generated automatically based on the account
    configuration. At the moment this field is only used when sending
    initial INVITE requests.
    """)
    headers = property(_pjsua2.SipTxOption_headers_get, _pjsua2.SipTxOption_headers_set, doc=r"""
    Additional message headers to be included in the outgoing message.

    Application may override Max-Forwards header value (the default is
    #PJSIP_MAX_FORWARDS_VALUE) by adding a Max-Forwards header here.
    """)
    contentType = property(_pjsua2.SipTxOption_contentType_get, _pjsua2.SipTxOption_contentType_set, doc=r"""
    MIME type of the message body, if application specifies the messageBody
    in this structure.
    """)
    msgBody = property(_pjsua2.SipTxOption_msgBody_get, _pjsua2.SipTxOption_msgBody_set, doc=r"""
    Optional message body to be added to the message, only when the
    message doesn't have a body.
    """)
    multipartContentType = property(_pjsua2.SipTxOption_multipartContentType_get, _pjsua2.SipTxOption_multipartContentType_set, doc=r"""
    Content type of the multipart body. If application wants to send
    multipart message bodies, it puts the parts in multipartParts and set
    the content type in multipartContentType. If the message already
    contains a body, the body will be added to the multipart bodies.
    """)
    multipartParts = property(_pjsua2.SipTxOption_multipartParts_get, _pjsua2.SipTxOption_multipartParts_set, doc=r"""
    Array of multipart parts. If application wants to send multipart
    message bodies, it puts the parts in *parts* and set the content
    type in *multipart_ctype*. If the message already contains a body,
    the body will be added to the multipart bodies.
    """)

    def isEmpty(self):
        r"""
        Check if the options are empty. If the options are set with empty
        values, there will be no additional information sent with outgoing
        SIP message.

        :rtype: boolean
        :return: True if the options are empty.
        """
        return _pjsua2.SipTxOption_isEmpty(self)

    def __init__(self):
        _pjsua2.SipTxOption_swiginit(self, _pjsua2.new_SipTxOption())
    __swig_destroy__ = _pjsua2.delete_SipTxOption

# Register SipTxOption in _pjsua2:
_pjsua2.SipTxOption_swigregister(SipTxOption)
class SendInstantMessageParam(object):
    r"""
    This structure contains parameters for sending instance message methods,
    e.g: Buddy::sendInstantMessage(), Call:sendInstantMessage().
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    contentType = property(_pjsua2.SendInstantMessageParam_contentType_get, _pjsua2.SendInstantMessageParam_contentType_set, doc=r"""MIME type. Default is "text/plain".""")
    content = property(_pjsua2.SendInstantMessageParam_content_get, _pjsua2.SendInstantMessageParam_content_set, doc=r"""The message content.""")
    txOption = property(_pjsua2.SendInstantMessageParam_txOption_get, _pjsua2.SendInstantMessageParam_txOption_set, doc=r"""List of headers etc to be included in outgoing request.""")
    userData = property(_pjsua2.SendInstantMessageParam_userData_get, _pjsua2.SendInstantMessageParam_userData_set, doc=r"""User data, which will be given back when the IM callback is called.""")

    def __init__(self):
        r"""Default constructor initializes with zero/empty values."""
        _pjsua2.SendInstantMessageParam_swiginit(self, _pjsua2.new_SendInstantMessageParam())
    __swig_destroy__ = _pjsua2.delete_SendInstantMessageParam

# Register SendInstantMessageParam in _pjsua2:
_pjsua2.SendInstantMessageParam_swigregister(SendInstantMessageParam)
class SendTypingIndicationParam(object):
    r"""
    This structure contains parameters for sending typing indication methods,
    e.g: Buddy::sendTypingIndication(), Call:sendTypingIndication().
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    isTyping = property(_pjsua2.SendTypingIndicationParam_isTyping_get, _pjsua2.SendTypingIndicationParam_isTyping_set, doc=r"""True to indicate to remote that local person is currently typing an IM.""")
    txOption = property(_pjsua2.SendTypingIndicationParam_txOption_get, _pjsua2.SendTypingIndicationParam_txOption_set, doc=r"""List of headers etc to be included in outgoing request.""")

    def __init__(self):
        r"""Default constructor initializes with zero/empty values."""
        _pjsua2.SendTypingIndicationParam_swiginit(self, _pjsua2.new_SendTypingIndicationParam())
    __swig_destroy__ = _pjsua2.delete_SendTypingIndicationParam

# Register SendTypingIndicationParam in _pjsua2:
_pjsua2.SendTypingIndicationParam_swigregister(SendTypingIndicationParam)
class SockOptVector(object):
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def iterator(self):
        return _pjsua2.SockOptVector_iterator(self)
    def __iter__(self):
        return self.iterator()

    def __nonzero__(self):
        return _pjsua2.SockOptVector___nonzero__(self)

    def __bool__(self):
        return _pjsua2.SockOptVector___bool__(self)

    def __len__(self):
        return _pjsua2.SockOptVector___len__(self)

    def __getslice__(self, i, j):
        return _pjsua2.SockOptVector___getslice__(self, i, j)

    def __setslice__(self, *args):
        return _pjsua2.SockOptVector___setslice__(self, *args)

    def __delslice__(self, i, j):
        return _pjsua2.SockOptVector___delslice__(self, i, j)

    def __delitem__(self, *args):
        return _pjsua2.SockOptVector___delitem__(self, *args)

    def __getitem__(self, *args):
        return _pjsua2.SockOptVector___getitem__(self, *args)

    def __setitem__(self, *args):
        return _pjsua2.SockOptVector___setitem__(self, *args)

    def pop(self):
        return _pjsua2.SockOptVector_pop(self)

    def append(self, x):
        return _pjsua2.SockOptVector_append(self, x)

    def empty(self):
        return _pjsua2.SockOptVector_empty(self)

    def size(self):
        return _pjsua2.SockOptVector_size(self)

    def swap(self, v):
        return _pjsua2.SockOptVector_swap(self, v)

    def begin(self):
        return _pjsua2.SockOptVector_begin(self)

    def end(self):
        return _pjsua2.SockOptVector_end(self)

    def rbegin(self):
        return _pjsua2.SockOptVector_rbegin(self)

    def rend(self):
        return _pjsua2.SockOptVector_rend(self)

    def clear(self):
        return _pjsua2.SockOptVector_clear(self)

    def get_allocator(self):
        return _pjsua2.SockOptVector_get_allocator(self)

    def pop_back(self):
        return _pjsua2.SockOptVector_pop_back(self)

    def erase(self, *args):
        return _pjsua2.SockOptVector_erase(self, *args)

    def __init__(self, *args):
        _pjsua2.SockOptVector_swiginit(self, _pjsua2.new_SockOptVector(*args))

    def push_back(self, x):
        return _pjsua2.SockOptVector_push_back(self, x)

    def front(self):
        return _pjsua2.SockOptVector_front(self)

    def back(self):
        return _pjsua2.SockOptVector_back(self)

    def assign(self, n, x):
        return _pjsua2.SockOptVector_assign(self, n, x)

    def resize(self, *args):
        return _pjsua2.SockOptVector_resize(self, *args)

    def insert(self, *args):
        return _pjsua2.SockOptVector_insert(self, *args)

    def reserve(self, n):
        return _pjsua2.SockOptVector_reserve(self, n)

    def capacity(self):
        return _pjsua2.SockOptVector_capacity(self)
    __swig_destroy__ = _pjsua2.delete_SockOptVector

# Register SockOptVector in _pjsua2:
_pjsua2.SockOptVector_swigregister(SockOptVector)
class SipHeaderVector(object):
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def iterator(self):
        return _pjsua2.SipHeaderVector_iterator(self)
    def __iter__(self):
        return self.iterator()

    def __nonzero__(self):
        return _pjsua2.SipHeaderVector___nonzero__(self)

    def __bool__(self):
        return _pjsua2.SipHeaderVector___bool__(self)

    def __len__(self):
        return _pjsua2.SipHeaderVector___len__(self)

    def __getslice__(self, i, j):
        return _pjsua2.SipHeaderVector___getslice__(self, i, j)

    def __setslice__(self, *args):
        return _pjsua2.SipHeaderVector___setslice__(self, *args)

    def __delslice__(self, i, j):
        return _pjsua2.SipHeaderVector___delslice__(self, i, j)

    def __delitem__(self, *args):
        return _pjsua2.SipHeaderVector___delitem__(self, *args)

    def __getitem__(self, *args):
        return _pjsua2.SipHeaderVector___getitem__(self, *args)

    def __setitem__(self, *args):
        return _pjsua2.SipHeaderVector___setitem__(self, *args)

    def pop(self):
        return _pjsua2.SipHeaderVector_pop(self)

    def append(self, x):
        return _pjsua2.SipHeaderVector_append(self, x)

    def empty(self):
        return _pjsua2.SipHeaderVector_empty(self)

    def size(self):
        return _pjsua2.SipHeaderVector_size(self)

    def swap(self, v):
        return _pjsua2.SipHeaderVector_swap(self, v)

    def begin(self):
        return _pjsua2.SipHeaderVector_begin(self)

    def end(self):
        return _pjsua2.SipHeaderVector_end(self)

    def rbegin(self):
        return _pjsua2.SipHeaderVector_rbegin(self)

    def rend(self):
        return _pjsua2.SipHeaderVector_rend(self)

    def clear(self):
        return _pjsua2.SipHeaderVector_clear(self)

    def get_allocator(self):
        return _pjsua2.SipHeaderVector_get_allocator(self)

    def pop_back(self):
        return _pjsua2.SipHeaderVector_pop_back(self)

    def erase(self, *args):
        return _pjsua2.SipHeaderVector_erase(self, *args)

    def __init__(self, *args):
        _pjsua2.SipHeaderVector_swiginit(self, _pjsua2.new_SipHeaderVector(*args))

    def push_back(self, x):
        return _pjsua2.SipHeaderVector_push_back(self, x)

    def front(self):
        return _pjsua2.SipHeaderVector_front(self)

    def back(self):
        return _pjsua2.SipHeaderVector_back(self)

    def assign(self, n, x):
        return _pjsua2.SipHeaderVector_assign(self, n, x)

    def resize(self, *args):
        return _pjsua2.SipHeaderVector_resize(self, *args)

    def insert(self, *args):
        return _pjsua2.SipHeaderVector_insert(self, *args)

    def reserve(self, n):
        return _pjsua2.SipHeaderVector_reserve(self, n)

    def capacity(self):
        return _pjsua2.SipHeaderVector_capacity(self)
    __swig_destroy__ = _pjsua2.delete_SipHeaderVector

# Register SipHeaderVector in _pjsua2:
_pjsua2.SipHeaderVector_swigregister(SipHeaderVector)
class AuthCredInfoVector(object):
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def iterator(self):
        return _pjsua2.AuthCredInfoVector_iterator(self)
    def __iter__(self):
        return self.iterator()

    def __nonzero__(self):
        return _pjsua2.AuthCredInfoVector___nonzero__(self)

    def __bool__(self):
        return _pjsua2.AuthCredInfoVector___bool__(self)

    def __len__(self):
        return _pjsua2.AuthCredInfoVector___len__(self)

    def __getslice__(self, i, j):
        return _pjsua2.AuthCredInfoVector___getslice__(self, i, j)

    def __setslice__(self, *args):
        return _pjsua2.AuthCredInfoVector___setslice__(self, *args)

    def __delslice__(self, i, j):
        return _pjsua2.AuthCredInfoVector___delslice__(self, i, j)

    def __delitem__(self, *args):
        return _pjsua2.AuthCredInfoVector___delitem__(self, *args)

    def __getitem__(self, *args):
        return _pjsua2.AuthCredInfoVector___getitem__(self, *args)

    def __setitem__(self, *args):
        return _pjsua2.AuthCredInfoVector___setitem__(self, *args)

    def pop(self):
        return _pjsua2.AuthCredInfoVector_pop(self)

    def append(self, x):
        return _pjsua2.AuthCredInfoVector_append(self, x)

    def empty(self):
        return _pjsua2.AuthCredInfoVector_empty(self)

    def size(self):
        return _pjsua2.AuthCredInfoVector_size(self)

    def swap(self, v):
        return _pjsua2.AuthCredInfoVector_swap(self, v)

    def begin(self):
        return _pjsua2.AuthCredInfoVector_begin(self)

    def end(self):
        return _pjsua2.AuthCredInfoVector_end(self)

    def rbegin(self):
        return _pjsua2.AuthCredInfoVector_rbegin(self)

    def rend(self):
        return _pjsua2.AuthCredInfoVector_rend(self)

    def clear(self):
        return _pjsua2.AuthCredInfoVector_clear(self)

    def get_allocator(self):
        return _pjsua2.AuthCredInfoVector_get_allocator(self)

    def pop_back(self):
        return _pjsua2.AuthCredInfoVector_pop_back(self)

    def erase(self, *args):
        return _pjsua2.AuthCredInfoVector_erase(self, *args)

    def __init__(self, *args):
        _pjsua2.AuthCredInfoVector_swiginit(self, _pjsua2.new_AuthCredInfoVector(*args))

    def push_back(self, x):
        return _pjsua2.AuthCredInfoVector_push_back(self, x)

    def front(self):
        return _pjsua2.AuthCredInfoVector_front(self)

    def back(self):
        return _pjsua2.AuthCredInfoVector_back(self)

    def assign(self, n, x):
        return _pjsua2.AuthCredInfoVector_assign(self, n, x)

    def resize(self, *args):
        return _pjsua2.AuthCredInfoVector_resize(self, *args)

    def insert(self, *args):
        return _pjsua2.AuthCredInfoVector_insert(self, *args)

    def reserve(self, n):
        return _pjsua2.AuthCredInfoVector_reserve(self, n)

    def capacity(self):
        return _pjsua2.AuthCredInfoVector_capacity(self)
    __swig_destroy__ = _pjsua2.delete_AuthCredInfoVector

# Register AuthCredInfoVector in _pjsua2:
_pjsua2.AuthCredInfoVector_swigregister(AuthCredInfoVector)
class SrtpCryptoVector(object):
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def iterator(self):
        return _pjsua2.SrtpCryptoVector_iterator(self)
    def __iter__(self):
        return self.iterator()

    def __nonzero__(self):
        return _pjsua2.SrtpCryptoVector___nonzero__(self)

    def __bool__(self):
        return _pjsua2.SrtpCryptoVector___bool__(self)

    def __len__(self):
        return _pjsua2.SrtpCryptoVector___len__(self)

    def __getslice__(self, i, j):
        return _pjsua2.SrtpCryptoVector___getslice__(self, i, j)

    def __setslice__(self, *args):
        return _pjsua2.SrtpCryptoVector___setslice__(self, *args)

    def __delslice__(self, i, j):
        return _pjsua2.SrtpCryptoVector___delslice__(self, i, j)

    def __delitem__(self, *args):
        return _pjsua2.SrtpCryptoVector___delitem__(self, *args)

    def __getitem__(self, *args):
        return _pjsua2.SrtpCryptoVector___getitem__(self, *args)

    def __setitem__(self, *args):
        return _pjsua2.SrtpCryptoVector___setitem__(self, *args)

    def pop(self):
        return _pjsua2.SrtpCryptoVector_pop(self)

    def append(self, x):
        return _pjsua2.SrtpCryptoVector_append(self, x)

    def empty(self):
        return _pjsua2.SrtpCryptoVector_empty(self)

    def size(self):
        return _pjsua2.SrtpCryptoVector_size(self)

    def swap(self, v):
        return _pjsua2.SrtpCryptoVector_swap(self, v)

    def begin(self):
        return _pjsua2.SrtpCryptoVector_begin(self)

    def end(self):
        return _pjsua2.SrtpCryptoVector_end(self)

    def rbegin(self):
        return _pjsua2.SrtpCryptoVector_rbegin(self)

    def rend(self):
        return _pjsua2.SrtpCryptoVector_rend(self)

    def clear(self):
        return _pjsua2.SrtpCryptoVector_clear(self)

    def get_allocator(self):
        return _pjsua2.SrtpCryptoVector_get_allocator(self)

    def pop_back(self):
        return _pjsua2.SrtpCryptoVector_pop_back(self)

    def erase(self, *args):
        return _pjsua2.SrtpCryptoVector_erase(self, *args)

    def __init__(self, *args):
        _pjsua2.SrtpCryptoVector_swiginit(self, _pjsua2.new_SrtpCryptoVector(*args))

    def push_back(self, x):
        return _pjsua2.SrtpCryptoVector_push_back(self, x)

    def front(self):
        return _pjsua2.SrtpCryptoVector_front(self)

    def back(self):
        return _pjsua2.SrtpCryptoVector_back(self)

    def assign(self, n, x):
        return _pjsua2.SrtpCryptoVector_assign(self, n, x)

    def resize(self, *args):
        return _pjsua2.SrtpCryptoVector_resize(self, *args)

    def insert(self, *args):
        return _pjsua2.SrtpCryptoVector_insert(self, *args)

    def reserve(self, n):
        return _pjsua2.SrtpCryptoVector_reserve(self, n)

    def capacity(self):
        return _pjsua2.SrtpCryptoVector_capacity(self)
    __swig_destroy__ = _pjsua2.delete_SrtpCryptoVector

# Register SrtpCryptoVector in _pjsua2:
_pjsua2.SrtpCryptoVector_swigregister(SrtpCryptoVector)
class SipMultipartPartVector(object):
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def iterator(self):
        return _pjsua2.SipMultipartPartVector_iterator(self)
    def __iter__(self):
        return self.iterator()

    def __nonzero__(self):
        return _pjsua2.SipMultipartPartVector___nonzero__(self)

    def __bool__(self):
        return _pjsua2.SipMultipartPartVector___bool__(self)

    def __len__(self):
        return _pjsua2.SipMultipartPartVector___len__(self)

    def __getslice__(self, i, j):
        return _pjsua2.SipMultipartPartVector___getslice__(self, i, j)

    def __setslice__(self, *args):
        return _pjsua2.SipMultipartPartVector___setslice__(self, *args)

    def __delslice__(self, i, j):
        return _pjsua2.SipMultipartPartVector___delslice__(self, i, j)

    def __delitem__(self, *args):
        return _pjsua2.SipMultipartPartVector___delitem__(self, *args)

    def __getitem__(self, *args):
        return _pjsua2.SipMultipartPartVector___getitem__(self, *args)

    def __setitem__(self, *args):
        return _pjsua2.SipMultipartPartVector___setitem__(self, *args)

    def pop(self):
        return _pjsua2.SipMultipartPartVector_pop(self)

    def append(self, x):
        return _pjsua2.SipMultipartPartVector_append(self, x)

    def empty(self):
        return _pjsua2.SipMultipartPartVector_empty(self)

    def size(self):
        return _pjsua2.SipMultipartPartVector_size(self)

    def swap(self, v):
        return _pjsua2.SipMultipartPartVector_swap(self, v)

    def begin(self):
        return _pjsua2.SipMultipartPartVector_begin(self)

    def end(self):
        return _pjsua2.SipMultipartPartVector_end(self)

    def rbegin(self):
        return _pjsua2.SipMultipartPartVector_rbegin(self)

    def rend(self):
        return _pjsua2.SipMultipartPartVector_rend(self)

    def clear(self):
        return _pjsua2.SipMultipartPartVector_clear(self)

    def get_allocator(self):
        return _pjsua2.SipMultipartPartVector_get_allocator(self)

    def pop_back(self):
        return _pjsua2.SipMultipartPartVector_pop_back(self)

    def erase(self, *args):
        return _pjsua2.SipMultipartPartVector_erase(self, *args)

    def __init__(self, *args):
        _pjsua2.SipMultipartPartVector_swiginit(self, _pjsua2.new_SipMultipartPartVector(*args))

    def push_back(self, x):
        return _pjsua2.SipMultipartPartVector_push_back(self, x)

    def front(self):
        return _pjsua2.SipMultipartPartVector_front(self)

    def back(self):
        return _pjsua2.SipMultipartPartVector_back(self)

    def assign(self, n, x):
        return _pjsua2.SipMultipartPartVector_assign(self, n, x)

    def resize(self, *args):
        return _pjsua2.SipMultipartPartVector_resize(self, *args)

    def insert(self, *args):
        return _pjsua2.SipMultipartPartVector_insert(self, *args)

    def reserve(self, n):
        return _pjsua2.SipMultipartPartVector_reserve(self, n)

    def capacity(self):
        return _pjsua2.SipMultipartPartVector_capacity(self)
    __swig_destroy__ = _pjsua2.delete_SipMultipartPartVector

# Register SipMultipartPartVector in _pjsua2:
_pjsua2.SipMultipartPartVector_swigregister(SipMultipartPartVector)
class BuddyVector(object):
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def iterator(self):
        return _pjsua2.BuddyVector_iterator(self)
    def __iter__(self):
        return self.iterator()

    def __nonzero__(self):
        return _pjsua2.BuddyVector___nonzero__(self)

    def __bool__(self):
        return _pjsua2.BuddyVector___bool__(self)

    def __len__(self):
        return _pjsua2.BuddyVector___len__(self)

    def __getslice__(self, i, j):
        return _pjsua2.BuddyVector___getslice__(self, i, j)

    def __setslice__(self, *args):
        return _pjsua2.BuddyVector___setslice__(self, *args)

    def __delslice__(self, i, j):
        return _pjsua2.BuddyVector___delslice__(self, i, j)

    def __delitem__(self, *args):
        return _pjsua2.BuddyVector___delitem__(self, *args)

    def __getitem__(self, *args):
        return _pjsua2.BuddyVector___getitem__(self, *args)

    def __setitem__(self, *args):
        return _pjsua2.BuddyVector___setitem__(self, *args)

    def pop(self):
        return _pjsua2.BuddyVector_pop(self)

    def append(self, x):
        return _pjsua2.BuddyVector_append(self, x)

    def empty(self):
        return _pjsua2.BuddyVector_empty(self)

    def size(self):
        return _pjsua2.BuddyVector_size(self)

    def swap(self, v):
        return _pjsua2.BuddyVector_swap(self, v)

    def begin(self):
        return _pjsua2.BuddyVector_begin(self)

    def end(self):
        return _pjsua2.BuddyVector_end(self)

    def rbegin(self):
        return _pjsua2.BuddyVector_rbegin(self)

    def rend(self):
        return _pjsua2.BuddyVector_rend(self)

    def clear(self):
        return _pjsua2.BuddyVector_clear(self)

    def get_allocator(self):
        return _pjsua2.BuddyVector_get_allocator(self)

    def pop_back(self):
        return _pjsua2.BuddyVector_pop_back(self)

    def erase(self, *args):
        return _pjsua2.BuddyVector_erase(self, *args)

    def __init__(self, *args):
        _pjsua2.BuddyVector_swiginit(self, _pjsua2.new_BuddyVector(*args))

    def push_back(self, x):
        return _pjsua2.BuddyVector_push_back(self, x)

    def front(self):
        return _pjsua2.BuddyVector_front(self)

    def back(self):
        return _pjsua2.BuddyVector_back(self)

    def assign(self, n, x):
        return _pjsua2.BuddyVector_assign(self, n, x)

    def resize(self, *args):
        return _pjsua2.BuddyVector_resize(self, *args)

    def insert(self, *args):
        return _pjsua2.BuddyVector_insert(self, *args)

    def reserve(self, n):
        return _pjsua2.BuddyVector_reserve(self, n)

    def capacity(self):
        return _pjsua2.BuddyVector_capacity(self)
    __swig_destroy__ = _pjsua2.delete_BuddyVector

# Register BuddyVector in _pjsua2:
_pjsua2.BuddyVector_swigregister(BuddyVector)
class BuddyVector2(object):
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def iterator(self):
        return _pjsua2.BuddyVector2_iterator(self)
    def __iter__(self):
        return self.iterator()

    def __nonzero__(self):
        return _pjsua2.BuddyVector2___nonzero__(self)

    def __bool__(self):
        return _pjsua2.BuddyVector2___bool__(self)

    def __len__(self):
        return _pjsua2.BuddyVector2___len__(self)

    def __getslice__(self, i, j):
        return _pjsua2.BuddyVector2___getslice__(self, i, j)

    def __setslice__(self, *args):
        return _pjsua2.BuddyVector2___setslice__(self, *args)

    def __delslice__(self, i, j):
        return _pjsua2.BuddyVector2___delslice__(self, i, j)

    def __delitem__(self, *args):
        return _pjsua2.BuddyVector2___delitem__(self, *args)

    def __getitem__(self, *args):
        return _pjsua2.BuddyVector2___getitem__(self, *args)

    def __setitem__(self, *args):
        return _pjsua2.BuddyVector2___setitem__(self, *args)

    def pop(self):
        return _pjsua2.BuddyVector2_pop(self)

    def append(self, x):
        return _pjsua2.BuddyVector2_append(self, x)

    def empty(self):
        return _pjsua2.BuddyVector2_empty(self)

    def size(self):
        return _pjsua2.BuddyVector2_size(self)

    def swap(self, v):
        return _pjsua2.BuddyVector2_swap(self, v)

    def begin(self):
        return _pjsua2.BuddyVector2_begin(self)

    def end(self):
        return _pjsua2.BuddyVector2_end(self)

    def rbegin(self):
        return _pjsua2.BuddyVector2_rbegin(self)

    def rend(self):
        return _pjsua2.BuddyVector2_rend(self)

    def clear(self):
        return _pjsua2.BuddyVector2_clear(self)

    def get_allocator(self):
        return _pjsua2.BuddyVector2_get_allocator(self)

    def pop_back(self):
        return _pjsua2.BuddyVector2_pop_back(self)

    def erase(self, *args):
        return _pjsua2.BuddyVector2_erase(self, *args)

    def __init__(self, *args):
        _pjsua2.BuddyVector2_swiginit(self, _pjsua2.new_BuddyVector2(*args))

    def push_back(self, x):
        return _pjsua2.BuddyVector2_push_back(self, x)

    def front(self):
        return _pjsua2.BuddyVector2_front(self)

    def back(self):
        return _pjsua2.BuddyVector2_back(self)

    def assign(self, n, x):
        return _pjsua2.BuddyVector2_assign(self, n, x)

    def resize(self, *args):
        return _pjsua2.BuddyVector2_resize(self, *args)

    def insert(self, *args):
        return _pjsua2.BuddyVector2_insert(self, *args)

    def reserve(self, n):
        return _pjsua2.BuddyVector2_reserve(self, n)

    def capacity(self):
        return _pjsua2.BuddyVector2_capacity(self)
    __swig_destroy__ = _pjsua2.delete_BuddyVector2

# Register BuddyVector2 in _pjsua2:
_pjsua2.BuddyVector2_swigregister(BuddyVector2)
class AudioMediaVector(object):
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def iterator(self):
        return _pjsua2.AudioMediaVector_iterator(self)
    def __iter__(self):
        return self.iterator()

    def __nonzero__(self):
        return _pjsua2.AudioMediaVector___nonzero__(self)

    def __bool__(self):
        return _pjsua2.AudioMediaVector___bool__(self)

    def __len__(self):
        return _pjsua2.AudioMediaVector___len__(self)

    def __getslice__(self, i, j):
        return _pjsua2.AudioMediaVector___getslice__(self, i, j)

    def __setslice__(self, *args):
        return _pjsua2.AudioMediaVector___setslice__(self, *args)

    def __delslice__(self, i, j):
        return _pjsua2.AudioMediaVector___delslice__(self, i, j)

    def __delitem__(self, *args):
        return _pjsua2.AudioMediaVector___delitem__(self, *args)

    def __getitem__(self, *args):
        return _pjsua2.AudioMediaVector___getitem__(self, *args)

    def __setitem__(self, *args):
        return _pjsua2.AudioMediaVector___setitem__(self, *args)

    def pop(self):
        return _pjsua2.AudioMediaVector_pop(self)

    def append(self, x):
        return _pjsua2.AudioMediaVector_append(self, x)

    def empty(self):
        return _pjsua2.AudioMediaVector_empty(self)

    def size(self):
        return _pjsua2.AudioMediaVector_size(self)

    def swap(self, v):
        return _pjsua2.AudioMediaVector_swap(self, v)

    def begin(self):
        return _pjsua2.AudioMediaVector_begin(self)

    def end(self):
        return _pjsua2.AudioMediaVector_end(self)

    def rbegin(self):
        return _pjsua2.AudioMediaVector_rbegin(self)

    def rend(self):
        return _pjsua2.AudioMediaVector_rend(self)

    def clear(self):
        return _pjsua2.AudioMediaVector_clear(self)

    def get_allocator(self):
        return _pjsua2.AudioMediaVector_get_allocator(self)

    def pop_back(self):
        return _pjsua2.AudioMediaVector_pop_back(self)

    def erase(self, *args):
        return _pjsua2.AudioMediaVector_erase(self, *args)

    def __init__(self, *args):
        _pjsua2.AudioMediaVector_swiginit(self, _pjsua2.new_AudioMediaVector(*args))

    def push_back(self, x):
        return _pjsua2.AudioMediaVector_push_back(self, x)

    def front(self):
        return _pjsua2.AudioMediaVector_front(self)

    def back(self):
        return _pjsua2.AudioMediaVector_back(self)

    def assign(self, n, x):
        return _pjsua2.AudioMediaVector_assign(self, n, x)

    def resize(self, *args):
        return _pjsua2.AudioMediaVector_resize(self, *args)

    def insert(self, *args):
        return _pjsua2.AudioMediaVector_insert(self, *args)

    def reserve(self, n):
        return _pjsua2.AudioMediaVector_reserve(self, n)

    def capacity(self):
        return _pjsua2.AudioMediaVector_capacity(self)
    __swig_destroy__ = _pjsua2.delete_AudioMediaVector

# Register AudioMediaVector in _pjsua2:
_pjsua2.AudioMediaVector_swigregister(AudioMediaVector)
class AudioMediaVector2(object):
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def iterator(self):
        return _pjsua2.AudioMediaVector2_iterator(self)
    def __iter__(self):
        return self.iterator()

    def __nonzero__(self):
        return _pjsua2.AudioMediaVector2___nonzero__(self)

    def __bool__(self):
        return _pjsua2.AudioMediaVector2___bool__(self)

    def __len__(self):
        return _pjsua2.AudioMediaVector2___len__(self)

    def __getslice__(self, i, j):
        return _pjsua2.AudioMediaVector2___getslice__(self, i, j)

    def __setslice__(self, *args):
        return _pjsua2.AudioMediaVector2___setslice__(self, *args)

    def __delslice__(self, i, j):
        return _pjsua2.AudioMediaVector2___delslice__(self, i, j)

    def __delitem__(self, *args):
        return _pjsua2.AudioMediaVector2___delitem__(self, *args)

    def __getitem__(self, *args):
        return _pjsua2.AudioMediaVector2___getitem__(self, *args)

    def __setitem__(self, *args):
        return _pjsua2.AudioMediaVector2___setitem__(self, *args)

    def pop(self):
        return _pjsua2.AudioMediaVector2_pop(self)

    def append(self, x):
        return _pjsua2.AudioMediaVector2_append(self, x)

    def empty(self):
        return _pjsua2.AudioMediaVector2_empty(self)

    def size(self):
        return _pjsua2.AudioMediaVector2_size(self)

    def swap(self, v):
        return _pjsua2.AudioMediaVector2_swap(self, v)

    def begin(self):
        return _pjsua2.AudioMediaVector2_begin(self)

    def end(self):
        return _pjsua2.AudioMediaVector2_end(self)

    def rbegin(self):
        return _pjsua2.AudioMediaVector2_rbegin(self)

    def rend(self):
        return _pjsua2.AudioMediaVector2_rend(self)

    def clear(self):
        return _pjsua2.AudioMediaVector2_clear(self)

    def get_allocator(self):
        return _pjsua2.AudioMediaVector2_get_allocator(self)

    def pop_back(self):
        return _pjsua2.AudioMediaVector2_pop_back(self)

    def erase(self, *args):
        return _pjsua2.AudioMediaVector2_erase(self, *args)

    def __init__(self, *args):
        _pjsua2.AudioMediaVector2_swiginit(self, _pjsua2.new_AudioMediaVector2(*args))

    def push_back(self, x):
        return _pjsua2.AudioMediaVector2_push_back(self, x)

    def front(self):
        return _pjsua2.AudioMediaVector2_front(self)

    def back(self):
        return _pjsua2.AudioMediaVector2_back(self)

    def assign(self, n, x):
        return _pjsua2.AudioMediaVector2_assign(self, n, x)

    def resize(self, *args):
        return _pjsua2.AudioMediaVector2_resize(self, *args)

    def insert(self, *args):
        return _pjsua2.AudioMediaVector2_insert(self, *args)

    def reserve(self, n):
        return _pjsua2.AudioMediaVector2_reserve(self, n)

    def capacity(self):
        return _pjsua2.AudioMediaVector2_capacity(self)
    __swig_destroy__ = _pjsua2.delete_AudioMediaVector2

# Register AudioMediaVector2 in _pjsua2:
_pjsua2.AudioMediaVector2_swigregister(AudioMediaVector2)
class VideoMediaVector(object):
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def iterator(self):
        return _pjsua2.VideoMediaVector_iterator(self)
    def __iter__(self):
        return self.iterator()

    def __nonzero__(self):
        return _pjsua2.VideoMediaVector___nonzero__(self)

    def __bool__(self):
        return _pjsua2.VideoMediaVector___bool__(self)

    def __len__(self):
        return _pjsua2.VideoMediaVector___len__(self)

    def __getslice__(self, i, j):
        return _pjsua2.VideoMediaVector___getslice__(self, i, j)

    def __setslice__(self, *args):
        return _pjsua2.VideoMediaVector___setslice__(self, *args)

    def __delslice__(self, i, j):
        return _pjsua2.VideoMediaVector___delslice__(self, i, j)

    def __delitem__(self, *args):
        return _pjsua2.VideoMediaVector___delitem__(self, *args)

    def __getitem__(self, *args):
        return _pjsua2.VideoMediaVector___getitem__(self, *args)

    def __setitem__(self, *args):
        return _pjsua2.VideoMediaVector___setitem__(self, *args)

    def pop(self):
        return _pjsua2.VideoMediaVector_pop(self)

    def append(self, x):
        return _pjsua2.VideoMediaVector_append(self, x)

    def empty(self):
        return _pjsua2.VideoMediaVector_empty(self)

    def size(self):
        return _pjsua2.VideoMediaVector_size(self)

    def swap(self, v):
        return _pjsua2.VideoMediaVector_swap(self, v)

    def begin(self):
        return _pjsua2.VideoMediaVector_begin(self)

    def end(self):
        return _pjsua2.VideoMediaVector_end(self)

    def rbegin(self):
        return _pjsua2.VideoMediaVector_rbegin(self)

    def rend(self):
        return _pjsua2.VideoMediaVector_rend(self)

    def clear(self):
        return _pjsua2.VideoMediaVector_clear(self)

    def get_allocator(self):
        return _pjsua2.VideoMediaVector_get_allocator(self)

    def pop_back(self):
        return _pjsua2.VideoMediaVector_pop_back(self)

    def erase(self, *args):
        return _pjsua2.VideoMediaVector_erase(self, *args)

    def __init__(self, *args):
        _pjsua2.VideoMediaVector_swiginit(self, _pjsua2.new_VideoMediaVector(*args))

    def push_back(self, x):
        return _pjsua2.VideoMediaVector_push_back(self, x)

    def front(self):
        return _pjsua2.VideoMediaVector_front(self)

    def back(self):
        return _pjsua2.VideoMediaVector_back(self)

    def assign(self, n, x):
        return _pjsua2.VideoMediaVector_assign(self, n, x)

    def resize(self, *args):
        return _pjsua2.VideoMediaVector_resize(self, *args)

    def insert(self, *args):
        return _pjsua2.VideoMediaVector_insert(self, *args)

    def reserve(self, n):
        return _pjsua2.VideoMediaVector_reserve(self, n)

    def capacity(self):
        return _pjsua2.VideoMediaVector_capacity(self)
    __swig_destroy__ = _pjsua2.delete_VideoMediaVector

# Register VideoMediaVector in _pjsua2:
_pjsua2.VideoMediaVector_swigregister(VideoMediaVector)
class ToneDescVector(object):
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def iterator(self):
        return _pjsua2.ToneDescVector_iterator(self)
    def __iter__(self):
        return self.iterator()

    def __nonzero__(self):
        return _pjsua2.ToneDescVector___nonzero__(self)

    def __bool__(self):
        return _pjsua2.ToneDescVector___bool__(self)

    def __len__(self):
        return _pjsua2.ToneDescVector___len__(self)

    def __getslice__(self, i, j):
        return _pjsua2.ToneDescVector___getslice__(self, i, j)

    def __setslice__(self, *args):
        return _pjsua2.ToneDescVector___setslice__(self, *args)

    def __delslice__(self, i, j):
        return _pjsua2.ToneDescVector___delslice__(self, i, j)

    def __delitem__(self, *args):
        return _pjsua2.ToneDescVector___delitem__(self, *args)

    def __getitem__(self, *args):
        return _pjsua2.ToneDescVector___getitem__(self, *args)

    def __setitem__(self, *args):
        return _pjsua2.ToneDescVector___setitem__(self, *args)

    def pop(self):
        return _pjsua2.ToneDescVector_pop(self)

    def append(self, x):
        return _pjsua2.ToneDescVector_append(self, x)

    def empty(self):
        return _pjsua2.ToneDescVector_empty(self)

    def size(self):
        return _pjsua2.ToneDescVector_size(self)

    def swap(self, v):
        return _pjsua2.ToneDescVector_swap(self, v)

    def begin(self):
        return _pjsua2.ToneDescVector_begin(self)

    def end(self):
        return _pjsua2.ToneDescVector_end(self)

    def rbegin(self):
        return _pjsua2.ToneDescVector_rbegin(self)

    def rend(self):
        return _pjsua2.ToneDescVector_rend(self)

    def clear(self):
        return _pjsua2.ToneDescVector_clear(self)

    def get_allocator(self):
        return _pjsua2.ToneDescVector_get_allocator(self)

    def pop_back(self):
        return _pjsua2.ToneDescVector_pop_back(self)

    def erase(self, *args):
        return _pjsua2.ToneDescVector_erase(self, *args)

    def __init__(self, *args):
        _pjsua2.ToneDescVector_swiginit(self, _pjsua2.new_ToneDescVector(*args))

    def push_back(self, x):
        return _pjsua2.ToneDescVector_push_back(self, x)

    def front(self):
        return _pjsua2.ToneDescVector_front(self)

    def back(self):
        return _pjsua2.ToneDescVector_back(self)

    def assign(self, n, x):
        return _pjsua2.ToneDescVector_assign(self, n, x)

    def resize(self, *args):
        return _pjsua2.ToneDescVector_resize(self, *args)

    def insert(self, *args):
        return _pjsua2.ToneDescVector_insert(self, *args)

    def reserve(self, n):
        return _pjsua2.ToneDescVector_reserve(self, n)

    def capacity(self):
        return _pjsua2.ToneDescVector_capacity(self)
    __swig_destroy__ = _pjsua2.delete_ToneDescVector

# Register ToneDescVector in _pjsua2:
_pjsua2.ToneDescVector_swigregister(ToneDescVector)
class ToneDigitVector(object):
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def iterator(self):
        return _pjsua2.ToneDigitVector_iterator(self)
    def __iter__(self):
        return self.iterator()

    def __nonzero__(self):
        return _pjsua2.ToneDigitVector___nonzero__(self)

    def __bool__(self):
        return _pjsua2.ToneDigitVector___bool__(self)

    def __len__(self):
        return _pjsua2.ToneDigitVector___len__(self)

    def __getslice__(self, i, j):
        return _pjsua2.ToneDigitVector___getslice__(self, i, j)

    def __setslice__(self, *args):
        return _pjsua2.ToneDigitVector___setslice__(self, *args)

    def __delslice__(self, i, j):
        return _pjsua2.ToneDigitVector___delslice__(self, i, j)

    def __delitem__(self, *args):
        return _pjsua2.ToneDigitVector___delitem__(self, *args)

    def __getitem__(self, *args):
        return _pjsua2.ToneDigitVector___getitem__(self, *args)

    def __setitem__(self, *args):
        return _pjsua2.ToneDigitVector___setitem__(self, *args)

    def pop(self):
        return _pjsua2.ToneDigitVector_pop(self)

    def append(self, x):
        return _pjsua2.ToneDigitVector_append(self, x)

    def empty(self):
        return _pjsua2.ToneDigitVector_empty(self)

    def size(self):
        return _pjsua2.ToneDigitVector_size(self)

    def swap(self, v):
        return _pjsua2.ToneDigitVector_swap(self, v)

    def begin(self):
        return _pjsua2.ToneDigitVector_begin(self)

    def end(self):
        return _pjsua2.ToneDigitVector_end(self)

    def rbegin(self):
        return _pjsua2.ToneDigitVector_rbegin(self)

    def rend(self):
        return _pjsua2.ToneDigitVector_rend(self)

    def clear(self):
        return _pjsua2.ToneDigitVector_clear(self)

    def get_allocator(self):
        return _pjsua2.ToneDigitVector_get_allocator(self)

    def pop_back(self):
        return _pjsua2.ToneDigitVector_pop_back(self)

    def erase(self, *args):
        return _pjsua2.ToneDigitVector_erase(self, *args)

    def __init__(self, *args):
        _pjsua2.ToneDigitVector_swiginit(self, _pjsua2.new_ToneDigitVector(*args))

    def push_back(self, x):
        return _pjsua2.ToneDigitVector_push_back(self, x)

    def front(self):
        return _pjsua2.ToneDigitVector_front(self)

    def back(self):
        return _pjsua2.ToneDigitVector_back(self)

    def assign(self, n, x):
        return _pjsua2.ToneDigitVector_assign(self, n, x)

    def resize(self, *args):
        return _pjsua2.ToneDigitVector_resize(self, *args)

    def insert(self, *args):
        return _pjsua2.ToneDigitVector_insert(self, *args)

    def reserve(self, n):
        return _pjsua2.ToneDigitVector_reserve(self, n)

    def capacity(self):
        return _pjsua2.ToneDigitVector_capacity(self)
    __swig_destroy__ = _pjsua2.delete_ToneDigitVector

# Register ToneDigitVector in _pjsua2:
_pjsua2.ToneDigitVector_swigregister(ToneDigitVector)
class ToneDigitMapVector(object):
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def iterator(self):
        return _pjsua2.ToneDigitMapVector_iterator(self)
    def __iter__(self):
        return self.iterator()

    def __nonzero__(self):
        return _pjsua2.ToneDigitMapVector___nonzero__(self)

    def __bool__(self):
        return _pjsua2.ToneDigitMapVector___bool__(self)

    def __len__(self):
        return _pjsua2.ToneDigitMapVector___len__(self)

    def __getslice__(self, i, j):
        return _pjsua2.ToneDigitMapVector___getslice__(self, i, j)

    def __setslice__(self, *args):
        return _pjsua2.ToneDigitMapVector___setslice__(self, *args)

    def __delslice__(self, i, j):
        return _pjsua2.ToneDigitMapVector___delslice__(self, i, j)

    def __delitem__(self, *args):
        return _pjsua2.ToneDigitMapVector___delitem__(self, *args)

    def __getitem__(self, *args):
        return _pjsua2.ToneDigitMapVector___getitem__(self, *args)

    def __setitem__(self, *args):
        return _pjsua2.ToneDigitMapVector___setitem__(self, *args)

    def pop(self):
        return _pjsua2.ToneDigitMapVector_pop(self)

    def append(self, x):
        return _pjsua2.ToneDigitMapVector_append(self, x)

    def empty(self):
        return _pjsua2.ToneDigitMapVector_empty(self)

    def size(self):
        return _pjsua2.ToneDigitMapVector_size(self)

    def swap(self, v):
        return _pjsua2.ToneDigitMapVector_swap(self, v)

    def begin(self):
        return _pjsua2.ToneDigitMapVector_begin(self)

    def end(self):
        return _pjsua2.ToneDigitMapVector_end(self)

    def rbegin(self):
        return _pjsua2.ToneDigitMapVector_rbegin(self)

    def rend(self):
        return _pjsua2.ToneDigitMapVector_rend(self)

    def clear(self):
        return _pjsua2.ToneDigitMapVector_clear(self)

    def get_allocator(self):
        return _pjsua2.ToneDigitMapVector_get_allocator(self)

    def pop_back(self):
        return _pjsua2.ToneDigitMapVector_pop_back(self)

    def erase(self, *args):
        return _pjsua2.ToneDigitMapVector_erase(self, *args)

    def __init__(self, *args):
        _pjsua2.ToneDigitMapVector_swiginit(self, _pjsua2.new_ToneDigitMapVector(*args))

    def push_back(self, x):
        return _pjsua2.ToneDigitMapVector_push_back(self, x)

    def front(self):
        return _pjsua2.ToneDigitMapVector_front(self)

    def back(self):
        return _pjsua2.ToneDigitMapVector_back(self)

    def assign(self, n, x):
        return _pjsua2.ToneDigitMapVector_assign(self, n, x)

    def resize(self, *args):
        return _pjsua2.ToneDigitMapVector_resize(self, *args)

    def insert(self, *args):
        return _pjsua2.ToneDigitMapVector_insert(self, *args)

    def reserve(self, n):
        return _pjsua2.ToneDigitMapVector_reserve(self, n)

    def capacity(self):
        return _pjsua2.ToneDigitMapVector_capacity(self)
    __swig_destroy__ = _pjsua2.delete_ToneDigitMapVector

# Register ToneDigitMapVector in _pjsua2:
_pjsua2.ToneDigitMapVector_swigregister(ToneDigitMapVector)
class AudioDevInfoVector(object):
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def iterator(self):
        return _pjsua2.AudioDevInfoVector_iterator(self)
    def __iter__(self):
        return self.iterator()

    def __nonzero__(self):
        return _pjsua2.AudioDevInfoVector___nonzero__(self)

    def __bool__(self):
        return _pjsua2.AudioDevInfoVector___bool__(self)

    def __len__(self):
        return _pjsua2.AudioDevInfoVector___len__(self)

    def __getslice__(self, i, j):
        return _pjsua2.AudioDevInfoVector___getslice__(self, i, j)

    def __setslice__(self, *args):
        return _pjsua2.AudioDevInfoVector___setslice__(self, *args)

    def __delslice__(self, i, j):
        return _pjsua2.AudioDevInfoVector___delslice__(self, i, j)

    def __delitem__(self, *args):
        return _pjsua2.AudioDevInfoVector___delitem__(self, *args)

    def __getitem__(self, *args):
        return _pjsua2.AudioDevInfoVector___getitem__(self, *args)

    def __setitem__(self, *args):
        return _pjsua2.AudioDevInfoVector___setitem__(self, *args)

    def pop(self):
        return _pjsua2.AudioDevInfoVector_pop(self)

    def append(self, x):
        return _pjsua2.AudioDevInfoVector_append(self, x)

    def empty(self):
        return _pjsua2.AudioDevInfoVector_empty(self)

    def size(self):
        return _pjsua2.AudioDevInfoVector_size(self)

    def swap(self, v):
        return _pjsua2.AudioDevInfoVector_swap(self, v)

    def begin(self):
        return _pjsua2.AudioDevInfoVector_begin(self)

    def end(self):
        return _pjsua2.AudioDevInfoVector_end(self)

    def rbegin(self):
        return _pjsua2.AudioDevInfoVector_rbegin(self)

    def rend(self):
        return _pjsua2.AudioDevInfoVector_rend(self)

    def clear(self):
        return _pjsua2.AudioDevInfoVector_clear(self)

    def get_allocator(self):
        return _pjsua2.AudioDevInfoVector_get_allocator(self)

    def pop_back(self):
        return _pjsua2.AudioDevInfoVector_pop_back(self)

    def erase(self, *args):
        return _pjsua2.AudioDevInfoVector_erase(self, *args)

    def __init__(self, *args):
        _pjsua2.AudioDevInfoVector_swiginit(self, _pjsua2.new_AudioDevInfoVector(*args))

    def push_back(self, x):
        return _pjsua2.AudioDevInfoVector_push_back(self, x)

    def front(self):
        return _pjsua2.AudioDevInfoVector_front(self)

    def back(self):
        return _pjsua2.AudioDevInfoVector_back(self)

    def assign(self, n, x):
        return _pjsua2.AudioDevInfoVector_assign(self, n, x)

    def resize(self, *args):
        return _pjsua2.AudioDevInfoVector_resize(self, *args)

    def insert(self, *args):
        return _pjsua2.AudioDevInfoVector_insert(self, *args)

    def reserve(self, n):
        return _pjsua2.AudioDevInfoVector_reserve(self, n)

    def capacity(self):
        return _pjsua2.AudioDevInfoVector_capacity(self)
    __swig_destroy__ = _pjsua2.delete_AudioDevInfoVector

# Register AudioDevInfoVector in _pjsua2:
_pjsua2.AudioDevInfoVector_swigregister(AudioDevInfoVector)
class AudioDevInfoVector2(object):
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def iterator(self):
        return _pjsua2.AudioDevInfoVector2_iterator(self)
    def __iter__(self):
        return self.iterator()

    def __nonzero__(self):
        return _pjsua2.AudioDevInfoVector2___nonzero__(self)

    def __bool__(self):
        return _pjsua2.AudioDevInfoVector2___bool__(self)

    def __len__(self):
        return _pjsua2.AudioDevInfoVector2___len__(self)

    def __getslice__(self, i, j):
        return _pjsua2.AudioDevInfoVector2___getslice__(self, i, j)

    def __setslice__(self, *args):
        return _pjsua2.AudioDevInfoVector2___setslice__(self, *args)

    def __delslice__(self, i, j):
        return _pjsua2.AudioDevInfoVector2___delslice__(self, i, j)

    def __delitem__(self, *args):
        return _pjsua2.AudioDevInfoVector2___delitem__(self, *args)

    def __getitem__(self, *args):
        return _pjsua2.AudioDevInfoVector2___getitem__(self, *args)

    def __setitem__(self, *args):
        return _pjsua2.AudioDevInfoVector2___setitem__(self, *args)

    def pop(self):
        return _pjsua2.AudioDevInfoVector2_pop(self)

    def append(self, x):
        return _pjsua2.AudioDevInfoVector2_append(self, x)

    def empty(self):
        return _pjsua2.AudioDevInfoVector2_empty(self)

    def size(self):
        return _pjsua2.AudioDevInfoVector2_size(self)

    def swap(self, v):
        return _pjsua2.AudioDevInfoVector2_swap(self, v)

    def begin(self):
        return _pjsua2.AudioDevInfoVector2_begin(self)

    def end(self):
        return _pjsua2.AudioDevInfoVector2_end(self)

    def rbegin(self):
        return _pjsua2.AudioDevInfoVector2_rbegin(self)

    def rend(self):
        return _pjsua2.AudioDevInfoVector2_rend(self)

    def clear(self):
        return _pjsua2.AudioDevInfoVector2_clear(self)

    def get_allocator(self):
        return _pjsua2.AudioDevInfoVector2_get_allocator(self)

    def pop_back(self):
        return _pjsua2.AudioDevInfoVector2_pop_back(self)

    def erase(self, *args):
        return _pjsua2.AudioDevInfoVector2_erase(self, *args)

    def __init__(self, *args):
        _pjsua2.AudioDevInfoVector2_swiginit(self, _pjsua2.new_AudioDevInfoVector2(*args))

    def push_back(self, x):
        return _pjsua2.AudioDevInfoVector2_push_back(self, x)

    def front(self):
        return _pjsua2.AudioDevInfoVector2_front(self)

    def back(self):
        return _pjsua2.AudioDevInfoVector2_back(self)

    def assign(self, n, x):
        return _pjsua2.AudioDevInfoVector2_assign(self, n, x)

    def resize(self, *args):
        return _pjsua2.AudioDevInfoVector2_resize(self, *args)

    def insert(self, *args):
        return _pjsua2.AudioDevInfoVector2_insert(self, *args)

    def reserve(self, n):
        return _pjsua2.AudioDevInfoVector2_reserve(self, n)

    def capacity(self):
        return _pjsua2.AudioDevInfoVector2_capacity(self)
    __swig_destroy__ = _pjsua2.delete_AudioDevInfoVector2

# Register AudioDevInfoVector2 in _pjsua2:
_pjsua2.AudioDevInfoVector2_swigregister(AudioDevInfoVector2)
class CodecInfoVector(object):
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def iterator(self):
        return _pjsua2.CodecInfoVector_iterator(self)
    def __iter__(self):
        return self.iterator()

    def __nonzero__(self):
        return _pjsua2.CodecInfoVector___nonzero__(self)

    def __bool__(self):
        return _pjsua2.CodecInfoVector___bool__(self)

    def __len__(self):
        return _pjsua2.CodecInfoVector___len__(self)

    def __getslice__(self, i, j):
        return _pjsua2.CodecInfoVector___getslice__(self, i, j)

    def __setslice__(self, *args):
        return _pjsua2.CodecInfoVector___setslice__(self, *args)

    def __delslice__(self, i, j):
        return _pjsua2.CodecInfoVector___delslice__(self, i, j)

    def __delitem__(self, *args):
        return _pjsua2.CodecInfoVector___delitem__(self, *args)

    def __getitem__(self, *args):
        return _pjsua2.CodecInfoVector___getitem__(self, *args)

    def __setitem__(self, *args):
        return _pjsua2.CodecInfoVector___setitem__(self, *args)

    def pop(self):
        return _pjsua2.CodecInfoVector_pop(self)

    def append(self, x):
        return _pjsua2.CodecInfoVector_append(self, x)

    def empty(self):
        return _pjsua2.CodecInfoVector_empty(self)

    def size(self):
        return _pjsua2.CodecInfoVector_size(self)

    def swap(self, v):
        return _pjsua2.CodecInfoVector_swap(self, v)

    def begin(self):
        return _pjsua2.CodecInfoVector_begin(self)

    def end(self):
        return _pjsua2.CodecInfoVector_end(self)

    def rbegin(self):
        return _pjsua2.CodecInfoVector_rbegin(self)

    def rend(self):
        return _pjsua2.CodecInfoVector_rend(self)

    def clear(self):
        return _pjsua2.CodecInfoVector_clear(self)

    def get_allocator(self):
        return _pjsua2.CodecInfoVector_get_allocator(self)

    def pop_back(self):
        return _pjsua2.CodecInfoVector_pop_back(self)

    def erase(self, *args):
        return _pjsua2.CodecInfoVector_erase(self, *args)

    def __init__(self, *args):
        _pjsua2.CodecInfoVector_swiginit(self, _pjsua2.new_CodecInfoVector(*args))

    def push_back(self, x):
        return _pjsua2.CodecInfoVector_push_back(self, x)

    def front(self):
        return _pjsua2.CodecInfoVector_front(self)

    def back(self):
        return _pjsua2.CodecInfoVector_back(self)

    def assign(self, n, x):
        return _pjsua2.CodecInfoVector_assign(self, n, x)

    def resize(self, *args):
        return _pjsua2.CodecInfoVector_resize(self, *args)

    def insert(self, *args):
        return _pjsua2.CodecInfoVector_insert(self, *args)

    def reserve(self, n):
        return _pjsua2.CodecInfoVector_reserve(self, n)

    def capacity(self):
        return _pjsua2.CodecInfoVector_capacity(self)
    __swig_destroy__ = _pjsua2.delete_CodecInfoVector

# Register CodecInfoVector in _pjsua2:
_pjsua2.CodecInfoVector_swigregister(CodecInfoVector)
class CodecInfoVector2(object):
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def iterator(self):
        return _pjsua2.CodecInfoVector2_iterator(self)
    def __iter__(self):
        return self.iterator()

    def __nonzero__(self):
        return _pjsua2.CodecInfoVector2___nonzero__(self)

    def __bool__(self):
        return _pjsua2.CodecInfoVector2___bool__(self)

    def __len__(self):
        return _pjsua2.CodecInfoVector2___len__(self)

    def __getslice__(self, i, j):
        return _pjsua2.CodecInfoVector2___getslice__(self, i, j)

    def __setslice__(self, *args):
        return _pjsua2.CodecInfoVector2___setslice__(self, *args)

    def __delslice__(self, i, j):
        return _pjsua2.CodecInfoVector2___delslice__(self, i, j)

    def __delitem__(self, *args):
        return _pjsua2.CodecInfoVector2___delitem__(self, *args)

    def __getitem__(self, *args):
        return _pjsua2.CodecInfoVector2___getitem__(self, *args)

    def __setitem__(self, *args):
        return _pjsua2.CodecInfoVector2___setitem__(self, *args)

    def pop(self):
        return _pjsua2.CodecInfoVector2_pop(self)

    def append(self, x):
        return _pjsua2.CodecInfoVector2_append(self, x)

    def empty(self):
        return _pjsua2.CodecInfoVector2_empty(self)

    def size(self):
        return _pjsua2.CodecInfoVector2_size(self)

    def swap(self, v):
        return _pjsua2.CodecInfoVector2_swap(self, v)

    def begin(self):
        return _pjsua2.CodecInfoVector2_begin(self)

    def end(self):
        return _pjsua2.CodecInfoVector2_end(self)

    def rbegin(self):
        return _pjsua2.CodecInfoVector2_rbegin(self)

    def rend(self):
        return _pjsua2.CodecInfoVector2_rend(self)

    def clear(self):
        return _pjsua2.CodecInfoVector2_clear(self)

    def get_allocator(self):
        return _pjsua2.CodecInfoVector2_get_allocator(self)

    def pop_back(self):
        return _pjsua2.CodecInfoVector2_pop_back(self)

    def erase(self, *args):
        return _pjsua2.CodecInfoVector2_erase(self, *args)

    def __init__(self, *args):
        _pjsua2.CodecInfoVector2_swiginit(self, _pjsua2.new_CodecInfoVector2(*args))

    def push_back(self, x):
        return _pjsua2.CodecInfoVector2_push_back(self, x)

    def front(self):
        return _pjsua2.CodecInfoVector2_front(self)

    def back(self):
        return _pjsua2.CodecInfoVector2_back(self)

    def assign(self, n, x):
        return _pjsua2.CodecInfoVector2_assign(self, n, x)

    def resize(self, *args):
        return _pjsua2.CodecInfoVector2_resize(self, *args)

    def insert(self, *args):
        return _pjsua2.CodecInfoVector2_insert(self, *args)

    def reserve(self, n):
        return _pjsua2.CodecInfoVector2_reserve(self, n)

    def capacity(self):
        return _pjsua2.CodecInfoVector2_capacity(self)
    __swig_destroy__ = _pjsua2.delete_CodecInfoVector2

# Register CodecInfoVector2 in _pjsua2:
_pjsua2.CodecInfoVector2_swigregister(CodecInfoVector2)
class VideoDevInfoVector(object):
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def iterator(self):
        return _pjsua2.VideoDevInfoVector_iterator(self)
    def __iter__(self):
        return self.iterator()

    def __nonzero__(self):
        return _pjsua2.VideoDevInfoVector___nonzero__(self)

    def __bool__(self):
        return _pjsua2.VideoDevInfoVector___bool__(self)

    def __len__(self):
        return _pjsua2.VideoDevInfoVector___len__(self)

    def __getslice__(self, i, j):
        return _pjsua2.VideoDevInfoVector___getslice__(self, i, j)

    def __setslice__(self, *args):
        return _pjsua2.VideoDevInfoVector___setslice__(self, *args)

    def __delslice__(self, i, j):
        return _pjsua2.VideoDevInfoVector___delslice__(self, i, j)

    def __delitem__(self, *args):
        return _pjsua2.VideoDevInfoVector___delitem__(self, *args)

    def __getitem__(self, *args):
        return _pjsua2.VideoDevInfoVector___getitem__(self, *args)

    def __setitem__(self, *args):
        return _pjsua2.VideoDevInfoVector___setitem__(self, *args)

    def pop(self):
        return _pjsua2.VideoDevInfoVector_pop(self)

    def append(self, x):
        return _pjsua2.VideoDevInfoVector_append(self, x)

    def empty(self):
        return _pjsua2.VideoDevInfoVector_empty(self)

    def size(self):
        return _pjsua2.VideoDevInfoVector_size(self)

    def swap(self, v):
        return _pjsua2.VideoDevInfoVector_swap(self, v)

    def begin(self):
        return _pjsua2.VideoDevInfoVector_begin(self)

    def end(self):
        return _pjsua2.VideoDevInfoVector_end(self)

    def rbegin(self):
        return _pjsua2.VideoDevInfoVector_rbegin(self)

    def rend(self):
        return _pjsua2.VideoDevInfoVector_rend(self)

    def clear(self):
        return _pjsua2.VideoDevInfoVector_clear(self)

    def get_allocator(self):
        return _pjsua2.VideoDevInfoVector_get_allocator(self)

    def pop_back(self):
        return _pjsua2.VideoDevInfoVector_pop_back(self)

    def erase(self, *args):
        return _pjsua2.VideoDevInfoVector_erase(self, *args)

    def __init__(self, *args):
        _pjsua2.VideoDevInfoVector_swiginit(self, _pjsua2.new_VideoDevInfoVector(*args))

    def push_back(self, x):
        return _pjsua2.VideoDevInfoVector_push_back(self, x)

    def front(self):
        return _pjsua2.VideoDevInfoVector_front(self)

    def back(self):
        return _pjsua2.VideoDevInfoVector_back(self)

    def assign(self, n, x):
        return _pjsua2.VideoDevInfoVector_assign(self, n, x)

    def resize(self, *args):
        return _pjsua2.VideoDevInfoVector_resize(self, *args)

    def insert(self, *args):
        return _pjsua2.VideoDevInfoVector_insert(self, *args)

    def reserve(self, n):
        return _pjsua2.VideoDevInfoVector_reserve(self, n)

    def capacity(self):
        return _pjsua2.VideoDevInfoVector_capacity(self)
    __swig_destroy__ = _pjsua2.delete_VideoDevInfoVector

# Register VideoDevInfoVector in _pjsua2:
_pjsua2.VideoDevInfoVector_swigregister(VideoDevInfoVector)
class VideoDevInfoVector2(object):
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def iterator(self):
        return _pjsua2.VideoDevInfoVector2_iterator(self)
    def __iter__(self):
        return self.iterator()

    def __nonzero__(self):
        return _pjsua2.VideoDevInfoVector2___nonzero__(self)

    def __bool__(self):
        return _pjsua2.VideoDevInfoVector2___bool__(self)

    def __len__(self):
        return _pjsua2.VideoDevInfoVector2___len__(self)

    def __getslice__(self, i, j):
        return _pjsua2.VideoDevInfoVector2___getslice__(self, i, j)

    def __setslice__(self, *args):
        return _pjsua2.VideoDevInfoVector2___setslice__(self, *args)

    def __delslice__(self, i, j):
        return _pjsua2.VideoDevInfoVector2___delslice__(self, i, j)

    def __delitem__(self, *args):
        return _pjsua2.VideoDevInfoVector2___delitem__(self, *args)

    def __getitem__(self, *args):
        return _pjsua2.VideoDevInfoVector2___getitem__(self, *args)

    def __setitem__(self, *args):
        return _pjsua2.VideoDevInfoVector2___setitem__(self, *args)

    def pop(self):
        return _pjsua2.VideoDevInfoVector2_pop(self)

    def append(self, x):
        return _pjsua2.VideoDevInfoVector2_append(self, x)

    def empty(self):
        return _pjsua2.VideoDevInfoVector2_empty(self)

    def size(self):
        return _pjsua2.VideoDevInfoVector2_size(self)

    def swap(self, v):
        return _pjsua2.VideoDevInfoVector2_swap(self, v)

    def begin(self):
        return _pjsua2.VideoDevInfoVector2_begin(self)

    def end(self):
        return _pjsua2.VideoDevInfoVector2_end(self)

    def rbegin(self):
        return _pjsua2.VideoDevInfoVector2_rbegin(self)

    def rend(self):
        return _pjsua2.VideoDevInfoVector2_rend(self)

    def clear(self):
        return _pjsua2.VideoDevInfoVector2_clear(self)

    def get_allocator(self):
        return _pjsua2.VideoDevInfoVector2_get_allocator(self)

    def pop_back(self):
        return _pjsua2.VideoDevInfoVector2_pop_back(self)

    def erase(self, *args):
        return _pjsua2.VideoDevInfoVector2_erase(self, *args)

    def __init__(self, *args):
        _pjsua2.VideoDevInfoVector2_swiginit(self, _pjsua2.new_VideoDevInfoVector2(*args))

    def push_back(self, x):
        return _pjsua2.VideoDevInfoVector2_push_back(self, x)

    def front(self):
        return _pjsua2.VideoDevInfoVector2_front(self)

    def back(self):
        return _pjsua2.VideoDevInfoVector2_back(self)

    def assign(self, n, x):
        return _pjsua2.VideoDevInfoVector2_assign(self, n, x)

    def resize(self, *args):
        return _pjsua2.VideoDevInfoVector2_resize(self, *args)

    def insert(self, *args):
        return _pjsua2.VideoDevInfoVector2_insert(self, *args)

    def reserve(self, n):
        return _pjsua2.VideoDevInfoVector2_reserve(self, n)

    def capacity(self):
        return _pjsua2.VideoDevInfoVector2_capacity(self)
    __swig_destroy__ = _pjsua2.delete_VideoDevInfoVector2

# Register VideoDevInfoVector2 in _pjsua2:
_pjsua2.VideoDevInfoVector2_swigregister(VideoDevInfoVector2)
class CodecFmtpVector(object):
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def iterator(self):
        return _pjsua2.CodecFmtpVector_iterator(self)
    def __iter__(self):
        return self.iterator()

    def __nonzero__(self):
        return _pjsua2.CodecFmtpVector___nonzero__(self)

    def __bool__(self):
        return _pjsua2.CodecFmtpVector___bool__(self)

    def __len__(self):
        return _pjsua2.CodecFmtpVector___len__(self)

    def __getslice__(self, i, j):
        return _pjsua2.CodecFmtpVector___getslice__(self, i, j)

    def __setslice__(self, *args):
        return _pjsua2.CodecFmtpVector___setslice__(self, *args)

    def __delslice__(self, i, j):
        return _pjsua2.CodecFmtpVector___delslice__(self, i, j)

    def __delitem__(self, *args):
        return _pjsua2.CodecFmtpVector___delitem__(self, *args)

    def __getitem__(self, *args):
        return _pjsua2.CodecFmtpVector___getitem__(self, *args)

    def __setitem__(self, *args):
        return _pjsua2.CodecFmtpVector___setitem__(self, *args)

    def pop(self):
        return _pjsua2.CodecFmtpVector_pop(self)

    def append(self, x):
        return _pjsua2.CodecFmtpVector_append(self, x)

    def empty(self):
        return _pjsua2.CodecFmtpVector_empty(self)

    def size(self):
        return _pjsua2.CodecFmtpVector_size(self)

    def swap(self, v):
        return _pjsua2.CodecFmtpVector_swap(self, v)

    def begin(self):
        return _pjsua2.CodecFmtpVector_begin(self)

    def end(self):
        return _pjsua2.CodecFmtpVector_end(self)

    def rbegin(self):
        return _pjsua2.CodecFmtpVector_rbegin(self)

    def rend(self):
        return _pjsua2.CodecFmtpVector_rend(self)

    def clear(self):
        return _pjsua2.CodecFmtpVector_clear(self)

    def get_allocator(self):
        return _pjsua2.CodecFmtpVector_get_allocator(self)

    def pop_back(self):
        return _pjsua2.CodecFmtpVector_pop_back(self)

    def erase(self, *args):
        return _pjsua2.CodecFmtpVector_erase(self, *args)

    def __init__(self, *args):
        _pjsua2.CodecFmtpVector_swiginit(self, _pjsua2.new_CodecFmtpVector(*args))

    def push_back(self, x):
        return _pjsua2.CodecFmtpVector_push_back(self, x)

    def front(self):
        return _pjsua2.CodecFmtpVector_front(self)

    def back(self):
        return _pjsua2.CodecFmtpVector_back(self)

    def assign(self, n, x):
        return _pjsua2.CodecFmtpVector_assign(self, n, x)

    def resize(self, *args):
        return _pjsua2.CodecFmtpVector_resize(self, *args)

    def insert(self, *args):
        return _pjsua2.CodecFmtpVector_insert(self, *args)

    def reserve(self, n):
        return _pjsua2.CodecFmtpVector_reserve(self, n)

    def capacity(self):
        return _pjsua2.CodecFmtpVector_capacity(self)
    __swig_destroy__ = _pjsua2.delete_CodecFmtpVector

# Register CodecFmtpVector in _pjsua2:
_pjsua2.CodecFmtpVector_swigregister(CodecFmtpVector)
class MediaFormatAudioVector(object):
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def iterator(self):
        return _pjsua2.MediaFormatAudioVector_iterator(self)
    def __iter__(self):
        return self.iterator()

    def __nonzero__(self):
        return _pjsua2.MediaFormatAudioVector___nonzero__(self)

    def __bool__(self):
        return _pjsua2.MediaFormatAudioVector___bool__(self)

    def __len__(self):
        return _pjsua2.MediaFormatAudioVector___len__(self)

    def __getslice__(self, i, j):
        return _pjsua2.MediaFormatAudioVector___getslice__(self, i, j)

    def __setslice__(self, *args):
        return _pjsua2.MediaFormatAudioVector___setslice__(self, *args)

    def __delslice__(self, i, j):
        return _pjsua2.MediaFormatAudioVector___delslice__(self, i, j)

    def __delitem__(self, *args):
        return _pjsua2.MediaFormatAudioVector___delitem__(self, *args)

    def __getitem__(self, *args):
        return _pjsua2.MediaFormatAudioVector___getitem__(self, *args)

    def __setitem__(self, *args):
        return _pjsua2.MediaFormatAudioVector___setitem__(self, *args)

    def pop(self):
        return _pjsua2.MediaFormatAudioVector_pop(self)

    def append(self, x):
        return _pjsua2.MediaFormatAudioVector_append(self, x)

    def empty(self):
        return _pjsua2.MediaFormatAudioVector_empty(self)

    def size(self):
        return _pjsua2.MediaFormatAudioVector_size(self)

    def swap(self, v):
        return _pjsua2.MediaFormatAudioVector_swap(self, v)

    def begin(self):
        return _pjsua2.MediaFormatAudioVector_begin(self)

    def end(self):
        return _pjsua2.MediaFormatAudioVector_end(self)

    def rbegin(self):
        return _pjsua2.MediaFormatAudioVector_rbegin(self)

    def rend(self):
        return _pjsua2.MediaFormatAudioVector_rend(self)

    def clear(self):
        return _pjsua2.MediaFormatAudioVector_clear(self)

    def get_allocator(self):
        return _pjsua2.MediaFormatAudioVector_get_allocator(self)

    def pop_back(self):
        return _pjsua2.MediaFormatAudioVector_pop_back(self)

    def erase(self, *args):
        return _pjsua2.MediaFormatAudioVector_erase(self, *args)

    def __init__(self, *args):
        _pjsua2.MediaFormatAudioVector_swiginit(self, _pjsua2.new_MediaFormatAudioVector(*args))

    def push_back(self, x):
        return _pjsua2.MediaFormatAudioVector_push_back(self, x)

    def front(self):
        return _pjsua2.MediaFormatAudioVector_front(self)

    def back(self):
        return _pjsua2.MediaFormatAudioVector_back(self)

    def assign(self, n, x):
        return _pjsua2.MediaFormatAudioVector_assign(self, n, x)

    def resize(self, *args):
        return _pjsua2.MediaFormatAudioVector_resize(self, *args)

    def insert(self, *args):
        return _pjsua2.MediaFormatAudioVector_insert(self, *args)

    def reserve(self, n):
        return _pjsua2.MediaFormatAudioVector_reserve(self, n)

    def capacity(self):
        return _pjsua2.MediaFormatAudioVector_capacity(self)
    __swig_destroy__ = _pjsua2.delete_MediaFormatAudioVector

# Register MediaFormatAudioVector in _pjsua2:
_pjsua2.MediaFormatAudioVector_swigregister(MediaFormatAudioVector)
class MediaFormatVideoVector(object):
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def iterator(self):
        return _pjsua2.MediaFormatVideoVector_iterator(self)
    def __iter__(self):
        return self.iterator()

    def __nonzero__(self):
        return _pjsua2.MediaFormatVideoVector___nonzero__(self)

    def __bool__(self):
        return _pjsua2.MediaFormatVideoVector___bool__(self)

    def __len__(self):
        return _pjsua2.MediaFormatVideoVector___len__(self)

    def __getslice__(self, i, j):
        return _pjsua2.MediaFormatVideoVector___getslice__(self, i, j)

    def __setslice__(self, *args):
        return _pjsua2.MediaFormatVideoVector___setslice__(self, *args)

    def __delslice__(self, i, j):
        return _pjsua2.MediaFormatVideoVector___delslice__(self, i, j)

    def __delitem__(self, *args):
        return _pjsua2.MediaFormatVideoVector___delitem__(self, *args)

    def __getitem__(self, *args):
        return _pjsua2.MediaFormatVideoVector___getitem__(self, *args)

    def __setitem__(self, *args):
        return _pjsua2.MediaFormatVideoVector___setitem__(self, *args)

    def pop(self):
        return _pjsua2.MediaFormatVideoVector_pop(self)

    def append(self, x):
        return _pjsua2.MediaFormatVideoVector_append(self, x)

    def empty(self):
        return _pjsua2.MediaFormatVideoVector_empty(self)

    def size(self):
        return _pjsua2.MediaFormatVideoVector_size(self)

    def swap(self, v):
        return _pjsua2.MediaFormatVideoVector_swap(self, v)

    def begin(self):
        return _pjsua2.MediaFormatVideoVector_begin(self)

    def end(self):
        return _pjsua2.MediaFormatVideoVector_end(self)

    def rbegin(self):
        return _pjsua2.MediaFormatVideoVector_rbegin(self)

    def rend(self):
        return _pjsua2.MediaFormatVideoVector_rend(self)

    def clear(self):
        return _pjsua2.MediaFormatVideoVector_clear(self)

    def get_allocator(self):
        return _pjsua2.MediaFormatVideoVector_get_allocator(self)

    def pop_back(self):
        return _pjsua2.MediaFormatVideoVector_pop_back(self)

    def erase(self, *args):
        return _pjsua2.MediaFormatVideoVector_erase(self, *args)

    def __init__(self, *args):
        _pjsua2.MediaFormatVideoVector_swiginit(self, _pjsua2.new_MediaFormatVideoVector(*args))

    def push_back(self, x):
        return _pjsua2.MediaFormatVideoVector_push_back(self, x)

    def front(self):
        return _pjsua2.MediaFormatVideoVector_front(self)

    def back(self):
        return _pjsua2.MediaFormatVideoVector_back(self)

    def assign(self, n, x):
        return _pjsua2.MediaFormatVideoVector_assign(self, n, x)

    def resize(self, *args):
        return _pjsua2.MediaFormatVideoVector_resize(self, *args)

    def insert(self, *args):
        return _pjsua2.MediaFormatVideoVector_insert(self, *args)

    def reserve(self, n):
        return _pjsua2.MediaFormatVideoVector_reserve(self, n)

    def capacity(self):
        return _pjsua2.MediaFormatVideoVector_capacity(self)
    __swig_destroy__ = _pjsua2.delete_MediaFormatVideoVector

# Register MediaFormatVideoVector in _pjsua2:
_pjsua2.MediaFormatVideoVector_swigregister(MediaFormatVideoVector)
class CallMediaInfoVector(object):
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def iterator(self):
        return _pjsua2.CallMediaInfoVector_iterator(self)
    def __iter__(self):
        return self.iterator()

    def __nonzero__(self):
        return _pjsua2.CallMediaInfoVector___nonzero__(self)

    def __bool__(self):
        return _pjsua2.CallMediaInfoVector___bool__(self)

    def __len__(self):
        return _pjsua2.CallMediaInfoVector___len__(self)

    def __getslice__(self, i, j):
        return _pjsua2.CallMediaInfoVector___getslice__(self, i, j)

    def __setslice__(self, *args):
        return _pjsua2.CallMediaInfoVector___setslice__(self, *args)

    def __delslice__(self, i, j):
        return _pjsua2.CallMediaInfoVector___delslice__(self, i, j)

    def __delitem__(self, *args):
        return _pjsua2.CallMediaInfoVector___delitem__(self, *args)

    def __getitem__(self, *args):
        return _pjsua2.CallMediaInfoVector___getitem__(self, *args)

    def __setitem__(self, *args):
        return _pjsua2.CallMediaInfoVector___setitem__(self, *args)

    def pop(self):
        return _pjsua2.CallMediaInfoVector_pop(self)

    def append(self, x):
        return _pjsua2.CallMediaInfoVector_append(self, x)

    def empty(self):
        return _pjsua2.CallMediaInfoVector_empty(self)

    def size(self):
        return _pjsua2.CallMediaInfoVector_size(self)

    def swap(self, v):
        return _pjsua2.CallMediaInfoVector_swap(self, v)

    def begin(self):
        return _pjsua2.CallMediaInfoVector_begin(self)

    def end(self):
        return _pjsua2.CallMediaInfoVector_end(self)

    def rbegin(self):
        return _pjsua2.CallMediaInfoVector_rbegin(self)

    def rend(self):
        return _pjsua2.CallMediaInfoVector_rend(self)

    def clear(self):
        return _pjsua2.CallMediaInfoVector_clear(self)

    def get_allocator(self):
        return _pjsua2.CallMediaInfoVector_get_allocator(self)

    def pop_back(self):
        return _pjsua2.CallMediaInfoVector_pop_back(self)

    def erase(self, *args):
        return _pjsua2.CallMediaInfoVector_erase(self, *args)

    def __init__(self, *args):
        _pjsua2.CallMediaInfoVector_swiginit(self, _pjsua2.new_CallMediaInfoVector(*args))

    def push_back(self, x):
        return _pjsua2.CallMediaInfoVector_push_back(self, x)

    def front(self):
        return _pjsua2.CallMediaInfoVector_front(self)

    def back(self):
        return _pjsua2.CallMediaInfoVector_back(self)

    def assign(self, n, x):
        return _pjsua2.CallMediaInfoVector_assign(self, n, x)

    def resize(self, *args):
        return _pjsua2.CallMediaInfoVector_resize(self, *args)

    def insert(self, *args):
        return _pjsua2.CallMediaInfoVector_insert(self, *args)

    def reserve(self, n):
        return _pjsua2.CallMediaInfoVector_reserve(self, n)

    def capacity(self):
        return _pjsua2.CallMediaInfoVector_capacity(self)
    __swig_destroy__ = _pjsua2.delete_CallMediaInfoVector

# Register CallMediaInfoVector in _pjsua2:
_pjsua2.CallMediaInfoVector_swigregister(CallMediaInfoVector)
class RtcpFbCapVector(object):
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def iterator(self):
        return _pjsua2.RtcpFbCapVector_iterator(self)
    def __iter__(self):
        return self.iterator()

    def __nonzero__(self):
        return _pjsua2.RtcpFbCapVector___nonzero__(self)

    def __bool__(self):
        return _pjsua2.RtcpFbCapVector___bool__(self)

    def __len__(self):
        return _pjsua2.RtcpFbCapVector___len__(self)

    def __getslice__(self, i, j):
        return _pjsua2.RtcpFbCapVector___getslice__(self, i, j)

    def __setslice__(self, *args):
        return _pjsua2.RtcpFbCapVector___setslice__(self, *args)

    def __delslice__(self, i, j):
        return _pjsua2.RtcpFbCapVector___delslice__(self, i, j)

    def __delitem__(self, *args):
        return _pjsua2.RtcpFbCapVector___delitem__(self, *args)

    def __getitem__(self, *args):
        return _pjsua2.RtcpFbCapVector___getitem__(self, *args)

    def __setitem__(self, *args):
        return _pjsua2.RtcpFbCapVector___setitem__(self, *args)

    def pop(self):
        return _pjsua2.RtcpFbCapVector_pop(self)

    def append(self, x):
        return _pjsua2.RtcpFbCapVector_append(self, x)

    def empty(self):
        return _pjsua2.RtcpFbCapVector_empty(self)

    def size(self):
        return _pjsua2.RtcpFbCapVector_size(self)

    def swap(self, v):
        return _pjsua2.RtcpFbCapVector_swap(self, v)

    def begin(self):
        return _pjsua2.RtcpFbCapVector_begin(self)

    def end(self):
        return _pjsua2.RtcpFbCapVector_end(self)

    def rbegin(self):
        return _pjsua2.RtcpFbCapVector_rbegin(self)

    def rend(self):
        return _pjsua2.RtcpFbCapVector_rend(self)

    def clear(self):
        return _pjsua2.RtcpFbCapVector_clear(self)

    def get_allocator(self):
        return _pjsua2.RtcpFbCapVector_get_allocator(self)

    def pop_back(self):
        return _pjsua2.RtcpFbCapVector_pop_back(self)

    def erase(self, *args):
        return _pjsua2.RtcpFbCapVector_erase(self, *args)

    def __init__(self, *args):
        _pjsua2.RtcpFbCapVector_swiginit(self, _pjsua2.new_RtcpFbCapVector(*args))

    def push_back(self, x):
        return _pjsua2.RtcpFbCapVector_push_back(self, x)

    def front(self):
        return _pjsua2.RtcpFbCapVector_front(self)

    def back(self):
        return _pjsua2.RtcpFbCapVector_back(self)

    def assign(self, n, x):
        return _pjsua2.RtcpFbCapVector_assign(self, n, x)

    def resize(self, *args):
        return _pjsua2.RtcpFbCapVector_resize(self, *args)

    def insert(self, *args):
        return _pjsua2.RtcpFbCapVector_insert(self, *args)

    def reserve(self, n):
        return _pjsua2.RtcpFbCapVector_reserve(self, n)

    def capacity(self):
        return _pjsua2.RtcpFbCapVector_capacity(self)
    __swig_destroy__ = _pjsua2.delete_RtcpFbCapVector

# Register RtcpFbCapVector in _pjsua2:
_pjsua2.RtcpFbCapVector_swigregister(RtcpFbCapVector)
class SslCertNameVector(object):
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def iterator(self):
        return _pjsua2.SslCertNameVector_iterator(self)
    def __iter__(self):
        return self.iterator()

    def __nonzero__(self):
        return _pjsua2.SslCertNameVector___nonzero__(self)

    def __bool__(self):
        return _pjsua2.SslCertNameVector___bool__(self)

    def __len__(self):
        return _pjsua2.SslCertNameVector___len__(self)

    def __getslice__(self, i, j):
        return _pjsua2.SslCertNameVector___getslice__(self, i, j)

    def __setslice__(self, *args):
        return _pjsua2.SslCertNameVector___setslice__(self, *args)

    def __delslice__(self, i, j):
        return _pjsua2.SslCertNameVector___delslice__(self, i, j)

    def __delitem__(self, *args):
        return _pjsua2.SslCertNameVector___delitem__(self, *args)

    def __getitem__(self, *args):
        return _pjsua2.SslCertNameVector___getitem__(self, *args)

    def __setitem__(self, *args):
        return _pjsua2.SslCertNameVector___setitem__(self, *args)

    def pop(self):
        return _pjsua2.SslCertNameVector_pop(self)

    def append(self, x):
        return _pjsua2.SslCertNameVector_append(self, x)

    def empty(self):
        return _pjsua2.SslCertNameVector_empty(self)

    def size(self):
        return _pjsua2.SslCertNameVector_size(self)

    def swap(self, v):
        return _pjsua2.SslCertNameVector_swap(self, v)

    def begin(self):
        return _pjsua2.SslCertNameVector_begin(self)

    def end(self):
        return _pjsua2.SslCertNameVector_end(self)

    def rbegin(self):
        return _pjsua2.SslCertNameVector_rbegin(self)

    def rend(self):
        return _pjsua2.SslCertNameVector_rend(self)

    def clear(self):
        return _pjsua2.SslCertNameVector_clear(self)

    def get_allocator(self):
        return _pjsua2.SslCertNameVector_get_allocator(self)

    def pop_back(self):
        return _pjsua2.SslCertNameVector_pop_back(self)

    def erase(self, *args):
        return _pjsua2.SslCertNameVector_erase(self, *args)

    def __init__(self, *args):
        _pjsua2.SslCertNameVector_swiginit(self, _pjsua2.new_SslCertNameVector(*args))

    def push_back(self, x):
        return _pjsua2.SslCertNameVector_push_back(self, x)

    def front(self):
        return _pjsua2.SslCertNameVector_front(self)

    def back(self):
        return _pjsua2.SslCertNameVector_back(self)

    def assign(self, n, x):
        return _pjsua2.SslCertNameVector_assign(self, n, x)

    def resize(self, *args):
        return _pjsua2.SslCertNameVector_resize(self, *args)

    def insert(self, *args):
        return _pjsua2.SslCertNameVector_insert(self, *args)

    def reserve(self, n):
        return _pjsua2.SslCertNameVector_reserve(self, n)

    def capacity(self):
        return _pjsua2.SslCertNameVector_capacity(self)
    __swig_destroy__ = _pjsua2.delete_SslCertNameVector

# Register SslCertNameVector in _pjsua2:
_pjsua2.SslCertNameVector_swigregister(SslCertNameVector)
class MediaFormat(object):
    r"""
    This structure contains all the information needed to completely describe
    a media.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    id = property(_pjsua2.MediaFormat_id_get, _pjsua2.MediaFormat_id_set, doc=r"""
    The format id that specifies the audio sample or video pixel format.
    Some well known formats ids are declared in pjmedia_format_id
    enumeration.

    See also: pjmedia_format_id
    """)
    type = property(_pjsua2.MediaFormat_type_get, _pjsua2.MediaFormat_type_set, doc=r"""The top-most type of the media, as an information.""")

    def __init__(self):
        r"""Default constructor"""
        _pjsua2.MediaFormat_swiginit(self, _pjsua2.new_MediaFormat())
    __swig_destroy__ = _pjsua2.delete_MediaFormat

# Register MediaFormat in _pjsua2:
_pjsua2.MediaFormat_swigregister(MediaFormat)
class MediaFormatAudio(MediaFormat):
    r"""This structure describe detail information about an audio media."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    clockRate = property(_pjsua2.MediaFormatAudio_clockRate_get, _pjsua2.MediaFormatAudio_clockRate_set, doc=r"""Audio clock rate in samples or Hz.""")
    channelCount = property(_pjsua2.MediaFormatAudio_channelCount_get, _pjsua2.MediaFormatAudio_channelCount_set, doc=r"""Number of channels.""")
    frameTimeUsec = property(_pjsua2.MediaFormatAudio_frameTimeUsec_get, _pjsua2.MediaFormatAudio_frameTimeUsec_set, doc=r"""Frame interval, in microseconds.""")
    bitsPerSample = property(_pjsua2.MediaFormatAudio_bitsPerSample_get, _pjsua2.MediaFormatAudio_bitsPerSample_set, doc=r"""Number of bits per sample.""")
    avgBps = property(_pjsua2.MediaFormatAudio_avgBps_get, _pjsua2.MediaFormatAudio_avgBps_set, doc=r"""Average bitrate""")
    maxBps = property(_pjsua2.MediaFormatAudio_maxBps_get, _pjsua2.MediaFormatAudio_maxBps_set, doc=r"""Maximum bitrate""")

    def __init__(self):
        r"""Default constructor"""
        _pjsua2.MediaFormatAudio_swiginit(self, _pjsua2.new_MediaFormatAudio())

    def init(self, formatId, clockRate, channelCount, frameTimeUsec, bitsPerSample, avgBps=0, maxBps=0):
        r"""Initialization"""
        return _pjsua2.MediaFormatAudio_init(self, formatId, clockRate, channelCount, frameTimeUsec, bitsPerSample, avgBps, maxBps)
    __swig_destroy__ = _pjsua2.delete_MediaFormatAudio

# Register MediaFormatAudio in _pjsua2:
_pjsua2.MediaFormatAudio_swigregister(MediaFormatAudio)
class MediaFormatVideo(MediaFormat):
    r"""This structure describe detail information about an video media."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    width = property(_pjsua2.MediaFormatVideo_width_get, _pjsua2.MediaFormatVideo_width_set, doc=r"""Video width.""")
    height = property(_pjsua2.MediaFormatVideo_height_get, _pjsua2.MediaFormatVideo_height_set, doc=r"""Video height.""")
    fpsNum = property(_pjsua2.MediaFormatVideo_fpsNum_get, _pjsua2.MediaFormatVideo_fpsNum_set, doc=r"""Frames per second numerator.""")
    fpsDenum = property(_pjsua2.MediaFormatVideo_fpsDenum_get, _pjsua2.MediaFormatVideo_fpsDenum_set, doc=r"""Frames per second denumerator.""")
    avgBps = property(_pjsua2.MediaFormatVideo_avgBps_get, _pjsua2.MediaFormatVideo_avgBps_set, doc=r"""Average bitrate.""")
    maxBps = property(_pjsua2.MediaFormatVideo_maxBps_get, _pjsua2.MediaFormatVideo_maxBps_set, doc=r"""Maximum bitrate.""")

    def __init__(self):
        r"""Default constructor"""
        _pjsua2.MediaFormatVideo_swiginit(self, _pjsua2.new_MediaFormatVideo())

    def init(self, formatId, width, height, fpsNum, fpsDenum=1, avgBps=0, maxBps=0):
        r"""Initialization"""
        return _pjsua2.MediaFormatVideo_init(self, formatId, width, height, fpsNum, fpsDenum, avgBps, maxBps)
    __swig_destroy__ = _pjsua2.delete_MediaFormatVideo

# Register MediaFormatVideo in _pjsua2:
_pjsua2.MediaFormatVideo_swigregister(MediaFormatVideo)
class ConfPortInfo(object):
    r"""
    This structure descibes information about a particular media port that
    has been registered into the conference bridge.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    portId = property(_pjsua2.ConfPortInfo_portId_get, _pjsua2.ConfPortInfo_portId_set, doc=r"""Conference port number.""")
    name = property(_pjsua2.ConfPortInfo_name_get, _pjsua2.ConfPortInfo_name_set, doc=r"""Port name.""")
    format = property(_pjsua2.ConfPortInfo_format_get, _pjsua2.ConfPortInfo_format_set, doc=r"""Media audio format information""")
    txLevelAdj = property(_pjsua2.ConfPortInfo_txLevelAdj_get, _pjsua2.ConfPortInfo_txLevelAdj_set, doc=r"""
    Tx level adjustment. Value 1.0 means no adjustment, value 0 means
    the port is muted, value 2.0 means the level is amplified two times.
    """)
    rxLevelAdj = property(_pjsua2.ConfPortInfo_rxLevelAdj_get, _pjsua2.ConfPortInfo_rxLevelAdj_set, doc=r"""
    Rx level adjustment. Value 1.0 means no adjustment, value 0 means
    the port is muted, value 2.0 means the level is amplified two times.
    """)
    listeners = property(_pjsua2.ConfPortInfo_listeners_get, _pjsua2.ConfPortInfo_listeners_set, doc=r"""
    Array of listeners (in other words, ports where this port is
    transmitting to).
    """)

    def __init__(self):
        _pjsua2.ConfPortInfo_swiginit(self, _pjsua2.new_ConfPortInfo())
    __swig_destroy__ = _pjsua2.delete_ConfPortInfo

# Register ConfPortInfo in _pjsua2:
_pjsua2.ConfPortInfo_swigregister(ConfPortInfo)
class Media(object):
    r"""Media."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")

    def __init__(self, *args, **kwargs):
        raise AttributeError("No constructor defined")
    __repr__ = _swig_repr
    __swig_destroy__ = _pjsua2.delete_Media

    def getType(self):
        r"""
        Get type of the media.

        :rtype: int
        :return: The media type.
        """
        return _pjsua2.Media_getType(self)

# Register Media in _pjsua2:
_pjsua2.Media_swigregister(Media)
class AudioMediaTransmitParam(object):
    r"""Parameters for AudioMedia::startTransmit2() method."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    level = property(_pjsua2.AudioMediaTransmitParam_level_get, _pjsua2.AudioMediaTransmitParam_level_set, doc=r"""
    Signal level adjustment. Value 1.0 means no level adjustment,
    while value 0 means to mute the port.

    Default: 1.0
    """)

    def __init__(self):
        r"""Default constructor"""
        _pjsua2.AudioMediaTransmitParam_swiginit(self, _pjsua2.new_AudioMediaTransmitParam())
    __swig_destroy__ = _pjsua2.delete_AudioMediaTransmitParam

# Register AudioMediaTransmitParam in _pjsua2:
_pjsua2.AudioMediaTransmitParam_swigregister(AudioMediaTransmitParam)
class AudioMedia(Media):
    r"""
    Audio Media. This is a lite wrapper class for audio conference bridge port,
    i.e: this class only maintains one data member, conference slot ID, and
    the methods are simply proxies for conference bridge operations.

    Application can create a derived class and use registerMediaPort2()/
    unregisterMediaPort() to register/unregister a media port to/from the
    conference bridge.

    The library will not keep a list of AudioMedia instances, so any
    AudioMedia (descendant) instances instantiated by application must be
    maintained and destroyed by the application itself.

    Note that any PJSUA2 APIs that return AudioMedia instance(s) such as
    Endpoint::mediaEnumPorts2() or Call::getAudioMedia() will just return
    generated copy. All AudioMedia methods should work normally on this
    generated copy instance.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def getPortInfo(self):
        r"""Get information about the specified conference port."""
        return _pjsua2.AudioMedia_getPortInfo(self)

    def getPortId(self):
        r"""Get port Id."""
        return _pjsua2.AudioMedia_getPortId(self)

    @staticmethod
    def getPortInfoFromId(port_id):
        r"""Get information from specific port id."""
        return _pjsua2.AudioMedia_getPortInfoFromId(port_id)

    def startTransmit(self, sink):
        r"""
        Establish unidirectional media flow to sink. This media port
        will act as a source, and it may transmit to multiple destinations/sink.
        And if multiple sources are transmitting to the same sink, the media
        will be mixed together. Source and sink may refer to the same Media,
        effectively looping the media.

        If bidirectional media flow is desired, application needs to call
        this method twice, with the second one called from the opposite source
        media.

        This operation executes asynchronously, use the callback set from
        Endpoint::onAudioMediaOpCompleted() to receive notification upon
        completion.


        :type sink: :py:class:`AudioMedia`
        :param sink:              The destination Media.
        """
        return _pjsua2.AudioMedia_startTransmit(self, sink)

    def startTransmit2(self, sink, param):
        r"""
        Establish unidirectional media flow to sink. This media port
        will act as a source, and it may transmit to multiple destinations/sink.
        And if multiple sources are transmitting to the same sink, the media
        will be mixed together. Source and sink may refer to the same Media,
        effectively looping the media.

        Signal level from this source to the sink can be adjusted by making
        it louder or quieter via the parameter param. The level adjustment
        will apply to a specific connection only (i.e. only for signal
        from this source to the sink), as compared to
        adjustTxLevel()/adjustRxLevel() which applies to all signals from/to
        this media port. The signal adjustment
        will be cumulative, in this following order:
        signal from this source will be adjusted with the level specified
        in adjustTxLevel(), then with the level specified via this API,
        and finally with the level specified to the sink's adjustRxLevel().

        If bidirectional media flow is desired, application needs to call
        this method twice, with the second one called from the opposite source
        media.

        This operation executes asynchronously, use the callback set from
        Endpoint::onAudioMediaOpCompleted() to receive notification upon
        completion.

        :type sink: :py:class:`AudioMedia`
        :param sink:              The destination Media.
        :type param: :py:class:`AudioMediaTransmitParam`
        :param param:             The parameter.
        """
        return _pjsua2.AudioMedia_startTransmit2(self, sink, param)

    def stopTransmit(self, sink):
        r"""
         Stop media flow to destination/sink port.

        This operation executes asynchronously, use the callback set from
        Endpoint::onAudioMediaOpCompleted() to receive notification upon
        completion.

        :type sink: :py:class:`AudioMedia`
        :param sink:              The destination media.
        """
        return _pjsua2.AudioMedia_stopTransmit(self, sink)

    def adjustRxLevel(self, level):
        r"""
        Adjust the signal level to be transmitted from the bridge to this
        media port by making it louder or quieter.

        :type level: float
        :param level:             Signal level adjustment. Value 1.0 means no
                                     level adjustment, while value 0 means to mute
                                     the port.
        """
        return _pjsua2.AudioMedia_adjustRxLevel(self, level)

    def adjustTxLevel(self, level):
        r"""
        Adjust the signal level to be received from this media port (to
        the bridge) by making it louder or quieter.

        :type level: float
        :param level:             Signal level adjustment. Value 1.0 means no
                                     level adjustment, while value 0 means to mute
                                     the port.
        """
        return _pjsua2.AudioMedia_adjustTxLevel(self, level)

    def getRxLevel(self):
        r"""
        Get the last received signal level.

        :rtype: int
        :return: Signal level in percent.
        """
        return _pjsua2.AudioMedia_getRxLevel(self)

    def getTxLevel(self):
        r"""
        Get the last transmitted signal level.

        :rtype: int
        :return: Signal level in percent.
        """
        return _pjsua2.AudioMedia_getTxLevel(self)

    @staticmethod
    def typecastFromMedia(media):
        r"""
        Warning: deprecated and will be removed in future release.

        Typecast from base class Media. This is useful for application written
        in language that does not support downcasting such as Python.

        :type media: :py:class:`Media`
        :param media:             The object to be downcasted

        :rtype: :py:class:`AudioMedia`
        :return: The object as AudioMedia instance
        """
        return _pjsua2.AudioMedia_typecastFromMedia(media)

    def __init__(self):
        r"""
        Default Constructor.

        Normally application will not create AudioMedia object directly,
        but it instantiates an AudioMedia derived class. This is set as public
        because some STL vector implementations require it.
        """
        _pjsua2.AudioMedia_swiginit(self, _pjsua2.new_AudioMedia())
    __swig_destroy__ = _pjsua2.delete_AudioMedia

# Register AudioMedia in _pjsua2:
_pjsua2.AudioMedia_swigregister(AudioMedia)
class MediaFrame(object):
    r"""This structure describes a media frame."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    type = property(_pjsua2.MediaFrame_type_get, _pjsua2.MediaFrame_type_set, doc=r"""Frame type.""")
    buf = property(_pjsua2.MediaFrame_buf_get, _pjsua2.MediaFrame_buf_set, doc=r"""Frame buffer content.""")
    size = property(_pjsua2.MediaFrame_size_get, _pjsua2.MediaFrame_size_set, doc=r"""Frame size in bytes.""")

    def __init__(self):
        r"""Default constructor"""
        _pjsua2.MediaFrame_swiginit(self, _pjsua2.new_MediaFrame())
    __swig_destroy__ = _pjsua2.delete_MediaFrame

# Register MediaFrame in _pjsua2:
_pjsua2.MediaFrame_swigregister(MediaFrame)
class AudioMediaPort(AudioMedia):
    r"""Audio Media Port."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def __init__(self):
        r"""Constructor."""
        if self.__class__ == AudioMediaPort:
            _self = None
        else:
            _self = self
        _pjsua2.AudioMediaPort_swiginit(self, _pjsua2.new_AudioMediaPort(_self, ))
    __swig_destroy__ = _pjsua2.delete_AudioMediaPort

    def createPort(self, name, fmt):
        r"""
        Create an audio media port and register it to the conference bridge.

        :type name: string
        :param name:      The port name.
        :type fmt: :py:class:`MediaFormatAudio`
        :param fmt:       The audio format.
        """
        return _pjsua2.AudioMediaPort_createPort(self, name, fmt)

    def onFrameRequested(self, frame):
        r"""
        This callback is called to request a frame from this port. On input,
        frame.size indicates the capacity of the frame buffer and frame.buf
        will initially be an empty vector. Application can then set the frame
        type and fill the vector.

        :type frame: :py:class:`MediaFrame`
        :param frame:       The frame.
        """
        return _pjsua2.AudioMediaPort_onFrameRequested(self, frame)

    def onFrameReceived(self, frame):
        r"""
        This callback is called when this port receives a frame. The frame
        content will be provided in frame.buf vector, and the frame size
        can be found in either frame.size or the vector's size (both
        have the same value).

        :type frame: :py:class:`MediaFrame`
        :param frame:       The frame.
        """
        return _pjsua2.AudioMediaPort_onFrameReceived(self, frame)
    def __disown__(self):
        self.this.disown()
        _pjsua2.disown_AudioMediaPort(self)
        return weakref.proxy(self)

# Register AudioMediaPort in _pjsua2:
_pjsua2.AudioMediaPort_swigregister(AudioMediaPort)
class AiMediaEvent(object):
    r"""AI Media Port event data."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    type = property(_pjsua2.AiMediaEvent_type_get, _pjsua2.AiMediaEvent_type_set, doc=r"""Event type.""")
    status = property(_pjsua2.AiMediaEvent_status_get, _pjsua2.AiMediaEvent_status_set, doc=r"""Status code. PJ_SUCCESS for informational events.""")
    text = property(_pjsua2.AiMediaEvent_text_get, _pjsua2.AiMediaEvent_text_set, doc=r"""Text payload (transcript). Only valid for TRANSCRIPT events.""")

    def __init__(self):
        _pjsua2.AiMediaEvent_swiginit(self, _pjsua2.new_AiMediaEvent())
    __swig_destroy__ = _pjsua2.delete_AiMediaEvent

# Register AiMediaEvent in _pjsua2:
_pjsua2.AiMediaEvent_swigregister(AiMediaEvent)
class AiMediaPortParam(object):
    r"""AI Media Port creation parameters."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    vadEnabled = property(_pjsua2.AiMediaPortParam_vadEnabled_get, _pjsua2.AiMediaPortParam_vadEnabled_set, doc=r"""
    Enable voice activity detection (VAD) on the TX path.
    When enabled, silence frames are not sent to the AI service.

    Default: false
    """)
    ptimeMsec = property(_pjsua2.AiMediaPortParam_ptimeMsec_get, _pjsua2.AiMediaPortParam_ptimeMsec_set, doc=r"""
    Ptime in milliseconds.

    Default: 20
    """)

    def __init__(self):
        r"""Default constructor"""
        _pjsua2.AiMediaPortParam_swiginit(self, _pjsua2.new_AiMediaPortParam())
    __swig_destroy__ = _pjsua2.delete_AiMediaPortParam

# Register AiMediaPortParam in _pjsua2:
_pjsua2.AiMediaPortParam_swigregister(AiMediaPortParam)
class AudioMediaAiPort(AudioMedia):
    r"""
    AI Media Port.

    This wraps pjmedia_ai_port as an AudioMedia object that can be
    connected to the conference bridge. It bridges audio to/from
    real-time AI services (e.g. OpenAI Realtime API) over WebSocket.

    Basic usage:
    1. Create with createPort() (uses the OpenAI Realtime API backend).
    2. Connect to the AI service with connect().
    3. Use startTransmit()/stopTransmit() to route audio from/to
       other conference bridge ports (e.g. AudioMedia from a call).
    4. Disconnect with disconnect() when done.

    Events (connected, transcript, etc.) are delivered via the
    virtual onEvent() callback.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def __init__(self):
        r"""Constructor."""
        if self.__class__ == AudioMediaAiPort:
            _self = None
        else:
            _self = self
        _pjsua2.AudioMediaAiPort_swiginit(self, _pjsua2.new_AudioMediaAiPort(_self, ))
    __swig_destroy__ = _pjsua2.delete_AudioMediaAiPort

    def createPort(self, *args):
        r"""
        Create an AI media port with the OpenAI Realtime API backend and
        register it to the conference bridge. The port operates at the
        backend's native clock rate (e.g. 24kHz for OpenAI); the
        conference bridge handles resampling.

        :type prm: :py:class:`AiMediaPortParam`, optional
        :param prm:       Creation parameters.
        """
        return _pjsua2.AudioMediaAiPort_createPort(self, *args)

    def connect(self, url, authToken):
        r"""
        Connect to the AI service asynchronously. The onEvent() callback
        will be called with PJMEDIA_AI_EVENT_CONNECTED or
        PJMEDIA_AI_EVENT_DISCONNECTED when complete.

        :type url: string
        :param url:           WebSocket URL (e.g.
                                 "wss://api.openai.com/v1/realtime?model=...")
        :type authToken: string
        :param authToken:     Authentication token (e.g. OpenAI API key).
        """
        return _pjsua2.AudioMediaAiPort_connect(self, url, authToken)

    def disconnect(self):
        r"""Disconnect from the AI service gracefully."""
        return _pjsua2.AudioMediaAiPort_disconnect(self)

    def onEvent(self, event):
        r"""
        Called when an AI event occurs (connected, transcript, etc.).
        This may be called from the ioqueue worker thread.

        :type event: :py:class:`AiMediaEvent`
        :param event:     The event data.
        """
        return _pjsua2.AudioMediaAiPort_onEvent(self, event)
    def __disown__(self):
        self.this.disown()
        _pjsua2.disown_AudioMediaAiPort(self)
        return weakref.proxy(self)

# Register AudioMediaAiPort in _pjsua2:
_pjsua2.AudioMediaAiPort_swigregister(AudioMediaAiPort)
class AudioMediaPlayerInfo(object):
    r"""This structure contains additional info about AudioMediaPlayer."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    formatId = property(_pjsua2.AudioMediaPlayerInfo_formatId_get, _pjsua2.AudioMediaPlayerInfo_formatId_set, doc=r"""Format ID of the payload.""")
    payloadBitsPerSample = property(_pjsua2.AudioMediaPlayerInfo_payloadBitsPerSample_get, _pjsua2.AudioMediaPlayerInfo_payloadBitsPerSample_set, doc=r"""
    The number of bits per sample of the file payload. For example,
    the value is 16 for PCM WAV and 8 for Alaw/Ulas WAV files.
    """)
    sizeBytes = property(_pjsua2.AudioMediaPlayerInfo_sizeBytes_get, _pjsua2.AudioMediaPlayerInfo_sizeBytes_set, doc=r"""The WAV payload size in bytes.""")
    sizeSamples = property(_pjsua2.AudioMediaPlayerInfo_sizeSamples_get, _pjsua2.AudioMediaPlayerInfo_sizeSamples_set, doc=r"""The WAV payload size in samples.""")

    def __init__(self):
        r"""Default constructor"""
        _pjsua2.AudioMediaPlayerInfo_swiginit(self, _pjsua2.new_AudioMediaPlayerInfo())
    __swig_destroy__ = _pjsua2.delete_AudioMediaPlayerInfo

# Register AudioMediaPlayerInfo in _pjsua2:
_pjsua2.AudioMediaPlayerInfo_swigregister(AudioMediaPlayerInfo)
class AudioMediaPlayer(AudioMedia):
    r"""Audio Media Player."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def __init__(self):
        r"""Constructor."""
        if self.__class__ == AudioMediaPlayer:
            _self = None
        else:
            _self = self
        _pjsua2.AudioMediaPlayer_swiginit(self, _pjsua2.new_AudioMediaPlayer(_self, ))

    def createPlayer(self, file_name, options=0):
        r"""
        Create a file player,  and automatically add this
        player to the conference bridge.

        :type file_name: string
        :param file_name:  The filename to be played. Currently only
                              WAV files are supported, and the WAV file MUST be
                              formatted as 16bit PCM mono/single channel (any
                              clock rate is supported).
        :type options: int, optional
        :param options:    Optional option flag. Application may specify
                              PJMEDIA_FILE_NO_LOOP to prevent playback loop.
        """
        return _pjsua2.AudioMediaPlayer_createPlayer(self, file_name, options)

    def createPlaylist(self, *args):
        r"""
        Create a file playlist media port, and automatically add the port
        to the conference bridge.

        :type file_names: :py:class:`StringVector`
        :param file_names:  Array of file names to be added to the play list.
                               Note that the files must have the same clock rate,
                               number of channels, and number of bits per sample.
        :type label: string, optional
        :param label:       Optional label to be set for the media port.
        :type options: int, optional
        :param options:     Optional option flag. Application may specify
                               PJMEDIA_FILE_NO_LOOP to prevent looping.
        """
        return _pjsua2.AudioMediaPlayer_createPlaylist(self, *args)

    def getInfo(self):
        r"""
        Get additional info about the player. This operation is only valid
        for player. For playlist, Error will be thrown.

        :rtype: :py:class:`AudioMediaPlayerInfo`
        :return: the info.
        """
        return _pjsua2.AudioMediaPlayer_getInfo(self)

    def getPos(self):
        r"""
        Get current playback position in samples. This operation is not valid
        for playlist.

        :rtype: int
        :return: Current playback position, in samples.
        """
        return _pjsua2.AudioMediaPlayer_getPos(self)

    def setPos(self, samples):
        r"""
        Set playback position in samples. This operation is not valid for
        playlist.

        :type samples: int
        :param samples:      The desired playback position, in samples.
        """
        return _pjsua2.AudioMediaPlayer_setPos(self, samples)

    @staticmethod
    def typecastFromAudioMedia(media):
        r"""
        Warning: deprecated and will be removed in future release.

        Typecast from base class AudioMedia. This is useful for application
        written in language that does not support downcasting such as Python.

        :type media: :py:class:`AudioMedia`
        :param media:             The object to be downcasted

        :rtype: :py:class:`AudioMediaPlayer`
        :return: The object as AudioMediaPlayer instance
        """
        return _pjsua2.AudioMediaPlayer_typecastFromAudioMedia(media)
    __swig_destroy__ = _pjsua2.delete_AudioMediaPlayer

    def onEof2(self):
        r"""
        Register a callback to be called when the file player reading has
        reached the end of file, or when the file reading has reached the
        end of file of the last file for a playlist. If the file or playlist
        is set to play repeatedly, then the callback will be called multiple
        times.

        If application wishes to stop the playback, it can stop the media
        transmission in the callback, and only after all transmissions have
        been stopped, could the application safely destroy the player.
        """
        return _pjsua2.AudioMediaPlayer_onEof2(self)
    def __disown__(self):
        self.this.disown()
        _pjsua2.disown_AudioMediaPlayer(self)
        return weakref.proxy(self)

# Register AudioMediaPlayer in _pjsua2:
_pjsua2.AudioMediaPlayer_swigregister(AudioMediaPlayer)
class AudioMediaRecorder(AudioMedia):
    r"""Audio Media Recorder."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def __init__(self):
        r"""Constructor."""
        _pjsua2.AudioMediaRecorder_swiginit(self, _pjsua2.new_AudioMediaRecorder())

    def createRecorder(self, file_name, enc_type=0, max_size=0, options=0):
        r"""
        Create a file recorder, and automatically connect this recorder to
        the conference bridge. The recorder currently supports recording WAV
        file. The type of the recorder to use is determined by the extension of
        the file (e.g. ".wav").

        :type file_name: string
        :param file_name:  Output file name. The function will determine the
                              default format to be used based on the file extension.
                              Currently ".wav" is supported on all platforms.
        :type enc_type: int, optional
        :param enc_type:   Optionally specify the type of encoder to be used to
                              compress the media, if the file can support different
                              encodings. This value must be zero for now.
        :type max_size: int, optional
        :param max_size:   Maximum file size. Specify zero or -1 to remove size
                              limitation. This value must be zero or -1 for now.
        :type options: int, optional
        :param options:    Optional options, which can be used to specify the
                              recording file format. Supported options are
                              PJMEDIA_FILE_WRITE_PCM, PJMEDIA_FILE_WRITE_ALAW,
                              and PJMEDIA_FILE_WRITE_ULAW. Default is zero or
                              PJMEDIA_FILE_WRITE_PCM.
        """
        return _pjsua2.AudioMediaRecorder_createRecorder(self, file_name, enc_type, max_size, options)

    @staticmethod
    def typecastFromAudioMedia(media):
        r"""
        Warning: deprecated and will be removed in future release.

        Typecast from base class AudioMedia. This is useful for application
        written in language that does not support downcasting such as Python.

        :type media: :py:class:`AudioMedia`
        :param media:             The object to be downcasted

        :rtype: :py:class:`AudioMediaRecorder`
        :return: The object as AudioMediaRecorder instance
        """
        return _pjsua2.AudioMediaRecorder_typecastFromAudioMedia(media)
    __swig_destroy__ = _pjsua2.delete_AudioMediaRecorder

# Register AudioMediaRecorder in _pjsua2:
_pjsua2.AudioMediaRecorder_swigregister(AudioMediaRecorder)
class ToneDesc(pjmedia_tone_desc):
    r"""Tone descriptor (abstraction for pjmedia_tone_desc)"""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def __init__(self):
        _pjsua2.ToneDesc_swiginit(self, _pjsua2.new_ToneDesc())
    __swig_destroy__ = _pjsua2.delete_ToneDesc

# Register ToneDesc in _pjsua2:
_pjsua2.ToneDesc_swigregister(ToneDesc)
class ToneDigit(pjmedia_tone_digit):
    r"""Tone digit (abstraction for pjmedia_tone_digit)"""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def __init__(self):
        _pjsua2.ToneDigit_swiginit(self, _pjsua2.new_ToneDigit())
    __swig_destroy__ = _pjsua2.delete_ToneDigit

# Register ToneDigit in _pjsua2:
_pjsua2.ToneDigit_swigregister(ToneDigit)
class ToneDigitMapDigit(object):
    r"""A digit in tone digit map"""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    digit = property(_pjsua2.ToneDigitMapDigit_digit_get, _pjsua2.ToneDigitMapDigit_digit_set, doc=r"""the digit""")
    freq1 = property(_pjsua2.ToneDigitMapDigit_freq1_get, _pjsua2.ToneDigitMapDigit_freq1_set, doc=r"""first frequency""")
    freq2 = property(_pjsua2.ToneDigitMapDigit_freq2_get, _pjsua2.ToneDigitMapDigit_freq2_set, doc=r"""second frequency""")

    def __init__(self):
        _pjsua2.ToneDigitMapDigit_swiginit(self, _pjsua2.new_ToneDigitMapDigit())
    __swig_destroy__ = _pjsua2.delete_ToneDigitMapDigit

# Register ToneDigitMapDigit in _pjsua2:
_pjsua2.ToneDigitMapDigit_swigregister(ToneDigitMapDigit)
class ToneGenerator(AudioMedia):
    r"""Tone generator."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def __init__(self):
        r"""Constructor."""
        _pjsua2.ToneGenerator_swiginit(self, _pjsua2.new_ToneGenerator())
    __swig_destroy__ = _pjsua2.delete_ToneGenerator

    def createToneGenerator(self, clock_rate=16000, channel_count=1):
        r"""Create tone generator and register the port to the conference bridge."""
        return _pjsua2.ToneGenerator_createToneGenerator(self, clock_rate, channel_count)

    def isBusy(self):
        r"""
        Check if the tone generator is still busy producing some tones.
        :rtype: boolean
        :return: Non-zero if busy.
        """
        return _pjsua2.ToneGenerator_isBusy(self)

    def stop(self):
        r"""Instruct the tone generator to stop current processing."""
        return _pjsua2.ToneGenerator_stop(self)

    def rewind(self):
        r"""
        Rewind the playback. This will start the playback to the first
        tone in the playback list.
        """
        return _pjsua2.ToneGenerator_rewind(self)

    def play(self, tones, loop=False):
        r"""
        Instruct the tone generator to play single or dual frequency tones
        with the specified duration. The new tones will be appended to
        currently playing tones, unless stop() is called before calling this
        function. The playback will begin as soon as the tone generator is
        connected to other media.

        :type tones: :py:class:`ToneDescVector`
        :param tones:         Array of tones to be played.
        :type loop: boolean, optional
        :param loop:          Play the tone in a loop.
        """
        return _pjsua2.ToneGenerator_play(self, tones, loop)

    def playDigits(self, digits, loop=False):
        r"""
        Instruct the tone generator to play multiple MF digits with each of
        the digits having individual ON/OFF duration. Each of the digit in the
        digit array must have the corresponding descriptor in the digit map.
        The new tones will be appended to currently playing tones, unless
        stop() is called before calling this function. The playback will begin
        as soon as the tone generator is connected to a sink media.

        :type digits: :py:class:`ToneDigitVector`
        :param digits:        Array of MF digits.
        :type loop: boolean, optional
        :param loop:          Play the tone in a loop.
        """
        return _pjsua2.ToneGenerator_playDigits(self, digits, loop)

    def getDigitMap(self):
        r"""
        Get the digit-map currently used by this tone generator.

        :rtype: :py:class:`ToneDigitMapVector`
        :return: The digitmap currently used by the tone generator
        """
        return _pjsua2.ToneGenerator_getDigitMap(self)

    def setDigitMap(self, digit_map):
        r"""
        Set digit map to be used by the tone generator.

        :type digit_map: :py:class:`ToneDigitMapVector`
        :param digit_map:     Digitmap to be used by the tone generator.
        """
        return _pjsua2.ToneGenerator_setDigitMap(self, digit_map)

# Register ToneGenerator in _pjsua2:
_pjsua2.ToneGenerator_swigregister(ToneGenerator)
class AudioDevInfo(object):
    r"""Audio device information structure."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    id = property(_pjsua2.AudioDevInfo_id_get, _pjsua2.AudioDevInfo_id_set, doc=r"""The device ID""")
    name = property(_pjsua2.AudioDevInfo_name_get, _pjsua2.AudioDevInfo_name_set, doc=r"""The device name""")
    inputCount = property(_pjsua2.AudioDevInfo_inputCount_get, _pjsua2.AudioDevInfo_inputCount_set, doc=r"""
    Maximum number of input channels supported by this device. If the
    value is zero, the device does not support input operation (i.e.
    it is a playback only device).
    """)
    outputCount = property(_pjsua2.AudioDevInfo_outputCount_get, _pjsua2.AudioDevInfo_outputCount_set, doc=r"""
    Maximum number of output channels supported by this device. If the
    value is zero, the device does not support output operation (i.e.
    it is an input only device).
    """)
    defaultSamplesPerSec = property(_pjsua2.AudioDevInfo_defaultSamplesPerSec_get, _pjsua2.AudioDevInfo_defaultSamplesPerSec_set, doc=r"""Default sampling rate.""")
    driver = property(_pjsua2.AudioDevInfo_driver_get, _pjsua2.AudioDevInfo_driver_set, doc=r"""The underlying driver name""")
    caps = property(_pjsua2.AudioDevInfo_caps_get, _pjsua2.AudioDevInfo_caps_set, doc=r"""Device capabilities, as bitmask combination of pjmedia_aud_dev_cap.""")
    routes = property(_pjsua2.AudioDevInfo_routes_get, _pjsua2.AudioDevInfo_routes_set, doc=r"""
    Supported audio device routes, as bitmask combination of
    pjmedia_aud_dev_route. The value may be zero if the device
    does not support audio routing.
    """)
    extFmt = property(_pjsua2.AudioDevInfo_extFmt_get, _pjsua2.AudioDevInfo_extFmt_set, doc=r"""Array of supported extended audio formats""")
    __swig_destroy__ = _pjsua2.delete_AudioDevInfo

    def __init__(self):
        _pjsua2.AudioDevInfo_swiginit(self, _pjsua2.new_AudioDevInfo())

# Register AudioDevInfo in _pjsua2:
_pjsua2.AudioDevInfo_swigregister(AudioDevInfo)
class AudDevManager(object):
    r"""Audio device manager."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")

    def __init__(self, *args, **kwargs):
        raise AttributeError("No constructor defined")
    __repr__ = _swig_repr

    def getCaptureDev(self):
        r"""
        Get currently active capture sound devices. If sound devices has not been
        created, it is possible that the function returns -1 as device IDs.

        :rtype: int
        :return: Device ID of the capture device.
        """
        return _pjsua2.AudDevManager_getCaptureDev(self)

    def getCaptureDevMedia(self):
        r"""
        Get the AudioMedia of the capture audio device.

        :rtype: :py:class:`AudioMedia`
        :return: Audio media for the capture device.
        """
        return _pjsua2.AudDevManager_getCaptureDevMedia(self)

    def getPlaybackDev(self):
        r"""
        Get currently active playback sound devices. If sound devices has not
        been created, it is possible that the function returns -1 as device IDs.

        :rtype: int
        :return: Device ID of the playback device.
        """
        return _pjsua2.AudDevManager_getPlaybackDev(self)

    def getPlaybackDevMedia(self):
        r"""
        Get the AudioMedia of the speaker/playback audio device.

        :rtype: :py:class:`AudioMedia`
        :return: Audio media for the speaker/playback device.
        """
        return _pjsua2.AudDevManager_getPlaybackDevMedia(self)

    def setCaptureDev(self, capture_dev):
        r"""
        Select or change capture sound device. Application may call this
        function at any time to replace current sound device. Calling this
        method will not change the state of the sound device (opened/closed).

        :type capture_dev: int
        :param capture_dev:       Device ID of the capture device.
        """
        return _pjsua2.AudDevManager_setCaptureDev(self, capture_dev)

    def setPlaybackDev(self, playback_dev):
        r"""
        Select or change playback sound device. Application may call this
        function at any time to replace current sound device. Calling this
        method will not change the state of the sound device (opened/closed).

        :type playback_dev: int
        :param playback_dev:      Device ID of the playback device.
        """
        return _pjsua2.AudDevManager_setPlaybackDev(self, playback_dev)

    def enumDev2(self):
        r"""
        Enum all audio devices installed in the system.

        :rtype: :py:class:`AudioDevInfoVector2`
        :return: The list of audio device info.
        """
        return _pjsua2.AudDevManager_enumDev2(self)

    def setNullDev(self):
        r"""
        Set pjsua to use null sound device. The null sound device only provides
        the timing needed by the conference bridge, and will not interract with
        any hardware.
        """
        return _pjsua2.AudDevManager_setNullDev(self)

    def setNoDev(self):
        r"""
        Disconnect the main conference bridge from any sound devices, and let
        application connect the bridge to it's own sound device/master port.

        :rtype: void
        :return: The port interface of the conference bridge,
                                     so that application can connect this to it's
                                     own sound device or master port.
        """
        return _pjsua2.AudDevManager_setNoDev(self)

    def setSndDevMode(self, mode):
        r"""
        Set sound device mode.

        Note that this method will open the sound device, using current
        active IDs set via setCaptureDev() or setPlaybackDev(), if the flag
        PJSUA_SND_DEV_NO_IMMEDIATE_OPEN is not specified.

        :type mode: int
        :param mode:              The sound device mode, as bitmask combination
                                     of #pjsua_snd_dev_mode
        """
        return _pjsua2.AudDevManager_setSndDevMode(self, mode)

    def setEcOptions(self, tail_msec, options):
        r"""
        Change the echo cancellation settings.

        The behavior of this function depends on whether the sound device is
        currently active, and if it is, whether device or software AEC is
        being used.

        If the sound device is currently active, and if the device supports AEC,
        this function will forward the change request to the device and it will
        be up to the device on whether support the request. If software AEC is
        being used (the software EC will be used if the device does not support
        AEC), this function will change the software EC settings. In all cases,
        the setting will be saved for future opening of the sound device.

        If the sound device is not currently active, this will only change the
        default AEC settings and the setting will be applied next time the
        sound device is opened.

        :type tail_msec: int
        :param tail_msec:         The tail length, in miliseconds. Set to zero to
                                     disable AEC.
        :type options: int
        :param options:           Options to be passed to pjmedia_echo_create().
                                     Normally the value should be zero.
        """
        return _pjsua2.AudDevManager_setEcOptions(self, tail_msec, options)

    def getEcTail(self):
        r"""
        Get current echo canceller tail length.

        :rtype: int
        :return: The EC tail length in milliseconds,
                                     If AEC is disabled, the value will be zero.
        """
        return _pjsua2.AudDevManager_getEcTail(self)

    def sndIsActive(self):
        r"""
        Check whether the sound device is currently active. The sound device
        may be inactive if the application has set the auto close feature to
        non-zero (the sndAutoCloseTime setting in MediaConfig), or
        if null sound device or no sound device has been configured via the
        setNoDev() function.
        """
        return _pjsua2.AudDevManager_sndIsActive(self)

    def refreshDevs(self):
        r"""
        Refresh the list of sound devices installed in the system. This method
        will only refresh the list of audio device so all active audio streams
        will be unaffected. After refreshing the device list, application MUST
        make sure to update all index references to audio devices before calling
        any method that accepts audio device index as its parameter.
        """
        return _pjsua2.AudDevManager_refreshDevs(self)

    def getDevCount(self):
        r"""
        Get the number of sound devices installed in the system.

        :rtype: int
        :return: The number of sound devices installed in the
                                     system.
        """
        return _pjsua2.AudDevManager_getDevCount(self)

    def getDevInfo(self, id):
        r"""
        Get device information.

        :type id: int
        :param id:                The audio device ID.

        :rtype: :py:class:`AudioDevInfo`
        :return: The device information which will be filled in
                                     by this method once it returns successfully.
        """
        return _pjsua2.AudDevManager_getDevInfo(self, id)

    def lookupDev(self, drv_name, dev_name):
        r"""
        Lookup device index based on the driver and device name.

        :type drv_name: string
        :param drv_name:          The driver name.
        :type dev_name: string
        :param dev_name:          The device name.

        :rtype: int
        :return: The device ID. If the device is not found,
                                     Error will be thrown.
        """
        return _pjsua2.AudDevManager_lookupDev(self, drv_name, dev_name)

    def capName(self, cap):
        r"""
        Get string info for the specified capability.

        :type cap: int
        :param cap:               The capability ID.

        :rtype: string
        :return: Capability name.
        """
        return _pjsua2.AudDevManager_capName(self, cap)

    def setExtFormat(self, format, keep=True):
        r"""
        This will configure audio format capability (other than PCM) to the
        sound device being used. If sound device is currently active, the method
        will forward the setting to the sound device instance to be applied
        immediately, if it supports it.

        This method is only valid if the device has
        PJMEDIA_AUD_DEV_CAP_EXT_FORMAT capability in AudioDevInfo.caps flags,
        otherwise Error will be thrown.

        Note that in case the setting is kept for future use, it will be applied
        to any devices, even when application has changed the sound device to be
        used.

        :type format: :py:class:`MediaFormatAudio`
        :param format:            The audio format.
        :type keep: boolean, optional
        :param keep:              Specify whether the setting is to be kept for
                                     future use.
        """
        return _pjsua2.AudDevManager_setExtFormat(self, format, keep)

    def getExtFormat(self):
        r"""
        Get the audio format capability (other than PCM) of the sound device
        being used. If sound device is currently active, the method will forward
        the request to the sound device. If sound device is currently inactive,
        and if application had previously set the setting and mark the setting
        as kept, then that setting will be returned. Otherwise, this method
        will raise error.

        This method is only valid if the device has
        PJMEDIA_AUD_DEV_CAP_EXT_FORMAT capability in AudioDevInfo.caps flags,
        otherwise Error will be thrown.

        :rtype: :py:class:`MediaFormatAudio`
        :return: The audio format.
        """
        return _pjsua2.AudDevManager_getExtFormat(self)

    def setInputLatency(self, latency_msec, keep=True):
        r"""
        This will configure audio input latency control or query capability to
        the sound device being used. If sound device is currently active,
        the method will forward the setting to the sound device instance to be
        applied immediately, if it supports it.

        This method is only valid if the device has
        PJMEDIA_AUD_DEV_CAP_INPUT_LATENCY capability in AudioDevInfo.caps flags,
        otherwise Error will be thrown.

        Note that in case the setting is kept for future use, it will be applied
        to any devices, even when application has changed the sound device to be
        used.

        :type latency_msec: int
        :param latency_msec:      The input latency.
        :type keep: boolean, optional
        :param keep:              Specify whether the setting is to be kept
                                     for future use.
        """
        return _pjsua2.AudDevManager_setInputLatency(self, latency_msec, keep)

    def getInputLatency(self):
        r"""
        Get the audio input latency control or query capability of the sound
        device being used. If sound device is currently active, the method will
        forward the request to the sound device. If sound device is currently
        inactive, and if application had previously set the setting and mark the
        setting as kept, then that setting will be returned. Otherwise, this
        method will raise error.

        This method is only valid if the device has
        PJMEDIA_AUD_DEV_CAP_INPUT_LATENCY capability in AudioDevInfo.caps flags,
        otherwise Error will be thrown.

        :rtype: int
        :return: The audio input latency.
        """
        return _pjsua2.AudDevManager_getInputLatency(self)

    def setOutputLatency(self, latency_msec, keep=True):
        r"""
        This will configure audio output latency control or query capability to
        the sound device being used. If sound device is currently active,
        the method will forward the setting to the sound device instance to be
        applied immediately, if it supports it.

        This method is only valid if the device has
        PJMEDIA_AUD_DEV_CAP_OUTPUT_LATENCY capability in AudioDevInfo.caps flags,
        otherwise Error will be thrown.

        Note that in case the setting is kept for future use, it will be applied
        to any devices, even when application has changed the sound device to be
        used.

        :type latency_msec: int
        :param latency_msec:      The output latency.
        :type keep: boolean, optional
        :param keep:              Specify whether the setting is to be kept
                                     for future use.
        """
        return _pjsua2.AudDevManager_setOutputLatency(self, latency_msec, keep)

    def getOutputLatency(self):
        r"""
        Get the audio output latency control or query capability of the sound
        device being used. If sound device is currently active, the method will
        forward the request to the sound device. If sound device is currently
        inactive, and if application had previously set the setting and mark the
        setting as kept, then that setting will be returned. Otherwise, this
        method will raise error.

        This method is only valid if the device has
        PJMEDIA_AUD_DEV_CAP_OUTPUT_LATENCY capability in AudioDevInfo.caps flags,
        otherwise Error will be thrown.

        :rtype: int
        :return: The audio output latency.
        """
        return _pjsua2.AudDevManager_getOutputLatency(self)

    def setInputVolume(self, volume, keep=True):
        r"""
        This will configure audio input volume level capability to the
        sound device being used.
        If sound device is currently active, the method will forward the
        setting to the sound device instance to be applied immediately,
        if it supports it.

        This method is only valid if the device has
        PJMEDIA_AUD_DEV_CAP_INPUT_VOLUME_SETTING capability in AudioDevInfo.caps
        flags, otherwise Error will be thrown.

        Note that in case the setting is kept for future use, it will be applied
        to any devices, even when application has changed the sound device to be
        used.

        :type volume: int
        :param volume:            The input volume level, in percent.
        :type keep: boolean, optional
        :param keep:              Specify whether the setting is to be kept for
                                     future use.
        """
        return _pjsua2.AudDevManager_setInputVolume(self, volume, keep)

    def getInputVolume(self):
        r"""
        Get the audio input volume level capability of the sound device being
        used. If sound device is currently active, the method will forward the
        request to the sound device. If sound device is currently inactive,
        and if application had previously set the setting and mark the setting
        as kept, then that setting will be returned. Otherwise, this method
        will raise error.

        This method is only valid if the device has
        PJMEDIA_AUD_DEV_CAP_INPUT_VOLUME_SETTING capability in AudioDevInfo.caps
        flags, otherwise Error will be thrown.     *

        :rtype: int
        :return: The audio input volume level, in percent.
        """
        return _pjsua2.AudDevManager_getInputVolume(self)

    def setOutputVolume(self, volume, keep=True):
        r"""
        This will configure audio output volume level capability to the sound
        device being used. If sound device is currently active, the method will
        forward the setting to the sound device instance to be applied
        immediately, if it supports it.

        This method is only valid if the device has
        PJMEDIA_AUD_DEV_CAP_OUTPUT_VOLUME_SETTING capability in AudioDevInfo.caps
        flags, otherwise Error will be thrown.

        Note that in case the setting is kept for future use, it will be applied
        to any devices, even when application has changed the sound device to be
        used.

        :type volume: int
        :param volume:            The output volume level, in percent.
        :type keep: boolean, optional
        :param keep:              Specify whether the setting is to be kept
                                     for future use.
        """
        return _pjsua2.AudDevManager_setOutputVolume(self, volume, keep)

    def getOutputVolume(self):
        r"""
        Get the audio output volume level capability of the sound device being
        used. If sound device is currently active, the method will forward the
        request to the sound device. If sound device is currently inactive,
        and if application had previously set the setting and mark the setting
        as kept, then that setting will be returned. Otherwise, this method
        will raise error.

        This method is only valid if the device has
        PJMEDIA_AUD_DEV_CAP_OUTPUT_VOLUME_SETTING capability in AudioDevInfo.caps
        flags, otherwise Error will be thrown.

        :rtype: int
        :return: The audio output volume level, in percent.
        """
        return _pjsua2.AudDevManager_getOutputVolume(self)

    def getInputSignal(self):
        r"""
        Get the audio input signal level capability of the sound device being
        used. If sound device is currently active, the method will forward the
        request to the sound device. If sound device is currently inactive,
        and if application had previously set the setting and mark the setting
        as kept, then that setting will be returned. Otherwise, this method
        will raise error.

        This method is only valid if the device has
        PJMEDIA_AUD_DEV_CAP_INPUT_SIGNAL_METER capability in AudioDevInfo.caps
        flags, otherwise Error will be thrown.

        :rtype: int
        :return: The audio input signal level, in percent.
        """
        return _pjsua2.AudDevManager_getInputSignal(self)

    def getOutputSignal(self):
        r"""
        Get the audio output signal level capability of the sound device being
        used. If sound device is currently active, the method will forward the
        request to the sound device. If sound device is currently inactive,
        and if application had previously set the setting and mark the setting
        as kept, then that setting will be returned. Otherwise, this method
        will raise error.

        This method is only valid if the device has
        PJMEDIA_AUD_DEV_CAP_OUTPUT_SIGNAL_METER capability in AudioDevInfo.caps
        flags, otherwise Error will be thrown.

        :rtype: int
        :return: The audio output signal level, in percent.
        """
        return _pjsua2.AudDevManager_getOutputSignal(self)

    def setInputRoute(self, route, keep=True):
        r"""
        This will configure audio input route capability to the sound device
        being used. If sound device is currently active, the method will
        forward the setting to the sound device instance to be applied
        immediately, if it supports it.

        This method is only valid if the device has
        PJMEDIA_AUD_DEV_CAP_INPUT_ROUTE capability in AudioDevInfo.caps
        flags, otherwise Error will be thrown.

        Note that in case the setting is kept for future use, it will be applied
        to any devices, even when application has changed the sound device to be
        used.

        :type route: int
        :param route:             The audio input route.
        :type keep: boolean, optional
        :param keep:              Specify whether the setting is to be kept
                                     for future use.
        """
        return _pjsua2.AudDevManager_setInputRoute(self, route, keep)

    def getInputRoute(self):
        r"""
        Get the audio input route capability of the sound device being used.
        If sound device is currently active, the method will forward the
        request to the sound device. If sound device is currently inactive,
        and if application had previously set the setting and mark the setting
        as kept, then that setting will be returned. Otherwise, this method
        will raise error.

        This method is only valid if the device has
        PJMEDIA_AUD_DEV_CAP_INPUT_ROUTE capability in AudioDevInfo.caps
        flags, otherwise Error will be thrown.

        :rtype: int
        :return: The audio input route.
        """
        return _pjsua2.AudDevManager_getInputRoute(self)

    def setOutputRoute(self, route, keep=True):
        r"""
        This will configure audio output route capability to the sound device
        being used. If sound device is currently active, the method will
        forward the setting to the sound device instance to be applied
        immediately, if it supports it.

        This method is only valid if the device has
        PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE capability in AudioDevInfo.caps
        flags, otherwise Error will be thrown.

        Note that in case the setting is kept for future use, it will be applied
        to any devices, even when application has changed the sound device to be
        used.

        :type route: int
        :param route:             The audio output route.
        :type keep: boolean, optional
        :param keep:              Specify whether the setting is to be kept
                                     for future use.
        """
        return _pjsua2.AudDevManager_setOutputRoute(self, route, keep)

    def getOutputRoute(self):
        r"""
        Get the audio output route capability of the sound device being used.
        If sound device is currently active, the method will forward the
        request to the sound device. If sound device is currently inactive,
        and if application had previously set the setting and mark the setting
        as kept, then that setting will be returned. Otherwise, this method
        will raise error.

        This method is only valid if the device has
        PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE capability in AudioDevInfo.caps
        flags, otherwise Error will be thrown.

        :rtype: int
        :return: The audio output route.
        """
        return _pjsua2.AudDevManager_getOutputRoute(self)

    def setVad(self, enable, keep=True):
        r"""
        This will configure audio voice activity detection capability to
        the sound device being used. If sound device is currently active,
        the method will forward the setting to the sound device instance
        to be applied immediately, if it supports it.

        This method is only valid if the device has PJMEDIA_AUD_DEV_CAP_VAD
        capability in AudioDevInfo.caps flags, otherwise Error will be thrown.

        Note that in case the setting is kept for future use, it will be applied
        to any devices, even when application has changed the sound device to be
        used.

        :type enable: boolean
        :param enable:            Enable/disable voice activity detection
                                     feature. Set true to enable.
        :type keep: boolean, optional
        :param keep:              Specify whether the setting is to be kept for
                                     future use.
        """
        return _pjsua2.AudDevManager_setVad(self, enable, keep)

    def getVad(self):
        r"""
        Get the audio voice activity detection capability of the sound device
        being used. If sound device is currently active, the method will
        forward the request to the sound device. If sound device is currently
        inactive, and if application had previously set the setting and mark
        the setting as kept, then that setting will be returned. Otherwise,
        this method will raise error.

        This method is only valid if the device has PJMEDIA_AUD_DEV_CAP_VAD
        capability in AudioDevInfo.caps flags, otherwise Error will be thrown.

        :rtype: boolean
        :return: The audio voice activity detection feature.
        """
        return _pjsua2.AudDevManager_getVad(self)

    def setCng(self, enable, keep=True):
        r"""
        This will configure audio comfort noise generation capability to
        the sound device being used. If sound device is currently active,
        the method will forward the setting to the sound device instance
        to be applied immediately, if it supports it.

        This method is only valid if the device has PJMEDIA_AUD_DEV_CAP_CNG
        capability in AudioDevInfo.caps flags, otherwise Error will be thrown.

        Note that in case the setting is kept for future use, it will be applied
        to any devices, even when application has changed the sound device to be
        used.

        :type enable: boolean
        :param enable:            Enable/disable comfort noise generation
                                     feature. Set true to enable.
        :type keep: boolean, optional
        :param keep:              Specify whether the setting is to be kept for
                                     future use.
        """
        return _pjsua2.AudDevManager_setCng(self, enable, keep)

    def getCng(self):
        r"""
        Get the audio comfort noise generation capability of the sound device
        being used. If sound device is currently active, the method will
        forward the request to the sound device. If sound device is currently
        inactive, and if application had previously set the setting and mark
        the setting as kept, then that setting will be returned. Otherwise,
        this method will raise error.

        This method is only valid if the device has PJMEDIA_AUD_DEV_CAP_CNG
        capability in AudioDevInfo.caps flags, otherwise Error will be thrown.

        :rtype: boolean
        :return: The audio comfort noise generation feature.
        """
        return _pjsua2.AudDevManager_getCng(self)

    def setPlc(self, enable, keep=True):
        r"""
        This will configure audio packet loss concealment capability to
        the sound device being used. If sound device is currently active,
        the method will forward the setting to the sound device instance
        to be applied immediately, if it supports it.

        This method is only valid if the device has PJMEDIA_AUD_DEV_CAP_PLC
        capability in AudioDevInfo.caps flags, otherwise Error will be thrown.

        Note that in case the setting is kept for future use, it will be applied
        to any devices, even when application has changed the sound device to be
        used.

        :type enable: boolean
        :param enable:            Enable/disable packet loss concealment
                                     feature. Set true to enable.
        :type keep: boolean, optional
        :param keep:              Specify whether the setting is to be kept for
                                     future use.
        """
        return _pjsua2.AudDevManager_setPlc(self, enable, keep)

    def getPlc(self):
        r"""
        Get the audio packet loss concealment capability of the sound device
        being used. If sound device is currently active, the method will
        forward the request to the sound device. If sound device is currently
        inactive, and if application had previously set the setting and mark
        the setting as kept, then that setting will be returned. Otherwise,
        this method will raise error.

        This method is only valid if the device has PJMEDIA_AUD_DEV_CAP_PLC
        capability in AudioDevInfo.caps flags, otherwise Error will be thrown.

        :rtype: boolean
        :return: The audio packet loss concealment feature.
        """
        return _pjsua2.AudDevManager_getPlc(self)

# Register AudDevManager in _pjsua2:
_pjsua2.AudDevManager_swigregister(AudDevManager)
class ExtraAudioDevice(AudioMedia):
    r"""
    Extra audio device. This class allows application to have multiple
    sound device instances active concurrently.

    Application may also use this class to improve media clock. Normally
    media clock is driven by sound device in master port, but unfortunately
    some sound devices may produce jittery clock. To improve media clock,
    application can install Null Sound Device (i.e: using
    AudDevManager::setNullDev()), which will act as a master port, and
    install the sound device as extra sound device.

    Note that extra sound device will not have auto-close upon idle feature.
    Also note that the extra sound device only supports mono channel.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def __init__(self, playdev, recdev):
        r"""
        Constructor.

        :type playdev: int
        :param playdev:           Playback device ID.
        :type recdev: int
        :param recdev:            Record device ID.
        """
        _pjsua2.ExtraAudioDevice_swiginit(self, _pjsua2.new_ExtraAudioDevice(playdev, recdev))
    __swig_destroy__ = _pjsua2.delete_ExtraAudioDevice

    def open(self):
        r"""
        Open the audio device using format (e.g.: clock rate, bit per sample,
        samples per frame) matched to the conference bridge's format, except
        the channel count, which will be set to one (mono channel). This will
        also register the audio device port to conference bridge.
        """
        return _pjsua2.ExtraAudioDevice_open(self)

    def close(self):
        r"""
        Close the audio device and unregister the audio device port from the
        conference bridge.
        """
        return _pjsua2.ExtraAudioDevice_close(self)

    def isOpened(self):
        r"""
        Is the extra audio device opened?

        :rtype: boolean
        :return: 'true' if it is opened.
        """
        return _pjsua2.ExtraAudioDevice_isOpened(self)

# Register ExtraAudioDevice in _pjsua2:
_pjsua2.ExtraAudioDevice_swigregister(ExtraAudioDevice)
class MediaCoordinate(object):
    r"""Representation of media coordinate."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    x = property(_pjsua2.MediaCoordinate_x_get, _pjsua2.MediaCoordinate_x_set, doc=r"""X position of the coordinate""")
    y = property(_pjsua2.MediaCoordinate_y_get, _pjsua2.MediaCoordinate_y_set, doc=r"""Y position of the coordinate""")

    def __init__(self):
        _pjsua2.MediaCoordinate_swiginit(self, _pjsua2.new_MediaCoordinate())
    __swig_destroy__ = _pjsua2.delete_MediaCoordinate

# Register MediaCoordinate in _pjsua2:
_pjsua2.MediaCoordinate_swigregister(MediaCoordinate)
class MediaSize(object):
    r"""Representation of media size."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    w = property(_pjsua2.MediaSize_w_get, _pjsua2.MediaSize_w_set, doc=r"""The width.""")
    h = property(_pjsua2.MediaSize_h_get, _pjsua2.MediaSize_h_set, doc=r"""The height.""")

    def __init__(self):
        _pjsua2.MediaSize_swiginit(self, _pjsua2.new_MediaSize())
    __swig_destroy__ = _pjsua2.delete_MediaSize

# Register MediaSize in _pjsua2:
_pjsua2.MediaSize_swigregister(MediaSize)
class VidConfPortInfo(object):
    r"""
    This structure descibes information about a particular media port that
    has been registered into the conference bridge.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    portId = property(_pjsua2.VidConfPortInfo_portId_get, _pjsua2.VidConfPortInfo_portId_set, doc=r"""Conference port number.""")
    name = property(_pjsua2.VidConfPortInfo_name_get, _pjsua2.VidConfPortInfo_name_set, doc=r"""Port name.""")
    format = property(_pjsua2.VidConfPortInfo_format_get, _pjsua2.VidConfPortInfo_format_set, doc=r"""Media audio format information""")
    listeners = property(_pjsua2.VidConfPortInfo_listeners_get, _pjsua2.VidConfPortInfo_listeners_set, doc=r"""
    Array of listeners (in other words, ports where this port is
    transmitting to).
    """)
    transmitters = property(_pjsua2.VidConfPortInfo_transmitters_get, _pjsua2.VidConfPortInfo_transmitters_set, doc=r"""
    Array of listeners (in other words, ports where this port is
    listening to).
    """)

    def __init__(self):
        _pjsua2.VidConfPortInfo_swiginit(self, _pjsua2.new_VidConfPortInfo())
    __swig_destroy__ = _pjsua2.delete_VidConfPortInfo

# Register VidConfPortInfo in _pjsua2:
_pjsua2.VidConfPortInfo_swigregister(VidConfPortInfo)
class VideoMediaTransmitParam(object):
    r"""Parameters for VideoMedia::startTransmit() method."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def __init__(self):
        _pjsua2.VideoMediaTransmitParam_swiginit(self, _pjsua2.new_VideoMediaTransmitParam())
    __swig_destroy__ = _pjsua2.delete_VideoMediaTransmitParam

# Register VideoMediaTransmitParam in _pjsua2:
_pjsua2.VideoMediaTransmitParam_swigregister(VideoMediaTransmitParam)
class VideoMedia(Media):
    r"""Video Media."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def getPortInfo(self):
        r"""Get information about the specified conference port."""
        return _pjsua2.VideoMedia_getPortInfo(self)

    def getPortId(self):
        r"""Get port Id."""
        return _pjsua2.VideoMedia_getPortId(self)

    @staticmethod
    def getPortInfoFromId(port_id):
        r"""Get information from specific port id."""
        return _pjsua2.VideoMedia_getPortInfoFromId(port_id)

    def startTransmit(self, sink, param):
        r"""
        Establish unidirectional media flow to sink. This media port
        will act as a source, and it may transmit to multiple destinations/sink.
        And if multiple sources are transmitting to the same sink, the media
        will be mixed together. Source and sink may refer to the same Media,
        effectively looping the media.

        If bidirectional media flow is desired, application needs to call
        this method twice, with the second one called from the opposite source
        media.

        This operation executes asynchronously, use the callback set from
        Endpoint::onVideoMediaOpCompleted() to receive notification upon
        completion.

        :type sink: :py:class:`VideoMedia`
        :param sink:              The destination Media.
        :type param: :py:class:`VideoMediaTransmitParam`
        :param param:             The parameter.
        """
        return _pjsua2.VideoMedia_startTransmit(self, sink, param)

    def stopTransmit(self, sink):
        r"""
         Stop media flow to destination/sink port.

        This operation executes asynchronously, use the callback set from
        Endpoint::onVideoMediaOpCompleted() to receive notification upon
        completion.

        :type sink: :py:class:`VideoMedia`
        :param sink:              The destination media.
        """
        return _pjsua2.VideoMedia_stopTransmit(self, sink)

    def update(self):
        r"""
        Update or refresh port states from video port info. Some port may
        change its port info in the middle of a session, for example when
        a video stream decoder learns that incoming video size or frame rate
        has changed, video conference needs to be informed to update its
        internal states.

        This operation executes asynchronously, use the callback set from
        Endpoint::onVideoMediaOpCompleted() to receive notification upon
        completion.
        """
        return _pjsua2.VideoMedia_update(self)

    def __init__(self):
        r"""
        Default Constructor.

        Normally application will not create VideoMedia object directly,
        but it instantiates a VideoMedia derived class. This is set as public
        because some STL vector implementations require it.
        """
        _pjsua2.VideoMedia_swiginit(self, _pjsua2.new_VideoMedia())
    __swig_destroy__ = _pjsua2.delete_VideoMedia

# Register VideoMedia in _pjsua2:
_pjsua2.VideoMedia_swigregister(VideoMedia)
class WindowHandle(object):
    r"""Window handle."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    window = property(_pjsua2.WindowHandle_window_get, _pjsua2.WindowHandle_window_set, doc=r"""Window""")
    display = property(_pjsua2.WindowHandle_display_get, _pjsua2.WindowHandle_display_set, doc=r"""Display""")

    def __init__(self):
        _pjsua2.WindowHandle_swiginit(self, _pjsua2.new_WindowHandle())
    __swig_destroy__ = _pjsua2.delete_WindowHandle

# Register WindowHandle in _pjsua2:
_pjsua2.WindowHandle_swigregister(WindowHandle)
class VideoWindowHandle(object):
    r"""Video window handle."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    type = property(_pjsua2.VideoWindowHandle_type_get, _pjsua2.VideoWindowHandle_type_set, doc=r"""The window handle type.""")
    handle = property(_pjsua2.VideoWindowHandle_handle_get, _pjsua2.VideoWindowHandle_handle_set, doc=r"""The window handle.""")

    def __init__(self):
        _pjsua2.VideoWindowHandle_swiginit(self, _pjsua2.new_VideoWindowHandle())
    __swig_destroy__ = _pjsua2.delete_VideoWindowHandle

# Register VideoWindowHandle in _pjsua2:
_pjsua2.VideoWindowHandle_swigregister(VideoWindowHandle)
class VideoWindowInfo(object):
    r"""This structure describes video window info."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    isNative = property(_pjsua2.VideoWindowInfo_isNative_get, _pjsua2.VideoWindowInfo_isNative_set, doc=r"""
    Flag to indicate whether this window is a native window,
    such as created by built-in preview device. If this field is
    true, only the video window handle field of this
    structure is valid.
    """)
    winHandle = property(_pjsua2.VideoWindowInfo_winHandle_get, _pjsua2.VideoWindowInfo_winHandle_set, doc=r"""Video window handle.""")
    renderDeviceId = property(_pjsua2.VideoWindowInfo_renderDeviceId_get, _pjsua2.VideoWindowInfo_renderDeviceId_set, doc=r"""Renderer device ID.""")
    show = property(_pjsua2.VideoWindowInfo_show_get, _pjsua2.VideoWindowInfo_show_set, doc=r"""Window show status. The window is hidden if false.""")
    pos = property(_pjsua2.VideoWindowInfo_pos_get, _pjsua2.VideoWindowInfo_pos_set, doc=r"""Window position.""")
    size = property(_pjsua2.VideoWindowInfo_size_get, _pjsua2.VideoWindowInfo_size_set, doc=r"""Window size.""")

    def __init__(self):
        _pjsua2.VideoWindowInfo_swiginit(self, _pjsua2.new_VideoWindowInfo())
    __swig_destroy__ = _pjsua2.delete_VideoWindowInfo

# Register VideoWindowInfo in _pjsua2:
_pjsua2.VideoWindowInfo_swigregister(VideoWindowInfo)
class VideoWindow(object):
    r"""Video window."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def __init__(self, win_id):
        r"""Constructor"""
        _pjsua2.VideoWindow_swiginit(self, _pjsua2.new_VideoWindow(win_id))

    def getInfo(self):
        r"""
        Get window info.

        :rtype: :py:class:`VideoWindowInfo`
        :return: video window info.
        """
        return _pjsua2.VideoWindow_getInfo(self)

    def getVideoMedia(self):
        r"""
        Get video media or conference bridge port of the renderer of
        this video window.

        :rtype: :py:class:`VideoMedia`
        :return: Video media of this renderer window.
        """
        return _pjsua2.VideoWindow_getVideoMedia(self)

    def Show(self, show):
        r"""
        Show or hide window. This operation is not valid for native windows
        (VideoWindowInfo.isNative=true), on which native windowing API
        must be used instead.

        :type show: boolean
        :param show:              Set to true to show the window, false to
                                     hide the window.
        """
        return _pjsua2.VideoWindow_Show(self, show)

    def setPos(self, pos):
        r"""
        Set video window position. This operation is not valid for native windows
        (VideoWindowInfo.isNative=true), on which native windowing API
        must be used instead.

        :type pos: :py:class:`MediaCoordinate`
        :param pos:               The window position.
        """
        return _pjsua2.VideoWindow_setPos(self, pos)

    def setSize(self, size):
        r"""
        Resize window. This operation is not valid for native windows
        (VideoWindowInfo.isNative=true), on which native windowing API
        must be used instead.

        :type size: :py:class:`MediaSize`
        :param size:              The new window size.
        """
        return _pjsua2.VideoWindow_setSize(self, size)

    def rotate(self, angle):
        r"""
        Rotate the video window. This function will change the video orientation
        and also possibly the video window size (width and height get swapped).
        This operation is not valid for native windows (VideoWindowInfo.isNative
        =true), on which native windowing API must be used instead.

        :type angle: int
        :param angle:             The rotation angle in degrees, must be
                                     multiple of 90.
                                     Specify positive value for clockwise rotation or
                                     negative value for counter-clockwise rotation.
        """
        return _pjsua2.VideoWindow_rotate(self, angle)

    def setWindow(self, win):
        r"""
        Set output window. This operation is valid only when the underlying
        video device supports PJMEDIA_VIDEO_DEV_CAP_OUTPUT_WINDOW capability AND
        allows the output window to be changed on-the-fly, otherwise Error will
        be thrown. Currently it is only supported on Android.

        :type win: :py:class:`VideoWindowHandle`
        :param win:               The new output window.
        """
        return _pjsua2.VideoWindow_setWindow(self, win)

    def setFullScreen(self, enabled):
        r"""
        Set video window full-screen. This operation is valid only when the
        underlying video device supports PJMEDIA_VID_DEV_CAP_OUTPUT_FULLSCREEN
        capability. Currently it is only supported on SDL backend.

        :type enabled: boolean
        :param enabled:           Set to true if full screen is desired, false
                                     otherwise.
        """
        return _pjsua2.VideoWindow_setFullScreen(self, enabled)

    def setFullScreen2(self, mode):
        r"""
        Set video window full-screen. This operation is valid only when the
        underlying video device supports PJMEDIA_VID_DEV_CAP_OUTPUT_FULLSCREEN
        capability. Currently it is only supported on SDL backend.

        :type mode: int
        :param mode:              Fullscreen mode, see
                                     pjmedia_vid_dev_fullscreen_flag.
        """
        return _pjsua2.VideoWindow_setFullScreen2(self, mode)
    __swig_destroy__ = _pjsua2.delete_VideoWindow

# Register VideoWindow in _pjsua2:
_pjsua2.VideoWindow_swigregister(VideoWindow)
class VideoPreviewOpParam(object):
    r"""This structure contains parameters for VideoPreview::start()"""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    rendId = property(_pjsua2.VideoPreviewOpParam_rendId_get, _pjsua2.VideoPreviewOpParam_rendId_set, doc=r"""
    Device ID for the video renderer to be used for rendering the
    capture stream for preview. This parameter is ignored if native
    preview is being used.

    Default: PJMEDIA_VID_DEFAULT_RENDER_DEV
    """)
    show = property(_pjsua2.VideoPreviewOpParam_show_get, _pjsua2.VideoPreviewOpParam_show_set, doc=r"""
    Show window initially.

    Default: PJ_TRUE.
    """)
    windowFlags = property(_pjsua2.VideoPreviewOpParam_windowFlags_get, _pjsua2.VideoPreviewOpParam_windowFlags_set, doc=r"""
    Window flags.  The value is a bitmask combination of
    *pjmedia_vid_dev_wnd_flag*.

    Default: 0.
    """)
    format = property(_pjsua2.VideoPreviewOpParam_format_get, _pjsua2.VideoPreviewOpParam_format_set, doc=r"""
    Media format video. By default, this parameter is uninitialized
    and will not be used.

    To initialize it, use MediaFormatVideo::init().
    If left uninitialized, the capture device will be opened using
    PJMEDIA wrapper default format, e.g:
    - Android : PJMEDIA_FORMAT_I420 using the first supported size and 15fps
    - iOS : PJMEDIA_FORMAT_BGRA using size 352x288 and 15fps
    Note that when the preview is already opened, this setting will be
    ignored.
    """)
    window = property(_pjsua2.VideoPreviewOpParam_window_get, _pjsua2.VideoPreviewOpParam_window_set, doc=r"""
    Optional output window to be used to display the video preview.
    This parameter will only be used if the video device supports
    PJMEDIA_VID_DEV_CAP_OUTPUT_WINDOW capability and the capability
    is not read-only.
    """)

    def __init__(self):
        r"""Default constructor initializes with default values."""
        _pjsua2.VideoPreviewOpParam_swiginit(self, _pjsua2.new_VideoPreviewOpParam())
    __swig_destroy__ = _pjsua2.delete_VideoPreviewOpParam

# Register VideoPreviewOpParam in _pjsua2:
_pjsua2.VideoPreviewOpParam_swigregister(VideoPreviewOpParam)
class VideoPreview(object):
    r"""Video Preview"""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def __init__(self, dev_id):
        r"""Constructor"""
        _pjsua2.VideoPreview_swiginit(self, _pjsua2.new_VideoPreview(dev_id))

    def hasNative(self):
        r"""
        Determine if the specified video input device has built-in native
        preview capability. This is a convenience function that is equal to
        querying device's capability for PJMEDIA_VID_DEV_CAP_INPUT_PREVIEW
        capability.

        :rtype: boolean
        :return: true if it has.
        """
        return _pjsua2.VideoPreview_hasNative(self)

    def start(self, param):
        r"""
        Start video preview window for the specified capture device.

        :type param: :py:class:`VideoPreviewOpParam`
        :param param:     Video preview parameters.
        """
        return _pjsua2.VideoPreview_start(self, param)

    def stop(self):
        r"""Stop video preview."""
        return _pjsua2.VideoPreview_stop(self)

    def getVideoWindow(self):
        r"""Get the preview window handle associated with the capture device,if any."""
        return _pjsua2.VideoPreview_getVideoWindow(self)

    def getVideoMedia(self):
        r"""
        Get video media or conference bridge port of the video capture device.

        :rtype: :py:class:`VideoMedia`
        :return: Video media of the video capture device.
        """
        return _pjsua2.VideoPreview_getVideoMedia(self)
    __swig_destroy__ = _pjsua2.delete_VideoPreview

# Register VideoPreview in _pjsua2:
_pjsua2.VideoPreview_swigregister(VideoPreview)
class VideoDevInfo(object):
    r"""Video device information structure."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    id = property(_pjsua2.VideoDevInfo_id_get, _pjsua2.VideoDevInfo_id_set, doc=r"""The device ID""")
    name = property(_pjsua2.VideoDevInfo_name_get, _pjsua2.VideoDevInfo_name_set, doc=r"""The device name""")
    driver = property(_pjsua2.VideoDevInfo_driver_get, _pjsua2.VideoDevInfo_driver_set, doc=r"""The underlying driver name""")
    dir = property(_pjsua2.VideoDevInfo_dir_get, _pjsua2.VideoDevInfo_dir_set, doc=r"""
    The supported direction of the video device, i.e. whether it supports
    capture only, render only, or both.
    """)
    caps = property(_pjsua2.VideoDevInfo_caps_get, _pjsua2.VideoDevInfo_caps_set, doc=r"""Device capabilities, as bitmask combination of #pjmedia_vid_dev_cap""")
    fmt = property(_pjsua2.VideoDevInfo_fmt_get, _pjsua2.VideoDevInfo_fmt_set, doc=r"""
    Array of supported video formats. Some fields in each supported video
    format may be set to zero or of "unknown" value, to indicate that the
    value is unknown or should be ignored. When these value are not set
    to zero, it indicates that the exact format combination is being used.
    """)

    def __init__(self):
        r"""Default constructor"""
        _pjsua2.VideoDevInfo_swiginit(self, _pjsua2.new_VideoDevInfo())
    __swig_destroy__ = _pjsua2.delete_VideoDevInfo

# Register VideoDevInfo in _pjsua2:
_pjsua2.VideoDevInfo_swigregister(VideoDevInfo)
class VideoSwitchParam(object):
    r"""Parameter for switching device with PJMEDIA_VID_DEV_CAP_SWITCH capability."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    target_id = property(_pjsua2.VideoSwitchParam_target_id_get, _pjsua2.VideoSwitchParam_target_id_set, doc=r"""
    Target device ID to switch to. Once the switching is successful, the
    video stream will use this device and the old device will be closed.
    """)

    def __init__(self):
        _pjsua2.VideoSwitchParam_swiginit(self, _pjsua2.new_VideoSwitchParam())
    __swig_destroy__ = _pjsua2.delete_VideoSwitchParam

# Register VideoSwitchParam in _pjsua2:
_pjsua2.VideoSwitchParam_swigregister(VideoSwitchParam)
class VidDevManager(object):
    r"""Video device manager."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")

    def __init__(self, *args, **kwargs):
        raise AttributeError("No constructor defined")
    __repr__ = _swig_repr

    def initSubsys(self):
        r"""
        Initialize the video device subsystem. This will register all supported
        video device factories to the video device subsystem.

        By default, library will initialize video device subsystem automatically
        on library initialization, so application will never need to invoke this
        function. However, when PJSUA_DONT_INIT_VID_DEV_SUBSYS is set to
        non-zero, application should invoke this function before accessing
        video device.
        """
        return _pjsua2.VidDevManager_initSubsys(self)

    def refreshDevs(self):
        r"""
        Refresh the list of video devices installed in the system. This function
        will only refresh the list of video device so all active video streams
        will be unaffected. After refreshing the device list, application MUST
        make sure to update all index references to video devices (i.e. all
        variables of type pjmedia_vid_dev_index) before calling any function
        that accepts video device index as its parameter.
        """
        return _pjsua2.VidDevManager_refreshDevs(self)

    def getDevCount(self):
        r"""
        Get the number of video devices installed in the system.

        :rtype: int
        :return: The number of devices.
        """
        return _pjsua2.VidDevManager_getDevCount(self)

    def getDevInfo(self, dev_id):
        r"""
        Retrieve the video device info for the specified device index.

        :type dev_id: int
        :param dev_id:    The video device id

        :rtype: :py:class:`VideoDevInfo`
        :return: The list of video device info
        """
        return _pjsua2.VidDevManager_getDevInfo(self, dev_id)

    def enumDev2(self):
        r"""
        Enum all video devices installed in the system.

        :rtype: :py:class:`VideoDevInfoVector2`
        :return: The list of video device info
        """
        return _pjsua2.VidDevManager_enumDev2(self)

    def lookupDev(self, drv_name, dev_name):
        r"""
        Lookup device index based on the driver and device name.

        :type drv_name: string
        :param drv_name:  The driver name.
        :type dev_name: string
        :param dev_name:  The device name.

        :rtype: int
        :return: The device ID. If the device is not found,
                             Error will be thrown.
        """
        return _pjsua2.VidDevManager_lookupDev(self, drv_name, dev_name)

    def capName(self, cap):
        r"""
        Get string info for the specified capability.

        :type cap: int
        :param cap:       The capability ID.

        :rtype: string
        :return: Capability name.
        """
        return _pjsua2.VidDevManager_capName(self, cap)

    def setFormat(self, dev_id, format, keep):
        r"""
        This will configure video format capability to the video device.
        If video device is currently active, the method will forward the setting
        to the video device instance to be applied immediately, if it
        supports it.

        This method is only valid if the device has
        PJMEDIA_VID_DEV_CAP_FORMAT capability in VideoDevInfo.caps flags,
        otherwise Error will be thrown.

        Note that in case the setting is kept for future use, it will be applied
        to any devices, even when application has changed the video device to be
        used.

        :type dev_id: int
        :param dev_id:    The video device id.
        :type format: :py:class:`MediaFormatVideo`
        :param format:    The video format.
        :type keep: boolean
        :param keep:      Specify whether the setting is to be kept for
                             future use.
        """
        return _pjsua2.VidDevManager_setFormat(self, dev_id, format, keep)

    def getFormat(self, dev_id):
        r"""
        Get the video format capability to the video device.
        If video device is currently active, the method will forward the request
        to the video device. If video device is currently inactive, and if
        application had previously set the setting and mark the setting as kept,
        then that setting will be returned. Otherwise, this method will
        raise error.

        This method is only valid if the device has
        PJMEDIA_VID_DEV_CAP_FORMAT capability in VideoDevInfo.caps flags,
        otherwise Error will be thrown.

        :type dev_id: int
        :param dev_id:    The video device id.
        :rtype: :py:class:`MediaFormatVideo`
        :return: keep     The video format.
        """
        return _pjsua2.VidDevManager_getFormat(self, dev_id)

    def setInputScale(self, dev_id, scale, keep):
        r"""
        This will configure video format capability to the video device.
        If video device is currently active, the method will forward the setting
        to the video device instance to be applied immediately, if it
        supports it.

        This method is only valid if the device has
        PJMEDIA_VID_DEV_CAP_INPUT_SCALE capability in VideoDevInfo.caps flags,
        otherwise Error will be thrown.

        Note that in case the setting is kept for future use, it will be applied
        to any devices, even when application has changed the video device to be
        used.

        :type dev_id: int
        :param dev_id:    The video device id.
        :type scale: :py:class:`MediaSize`
        :param scale:     The video scale.
        :type keep: boolean
        :param keep:      Specify whether the setting is to be kept for
                             future use.
        """
        return _pjsua2.VidDevManager_setInputScale(self, dev_id, scale, keep)

    def getInputScale(self, dev_id):
        r"""
        Get the video input scale capability to the video device.
        If video device is currently active, the method will forward the request
        to the video device. If video device is currently inactive, and if
        application had previously set the setting and mark the setting as kept,
        then that setting will be returned. Otherwise, this method will
        raise error.

        This method is only valid if the device has
        PJMEDIA_VID_DEV_CAP_FORMAT capability in VideoDevInfo.caps flags,
        otherwise Error will be thrown.

        :type dev_id: int
        :param dev_id:    The video device id.
        :rtype: :py:class:`MediaSize`
        :return: keep     The video format.
        """
        return _pjsua2.VidDevManager_getInputScale(self, dev_id)

    def setOutputWindowFlags(self, dev_id, flags, keep):
        r"""
        This will configure fast switching to another video device.
        If video device is currently active, the method will forward the setting
        to the video device instance to be applied immediately, if it
        supports it.

        This method is only valid if the device has
        PJMEDIA_VID_DEV_CAP_OUTPUT_WINDOW_FLAGS capability in VideoDevInfo.caps
        flags, otherwise Error will be thrown.

        Note that in case the setting is kept for future use, it will be applied
        to any devices, even when application has changed the video device to be
        used.

        :type dev_id: int
        :param dev_id:    The video device id.
        :type flags: int
        :param flags:     The video window flag.
        :type keep: boolean
        :param keep:      Specify whether the setting is to be kept for
                             future use.
        """
        return _pjsua2.VidDevManager_setOutputWindowFlags(self, dev_id, flags, keep)

    def getOutputWindowFlags(self, dev_id):
        r"""
        Get the window output flags capability to the video device.
        If video device is currently active, the method will forward the request
        to the video device. If video device is currently inactive, and if
        application had previously set the setting and mark the setting as kept,
        then that setting will be returned. Otherwise, this method will
        raise error.

        This method is only valid if the device has
        PJMEDIA_VID_DEV_CAP_OUTPUT_WINDOW_FLAGS capability in VideoDevInfo.caps
        flags, otherwise Error will be thrown.

        :type dev_id: int
        :param dev_id:    The video device id.
        :rtype: int
        :return: keep     The video format.
        """
        return _pjsua2.VidDevManager_getOutputWindowFlags(self, dev_id)

    def switchDev(self, dev_id, param):
        r"""
        This will configure fast switching to another video device.
        If video device is currently active, the method will forward the setting
        to the video device instance to be applied immediately, if it
        supports it.

        This method is only valid if the device has
        PJMEDIA_VID_DEV_CAP_SWITCH capability in VideoDevInfo.caps flags,
        otherwise Error will be thrown.

        :type dev_id: int
        :param dev_id:    The video device id.
        :type param: :py:class:`VideoSwitchParam`
        :param param:     The video switch param.
        """
        return _pjsua2.VidDevManager_switchDev(self, dev_id, param)

    def isCaptureActive(self, dev_id):
        r"""
        Check whether the video capture device is currently active, i.e. if
        a video preview has been started or there is a video call using
        the device.

        :type dev_id: int
        :param dev_id:    The video device id

        :rtype: boolean
        :return: True if it's active.
        """
        return _pjsua2.VidDevManager_isCaptureActive(self, dev_id)

    def setCaptureOrient(self, dev_id, orient, keep=True):
        r"""
        This will configure video orientation of the video capture device.
        If the device is currently active (i.e. if there is a video call
        using the device or a video preview has been started), the method
        will forward the setting to the video device instance to be applied
        immediately, if it supports it.

        The setting will be saved for future opening of the video device,
        if the "keep" argument is set to true. If the video device is
        currently inactive, and the "keep" argument is false, this method
        will throw Error.

        :type dev_id: int
        :param dev_id:    The video device id
        :type orient: int
        :param orient:    The video orientation.
        :type keep: boolean, optional
        :param keep:      Specify whether the setting is to be kept for
                             future use.
        """
        return _pjsua2.VidDevManager_setCaptureOrient(self, dev_id, orient, keep)

# Register VidDevManager in _pjsua2:
_pjsua2.VidDevManager_swigregister(VidDevManager)
class VideoPlayer(object):
    r"""Video AVI Player."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def __init__(self):
        r"""Constructor."""
        _pjsua2.VideoPlayer_swiginit(self, _pjsua2.new_VideoPlayer())

    def createVideoPlayer(self, file_name):
        r"""
        Create an avi file player, and automatically add this player to
        the audio/video conference bridge. The player will create a virtual
        video device and audio/video media port based on the streams contained
        in the file.
        The maximum number of stream is limited to PJSUA_MAX_AVI_NUM_STREAMS
        and the video stream is limited to one stream.

        :param filename:      The filename to be played. Currently only
                                 AVI files are supported. The video stream is using
                                 YUY2/I420/RGB24 format and the audio stream is using
                                 16bit PCM format.
                                 Filename's length must be smaller than PJ_MAXPATH.
        """
        return _pjsua2.VideoPlayer_createVideoPlayer(self, file_name)

    def mediaEnumPorts(self):
        r"""
        Enumerate all audio media port.

        :rtype: :py:class:`AudioMediaVector2`
        :return: The list of audio media port.
        """
        return _pjsua2.VideoPlayer_mediaEnumPorts(self)

    def mediaEnumVidPorts(self):
        r"""
        Enumerate all video media port.

        :rtype: :py:class:`VideoMediaVector`
        :return: The list of video media port.
        """
        return _pjsua2.VideoPlayer_mediaEnumVidPorts(self)

    def getVideoDevId(self):
        r"""
        Get the video device index of the avi player. Application can use this
        index as the video source/capture device.

        :rtype: int
        :return: The video device index.
        """
        return _pjsua2.VideoPlayer_getVideoDevId(self)
    __swig_destroy__ = _pjsua2.delete_VideoPlayer

# Register VideoPlayer in _pjsua2:
_pjsua2.VideoPlayer_swigregister(VideoPlayer)
class VideoRecorder(object):
    r"""Video AVI Recorder."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def __init__(self):
        r"""Constructor."""
        if self.__class__ == VideoRecorder:
            _self = None
        else:
            _self = self
        _pjsua2.VideoRecorder_swiginit(self, _pjsua2.new_VideoRecorder(_self, ))

    def createVideoRecorder(self, file_name, max_size=0, vid_fmt=None, aud_fmt=None, options=0):
        r"""
        Create an avi recorder and automatically add a audio/video port
        the audio/video conference bridge. User can connect the audio/video port
        from a source port to store the uncompressed video and 16 bit PCM audio.
        The recorder currently supports YUY2/I420/RGB24 video format and
        PCM audio format.

        Note: Uncompressed video can lead to significant file size growth.

        :param filename:      The filename to be played. Currently only
                                 AVI files are supported. Filename's length must be
                                 smaller than PJ_MAXPATH.
                                 Filename's length must be smaller than PJ_MAXPATH.
        :type max_size: int, optional
        :param max_size:      Maximum file size.
        :type vid_fmt: :py:class:`MediaFormatVideo`, optional
        :param vid_fmt:       The video format. If this is not set (NULL), the
                                        format will be set to:
                                        - format:PJMEDIA_FORMAT_I420
                                        - size:320x240
                                        - fps:15
        :type aud_fmt: :py:class:`MediaFormatAudio`, optional
        :param aud_fmt:       The audio format. If this is not set (NULL), the
                                        format will be set to:
                                        - format:PJMEDIA_FORMAT_PCM
                                        - bits_per_sample:16
                                        - clock rate/chan count/ptime:the conf bridge settings
        :type options: int, optional
        :param options:       Optional options.
        """
        return _pjsua2.VideoRecorder_createVideoRecorder(self, file_name, max_size, vid_fmt, aud_fmt, options)

    def getVideoMedia(self):
        r"""
        Enumerate video media port.

        :rtype: :py:class:`VideoMedia`
        :return: The list of audio media port.
        """
        return _pjsua2.VideoRecorder_getVideoMedia(self)

    def getAudioMedia(self):
        r"""
        Enumerate audio media port.

        :rtype: :py:class:`AudioMedia`
        :return: The list of video media port.
        """
        return _pjsua2.VideoRecorder_getAudioMedia(self)

    def onMaxSize(self):
        r"""
        Register a callback to be called when the file size has reached the
        max size.
        """
        return _pjsua2.VideoRecorder_onMaxSize(self)
    __swig_destroy__ = _pjsua2.delete_VideoRecorder
    def __disown__(self):
        self.this.disown()
        _pjsua2.disown_VideoRecorder(self)
        return weakref.proxy(self)

# Register VideoRecorder in _pjsua2:
_pjsua2.VideoRecorder_swigregister(VideoRecorder)
class CodecInfo(object):
    r"""This structure describes codec information."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    codecId = property(_pjsua2.CodecInfo_codecId_get, _pjsua2.CodecInfo_codecId_set, doc=r"""Codec unique identification.""")
    priority = property(_pjsua2.CodecInfo_priority_get, _pjsua2.CodecInfo_priority_set, doc=r"""Codec priority (integer 0-255).""")
    desc = property(_pjsua2.CodecInfo_desc_get, _pjsua2.CodecInfo_desc_set, doc=r"""Codec description.""")

    def __init__(self):
        _pjsua2.CodecInfo_swiginit(self, _pjsua2.new_CodecInfo())
    __swig_destroy__ = _pjsua2.delete_CodecInfo

# Register CodecInfo in _pjsua2:
_pjsua2.CodecInfo_swigregister(CodecInfo)
class CodecFmtp(object):
    r"""
    Structure of codec specific parameters which contains name=value pairs.
    The codec specific parameters are to be used with SDP according to
    the standards (e.g: RFC 3555) in SDP 'a=fmtp' attribute.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    name = property(_pjsua2.CodecFmtp_name_get, _pjsua2.CodecFmtp_name_set, doc=r"""name""")
    val = property(_pjsua2.CodecFmtp_val_get, _pjsua2.CodecFmtp_val_set, doc=r"""value""")

    def __init__(self):
        _pjsua2.CodecFmtp_swiginit(self, _pjsua2.new_CodecFmtp())
    __swig_destroy__ = _pjsua2.delete_CodecFmtp

# Register CodecFmtp in _pjsua2:
_pjsua2.CodecFmtp_swigregister(CodecFmtp)
class CodecParamInfo(object):
    r"""Audio codec parameters info."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    clockRate = property(_pjsua2.CodecParamInfo_clockRate_get, _pjsua2.CodecParamInfo_clockRate_set, doc=r"""Sampling rate in Hz""")
    channelCnt = property(_pjsua2.CodecParamInfo_channelCnt_get, _pjsua2.CodecParamInfo_channelCnt_set, doc=r"""Channel count.""")
    avgBps = property(_pjsua2.CodecParamInfo_avgBps_get, _pjsua2.CodecParamInfo_avgBps_set, doc=r"""Average bandwidth in bits/sec""")
    maxBps = property(_pjsua2.CodecParamInfo_maxBps_get, _pjsua2.CodecParamInfo_maxBps_set, doc=r"""Maximum bandwidth in bits/sec""")
    maxRxFrameSize = property(_pjsua2.CodecParamInfo_maxRxFrameSize_get, _pjsua2.CodecParamInfo_maxRxFrameSize_set, doc=r"""Maximum frame size""")
    frameLen = property(_pjsua2.CodecParamInfo_frameLen_get, _pjsua2.CodecParamInfo_frameLen_set, doc=r"""Decoder frame ptime in msec.""")
    frameLenDenum = property(_pjsua2.CodecParamInfo_frameLenDenum_get, _pjsua2.CodecParamInfo_frameLenDenum_set, doc=r"""
    Decoder frame ptime denum, or
                                                zero if ptime is integer.
    """)
    encFrameLen = property(_pjsua2.CodecParamInfo_encFrameLen_get, _pjsua2.CodecParamInfo_encFrameLen_set, doc=r"""
    Encoder ptime, or zero if it's
                                                equal to decoder ptime.
    """)
    encFrameLenDenum = property(_pjsua2.CodecParamInfo_encFrameLenDenum_get, _pjsua2.CodecParamInfo_encFrameLenDenum_set, doc=r"""
    Encoder ptime denum, or zero
                                                if ptime is integer.
    """)
    pcmBitsPerSample = property(_pjsua2.CodecParamInfo_pcmBitsPerSample_get, _pjsua2.CodecParamInfo_pcmBitsPerSample_set, doc=r"""Bits/sample in the PCM side""")
    pt = property(_pjsua2.CodecParamInfo_pt_get, _pjsua2.CodecParamInfo_pt_set, doc=r"""Payload type.""")
    fmtId = property(_pjsua2.CodecParamInfo_fmtId_get, _pjsua2.CodecParamInfo_fmtId_set, doc=r"""
    Source format, it's format of
                                                encoder input and decoder
                                                output.
    """)

    def __init__(self):
        r"""Default constructor"""
        _pjsua2.CodecParamInfo_swiginit(self, _pjsua2.new_CodecParamInfo())
    __swig_destroy__ = _pjsua2.delete_CodecParamInfo

# Register CodecParamInfo in _pjsua2:
_pjsua2.CodecParamInfo_swigregister(CodecParamInfo)
class CodecParamSetting(object):
    r"""Audio codec parameters setting."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    frmPerPkt = property(_pjsua2.CodecParamSetting_frmPerPkt_get, _pjsua2.CodecParamSetting_frmPerPkt_set, doc=r"""Number of frames per packet.""")
    vad = property(_pjsua2.CodecParamSetting_vad_get, _pjsua2.CodecParamSetting_vad_set, doc=r"""Voice Activity Detector.""")
    cng = property(_pjsua2.CodecParamSetting_cng_get, _pjsua2.CodecParamSetting_cng_set, doc=r"""Comfort Noise Generator.""")
    penh = property(_pjsua2.CodecParamSetting_penh_get, _pjsua2.CodecParamSetting_penh_set, doc=r"""Perceptual Enhancement""")
    plc = property(_pjsua2.CodecParamSetting_plc_get, _pjsua2.CodecParamSetting_plc_set, doc=r"""Packet loss concealment""")
    reserved = property(_pjsua2.CodecParamSetting_reserved_get, _pjsua2.CodecParamSetting_reserved_set, doc=r"""Reserved, must be zero.""")
    encFmtp = property(_pjsua2.CodecParamSetting_encFmtp_get, _pjsua2.CodecParamSetting_encFmtp_set, doc=r"""Encoder's fmtp params.""")
    decFmtp = property(_pjsua2.CodecParamSetting_decFmtp_get, _pjsua2.CodecParamSetting_decFmtp_set, doc=r"""Decoder's fmtp params.""")
    packetLoss = property(_pjsua2.CodecParamSetting_packetLoss_get, _pjsua2.CodecParamSetting_packetLoss_set, doc=r"""Encoder's expected pkt loss %.""")
    complexity = property(_pjsua2.CodecParamSetting_complexity_get, _pjsua2.CodecParamSetting_complexity_set, doc=r"""Encoder complexity, 0-10(max).""")
    cbr = property(_pjsua2.CodecParamSetting_cbr_get, _pjsua2.CodecParamSetting_cbr_set, doc=r"""Constant bit rate?""")

    def __init__(self):
        _pjsua2.CodecParamSetting_swiginit(self, _pjsua2.new_CodecParamSetting())
    __swig_destroy__ = _pjsua2.delete_CodecParamSetting

# Register CodecParamSetting in _pjsua2:
_pjsua2.CodecParamSetting_swigregister(CodecParamSetting)
class CodecParam(object):
    r"""
    Detailed codec attributes used in configuring an audio codec and in querying
    the capability of audio codec factories.

    Please note that codec parameter also contains SDP specific setting,
    setting::decFmtp and setting::encFmtp, which may need to be set
    appropriately based on the effective setting.
    See each codec documentation for more detail.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    info = property(_pjsua2.CodecParam_info_get, _pjsua2.CodecParam_info_set, doc=r"""info""")
    setting = property(_pjsua2.CodecParam_setting_get, _pjsua2.CodecParam_setting_set, doc=r"""setting""")

    def __init__(self):
        _pjsua2.CodecParam_swiginit(self, _pjsua2.new_CodecParam())
    __swig_destroy__ = _pjsua2.delete_CodecParam

# Register CodecParam in _pjsua2:
_pjsua2.CodecParam_swigregister(CodecParam)
class CodecOpusConfig(object):
    r"""Opus codec parameters setting;"""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    sample_rate = property(_pjsua2.CodecOpusConfig_sample_rate_get, _pjsua2.CodecOpusConfig_sample_rate_set, doc=r"""Sample rate in Hz.""")
    channel_cnt = property(_pjsua2.CodecOpusConfig_channel_cnt_get, _pjsua2.CodecOpusConfig_channel_cnt_set, doc=r"""Number of channels.""")
    frm_ptime = property(_pjsua2.CodecOpusConfig_frm_ptime_get, _pjsua2.CodecOpusConfig_frm_ptime_set, doc=r"""Frame time in msec.""")
    frm_ptime_denum = property(_pjsua2.CodecOpusConfig_frm_ptime_denum_get, _pjsua2.CodecOpusConfig_frm_ptime_denum_set, doc=r"""Frame time denumerator.""")
    bit_rate = property(_pjsua2.CodecOpusConfig_bit_rate_get, _pjsua2.CodecOpusConfig_bit_rate_set, doc=r"""Encoder bit rate in bps.""")
    packet_loss = property(_pjsua2.CodecOpusConfig_packet_loss_get, _pjsua2.CodecOpusConfig_packet_loss_set, doc=r"""Encoder's expected packet loss pct.""")
    complexity = property(_pjsua2.CodecOpusConfig_complexity_get, _pjsua2.CodecOpusConfig_complexity_set, doc=r"""Encoder complexity, 0-10(10 is highest)""")
    cbr = property(_pjsua2.CodecOpusConfig_cbr_get, _pjsua2.CodecOpusConfig_cbr_set, doc=r"""Constant bit rate?""")

    def __init__(self):
        _pjsua2.CodecOpusConfig_swiginit(self, _pjsua2.new_CodecOpusConfig())
    __swig_destroy__ = _pjsua2.delete_CodecOpusConfig

# Register CodecOpusConfig in _pjsua2:
_pjsua2.CodecOpusConfig_swigregister(CodecOpusConfig)
class CodecLyraConfig(object):
    r"""Lyra codec setting;"""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    bitRate = property(_pjsua2.CodecLyraConfig_bitRate_get, _pjsua2.CodecLyraConfig_bitRate_set, doc=r"""
    The value represents the decoder bitrate requested by the receiver.
    Endpoints can be configured with different bitrates. For example,
    the local endpoint might be set to a bitrate of 3200, while
    the remote endpoint is set to 6000. In this scenario, the remote
    endpoint will send data at 3200 bitrate, while the local endpoint
    will send data at 6000 bitrate. Valid bitrate: 3200, 6000, 9200.
    By default it is set to PJMEDIA_CODEC_LYRA_DEFAULT_BIT_RATE.
    """)
    modelPath = property(_pjsua2.CodecLyraConfig_modelPath_get, _pjsua2.CodecLyraConfig_modelPath_set, doc=r"""
    Lyra required some additional (model) files, including
    **lyra_config.binarypb** , **lyragan.tflite** , **quantizer.tflite** and
    **soundstream_encoder.tflite** .
    This setting represents the folder containing the above files.
    The specified folder should contain these files. If an invalid folder
    is provided, the codec creation will fail.
    """)

    def __init__(self):
        _pjsua2.CodecLyraConfig_swiginit(self, _pjsua2.new_CodecLyraConfig())
    __swig_destroy__ = _pjsua2.delete_CodecLyraConfig

# Register CodecLyraConfig in _pjsua2:
_pjsua2.CodecLyraConfig_swigregister(CodecLyraConfig)
class VidCodecParam(object):
    r"""
    Detailed codec attributes used in configuring a video codec and in querying
    the capability of video codec factories.

    Please note that codec parameter also contains SDP specific setting,
    #decFmtp and #encFmtp, which may need to be set appropriately based on
    the effective setting. See each codec documentation for more detail.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    dir = property(_pjsua2.VidCodecParam_dir_get, _pjsua2.VidCodecParam_dir_set, doc=r"""Direction""")
    packing = property(_pjsua2.VidCodecParam_packing_get, _pjsua2.VidCodecParam_packing_set, doc=r"""Packetization strategy.""")
    encFmt = property(_pjsua2.VidCodecParam_encFmt_get, _pjsua2.VidCodecParam_encFmt_set, doc=r"""Encoded format""")
    encFmtp = property(_pjsua2.VidCodecParam_encFmtp_get, _pjsua2.VidCodecParam_encFmtp_set, doc=r"""Encoder fmtp params""")
    encMtu = property(_pjsua2.VidCodecParam_encMtu_get, _pjsua2.VidCodecParam_encMtu_set, doc=r"""MTU or max payload size setting""")
    decFmt = property(_pjsua2.VidCodecParam_decFmt_get, _pjsua2.VidCodecParam_decFmt_set, doc=r"""Decoded format""")
    decFmtp = property(_pjsua2.VidCodecParam_decFmtp_get, _pjsua2.VidCodecParam_decFmtp_set, doc=r"""Decoder fmtp params""")
    ignoreFmtp = property(_pjsua2.VidCodecParam_ignoreFmtp_get, _pjsua2.VidCodecParam_ignoreFmtp_set, doc=r"""
    Ignore fmtp params. If set to
                                                true, the codec will apply
                                                format settings specified in
                                                encFmt and decFmt only.
    """)

    def __init__(self):
        r"""Default constructor"""
        _pjsua2.VidCodecParam_swiginit(self, _pjsua2.new_VidCodecParam())
    __swig_destroy__ = _pjsua2.delete_VidCodecParam

# Register VidCodecParam in _pjsua2:
_pjsua2.VidCodecParam_swigregister(VidCodecParam)
class MediaFmtChangedEvent(object):
    r"""This structure describes a media format changed event."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    newWidth = property(_pjsua2.MediaFmtChangedEvent_newWidth_get, _pjsua2.MediaFmtChangedEvent_newWidth_set, doc=r"""The new width.""")
    newHeight = property(_pjsua2.MediaFmtChangedEvent_newHeight_get, _pjsua2.MediaFmtChangedEvent_newHeight_set, doc=r"""The new height.""")

    def __init__(self):
        _pjsua2.MediaFmtChangedEvent_swiginit(self, _pjsua2.new_MediaFmtChangedEvent())
    __swig_destroy__ = _pjsua2.delete_MediaFmtChangedEvent

# Register MediaFmtChangedEvent in _pjsua2:
_pjsua2.MediaFmtChangedEvent_swigregister(MediaFmtChangedEvent)
class AudDevErrorEvent(object):
    r"""This structure describes an audio device error event."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    dir = property(_pjsua2.AudDevErrorEvent_dir_get, _pjsua2.AudDevErrorEvent_dir_set, doc=r"""The direction.""")
    id = property(_pjsua2.AudDevErrorEvent_id_get, _pjsua2.AudDevErrorEvent_id_set, doc=r"""The audio device ID.""")
    status = property(_pjsua2.AudDevErrorEvent_status_get, _pjsua2.AudDevErrorEvent_status_set, doc=r"""The status code.""")

    def __init__(self):
        _pjsua2.AudDevErrorEvent_swiginit(self, _pjsua2.new_AudDevErrorEvent())
    __swig_destroy__ = _pjsua2.delete_AudDevErrorEvent

# Register AudDevErrorEvent in _pjsua2:
_pjsua2.AudDevErrorEvent_swigregister(AudDevErrorEvent)
class MediaEventData(object):
    r"""Media event data."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    fmtChanged = property(_pjsua2.MediaEventData_fmtChanged_get, _pjsua2.MediaEventData_fmtChanged_set, doc=r"""Media format changed event data.""")
    audDevError = property(_pjsua2.MediaEventData_audDevError_get, _pjsua2.MediaEventData_audDevError_set, doc=r"""Audio device error event data.""")
    ptr = property(_pjsua2.MediaEventData_ptr_get, _pjsua2.MediaEventData_ptr_set, doc=r"""
    Pointer to storage to user event data, if it's outside
    this struct
    """)

    def __init__(self):
        _pjsua2.MediaEventData_swiginit(self, _pjsua2.new_MediaEventData())
    __swig_destroy__ = _pjsua2.delete_MediaEventData

# Register MediaEventData in _pjsua2:
_pjsua2.MediaEventData_swigregister(MediaEventData)
class MediaEvent(object):
    r"""
    This structure describes a media event. It corresponds to the
    pjmedia_event structure.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    type = property(_pjsua2.MediaEvent_type_get, _pjsua2.MediaEvent_type_set, doc=r"""The event type.""")
    data = property(_pjsua2.MediaEvent_data_get, _pjsua2.MediaEvent_data_set, doc=r"""
    Additional data/parameters about the event. The type of data
    will be specific to the event type being reported.
    """)
    pjMediaEvent = property(_pjsua2.MediaEvent_pjMediaEvent_get, _pjsua2.MediaEvent_pjMediaEvent_set, doc=r"""
    Pointer to original pjmedia_event. Only valid when the struct
    is converted from PJSIP's pjmedia_event.
    """)

    def __init__(self):
        r"""Default constructor"""
        _pjsua2.MediaEvent_swiginit(self, _pjsua2.new_MediaEvent())
    __swig_destroy__ = _pjsua2.delete_MediaEvent

# Register MediaEvent in _pjsua2:
_pjsua2.MediaEvent_swigregister(MediaEvent)
class PresenceStatus(object):
    r"""This describes presence status."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    status = property(_pjsua2.PresenceStatus_status_get, _pjsua2.PresenceStatus_status_set, doc=r"""Buddy's online status.""")
    statusText = property(_pjsua2.PresenceStatus_statusText_get, _pjsua2.PresenceStatus_statusText_set, doc=r"""Text to describe buddy's online status.""")
    activity = property(_pjsua2.PresenceStatus_activity_get, _pjsua2.PresenceStatus_activity_set, doc=r"""Activity type.""")
    note = property(_pjsua2.PresenceStatus_note_get, _pjsua2.PresenceStatus_note_set, doc=r"""Optional text describing the person/element.""")
    rpidId = property(_pjsua2.PresenceStatus_rpidId_get, _pjsua2.PresenceStatus_rpidId_set, doc=r"""Optional RPID ID string.""")

    def __init__(self):
        r"""Constructor."""
        _pjsua2.PresenceStatus_swiginit(self, _pjsua2.new_PresenceStatus())
    __swig_destroy__ = _pjsua2.delete_PresenceStatus

# Register PresenceStatus in _pjsua2:
_pjsua2.PresenceStatus_swigregister(PresenceStatus)
class BuddyConfig(PersistentObject):
    r"""
    This structure describes buddy configuration when adding a buddy to
    the buddy list with Buddy::create().
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    uri = property(_pjsua2.BuddyConfig_uri_get, _pjsua2.BuddyConfig_uri_set, doc=r"""Buddy URL or name address.""")
    subscribe = property(_pjsua2.BuddyConfig_subscribe_get, _pjsua2.BuddyConfig_subscribe_set, doc=r"""Specify whether presence subscription should start immediately.""")
    subscribe_dlg_event = property(_pjsua2.BuddyConfig_subscribe_dlg_event_get, _pjsua2.BuddyConfig_subscribe_dlg_event_set, doc=r"""
    Specify whether we should immediately subscribe to the buddy's
    dialog event, such as for Busy Lamp Field (BLF) feature.
    Note that only one subscription (presence or dialog event)
    can be active at any time.
    """)

    def readObject(self, node):
        r"""
        Read this object from a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to read values from.
        """
        return _pjsua2.BuddyConfig_readObject(self, node)

    def writeObject(self, node):
        r"""
        Write this object to a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to write values to.
        """
        return _pjsua2.BuddyConfig_writeObject(self, node)

    def __init__(self):
        _pjsua2.BuddyConfig_swiginit(self, _pjsua2.new_BuddyConfig())
    __swig_destroy__ = _pjsua2.delete_BuddyConfig

# Register BuddyConfig in _pjsua2:
_pjsua2.BuddyConfig_swigregister(BuddyConfig)
class BuddyInfo(object):
    r"""
    This structure describes buddy info, which can be retrieved by via
    Buddy::getInfo().
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    uri = property(_pjsua2.BuddyInfo_uri_get, _pjsua2.BuddyInfo_uri_set, doc=r"""The full URI of the buddy, as specified in the configuration.""")
    contact = property(_pjsua2.BuddyInfo_contact_get, _pjsua2.BuddyInfo_contact_set, doc=r"""
    Buddy's Contact, only available when presence subscription has
    been established to the buddy.
    """)
    accId = property(_pjsua2.BuddyInfo_accId_get, _pjsua2.BuddyInfo_accId_set, doc=r"""
    The account ID associated with this buddy. If not associated
    with any account, the value will be PJSUA_INVALID_ID.
    """)
    presMonitorEnabled = property(_pjsua2.BuddyInfo_presMonitorEnabled_get, _pjsua2.BuddyInfo_presMonitorEnabled_set, doc=r"""
    Flag to indicate that we should monitor the presence information for
    this buddy (normally yes, unless explicitly disabled).
    """)
    subState = property(_pjsua2.BuddyInfo_subState_get, _pjsua2.BuddyInfo_subState_set, doc=r"""
    If *presMonitorEnabled* is true, this specifies the last state of
    the presence subscription. If presence subscription session is currently
    active, the value will be PJSIP_EVSUB_STATE_ACTIVE. If presence
    subscription request has been rejected, the value will be
    PJSIP_EVSUB_STATE_TERMINATED, and the termination reason will be
    specified in *subTermReason*.
    """)
    subStateName = property(_pjsua2.BuddyInfo_subStateName_get, _pjsua2.BuddyInfo_subStateName_set, doc=r"""String representation of subscription state.""")
    subTermCode = property(_pjsua2.BuddyInfo_subTermCode_get, _pjsua2.BuddyInfo_subTermCode_set, doc=r"""
    Specifies the last presence subscription termination code. This would
    return the last status of the SUBSCRIBE request. If the subscription
    is terminated with NOTIFY by the server, this value will be set to
    200, and subscription termination reason will be given in the
    *subTermReason* field.
    """)
    subTermReason = property(_pjsua2.BuddyInfo_subTermReason_get, _pjsua2.BuddyInfo_subTermReason_set, doc=r"""
    Specifies the last presence subscription termination reason. If
    presence subscription is currently active, the value will be empty.
    """)
    presStatus = property(_pjsua2.BuddyInfo_presStatus_get, _pjsua2.BuddyInfo_presStatus_set, doc=r"""Presence status.""")

    def __init__(self):
        r"""Default constructor"""
        _pjsua2.BuddyInfo_swiginit(self, _pjsua2.new_BuddyInfo())
    __swig_destroy__ = _pjsua2.delete_BuddyInfo

# Register BuddyInfo in _pjsua2:
_pjsua2.BuddyInfo_swigregister(BuddyInfo)
class OnBuddyEvSubStateParam(object):
    r"""This structure contains parameters for Buddy::onBuddyEvSubState() callback."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    e = property(_pjsua2.OnBuddyEvSubStateParam_e_get, _pjsua2.OnBuddyEvSubStateParam_e_set, doc=r"""* The event which triggers state change event.""")

    def __init__(self):
        _pjsua2.OnBuddyEvSubStateParam_swiginit(self, _pjsua2.new_OnBuddyEvSubStateParam())
    __swig_destroy__ = _pjsua2.delete_OnBuddyEvSubStateParam

# Register OnBuddyEvSubStateParam in _pjsua2:
_pjsua2.OnBuddyEvSubStateParam_swigregister(OnBuddyEvSubStateParam)
class Buddy(object):
    r"""
    Buddy. This is a lite wrapper class for PJSUA-LIB buddy, i.e: this class
    only maintains one data member, PJSUA-LIB buddy ID, and the methods are
    simply proxies for PJSUA-LIB buddy operations.

    Application can use create() to register a buddy to PJSUA-LIB, and
    the destructor of the original instance (i.e: the instance that calls
    create()) will unregister and delete the buddy from PJSUA-LIB. Application
    must delete all Buddy instances belong to an account before shutting down
    the account (via Account::shutdown()).

    The library will not keep a list of Buddy instances, so any Buddy (or
    descendant) instances instantiated by application must be maintained
    and destroyed by the application itself. Any PJSUA2 APIs that return Buddy
    instance(s) such as Account::enumBuddies2() or Account::findBuddy2() will
    just return generated copy. All Buddy methods should work normally on this
    generated copy instance.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def __init__(self):
        r"""Constructor."""
        if self.__class__ == Buddy:
            _self = None
        else:
            _self = self
        _pjsua2.Buddy_swiginit(self, _pjsua2.new_Buddy(_self, ))
    __swig_destroy__ = _pjsua2.delete_Buddy

    def create(self, acc, cfg):
        r"""
        Create buddy and register the buddy to PJSUA-LIB.

        Note that application should maintain the Buddy original instance, i.e:
        the instance that calls this create() method as it is only the original
        instance destructor that will delete the underlying Buddy in PJSUA-LIB.

        IMPORTANT: Application must make sure that the Account instance remains
        valid for the entire lifetime of the Buddy object.

        :type acc: :py:class:`Account`
        :param acc:               The account for this buddy.
        :type cfg: :py:class:`BuddyConfig`
        :param cfg:               The buddy config.
        """
        return _pjsua2.Buddy_create(self, acc, cfg)

    def isValid(self):
        r"""
        Check if this buddy is valid.

        :rtype: boolean
        :return: True if it is.
        """
        return _pjsua2.Buddy_isValid(self)

    def getId(self):
        r"""
        Get PJSUA-LIB buddy ID or index associated with this buddy.

        :rtype: int
        :return: Integer greater than or equal to zero.
        """
        return _pjsua2.Buddy_getId(self)

    def getInfo(self):
        r"""
        Get detailed buddy info.

        :rtype: :py:class:`BuddyInfo`
        :return: Buddy info.
        """
        return _pjsua2.Buddy_getInfo(self)

    def subscribePresence(self, subscribe):
        r"""
        Enable/disable buddy's presence monitoring. Once buddy's presence is
        subscribed, application will be informed about buddy's presence status
        changed via *onBuddyState()* callback.

        :type subscribe: boolean
        :param subscribe:         Specify true to activate presence
                                     subscription.
        """
        return _pjsua2.Buddy_subscribePresence(self, subscribe)

    def updatePresence(self):
        r"""
        Update the presence information for the buddy. Although the library
        periodically refreshes the presence subscription for all buddies,
        some application may want to refresh the buddy's presence subscription
        immediately, and in this case it can use this function to accomplish
        this.

        Note that the buddy's presence subscription will only be initiated
        if presence monitoring is enabled for the buddy. See
        subscribePresence() for more info. Also if presence subscription for
        the buddy is already active, this function will not do anything.

        Once the presence subscription is activated successfully for the buddy,
        application will be notified about the buddy's presence status in the
        *onBuddyState()* callback.
        """
        return _pjsua2.Buddy_updatePresence(self)

    def subscribeDlgEvent(self, subscribe):
        r"""
        Enable/disable buddy's dialog event monitoring. Once buddy's dialog event
        is subscribed, application will be informed about buddy's dialog info
        status change via *onBuddyDlgEventState()* callback.

        Note that only one subscription (presence or dialog event) can be active
        at any time.

        :type subscribe: boolean
        :param subscribe:     Specify non-zero to activate dialog event subscription
                                 to the specified buddy.

        :rtype: void
        :return: PJ_SUCCESS on success, or the appropriate error code.
        """
        return _pjsua2.Buddy_subscribeDlgEvent(self, subscribe)

    def updateDlgEvent(self):
        r"""
        Update the dialog event information for the buddy. Although the library
        periodically refreshes the dialog event subscription for all buddies, some
        application may want to refresh the buddy's dialog event subscription
        immediately, and in this case it can use this function to accomplish
        this.

        Note that the buddy's dialog event subscription will only be initiated
        if dialog event monitoring is enabled for the buddy. See
        subscribeDlgEvent() for more info. Also if dialog event
        subscription for the buddy is already active, this function will not do
        anything.

        Once the dialog event subscription is activated successfully for the buddy,
        application will be notified about the buddy's dialog info status in the
        onBuddyDlgEventState() callback.
        """
        return _pjsua2.Buddy_updateDlgEvent(self)

    def sendInstantMessage(self, prm):
        r"""
        Send instant messaging outside dialog, using this buddy's specified
        account for route set and authentication.

        :type prm: :py:class:`SendInstantMessageParam`
        :param prm:       Sending instant message parameter.
        """
        return _pjsua2.Buddy_sendInstantMessage(self, prm)

    def sendTypingIndication(self, prm):
        r"""
        Send typing indication outside dialog.

        :type prm: :py:class:`SendTypingIndicationParam`
        :param prm:       Sending instant message parameter.
        """
        return _pjsua2.Buddy_sendTypingIndication(self, prm)

    def onBuddyState(self):
        r"""
        Notify application when the buddy state has changed.
        Application may then query the buddy info to get the details.
        """
        return _pjsua2.Buddy_onBuddyState(self)

    def onBuddyDlgEventState(self):
        r"""
        Notify application when the buddy dialog state has changed.
        Application may then query the buddy into to get the details.
        """
        return _pjsua2.Buddy_onBuddyDlgEventState(self)

    def onBuddyEvSubState(self, prm):
        r"""
        Notify application when the state of client subscription session
        associated with a buddy has changed. Application may use this
        callback to retrieve more detailed information about the state
        changed event.

        :type prm: :py:class:`OnBuddyEvSubStateParam`
        :param prm:       Callback parameter.
        """
        return _pjsua2.Buddy_onBuddyEvSubState(self, prm)

    def onBuddyEvSubDlgEventState(self, prm):
        r"""
        Notify application when the state of client subscription session
        associated with a buddy dialog state has changed. Application
        may use this callback to retrieve more detailed information about the
        state changed event.
        """
        return _pjsua2.Buddy_onBuddyEvSubDlgEventState(self, prm)
    def __disown__(self):
        self.this.disown()
        _pjsua2.disown_Buddy(self)
        return weakref.proxy(self)

# Register Buddy in _pjsua2:
_pjsua2.Buddy_swigregister(Buddy)
class AccountRegConfig(PersistentObject):
    r"""Account registration config. This will be specified in AccountConfig."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    registrarUri = property(_pjsua2.AccountRegConfig_registrarUri_get, _pjsua2.AccountRegConfig_registrarUri_set, doc=r"""
    This is the URL to be put in the request URI for the registration,
    and will look something like "sip:serviceprovider".

    This field should be specified if registration is desired. If the
    value is empty, no account registration will be performed.
    """)
    registerOnAdd = property(_pjsua2.AccountRegConfig_registerOnAdd_get, _pjsua2.AccountRegConfig_registerOnAdd_set, doc=r"""
    Specify whether the account should register as soon as it is
    added to the UA. Application can set this to PJ_FALSE and control
    the registration manually with pjsua_acc_set_registration().

    Default: True
    """)
    disableRegOnModify = property(_pjsua2.AccountRegConfig_disableRegOnModify_get, _pjsua2.AccountRegConfig_disableRegOnModify_set, doc=r"""
    Specify whether account modification with Account::modify() should
    automatically update registration if necessary, for example if
    account credentials change.

    Disable this when immediate registration is not desirable, such as
    during IP address change.

    Default: false.
    """)
    headers = property(_pjsua2.AccountRegConfig_headers_get, _pjsua2.AccountRegConfig_headers_set, doc=r"""
    The optional custom SIP headers to be put in the registration
    request.
    """)
    contactParams = property(_pjsua2.AccountRegConfig_contactParams_get, _pjsua2.AccountRegConfig_contactParams_set, doc=r"""
    Additional parameters that will be appended in the Contact header
    of the registration requests. This will be appended after
    *AccountSipConfig.contactParams;*

    The parameters should be preceeded by semicolon, and all strings must
    be properly escaped. Example:
      ";my-param=X;another-param=Hi%20there"
    """)
    contactUriParams = property(_pjsua2.AccountRegConfig_contactUriParams_get, _pjsua2.AccountRegConfig_contactUriParams_set, doc=r"""
    Additional parameters that will be appended in the Contact URI
    of the registration requests. This will be appended after
    *AccountSipConfig.contactUriParams;*

    The parameters should be preceeded by semicolon, and all strings must
    be properly escaped. Example:
      ";my-param=X;another-param=Hi%20there"
    """)
    timeoutSec = property(_pjsua2.AccountRegConfig_timeoutSec_get, _pjsua2.AccountRegConfig_timeoutSec_set, doc=r"""
    Optional interval for registration, in seconds. If the value is zero,
    default interval will be used (PJSUA_REG_INTERVAL, 300 seconds).
    """)
    retryIntervalSec = property(_pjsua2.AccountRegConfig_retryIntervalSec_get, _pjsua2.AccountRegConfig_retryIntervalSec_set, doc=r"""
    Specify interval of auto registration retry upon registration failure
    (including caused by transport problem), in second. Set to 0 to
    disable auto re-registration. Note that if the registration retry
    occurs because of transport failure, the first retry will be done
    after *firstRetryIntervalSec* seconds instead. Also note that
    the interval will be randomized slightly by some seconds (specified
    in *reg_retry_random_interval)* to avoid all clients re-registering
    at the same time.

    See also *firstRetryIntervalSec* and *randomRetryIntervalSec*
    settings.

    Default: PJSUA_REG_RETRY_INTERVAL
    """)
    firstRetryIntervalSec = property(_pjsua2.AccountRegConfig_firstRetryIntervalSec_get, _pjsua2.AccountRegConfig_firstRetryIntervalSec_set, doc=r"""
    This specifies the interval for the first registration retry. The
    registration retry is explained in *retryIntervalSec*. Note that
    the value here will also be randomized by some seconds (specified
    in *reg_retry_random_interval)* to avoid all clients re-registering
    at the same time.

    See also *retryIntervalSec* and *randomRetryIntervalSec* settings.

    Default: 0
    """)
    randomRetryIntervalSec = property(_pjsua2.AccountRegConfig_randomRetryIntervalSec_get, _pjsua2.AccountRegConfig_randomRetryIntervalSec_set, doc=r"""
    This specifies maximum randomized value to be added/substracted
    to/from the registration retry interval specified in
    *reg_retry_interval* and *reg_first_retry_interval*, in second.
    This is useful to avoid all clients re-registering at the same time.
    For example, if the registration retry interval is set to 100 seconds
    and this is set to 10 seconds, the actual registration retry interval
    will be in the range of 90 to 110 seconds.

    See also *retryIntervalSec* and *firstRetryIntervalSec* settings.

    Default: 10
    """)
    delayBeforeRefreshSec = property(_pjsua2.AccountRegConfig_delayBeforeRefreshSec_get, _pjsua2.AccountRegConfig_delayBeforeRefreshSec_set, doc=r"""
    Specify the number of seconds to refresh the client registration
    before the registration expires.

    Default: PJSIP_REGISTER_CLIENT_DELAY_BEFORE_REFRESH, 5 seconds
    """)
    dropCallsOnFail = property(_pjsua2.AccountRegConfig_dropCallsOnFail_get, _pjsua2.AccountRegConfig_dropCallsOnFail_set, doc=r"""
    Specify whether calls of the configured account should be dropped
    after registration failure and an attempt of re-registration has
    also failed.

    Default: FALSE (disabled)
    """)
    unregWaitMsec = property(_pjsua2.AccountRegConfig_unregWaitMsec_get, _pjsua2.AccountRegConfig_unregWaitMsec_set, doc=r"""
    Specify the maximum time to wait for unregistration requests to
    complete during library shutdown sequence.

    Default: PJSUA_UNREG_TIMEOUT
    """)
    proxyUse = property(_pjsua2.AccountRegConfig_proxyUse_get, _pjsua2.AccountRegConfig_proxyUse_set, doc=r"""
    Specify how the registration uses the outbound and account proxy
    settings. This controls if and what Route headers will appear in
    the REGISTER request of this account. The value is bitmask combination
    of PJSUA_REG_USE_OUTBOUND_PROXY and PJSUA_REG_USE_ACC_PROXY bits.
    If the value is set to 0, the REGISTER request will not use any proxy
    (i.e. it will not have any Route headers).

    Default: 3 (PJSUA_REG_USE_OUTBOUND_PROXY | PJSUA_REG_USE_ACC_PROXY)
    """)

    def readObject(self, node):
        r"""
        Read this object from a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to read values from.
        """
        return _pjsua2.AccountRegConfig_readObject(self, node)

    def writeObject(self, node):
        r"""
        Write this object to a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to write values to.
        """
        return _pjsua2.AccountRegConfig_writeObject(self, node)

    def __init__(self):
        _pjsua2.AccountRegConfig_swiginit(self, _pjsua2.new_AccountRegConfig())
    __swig_destroy__ = _pjsua2.delete_AccountRegConfig

# Register AccountRegConfig in _pjsua2:
_pjsua2.AccountRegConfig_swigregister(AccountRegConfig)
class AccountSipConfig(PersistentObject):
    r"""
    Various SIP settings for the account. This will be specified in
    AccountConfig.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    authCreds = property(_pjsua2.AccountSipConfig_authCreds_get, _pjsua2.AccountSipConfig_authCreds_set, doc=r"""
    Array of credentials. If registration is desired, normally there should
    be at least one credential specified, to successfully authenticate
    against the service provider. More credentials can be specified, for
    example when the requests are expected to be challenged by the
    proxies in the route set.
    """)
    proxies = property(_pjsua2.AccountSipConfig_proxies_get, _pjsua2.AccountSipConfig_proxies_set, doc=r"""
    Array of proxy servers to visit for outgoing requests. Each of the
    entry is translated into one Route URI.
    """)
    contactForced = property(_pjsua2.AccountSipConfig_contactForced_get, _pjsua2.AccountSipConfig_contactForced_set, doc=r"""
    Optional URI to be put as Contact for this account. It is recommended
    that this field is left empty, so that the value will be calculated
    automatically based on the transport address.
    """)
    contactParams = property(_pjsua2.AccountSipConfig_contactParams_get, _pjsua2.AccountSipConfig_contactParams_set, doc=r"""
    Additional parameters that will be appended in the Contact header
    for this account. This will affect the Contact header in all SIP
    messages sent on behalf of this account, including but not limited to
    REGISTER, INVITE, and SUBCRIBE requests or responses.

    The parameters should be preceeded by semicolon, and all strings must
    be properly escaped. Example:
      ";my-param=X;another-param=Hi%20there"
    """)
    contactUriParams = property(_pjsua2.AccountSipConfig_contactUriParams_get, _pjsua2.AccountSipConfig_contactUriParams_set, doc=r"""
    Additional URI parameters that will be appended in the Contact URI
    for this account. This will affect the Contact URI in all SIP
    messages sent on behalf of this account, including but not limited to
    REGISTER, INVITE, and SUBCRIBE requests or responses.

    The parameters should be preceeded by semicolon, and all strings must
    be properly escaped. Example:
      ";my-param=X;another-param=Hi%20there"
    """)
    authInitialEmpty = property(_pjsua2.AccountSipConfig_authInitialEmpty_get, _pjsua2.AccountSipConfig_authInitialEmpty_set, doc=r"""
    If this flag is set, the authentication client framework will
    send an empty Authorization header in each initial request.
    Default is no.
    """)
    authInitialAlgorithm = property(_pjsua2.AccountSipConfig_authInitialAlgorithm_get, _pjsua2.AccountSipConfig_authInitialAlgorithm_set, doc=r"""
    Specify the algorithm to use when empty Authorization header
    is to be sent for each initial request (see above)
    """)
    transportId = property(_pjsua2.AccountSipConfig_transportId_get, _pjsua2.AccountSipConfig_transportId_set, doc=r"""
    Optionally bind this account to specific transport. This normally is
    not a good idea, as account should be able to send requests using
    any available transports according to the destination. But some
    application may want to have explicit control over the transport to
    use, so in that case it can set this field.

    Default: -1 (PJSUA_INVALID_ID)

    See also: Account::setTransport()
    """)
    ipv6Use = property(_pjsua2.AccountSipConfig_ipv6Use_get, _pjsua2.AccountSipConfig_ipv6Use_set, doc=r"""
    Specify whether IPv6 should be used for SIP signalling.

    Default: PJSUA_IPV6_ENABLED_NO_PREFERENCE
    (IP version used will be based on the address resolution
    returned by OS/resolver)
    """)
    useSharedAuth = property(_pjsua2.AccountSipConfig_useSharedAuth_get, _pjsua2.AccountSipConfig_useSharedAuth_set, doc=r"""
    Use a shared authorization session within this account.
    This will use the accounts credentials on outgoing requests,
    so that less 401/407 Responses will be returned.

    Needs PJSIP_AUTH_AUTO_SEND_NEXT and PJSIP_AUTH_HEADER_CACHING
    enabled to work properly, and also will grow usage of the used pool for
    the cached headers.

    Default is disabled/false.
    """)
    autoRespondSipMessage = property(_pjsua2.AccountSipConfig_autoRespondSipMessage_get, _pjsua2.AccountSipConfig_autoRespondSipMessage_set, doc=r"""
    Configure automatic SIP-MESSAGE processing behavior for this account.
    When set to true, incoming SIP MESSAGE requests will be responded to
    immediately with a 200 OK response (legacy behavior). When set to false,
    incoming SIP MESSAGE requests will create UAS transactions allowing for
    deferred responses, cf. Account::sendResponse() and DeferredResponse.

    Default: true (automatic response for backward compatibility)
    """)

    def readObject(self, node):
        r"""
        Read this object from a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to read values from.
        """
        return _pjsua2.AccountSipConfig_readObject(self, node)

    def writeObject(self, node):
        r"""
        Write this object to a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to write values to.
        """
        return _pjsua2.AccountSipConfig_writeObject(self, node)

    def __init__(self):
        _pjsua2.AccountSipConfig_swiginit(self, _pjsua2.new_AccountSipConfig())
    __swig_destroy__ = _pjsua2.delete_AccountSipConfig

# Register AccountSipConfig in _pjsua2:
_pjsua2.AccountSipConfig_swigregister(AccountSipConfig)
class AccountCallConfig(PersistentObject):
    r"""Account's call settings. This will be specified in AccountConfig."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    holdType = property(_pjsua2.AccountCallConfig_holdType_get, _pjsua2.AccountCallConfig_holdType_set, doc=r"""
    Specify how to offer call hold to remote peer. Please see the
    documentation on pjsua_call_hold_type for more info.

    Default: PJSUA_CALL_HOLD_TYPE_DEFAULT
    """)
    prackUse = property(_pjsua2.AccountCallConfig_prackUse_get, _pjsua2.AccountCallConfig_prackUse_set, doc=r"""
    Specify how support for reliable provisional response (100rel/
    PRACK) should be used for all sessions in this account. See the
    documentation of pjsua_100rel_use enumeration for more info.

    Default: PJSUA_100REL_NOT_USED
    """)
    timerUse = property(_pjsua2.AccountCallConfig_timerUse_get, _pjsua2.AccountCallConfig_timerUse_set, doc=r"""
    Specify the usage of Session Timers for all sessions. See the
    pjsua_sip_timer_use for possible values.

    Default: PJSUA_SIP_TIMER_OPTIONAL
    """)
    siprecUse = property(_pjsua2.AccountCallConfig_siprecUse_get, _pjsua2.AccountCallConfig_siprecUse_set, doc=r"""
    Specify the usage of SIPREC INVITE request. See the
    pjsua_sip_siprec_use for possible values.

    Default: PJSUA_SIP_SIPREC_INACTIVE
    """)
    timerMinSESec = property(_pjsua2.AccountCallConfig_timerMinSESec_get, _pjsua2.AccountCallConfig_timerMinSESec_set, doc=r"""
    Specify minimum Session Timer expiration period, in seconds.
    Must not be lower than 90. Default is 90.
    """)
    timerSessExpiresSec = property(_pjsua2.AccountCallConfig_timerSessExpiresSec_get, _pjsua2.AccountCallConfig_timerSessExpiresSec_set, doc=r"""
    Specify Session Timer expiration period, in seconds.
    Must not be lower than timerMinSE. Default is 1800.
    """)

    def __init__(self):
        r"""Default constructor"""
        _pjsua2.AccountCallConfig_swiginit(self, _pjsua2.new_AccountCallConfig())

    def readObject(self, node):
        r"""
        Read this object from a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to read values from.
        """
        return _pjsua2.AccountCallConfig_readObject(self, node)

    def writeObject(self, node):
        r"""
        Write this object to a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to write values to.
        """
        return _pjsua2.AccountCallConfig_writeObject(self, node)
    __swig_destroy__ = _pjsua2.delete_AccountCallConfig

# Register AccountCallConfig in _pjsua2:
_pjsua2.AccountCallConfig_swigregister(AccountCallConfig)
class AccountPresConfig(PersistentObject):
    r"""Account presence config. This will be specified in AccountConfig."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    headers = property(_pjsua2.AccountPresConfig_headers_get, _pjsua2.AccountPresConfig_headers_set, doc=r"""
    The optional custom SIP headers to be put in the presence
    subscription request.
    """)
    publishEnabled = property(_pjsua2.AccountPresConfig_publishEnabled_get, _pjsua2.AccountPresConfig_publishEnabled_set, doc=r"""
    If this flag is set, the presence information of this account will
    be PUBLISH-ed to the server where the account belongs.

    Default: PJ_FALSE
    """)
    publishQueue = property(_pjsua2.AccountPresConfig_publishQueue_get, _pjsua2.AccountPresConfig_publishQueue_set, doc=r"""
    Specify whether the client publication session should queue the
    PUBLISH request should there be another PUBLISH transaction still
    pending. If this is set to false, the client will return error
    on the PUBLISH request if there is another PUBLISH transaction still
    in progress.

    Default: PJSIP_PUBLISHC_QUEUE_REQUEST (TRUE)
    """)
    publishShutdownWaitMsec = property(_pjsua2.AccountPresConfig_publishShutdownWaitMsec_get, _pjsua2.AccountPresConfig_publishShutdownWaitMsec_set, doc=r"""
    Maximum time to wait for unpublication transaction(s) to complete
    during shutdown process, before sending unregistration. The library
    tries to wait for the unpublication (un-PUBLISH) to complete before
    sending REGISTER request to unregister the account, during library
    shutdown process. If the value is set too short, it is possible that
    the unregistration is sent before unpublication completes, causing
    unpublication request to fail.

    Value is in milliseconds.

    Default: PJSUA_UNPUBLISH_MAX_WAIT_TIME_MSEC (2000)
    """)
    pidfTupleId = property(_pjsua2.AccountPresConfig_pidfTupleId_get, _pjsua2.AccountPresConfig_pidfTupleId_set, doc=r"""
    Optional PIDF tuple ID for outgoing PUBLISH and NOTIFY. If this value
    is not specified, a random string will be used.
    """)

    def readObject(self, node):
        r"""
        Read this object from a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to read values from.
        """
        return _pjsua2.AccountPresConfig_readObject(self, node)

    def writeObject(self, node):
        r"""
        Write this object to a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to write values to.
        """
        return _pjsua2.AccountPresConfig_writeObject(self, node)

    def __init__(self):
        _pjsua2.AccountPresConfig_swiginit(self, _pjsua2.new_AccountPresConfig())
    __swig_destroy__ = _pjsua2.delete_AccountPresConfig

# Register AccountPresConfig in _pjsua2:
_pjsua2.AccountPresConfig_swigregister(AccountPresConfig)
class AccountMwiConfig(PersistentObject):
    r"""
    Account MWI (Message Waiting Indication) settings. This will be specified
    in AccountConfig.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    enabled = property(_pjsua2.AccountMwiConfig_enabled_get, _pjsua2.AccountMwiConfig_enabled_set, doc=r"""
    Subscribe to message waiting indication events (RFC 3842).

    See also UaConfig.mwiUnsolicitedEnabled setting.

    Default: FALSE
    """)
    expirationSec = property(_pjsua2.AccountMwiConfig_expirationSec_get, _pjsua2.AccountMwiConfig_expirationSec_set, doc=r"""
    Specify the default expiration time (in seconds) for Message
    Waiting Indication (RFC 3842) event subscription. This must not
    be zero.

    Default: PJSIP_MWI_DEFAULT_EXPIRES (3600)
    """)

    def readObject(self, node):
        r"""
        Read this object from a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to read values from.
        """
        return _pjsua2.AccountMwiConfig_readObject(self, node)

    def writeObject(self, node):
        r"""
        Write this object to a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to write values to.
        """
        return _pjsua2.AccountMwiConfig_writeObject(self, node)

    def __init__(self):
        _pjsua2.AccountMwiConfig_swiginit(self, _pjsua2.new_AccountMwiConfig())
    __swig_destroy__ = _pjsua2.delete_AccountMwiConfig

# Register AccountMwiConfig in _pjsua2:
_pjsua2.AccountMwiConfig_swigregister(AccountMwiConfig)
class AccountNatConfig(PersistentObject):
    r"""
    Account's NAT (Network Address Translation) settings. This will be
    specified in AccountConfig.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    sipStunUse = property(_pjsua2.AccountNatConfig_sipStunUse_get, _pjsua2.AccountNatConfig_sipStunUse_set, doc=r"""
    Control the use of STUN for the SIP signaling.

    Default: PJSUA_STUN_USE_DEFAULT
    """)
    mediaStunUse = property(_pjsua2.AccountNatConfig_mediaStunUse_get, _pjsua2.AccountNatConfig_mediaStunUse_set, doc=r"""
    Control the use of STUN for the media transports.

    Default: PJSUA_STUN_USE_DEFAULT
    """)
    sipUpnpUse = property(_pjsua2.AccountNatConfig_sipUpnpUse_get, _pjsua2.AccountNatConfig_sipUpnpUse_set, doc=r"""
    Control the use of UPnP for the SIP signaling.

    Default: PJSUA_UPNP_USE_DEFAULT
    """)
    mediaUpnpUse = property(_pjsua2.AccountNatConfig_mediaUpnpUse_get, _pjsua2.AccountNatConfig_mediaUpnpUse_set, doc=r"""
    Control the use of UPnP for the media transports.

    Default: PJSUA_UPNP_USE_DEFAULT
    """)
    nat64Opt = property(_pjsua2.AccountNatConfig_nat64Opt_get, _pjsua2.AccountNatConfig_nat64Opt_set, doc=r"""
    Specify NAT64 options.

    Default: PJSUA_NAT64_DISABLED
    """)
    iceEnabled = property(_pjsua2.AccountNatConfig_iceEnabled_get, _pjsua2.AccountNatConfig_iceEnabled_set, doc=r"""
    Enable ICE for the media transport.

    Default: False
    """)
    iceTrickle = property(_pjsua2.AccountNatConfig_iceTrickle_get, _pjsua2.AccountNatConfig_iceTrickle_set, doc=r"""
    Set trickle ICE mode for ICE media transport.

    Default: PJ_ICE_SESS_TRICKLE_DISABLED
    """)
    iceMaxHostCands = property(_pjsua2.AccountNatConfig_iceMaxHostCands_get, _pjsua2.AccountNatConfig_iceMaxHostCands_set, doc=r"""
    Set the maximum number of ICE host candidates.

    Default: -1 (maximum not set)
    """)
    iceManualHost = property(_pjsua2.AccountNatConfig_iceManualHost_get, _pjsua2.AccountNatConfig_iceManualHost_set, doc=r"""
    Optional configuration to manually specify host candidates.
    Each candidate will use the same port as the automatic/base host
    candidate. The number of entries in this array must be equal or less
    than *iceMaxHostCands*.
    """)
    iceAggressiveNomination = property(_pjsua2.AccountNatConfig_iceAggressiveNomination_get, _pjsua2.AccountNatConfig_iceAggressiveNomination_set, doc=r"""
    Specify whether to use aggressive nomination.

    Default: True
    """)
    iceNominatedCheckDelayMsec = property(_pjsua2.AccountNatConfig_iceNominatedCheckDelayMsec_get, _pjsua2.AccountNatConfig_iceNominatedCheckDelayMsec_set, doc=r"""
    For controlling agent if it uses regular nomination, specify the delay
    to perform nominated check (connectivity check with USE-CANDIDATE
    attribute) after all components have a valid pair.

    Default value is PJ_ICE_NOMINATED_CHECK_DELAY.
    """)
    iceWaitNominationTimeoutMsec = property(_pjsua2.AccountNatConfig_iceWaitNominationTimeoutMsec_get, _pjsua2.AccountNatConfig_iceWaitNominationTimeoutMsec_set, doc=r"""
    For a controlled agent, specify how long it wants to wait (in
    milliseconds) for the controlling agent to complete sending
    connectivity check with nominated flag set to true for all components
    after the controlled agent has found that all connectivity checks in
    its checklist have been completed and there is at least one successful
    (but not nominated) check for every component.

    Default value for this option is
    ICE_CONTROLLED_AGENT_WAIT_NOMINATION_TIMEOUT. Specify -1 to disable
    this timer.
    """)
    iceCheckSrcAddr = property(_pjsua2.AccountNatConfig_iceCheckSrcAddr_get, _pjsua2.AccountNatConfig_iceCheckSrcAddr_set, doc=r"""
    Specify whether to check the source address of the incoming messages.
    The source address will be compared to the remote candidate which has
    a completed connectivity check or received a connectivity check.

    Default value is PJ_ICE_SESS_CHECK_SRC_ADDR.
    """)
    iceNoRtcp = property(_pjsua2.AccountNatConfig_iceNoRtcp_get, _pjsua2.AccountNatConfig_iceNoRtcp_set, doc=r"""
    Disable RTCP component.

    Default: False
    """)
    iceAlwaysUpdate = property(_pjsua2.AccountNatConfig_iceAlwaysUpdate_get, _pjsua2.AccountNatConfig_iceAlwaysUpdate_set, doc=r"""
    Always send re-INVITE/UPDATE after ICE negotiation regardless of whether
    the default ICE transport address is changed or not. When this is set
    to False, re-INVITE/UPDATE will be sent only when the default ICE
    transport address is changed.

    Default: yes
    """)
    turnEnabled = property(_pjsua2.AccountNatConfig_turnEnabled_get, _pjsua2.AccountNatConfig_turnEnabled_set, doc=r"""Enable TURN candidate in ICE.""")
    turnServer = property(_pjsua2.AccountNatConfig_turnServer_get, _pjsua2.AccountNatConfig_turnServer_set, doc=r"""
    Specify TURN domain name or host name, in in "DOMAIN:PORT" or
    "HOST:PORT" format.
    """)
    turnConnType = property(_pjsua2.AccountNatConfig_turnConnType_get, _pjsua2.AccountNatConfig_turnConnType_set, doc=r"""
    Specify the connection type to be used to the TURN server. Valid
    values are PJ_TURN_TP_UDP or PJ_TURN_TP_TCP.

    Default: PJ_TURN_TP_UDP
    """)
    turnUserName = property(_pjsua2.AccountNatConfig_turnUserName_get, _pjsua2.AccountNatConfig_turnUserName_set, doc=r"""Specify the username to authenticate with the TURN server.""")
    turnPasswordType = property(_pjsua2.AccountNatConfig_turnPasswordType_get, _pjsua2.AccountNatConfig_turnPasswordType_set, doc=r"""
    Specify the type of password. Currently this must be zero to
    indicate plain-text password will be used in the password.
    """)
    turnPassword = property(_pjsua2.AccountNatConfig_turnPassword_get, _pjsua2.AccountNatConfig_turnPassword_set, doc=r"""Specify the password to authenticate with the TURN server.""")
    contactRewriteUse = property(_pjsua2.AccountNatConfig_contactRewriteUse_get, _pjsua2.AccountNatConfig_contactRewriteUse_set, doc=r"""
    This option is used to update the transport address and the Contact
    header of REGISTER request. When this option is  enabled, the library
    will keep track of the public IP address from the response of REGISTER
    request. Once it detects that the address has changed, it will
    unregister current Contact, update the Contact with transport address
    learned from Via header, and register a new Contact to the registrar.
    This will also update the public name of UDP transport if STUN is
    configured.

    Possible values:
    * 0 (disabled).
    * 1 (enabled). Update except if both Contact and server's IP address
    are public but response contains private IP.
    * 2 (enabled). Update without exception.

    See also contactRewriteMethod field.

    Default: 1
    """)
    contactRewriteMethod = property(_pjsua2.AccountNatConfig_contactRewriteMethod_get, _pjsua2.AccountNatConfig_contactRewriteMethod_set, doc=r"""
    Specify how Contact update will be done with the registration, if
    *contactRewriteEnabled* is enabled. The value is bitmask combination of
    *pjsua_contact_rewrite_method*. See also pjsua_contact_rewrite_method.

    Value PJSUA_CONTACT_REWRITE_UNREGISTER(1) is the legacy behavior.

    Default value: PJSUA_CONTACT_REWRITE_METHOD
      (PJSUA_CONTACT_REWRITE_NO_UNREG | PJSUA_CONTACT_REWRITE_ALWAYS_UPDATE)
    """)
    contactUseSrcPort = property(_pjsua2.AccountNatConfig_contactUseSrcPort_get, _pjsua2.AccountNatConfig_contactUseSrcPort_set, doc=r"""
    Specify if source TCP port should be used as the initial Contact
    address if TCP/TLS transport is used. Note that this feature will
    be automatically turned off when nameserver is configured because
    it may yield different destination address due to DNS SRV resolution.
    Also some platforms are unable to report the local address of the
    TCP socket when it is still connecting. In these cases, this
    feature will also be turned off.

    Default: 1 (PJ_TRUE / yes).
    """)
    viaRewriteUse = property(_pjsua2.AccountNatConfig_viaRewriteUse_get, _pjsua2.AccountNatConfig_viaRewriteUse_set, doc=r"""
    This option is used to overwrite the "sent-by" field of the Via header
    for outgoing messages with the same interface address as the one in
    the REGISTER request, as long as the request uses the same transport
    instance as the previous REGISTER request.

    Default: 1 (PJ_TRUE / yes)
    """)
    sdpNatRewriteUse = property(_pjsua2.AccountNatConfig_sdpNatRewriteUse_get, _pjsua2.AccountNatConfig_sdpNatRewriteUse_set, doc=r"""
    This option controls whether the IP address in SDP should be replaced
    with the IP address found in Via header of the REGISTER response, ONLY
    when STUN and ICE are not used. If the value is FALSE (the original
    behavior), then the local IP address will be used. If TRUE, and when
    STUN and ICE are disabled, then the IP address found in registration
    response will be used.

    Default: PJ_FALSE (no)
    """)
    sipOutboundUse = property(_pjsua2.AccountNatConfig_sipOutboundUse_get, _pjsua2.AccountNatConfig_sipOutboundUse_set, doc=r"""
    Control the use of SIP outbound feature. SIP outbound is described in
    RFC 5626 to enable proxies or registrar to send inbound requests back
    to UA using the same connection initiated by the UA for its
    registration. This feature is highly useful in NAT-ed deployemtns,
    hence it is enabled by default.

    Note: currently SIP outbound can only be used with TCP and TLS
    transports. If UDP is used for the registration, the SIP outbound
    feature will be silently ignored for the account.

    Default: 1 (PJ_TRUE / yes)
    """)
    sipOutboundInstanceId = property(_pjsua2.AccountNatConfig_sipOutboundInstanceId_get, _pjsua2.AccountNatConfig_sipOutboundInstanceId_set, doc=r"""
    Specify SIP outbound (RFC 5626) instance ID to be used by this
    account. If empty, an instance ID will be generated based on
    the hostname of this agent. If application specifies this parameter, the
    value will look like "<urn:uuid:00000000-0000-1000-8000-AABBCCDDEEFF>"
    without the double-quotes.

    Default: empty
    """)
    sipOutboundRegId = property(_pjsua2.AccountNatConfig_sipOutboundRegId_get, _pjsua2.AccountNatConfig_sipOutboundRegId_set, doc=r"""
    Specify SIP outbound (RFC 5626) registration ID. The default value
    is empty, which would cause the library to automatically generate
    a suitable value.

    Default: empty
    """)
    udpKaIntervalSec = property(_pjsua2.AccountNatConfig_udpKaIntervalSec_get, _pjsua2.AccountNatConfig_udpKaIntervalSec_set, doc=r"""
    Set the interval for periodic keep-alive transmission for this account.
    If this value is zero, keep-alive will be disabled for this account.
    The keep-alive transmission will be sent to the registrar's address,
    after successful registration.

    Default: 15 (seconds)
    """)
    udpKaData = property(_pjsua2.AccountNatConfig_udpKaData_get, _pjsua2.AccountNatConfig_udpKaData_set, doc=r"""
    Specify the data to be transmitted as keep-alive packets.

    Default: CR-LF
    """)

    def __init__(self):
        r"""Default constructor"""
        _pjsua2.AccountNatConfig_swiginit(self, _pjsua2.new_AccountNatConfig())

    def readObject(self, node):
        r"""
        Read this object from a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to read values from.
        """
        return _pjsua2.AccountNatConfig_readObject(self, node)

    def writeObject(self, node):
        r"""
        Write this object to a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to write values to.
        """
        return _pjsua2.AccountNatConfig_writeObject(self, node)
    __swig_destroy__ = _pjsua2.delete_AccountNatConfig

# Register AccountNatConfig in _pjsua2:
_pjsua2.AccountNatConfig_swigregister(AccountNatConfig)
class SendRequestParam(object):
    r"""This structure contains parameters for Account::sendRequest()"""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    userData = property(_pjsua2.SendRequestParam_userData_get, _pjsua2.SendRequestParam_userData_set, doc=r"""
    Token or arbitrary user data ownd by the application,
    which will be passed back in callback Account::onSendRequest().
    """)
    method = property(_pjsua2.SendRequestParam_method_get, _pjsua2.SendRequestParam_method_set, doc=r"""SIP method of the request.""")
    txOption = property(_pjsua2.SendRequestParam_txOption_get, _pjsua2.SendRequestParam_txOption_set, doc=r"""
    Message body and/or list of headers etc. to be included in
    the outgoing request.
    """)

    def __init__(self):
        r"""Default constructor initializes with zero/empty values."""
        _pjsua2.SendRequestParam_swiginit(self, _pjsua2.new_SendRequestParam())
    __swig_destroy__ = _pjsua2.delete_SendRequestParam

# Register SendRequestParam in _pjsua2:
_pjsua2.SendRequestParam_swigregister(SendRequestParam)
class SrtpCrypto(object):
    r"""SRTP crypto."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    key = property(_pjsua2.SrtpCrypto_key_get, _pjsua2.SrtpCrypto_key_set, doc=r"""Optional key. If empty, a random key will be autogenerated.""")
    name = property(_pjsua2.SrtpCrypto_name_get, _pjsua2.SrtpCrypto_name_set, doc=r"""Crypto name.""")
    flags = property(_pjsua2.SrtpCrypto_flags_get, _pjsua2.SrtpCrypto_flags_set, doc=r"""Flags, bitmask from #pjmedia_srtp_crypto_option""")

    def __init__(self):
        _pjsua2.SrtpCrypto_swiginit(self, _pjsua2.new_SrtpCrypto())
    __swig_destroy__ = _pjsua2.delete_SrtpCrypto

# Register SrtpCrypto in _pjsua2:
_pjsua2.SrtpCrypto_swigregister(SrtpCrypto)
class SrtpOpt(PersistentObject):
    r"""SRTP settings."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    cryptos = property(_pjsua2.SrtpOpt_cryptos_get, _pjsua2.SrtpOpt_cryptos_set, doc=r"""
    Specify SRTP cryptos. If empty, all crypto will be enabled.
    Available crypto can be enumerated using Endpoint::srtpCryptoEnum().

    Default: empty.
    """)
    keyings = property(_pjsua2.SrtpOpt_keyings_get, _pjsua2.SrtpOpt_keyings_set, doc=r"""
    Specify SRTP keying methods, valid keying method is defined in
    pjmedia_srtp_keying_method. If empty, all keying methods will be
    enabled with priority order: SDES, DTLS-SRTP.

    Default: empty.
    """)

    def __init__(self):
        r"""Default constructor initializes with default values."""
        _pjsua2.SrtpOpt_swiginit(self, _pjsua2.new_SrtpOpt())

    def readObject(self, node):
        r"""
        Read this object from a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to read values from.
        """
        return _pjsua2.SrtpOpt_readObject(self, node)

    def writeObject(self, node):
        r"""
        Write this object to a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to write values to.
        """
        return _pjsua2.SrtpOpt_writeObject(self, node)
    __swig_destroy__ = _pjsua2.delete_SrtpOpt

# Register SrtpOpt in _pjsua2:
_pjsua2.SrtpOpt_swigregister(SrtpOpt)
class RtcpFbCap(object):
    r"""RTCP Feedback capability."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    codecId = property(_pjsua2.RtcpFbCap_codecId_get, _pjsua2.RtcpFbCap_codecId_set, doc=r"""
    Specify the codecs to which the capability is applicable. Codec ID is
    using the same format as in pjmedia_codec_mgr_find_codecs_by_id() and
    pjmedia_vid_codec_mgr_find_codecs_by_id(), e.g: "L16/8000/1", "PCMU",
    "H264". This can also be an asterisk ("*") to represent all codecs.
    """)
    type = property(_pjsua2.RtcpFbCap_type_get, _pjsua2.RtcpFbCap_type_set, doc=r"""Specify the RTCP Feedback type.""")
    typeName = property(_pjsua2.RtcpFbCap_typeName_get, _pjsua2.RtcpFbCap_typeName_set, doc=r"""Specify the type name if RTCP Feedback type is PJMEDIA_RTCP_FB_OTHER.""")
    param = property(_pjsua2.RtcpFbCap_param_get, _pjsua2.RtcpFbCap_param_set, doc=r"""Specify the RTCP Feedback parameters.""")

    def __init__(self):
        r"""Constructor."""
        _pjsua2.RtcpFbCap_swiginit(self, _pjsua2.new_RtcpFbCap())
    __swig_destroy__ = _pjsua2.delete_RtcpFbCap

# Register RtcpFbCap in _pjsua2:
_pjsua2.RtcpFbCap_swigregister(RtcpFbCap)
class RtcpFbConfig(PersistentObject):
    r"""RTCP Feedback settings."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    dontUseAvpf = property(_pjsua2.RtcpFbConfig_dontUseAvpf_get, _pjsua2.RtcpFbConfig_dontUseAvpf_set, doc=r"""
    Specify whether transport protocol in SDP media description uses
    RTP/AVP instead of RTP/AVPF. Note that the standard mandates to signal
    AVPF profile, but it may cause SDP negotiation failure when negotiating
    with endpoints that does not support RTCP Feedback (including older
    version of PJSIP).

    Default: false.
    """)
    caps = property(_pjsua2.RtcpFbConfig_caps_get, _pjsua2.RtcpFbConfig_caps_set, doc=r"""RTCP Feedback capabilities.""")

    def __init__(self):
        r"""Constructor."""
        _pjsua2.RtcpFbConfig_swiginit(self, _pjsua2.new_RtcpFbConfig())

    def readObject(self, node):
        r"""
        Read this object from a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to read values from.
        """
        return _pjsua2.RtcpFbConfig_readObject(self, node)

    def writeObject(self, node):
        r"""
        Write this object to a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to write values to.
        """
        return _pjsua2.RtcpFbConfig_writeObject(self, node)
    __swig_destroy__ = _pjsua2.delete_RtcpFbConfig

# Register RtcpFbConfig in _pjsua2:
_pjsua2.RtcpFbConfig_swigregister(RtcpFbConfig)
class AccountMediaConfig(PersistentObject):
    r"""
    Account media config (applicable for audio, video, and text). This will be
    specified in AccountConfig.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    transportConfig = property(_pjsua2.AccountMediaConfig_transportConfig_get, _pjsua2.AccountMediaConfig_transportConfig_set, doc=r"""
    Media transport (RTP) configuration.

    For *port* and *portRange* settings, RTCP port is selected as
    RTP port+1.
    Example: *port=5000*, *portRange=4*
    - Available ports: 5000, 5002, 5004 (Media/RTP transport)
                       5001, 5003, 5005 (Media/RTCP transport)
    """)
    lockCodecEnabled = property(_pjsua2.AccountMediaConfig_lockCodecEnabled_get, _pjsua2.AccountMediaConfig_lockCodecEnabled_set, doc=r"""
    If remote sends SDP answer containing more than one format or codec in
    the media line, send re-INVITE or UPDATE with just one codec to lock
    which codec to use.

    Default: True (Yes).
    """)
    streamKaEnabled = property(_pjsua2.AccountMediaConfig_streamKaEnabled_get, _pjsua2.AccountMediaConfig_streamKaEnabled_set, doc=r"""
    Specify whether stream keep-alive and NAT hole punching with
    non-codec-VAD mechanism (see PJMEDIA_STREAM_ENABLE_KA) is enabled
    for this account.

    Default: False
    """)
    srtpUse = property(_pjsua2.AccountMediaConfig_srtpUse_get, _pjsua2.AccountMediaConfig_srtpUse_set, doc=r"""
    Specify whether secure media transport should be used for this account.
    Valid values are PJMEDIA_SRTP_DISABLED, PJMEDIA_SRTP_OPTIONAL, and
    PJMEDIA_SRTP_MANDATORY.

    Default: PJSUA_DEFAULT_USE_SRTP
    """)
    srtpSecureSignaling = property(_pjsua2.AccountMediaConfig_srtpSecureSignaling_get, _pjsua2.AccountMediaConfig_srtpSecureSignaling_set, doc=r"""
    Specify whether SRTP requires secure signaling to be used. This option
    is only used when *use_srtp* option above is non-zero.

    Valid values are:
     0: SRTP does not require secure signaling
     1: SRTP requires secure transport such as TLS
     2: SRTP requires secure end-to-end transport (SIPS)

    Default: PJSUA_DEFAULT_SRTP_SECURE_SIGNALING
    """)
    srtpOpt = property(_pjsua2.AccountMediaConfig_srtpOpt_get, _pjsua2.AccountMediaConfig_srtpOpt_set, doc=r"""Specify SRTP settings, like cryptos and keying methods.""")
    ipv6Use = property(_pjsua2.AccountMediaConfig_ipv6Use_get, _pjsua2.AccountMediaConfig_ipv6Use_set, doc=r"""
    Specify whether IPv6 should be used on media.

    Default: PJSUA_IPV6_ENABLED_PREFER_IPV4
    (Dual stack media, capable to use IPv4/IPv6.
    Outgoing offer will prefer to use IPv4)
    """)
    rtcpMuxEnabled = property(_pjsua2.AccountMediaConfig_rtcpMuxEnabled_get, _pjsua2.AccountMediaConfig_rtcpMuxEnabled_set, doc=r"""
    Enable RTP and RTCP multiplexing.
    Default: false
    """)
    rtcpFbConfig = property(_pjsua2.AccountMediaConfig_rtcpFbConfig_get, _pjsua2.AccountMediaConfig_rtcpFbConfig_set, doc=r"""RTCP Feedback settings.""")
    rtcpXrEnabled = property(_pjsua2.AccountMediaConfig_rtcpXrEnabled_get, _pjsua2.AccountMediaConfig_rtcpXrEnabled_set, doc=r"""
    Enable RTCP Extended Report (RTCP XR).

    Default: PJMEDIA_STREAM_ENABLE_XR
    """)
    useLoopMedTp = property(_pjsua2.AccountMediaConfig_useLoopMedTp_get, _pjsua2.AccountMediaConfig_useLoopMedTp_set, doc=r"""
    Use loopback media transport. This may be useful if application
    doesn't want PJSUA2 to create real media transports/sockets, such as
    when using third party media.

    Default: false
    """)
    enableLoopback = property(_pjsua2.AccountMediaConfig_enableLoopback_get, _pjsua2.AccountMediaConfig_enableLoopback_set, doc=r"""
    Enable local loopback when useLoopMedTp is set to TRUE.
    If enabled, packets sent to the transport will be sent back to
    the streams attached to the transport.

    Default: false
    """)

    def __init__(self):
        r"""Default constructor"""
        _pjsua2.AccountMediaConfig_swiginit(self, _pjsua2.new_AccountMediaConfig())

    def readObject(self, node):
        r"""
        Read this object from a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to read values from.
        """
        return _pjsua2.AccountMediaConfig_readObject(self, node)

    def writeObject(self, node):
        r"""
        Write this object to a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to write values to.
        """
        return _pjsua2.AccountMediaConfig_writeObject(self, node)
    __swig_destroy__ = _pjsua2.delete_AccountMediaConfig

# Register AccountMediaConfig in _pjsua2:
_pjsua2.AccountMediaConfig_swigregister(AccountMediaConfig)
class AccountVideoConfig(PersistentObject):
    r"""Account video config. This will be specified in AccountConfig."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    autoShowIncoming = property(_pjsua2.AccountVideoConfig_autoShowIncoming_get, _pjsua2.AccountVideoConfig_autoShowIncoming_set, doc=r"""
    Specify whether incoming video should be shown to screen by default.
    This applies to incoming call (INVITE), incoming re-INVITE, and
    incoming UPDATE requests.

    Regardless of this setting, application can detect incoming video
    by implementing *on_call_media_state()* callback and enumerating
    the media stream(s) with pjsua_call_get_info(). Once incoming
    video is recognised, application may retrieve the window associated
    with the incoming video and show or hide it with
    pjsua_vid_win_set_show().

    Default: False
    """)
    autoTransmitOutgoing = property(_pjsua2.AccountVideoConfig_autoTransmitOutgoing_get, _pjsua2.AccountVideoConfig_autoTransmitOutgoing_set, doc=r"""
    Specify whether outgoing video should be activated by default when
    making outgoing calls and/or when incoming video is detected. This
    applies to incoming and outgoing calls, incoming re-INVITE, and
    incoming UPDATE. If the setting is non-zero, outgoing video
    transmission will be started as soon as response to these requests
    is sent (or received).

    Regardless of the value of this setting, application can start and
    stop outgoing video transmission with pjsua_call_set_vid_strm().

    Default: False
    """)
    windowFlags = property(_pjsua2.AccountVideoConfig_windowFlags_get, _pjsua2.AccountVideoConfig_windowFlags_set, doc=r"""
    Specify video window's flags. The value is a bitmask combination of
    pjmedia_vid_dev_wnd_flag.

    Default: 0
    """)
    defaultCaptureDevice = property(_pjsua2.AccountVideoConfig_defaultCaptureDevice_get, _pjsua2.AccountVideoConfig_defaultCaptureDevice_set, doc=r"""
    Specify the default capture device to be used by this account. If
    vidOutAutoTransmit is enabled, this device will be used for
    capturing video.

    Default: PJMEDIA_VID_DEFAULT_CAPTURE_DEV
    """)
    defaultRenderDevice = property(_pjsua2.AccountVideoConfig_defaultRenderDevice_get, _pjsua2.AccountVideoConfig_defaultRenderDevice_set, doc=r"""
    Specify the default rendering device to be used by this account.

    Default: PJMEDIA_VID_DEFAULT_RENDER_DEV
    """)
    rateControlMethod = property(_pjsua2.AccountVideoConfig_rateControlMethod_get, _pjsua2.AccountVideoConfig_rateControlMethod_set, doc=r"""
    Rate control method.

    Default: PJMEDIA_VID_STREAM_RC_SIMPLE_BLOCKING.
    """)
    rateControlBandwidth = property(_pjsua2.AccountVideoConfig_rateControlBandwidth_get, _pjsua2.AccountVideoConfig_rateControlBandwidth_set, doc=r"""
    Upstream/outgoing bandwidth. If this is set to zero, the video stream
    will use codec maximum bitrate setting.

    Default: 0 (follow codec maximum bitrate).
    """)
    startKeyframeCount = property(_pjsua2.AccountVideoConfig_startKeyframeCount_get, _pjsua2.AccountVideoConfig_startKeyframeCount_set, doc=r"""
    The number of keyframe to be sent after the stream is created.

    Default: PJMEDIA_VID_STREAM_START_KEYFRAME_CNT
    """)
    startKeyframeInterval = property(_pjsua2.AccountVideoConfig_startKeyframeInterval_get, _pjsua2.AccountVideoConfig_startKeyframeInterval_set, doc=r"""
    The keyframe sending interval after the stream is created.

    Default: PJMEDIA_VID_STREAM_START_KEYFRAME_INTERVAL_MSEC
    """)

    def __init__(self):
        r"""Default constructor"""
        _pjsua2.AccountVideoConfig_swiginit(self, _pjsua2.new_AccountVideoConfig())

    def readObject(self, node):
        r"""
        Read this object from a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to read values from.
        """
        return _pjsua2.AccountVideoConfig_readObject(self, node)

    def writeObject(self, node):
        r"""
        Write this object to a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to write values to.
        """
        return _pjsua2.AccountVideoConfig_writeObject(self, node)
    __swig_destroy__ = _pjsua2.delete_AccountVideoConfig

# Register AccountVideoConfig in _pjsua2:
_pjsua2.AccountVideoConfig_swigregister(AccountVideoConfig)
class AccountTextConfig(PersistentObject):
    r"""Account text config. This will be specified in AccountConfig."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    redundancyLevel = property(_pjsua2.AccountTextConfig_redundancyLevel_get, _pjsua2.AccountTextConfig_redundancyLevel_set, doc=r"""
    Specifies text stream redundancy level, as specified in RFC 4103
    and 2198. When redundancy is enabled, each packet transmission
    will contain the current text data as well as a number of the
    previously transmitted text data to provide levels of redundancy.
    This mechanism offers protection against loss of data at the cost
    of additional bandwidth required.

    Value is integer indicating redundancy levels, i.e. the number
    of previous text data to be included with the current packet.
    (0 means disabled/no redundancy).
    A value of 1 provides an adequate protection against an average
    packet loss of up to 50%, while 2 can potentially protect
    against 66.7%.
    The maximum value is determined by PJMEDIA_TXT_STREAM_MAX_RED_LEVELS.

    Note that the redundancy level actually used is subject to remote
    capability and we will opt to use the lower redundancy value based
    on the result of SDP negotiation.

    Default: PJSUA_TXT_DEFAULT_REDUNDANCY_LEVEL (2), as per the
    recommendation of RFC 4103.
    """)

    def __init__(self):
        r"""Default constructor"""
        _pjsua2.AccountTextConfig_swiginit(self, _pjsua2.new_AccountTextConfig())

    def readObject(self, node):
        r"""
        Read this object from a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to read values from.
        """
        return _pjsua2.AccountTextConfig_readObject(self, node)

    def writeObject(self, node):
        r"""
        Write this object to a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to write values to.
        """
        return _pjsua2.AccountTextConfig_writeObject(self, node)
    __swig_destroy__ = _pjsua2.delete_AccountTextConfig

# Register AccountTextConfig in _pjsua2:
_pjsua2.AccountTextConfig_swigregister(AccountTextConfig)
class AccountIpChangeConfig(object):
    r"""Account config specific to IP address change."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    shutdownTp = property(_pjsua2.AccountIpChangeConfig_shutdownTp_get, _pjsua2.AccountIpChangeConfig_shutdownTp_set, doc=r"""
    Shutdown the transport used for account registration. If this is set to
    PJ_TRUE, the transport will be shutdown altough it's used by multiple
    account. Shutdown transport will be followed by re-Registration if
    AccountConfig.natConfig.contactRewriteUse is enabled.

    Default: true
    """)
    hangupCalls = property(_pjsua2.AccountIpChangeConfig_hangupCalls_get, _pjsua2.AccountIpChangeConfig_hangupCalls_set, doc=r"""
    Hangup active calls associated with the acount. If this is set to true,
    then the calls will be hang up.

    Default: false
    """)
    reinviteFlags = property(_pjsua2.AccountIpChangeConfig_reinviteFlags_get, _pjsua2.AccountIpChangeConfig_reinviteFlags_set, doc=r"""
    Specify the call flags used in the re-INVITE when *hangupCalls* is set
    to false. If this is set to 0, no re-INVITE will be sent. The
    re-INVITE will be sent after re-Registration is finished.

    Default: PJSUA_CALL_REINIT_MEDIA | PJSUA_CALL_UPDATE_CONTACT |
             PJSUA_CALL_UPDATE_VIA
    """)
    reinvUseUpdate = property(_pjsua2.AccountIpChangeConfig_reinvUseUpdate_get, _pjsua2.AccountIpChangeConfig_reinvUseUpdate_set, doc=r"""
    For refreshing the call, use SIP UPDATE, instead of re-INVITE, if
    remote supports it (by publishing it in Allow header). If remote
    does not support UPDATE method or somehow the UPDATE attempt fails,
    it will fallback to using re-INVITE. The *reinviteFlags* will be
    used regardless whether it is re-INVITE or UPDATE that is sent.

    Default: PJ_FALSE (using re-INVITE).
    """)
    __swig_destroy__ = _pjsua2.delete_AccountIpChangeConfig

    def readObject(self, node):
        r"""
        Read this object from a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to read values from.
        """
        return _pjsua2.AccountIpChangeConfig_readObject(self, node)

    def writeObject(self, node):
        r"""
        Write this object to a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to write values to.
        """
        return _pjsua2.AccountIpChangeConfig_writeObject(self, node)

    def __init__(self):
        _pjsua2.AccountIpChangeConfig_swiginit(self, _pjsua2.new_AccountIpChangeConfig())

# Register AccountIpChangeConfig in _pjsua2:
_pjsua2.AccountIpChangeConfig_swigregister(AccountIpChangeConfig)
class AccountConfig(PersistentObject):
    r"""Account configuration."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    priority = property(_pjsua2.AccountConfig_priority_get, _pjsua2.AccountConfig_priority_set, doc=r"""
    Account priority, which is used to control the order of matching
    incoming/outgoing requests. The higher the number means the higher
    the priority is, and the account will be matched first.
    """)
    idUri = property(_pjsua2.AccountConfig_idUri_get, _pjsua2.AccountConfig_idUri_set, doc=r"""
    The Address of Record or AOR, that is full SIP URL that identifies the
    account. The value can take name address or URL format, and will look
    something like "sip:account@serviceprovider".

    This field is mandatory.
    """)
    regConfig = property(_pjsua2.AccountConfig_regConfig_get, _pjsua2.AccountConfig_regConfig_set, doc=r"""Registration settings.""")
    sipConfig = property(_pjsua2.AccountConfig_sipConfig_get, _pjsua2.AccountConfig_sipConfig_set, doc=r"""SIP settings.""")
    callConfig = property(_pjsua2.AccountConfig_callConfig_get, _pjsua2.AccountConfig_callConfig_set, doc=r"""Call settings.""")
    presConfig = property(_pjsua2.AccountConfig_presConfig_get, _pjsua2.AccountConfig_presConfig_set, doc=r"""Presence settings.""")
    mwiConfig = property(_pjsua2.AccountConfig_mwiConfig_get, _pjsua2.AccountConfig_mwiConfig_set, doc=r"""MWI (Message Waiting Indication) settings.""")
    natConfig = property(_pjsua2.AccountConfig_natConfig_get, _pjsua2.AccountConfig_natConfig_set, doc=r"""NAT settings.""")
    mediaConfig = property(_pjsua2.AccountConfig_mediaConfig_get, _pjsua2.AccountConfig_mediaConfig_set, doc=r"""Media settings (applicable for audio, video, and text).""")
    videoConfig = property(_pjsua2.AccountConfig_videoConfig_get, _pjsua2.AccountConfig_videoConfig_set, doc=r"""Video settings.""")
    textConfig = property(_pjsua2.AccountConfig_textConfig_get, _pjsua2.AccountConfig_textConfig_set, doc=r"""Text settings.""")
    ipChangeConfig = property(_pjsua2.AccountConfig_ipChangeConfig_get, _pjsua2.AccountConfig_ipChangeConfig_set, doc=r"""IP Change settings.""")

    def __init__(self):
        r"""Default constructor will initialize with default values."""
        _pjsua2.AccountConfig_swiginit(self, _pjsua2.new_AccountConfig())

    def readObject(self, node):
        r"""
        Read this object from a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to read values from.
        """
        return _pjsua2.AccountConfig_readObject(self, node)

    def writeObject(self, node):
        r"""
        Write this object to a container node.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to write values to.
        """
        return _pjsua2.AccountConfig_writeObject(self, node)
    __swig_destroy__ = _pjsua2.delete_AccountConfig

# Register AccountConfig in _pjsua2:
_pjsua2.AccountConfig_swigregister(AccountConfig)
class AccountInfo(object):
    r"""
    Account information. Application can query the account information
    by calling Account::getInfo().
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    id = property(_pjsua2.AccountInfo_id_get, _pjsua2.AccountInfo_id_set, doc=r"""The account ID.""")
    isDefault = property(_pjsua2.AccountInfo_isDefault_get, _pjsua2.AccountInfo_isDefault_set, doc=r"""Flag to indicate whether this is the default account.""")
    uri = property(_pjsua2.AccountInfo_uri_get, _pjsua2.AccountInfo_uri_set, doc=r"""Account URI""")
    regIsConfigured = property(_pjsua2.AccountInfo_regIsConfigured_get, _pjsua2.AccountInfo_regIsConfigured_set, doc=r"""
    Flag to tell whether this account has registration setting
    (reg_uri is not empty).
    """)
    regIsActive = property(_pjsua2.AccountInfo_regIsActive_get, _pjsua2.AccountInfo_regIsActive_set, doc=r"""
    Flag to tell whether this account is currently registered
    (has active registration session).
    """)
    regExpiresSec = property(_pjsua2.AccountInfo_regExpiresSec_get, _pjsua2.AccountInfo_regExpiresSec_set, doc=r"""An up to date expiration interval for account registration session.""")
    regStatus = property(_pjsua2.AccountInfo_regStatus_get, _pjsua2.AccountInfo_regStatus_set, doc=r"""
    Last registration status code. If status code is zero, the account
    is currently not registered. Any other value indicates the SIP
    status code of the registration.
    """)
    regStatusText = property(_pjsua2.AccountInfo_regStatusText_get, _pjsua2.AccountInfo_regStatusText_set, doc=r"""String describing the registration status.""")
    regLastErr = property(_pjsua2.AccountInfo_regLastErr_get, _pjsua2.AccountInfo_regLastErr_set, doc=r"""
    Last registration error code. When the status field contains a SIP
    status code that indicates a registration failure, last registration
    error code contains the error code that causes the failure. In any
    other case, its value is zero.
    """)
    onlineStatus = property(_pjsua2.AccountInfo_onlineStatus_get, _pjsua2.AccountInfo_onlineStatus_set, doc=r"""Presence online status for this account.""")
    onlineStatusText = property(_pjsua2.AccountInfo_onlineStatusText_get, _pjsua2.AccountInfo_onlineStatusText_set, doc=r"""Presence online status text.""")

    def __init__(self):
        r"""Default constructor"""
        _pjsua2.AccountInfo_swiginit(self, _pjsua2.new_AccountInfo())
    __swig_destroy__ = _pjsua2.delete_AccountInfo

# Register AccountInfo in _pjsua2:
_pjsua2.AccountInfo_swigregister(AccountInfo)
class OnIncomingCallParam(object):
    r"""This structure contains parameters for onIncomingCall() account callback."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    callId = property(_pjsua2.OnIncomingCallParam_callId_get, _pjsua2.OnIncomingCallParam_callId_set, doc=r"""The library call ID allocated for the new call.""")
    rdata = property(_pjsua2.OnIncomingCallParam_rdata_get, _pjsua2.OnIncomingCallParam_rdata_set, doc=r"""The incoming INVITE request.""")

    def __init__(self):
        _pjsua2.OnIncomingCallParam_swiginit(self, _pjsua2.new_OnIncomingCallParam())
    __swig_destroy__ = _pjsua2.delete_OnIncomingCallParam

# Register OnIncomingCallParam in _pjsua2:
_pjsua2.OnIncomingCallParam_swigregister(OnIncomingCallParam)
class OnRegStartedParam(object):
    r"""This structure contains parameters for onRegStarted() account callback."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    renew = property(_pjsua2.OnRegStartedParam_renew_get, _pjsua2.OnRegStartedParam_renew_set, doc=r"""True for registration and False for unregistration.""")

    def __init__(self):
        _pjsua2.OnRegStartedParam_swiginit(self, _pjsua2.new_OnRegStartedParam())
    __swig_destroy__ = _pjsua2.delete_OnRegStartedParam

# Register OnRegStartedParam in _pjsua2:
_pjsua2.OnRegStartedParam_swigregister(OnRegStartedParam)
class OnRegStateParam(object):
    r"""This structure contains parameters for onRegState() account callback."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    status = property(_pjsua2.OnRegStateParam_status_get, _pjsua2.OnRegStateParam_status_set, doc=r"""Registration operation status.""")
    code = property(_pjsua2.OnRegStateParam_code_get, _pjsua2.OnRegStateParam_code_set, doc=r"""SIP status code received.""")
    reason = property(_pjsua2.OnRegStateParam_reason_get, _pjsua2.OnRegStateParam_reason_set, doc=r"""SIP reason phrase received.""")
    rdata = property(_pjsua2.OnRegStateParam_rdata_get, _pjsua2.OnRegStateParam_rdata_set, doc=r"""The incoming message.""")
    expiration = property(_pjsua2.OnRegStateParam_expiration_get, _pjsua2.OnRegStateParam_expiration_set, doc=r"""Next expiration interval.""")

    def __init__(self):
        _pjsua2.OnRegStateParam_swiginit(self, _pjsua2.new_OnRegStateParam())
    __swig_destroy__ = _pjsua2.delete_OnRegStateParam

# Register OnRegStateParam in _pjsua2:
_pjsua2.OnRegStateParam_swigregister(OnRegStateParam)
class OnIncomingSubscribeParam(object):
    r"""This structure contains parameters for onIncomingSubscribe() callback."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    srvPres = property(_pjsua2.OnIncomingSubscribeParam_srvPres_get, _pjsua2.OnIncomingSubscribeParam_srvPres_set, doc=r"""
    Server presence subscription instance. If application delays
    the acceptance of the request, it will need to specify this object
    when calling Account::presNotify().
    """)
    fromUri = property(_pjsua2.OnIncomingSubscribeParam_fromUri_get, _pjsua2.OnIncomingSubscribeParam_fromUri_set, doc=r"""Sender URI.""")
    rdata = property(_pjsua2.OnIncomingSubscribeParam_rdata_get, _pjsua2.OnIncomingSubscribeParam_rdata_set, doc=r"""The incoming message.""")
    code = property(_pjsua2.OnIncomingSubscribeParam_code_get, _pjsua2.OnIncomingSubscribeParam_code_set, doc=r"""
    The status code to respond to the request. The default value is 200.
    Application may set this to other final status code to accept or
    reject the request.
    """)
    reason = property(_pjsua2.OnIncomingSubscribeParam_reason_get, _pjsua2.OnIncomingSubscribeParam_reason_set, doc=r"""The reason phrase to respond to the request.""")
    txOption = property(_pjsua2.OnIncomingSubscribeParam_txOption_get, _pjsua2.OnIncomingSubscribeParam_txOption_set, doc=r"""Additional data to be sent with the response, if any.""")

    def __init__(self):
        _pjsua2.OnIncomingSubscribeParam_swiginit(self, _pjsua2.new_OnIncomingSubscribeParam())
    __swig_destroy__ = _pjsua2.delete_OnIncomingSubscribeParam

# Register OnIncomingSubscribeParam in _pjsua2:
_pjsua2.OnIncomingSubscribeParam_swigregister(OnIncomingSubscribeParam)
class OnInstantMessageParam(object):
    r"""Parameters for onInstantMessage() account callback."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    fromUri = property(_pjsua2.OnInstantMessageParam_fromUri_get, _pjsua2.OnInstantMessageParam_fromUri_set, doc=r"""Sender From URI.""")
    toUri = property(_pjsua2.OnInstantMessageParam_toUri_get, _pjsua2.OnInstantMessageParam_toUri_set, doc=r"""To URI of the request.""")
    contactUri = property(_pjsua2.OnInstantMessageParam_contactUri_get, _pjsua2.OnInstantMessageParam_contactUri_set, doc=r"""Contact URI of the sender.""")
    contentType = property(_pjsua2.OnInstantMessageParam_contentType_get, _pjsua2.OnInstantMessageParam_contentType_set, doc=r"""MIME type of the message body.""")
    msgBody = property(_pjsua2.OnInstantMessageParam_msgBody_get, _pjsua2.OnInstantMessageParam_msgBody_set, doc=r"""The message body.""")
    rdata = property(_pjsua2.OnInstantMessageParam_rdata_get, _pjsua2.OnInstantMessageParam_rdata_set, doc=r"""The whole message.""")

    def __init__(self):
        _pjsua2.OnInstantMessageParam_swiginit(self, _pjsua2.new_OnInstantMessageParam())
    __swig_destroy__ = _pjsua2.delete_OnInstantMessageParam

# Register OnInstantMessageParam in _pjsua2:
_pjsua2.OnInstantMessageParam_swigregister(OnInstantMessageParam)
class OnInstantMessageStatusParam(object):
    r"""Parameters for onInstantMessageStatus() account callback."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    userData = property(_pjsua2.OnInstantMessageStatusParam_userData_get, _pjsua2.OnInstantMessageStatusParam_userData_set, doc=r"""
    Token or a user data that was associated with the pager
    transmission.
    """)
    toUri = property(_pjsua2.OnInstantMessageStatusParam_toUri_get, _pjsua2.OnInstantMessageStatusParam_toUri_set, doc=r"""Destination URI.""")
    msgBody = property(_pjsua2.OnInstantMessageStatusParam_msgBody_get, _pjsua2.OnInstantMessageStatusParam_msgBody_set, doc=r"""The message body.""")
    code = property(_pjsua2.OnInstantMessageStatusParam_code_get, _pjsua2.OnInstantMessageStatusParam_code_set, doc=r"""The SIP status code of the transaction.""")
    reason = property(_pjsua2.OnInstantMessageStatusParam_reason_get, _pjsua2.OnInstantMessageStatusParam_reason_set, doc=r"""The reason phrase of the transaction.""")
    rdata = property(_pjsua2.OnInstantMessageStatusParam_rdata_get, _pjsua2.OnInstantMessageStatusParam_rdata_set, doc=r"""
    The incoming response that causes this callback to be called.
    If the transaction fails because of time out or transport error,
    the content will be empty.
    """)

    def __init__(self):
        _pjsua2.OnInstantMessageStatusParam_swiginit(self, _pjsua2.new_OnInstantMessageStatusParam())
    __swig_destroy__ = _pjsua2.delete_OnInstantMessageStatusParam

# Register OnInstantMessageStatusParam in _pjsua2:
_pjsua2.OnInstantMessageStatusParam_swigregister(OnInstantMessageStatusParam)
class OnTypingIndicationParam(object):
    r"""Parameters for onTypingIndication() account callback."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    fromUri = property(_pjsua2.OnTypingIndicationParam_fromUri_get, _pjsua2.OnTypingIndicationParam_fromUri_set, doc=r"""Sender/From URI.""")
    toUri = property(_pjsua2.OnTypingIndicationParam_toUri_get, _pjsua2.OnTypingIndicationParam_toUri_set, doc=r"""To URI.""")
    contactUri = property(_pjsua2.OnTypingIndicationParam_contactUri_get, _pjsua2.OnTypingIndicationParam_contactUri_set, doc=r"""The Contact URI.""")
    isTyping = property(_pjsua2.OnTypingIndicationParam_isTyping_get, _pjsua2.OnTypingIndicationParam_isTyping_set, doc=r"""Boolean to indicate if sender is typing.""")
    rdata = property(_pjsua2.OnTypingIndicationParam_rdata_get, _pjsua2.OnTypingIndicationParam_rdata_set, doc=r"""The whole message buffer.""")

    def __init__(self):
        _pjsua2.OnTypingIndicationParam_swiginit(self, _pjsua2.new_OnTypingIndicationParam())
    __swig_destroy__ = _pjsua2.delete_OnTypingIndicationParam

# Register OnTypingIndicationParam in _pjsua2:
_pjsua2.OnTypingIndicationParam_swigregister(OnTypingIndicationParam)
class OnMwiInfoParam(object):
    r"""Parameters for onMwiInfo() account callback."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    state = property(_pjsua2.OnMwiInfoParam_state_get, _pjsua2.OnMwiInfoParam_state_set, doc=r"""MWI subscription state.""")
    rdata = property(_pjsua2.OnMwiInfoParam_rdata_get, _pjsua2.OnMwiInfoParam_rdata_set, doc=r"""The whole message buffer.""")

    def __init__(self):
        _pjsua2.OnMwiInfoParam_swiginit(self, _pjsua2.new_OnMwiInfoParam())
    __swig_destroy__ = _pjsua2.delete_OnMwiInfoParam

# Register OnMwiInfoParam in _pjsua2:
_pjsua2.OnMwiInfoParam_swigregister(OnMwiInfoParam)
class OnSendRequestParam(object):
    r"""This structure contains parameters for Account::onSendRequest() callback."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    userData = property(_pjsua2.OnSendRequestParam_userData_get, _pjsua2.OnSendRequestParam_userData_set, doc=r"""
    Token or arbitrary user data owned by the application,
    which was passed to Endpoint::sendRquest() function.
    """)
    e = property(_pjsua2.OnSendRequestParam_e_get, _pjsua2.OnSendRequestParam_e_set, doc=r"""Transaction event that caused the state change.""")

    def __init__(self):
        _pjsua2.OnSendRequestParam_swiginit(self, _pjsua2.new_OnSendRequestParam())
    __swig_destroy__ = _pjsua2.delete_OnSendRequestParam

# Register OnSendRequestParam in _pjsua2:
_pjsua2.OnSendRequestParam_swigregister(OnSendRequestParam)
class AuthChallenge(object):
    r"""
    Represents a pending authentication challenge.
    Call respond() to resend with authentication, or abandon() to give up.
    If neither is called before the callback returns, the library handles
    authentication automatically using configured credentials (sync path).

    For async use, call defer() during the callback to obtain a heap-allocated
    AuthChallenge that can be used later. The caller owns the returned object.

    Each AuthChallenge is single-use: once consumed by respond(), abandon(),
    or defer(), further calls return PJ_EINVALIDOP (defer() throws Error).

    Thread safety: on a deferred object, respond() and abandon() must be called
    from a pjlib-registered thread. The non-deferred object must only be used
    during the onAuthChallenge() callback.

    GC note (Python/Java): The destructor calls pjsip APIs which require a
    pjlib-registered thread. Since garbage collectors may run destructor/
    Release() on an unregistered finalizer thread, you MUST explicitly call
    respond(), abandon(), or delete/Release() on the deferred object from a
    pjlib-registered thread. Do NOT let the GC collect it implicitly.
    See https://docs.pjsip.org/en/latest/pjsua2/general_concept.html#problems-with-garbage-collection
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def __init__(self):
        _pjsua2.AuthChallenge_swiginit(self, _pjsua2.new_AuthChallenge())
    __swig_destroy__ = _pjsua2.delete_AuthChallenge

    def defer(self):
        r"""
        Defer the challenge for asynchronous handling. Creates a new
        heap-allocated AuthChallenge that can be used after the callback
        returns. The caller owns the returned object and must eventually
        call respond() or abandon() on it (or simply delete it, which
        auto-abandons).

        Must be called during the onAuthChallenge() callback. After this
        call, the original AuthChallenge becomes invalid.

        :rtype: :py:class:`AuthChallenge`
        :return: New heap-allocated AuthChallenge (caller owns).
        """
        return _pjsua2.AuthChallenge_defer(self)

    def respond(self, *args):
        r"""
        *Overload 1:*

        Respond to the authentication challenge by building and sending
        an authenticated request. Uses credentials currently configured
        on the auth session.

        :rtype: int
        :return: PJ_SUCCESS on success, or PJ_EINVALIDOP if already
                             consumed by a prior respond()/abandon()/defer() call.

        |

        *Overload 2:*

        Respond with provided credentials. Sets them on the account-level
        shared auth session before building the authenticated request.
        Note that this permanently replaces the account's credentials,
        affecting all subsequent authentication for the account.

        :type creds: :py:class:`AuthCredInfoVector`
        :param creds:     Credentials to set on the auth session.
        :rtype: int
        :return: PJ_SUCCESS on success.
        """
        return _pjsua2.AuthChallenge_respond(self, *args)

    def abandon(self):
        r"""
        Abandon the authentication challenge. The pending request will
        not be resent.

        :rtype: int
        :return: PJ_SUCCESS on success, or PJ_EINVALIDOP if already
                             consumed by a prior respond()/abandon()/defer() call.
        """
        return _pjsua2.AuthChallenge_abandon(self)

    def isValid(self):
        r"""
        Check whether this challenge object is still valid (not yet
        consumed by respond() or abandon(), and the associated account
        is still active).

        Note: this is an advisory check without synchronization.
        The result may be stale if another thread concurrently
        deletes the account.

        :rtype: boolean
        :return: true if valid.
        """
        return _pjsua2.AuthChallenge_isValid(self)

# Register AuthChallenge in _pjsua2:
_pjsua2.AuthChallenge_swigregister(AuthChallenge)
class OnAuthChallengeParam(object):
    r"""Parameters for Account::onAuthChallenge() callback."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    accId = property(_pjsua2.OnAuthChallengeParam_accId_get, _pjsua2.OnAuthChallengeParam_accId_set, doc=r"""Account ID associated with the challenged request.""")
    callId = property(_pjsua2.OnAuthChallengeParam_callId_get, _pjsua2.OnAuthChallengeParam_callId_set, doc=r"""Call ID, or PJSUA_INVALID_ID for non-call requests.""")
    rdata = property(_pjsua2.OnAuthChallengeParam_rdata_get, _pjsua2.OnAuthChallengeParam_rdata_set, doc=r"""The 401/407 response containing the challenge.""")
    challenge = property(_pjsua2.OnAuthChallengeParam_challenge_get, doc=r"""The authentication challenge. Call respond() or abandon().""")

    def __init__(self):
        _pjsua2.OnAuthChallengeParam_swiginit(self, _pjsua2.new_OnAuthChallengeParam())
    __swig_destroy__ = _pjsua2.delete_OnAuthChallengeParam

# Register OnAuthChallengeParam in _pjsua2:
_pjsua2.OnAuthChallengeParam_swigregister(OnAuthChallengeParam)
class PresNotifyParam(object):
    r"""Parameters for presNotify() account method."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    srvPres = property(_pjsua2.PresNotifyParam_srvPres_get, _pjsua2.PresNotifyParam_srvPres_set, doc=r"""Server presence subscription instance.""")
    state = property(_pjsua2.PresNotifyParam_state_get, _pjsua2.PresNotifyParam_state_set, doc=r"""Server presence subscription state to set.""")
    stateStr = property(_pjsua2.PresNotifyParam_stateStr_get, _pjsua2.PresNotifyParam_stateStr_set, doc=r"""
    Optionally specify the state string name, if state is not "active",
    "pending", or "terminated".
    """)
    reason = property(_pjsua2.PresNotifyParam_reason_get, _pjsua2.PresNotifyParam_reason_set, doc=r"""
    If the new state is PJSIP_EVSUB_STATE_TERMINATED, optionally specify
    the termination reason.
    """)
    withBody = property(_pjsua2.PresNotifyParam_withBody_get, _pjsua2.PresNotifyParam_withBody_set, doc=r"""
    If the new state is PJSIP_EVSUB_STATE_TERMINATED, this specifies
    whether the NOTIFY request should contain message body containing
    account's presence information.
    """)
    txOption = property(_pjsua2.PresNotifyParam_txOption_get, _pjsua2.PresNotifyParam_txOption_set, doc=r"""Optional list of headers to be sent with the NOTIFY request.""")

    def __init__(self):
        _pjsua2.PresNotifyParam_swiginit(self, _pjsua2.new_PresNotifyParam())
    __swig_destroy__ = _pjsua2.delete_PresNotifyParam

# Register PresNotifyParam in _pjsua2:
_pjsua2.PresNotifyParam_swigregister(PresNotifyParam)
class FindBuddyMatch(object):
    r"""
    Wrapper class for Buddy matching algo.

    Default algo is a simple substring lookup of search-token in the
    Buddy URIs, with case sensitive. Application can implement its own
    matching algo by overriding this class and specifying its instance
    in Account::findBuddy().
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def match(self, token, buddy):
        r"""Default algo implementation."""
        return _pjsua2.FindBuddyMatch_match(self, token, buddy)
    __swig_destroy__ = _pjsua2.delete_FindBuddyMatch

    def __init__(self):
        if self.__class__ == FindBuddyMatch:
            _self = None
        else:
            _self = self
        _pjsua2.FindBuddyMatch_swiginit(self, _pjsua2.new_FindBuddyMatch(_self, ))
    def __disown__(self):
        self.this.disown()
        _pjsua2.disown_FindBuddyMatch(self)
        return weakref.proxy(self)

# Register FindBuddyMatch in _pjsua2:
_pjsua2.FindBuddyMatch_swigregister(FindBuddyMatch)
class DeferredResponse(object):
    r"""
    This class is used to store the received parsed SIP MESSAGE request and
    its transaction for use in sendResponse().
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def __init__(self, *args):
        r"""
        *Overload 1:*

        Constructor that clones the rx_data and keeps a non-owning pointer
        to the transaction.
        :type param: :py:class:`OnInstantMessageParam`
        :param param:        The instant message parameters from the callback.

        |

        *Overload 2:*

        Constructs an empty object. Must be assigned to before use.

        |

        *Overload 3:*

        Copies the deferred response object by cloning the rx_data.
        """
        _pjsua2.DeferredResponse_swiginit(self, _pjsua2.new_DeferredResponse(*args))
    __swig_destroy__ = _pjsua2.delete_DeferredResponse

# Register DeferredResponse in _pjsua2:
_pjsua2.DeferredResponse_swigregister(DeferredResponse)
class SendResponseParam(object):
    r"""Parameters for Account::sendResponse()."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    deferredResponse = property(_pjsua2.SendResponseParam_deferredResponse_get, _pjsua2.SendResponseParam_deferredResponse_set, doc=r"""Deferred response object, which is valid until the response is sent.""")
    code = property(_pjsua2.SendResponseParam_code_get, _pjsua2.SendResponseParam_code_set, doc=r"""Status code of the response.""")
    reason = property(_pjsua2.SendResponseParam_reason_get, _pjsua2.SendResponseParam_reason_set, doc=r"""Optional reason phrase of the response.""")

    def __init__(self):
        _pjsua2.SendResponseParam_swiginit(self, _pjsua2.new_SendResponseParam())
    __swig_destroy__ = _pjsua2.delete_SendResponseParam

# Register SendResponseParam in _pjsua2:
_pjsua2.SendResponseParam_swigregister(SendResponseParam)
class AccountShutdownParam(object):
    r"""Parameters for Account::shutdown2()."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    force = property(_pjsua2.AccountShutdownParam_force_get, _pjsua2.AccountShutdownParam_force_set, doc=r"""
    If true, the account will always be deleted even when there are
    active calls using it (a warning will be logged). If false, the
    function will throw an Error with PJ_EBUSY when active calls exist.

    Default: false
    """)

    def __init__(self):
        r"""Default constructor"""
        _pjsua2.AccountShutdownParam_swiginit(self, _pjsua2.new_AccountShutdownParam())
    __swig_destroy__ = _pjsua2.delete_AccountShutdownParam

# Register AccountShutdownParam in _pjsua2:
_pjsua2.AccountShutdownParam_swigregister(AccountShutdownParam)
class Account(object):
    r"""Account."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def __init__(self):
        r"""Constructor."""
        if self.__class__ == Account:
            _self = None
        else:
            _self = self
        _pjsua2.Account_swiginit(self, _pjsua2.new_Account(_self, ))
    __swig_destroy__ = _pjsua2.delete_Account

    def create(self, cfg, make_default=False):
        r"""
        Create the account.

        If application implements a derived class, the derived class should
        call shutdown() in the beginning stage in its destructor, or
        alternatively application should call shutdown() before deleting
        the derived class instance. This is to avoid race condition between
        the derived class destructor and Account callbacks.

        :type cfg: :py:class:`AccountConfig`
        :param cfg:               The account config.
        :type make_default: boolean, optional
        :param make_default:      Make this the default account.
        """
        return _pjsua2.Account_create(self, cfg, make_default)

    def shutdown(self):
        r"""
        Shutdown the account. This will always delete the account
        (force=true), initiating unregistration if needed, and deleting the
        corresponding account in the PJSUA-LIB. Active calls will not
        prevent deletion; a warning will be logged if any exist.

        This method does not throw an exception. Any error will be logged
        internally. For safer behavior that checks for active calls, use
        shutdown2() instead.

        Note that application must delete all Buddy instances belong to this
        account before shutting down the account.

        If application implements a derived class, the derived class should
        call this method in the beginning stage in its destructor, or
        alternatively application should call this method before deleting
        the derived class instance. This is to avoid race condition between
        the derived class destructor and Account callbacks.
        """
        return _pjsua2.Account_shutdown(self)

    def shutdown2(self, prm):
        r"""
        Shutdown the account, with additional options. This will initiate
        unregistration if needed, and delete the corresponding account in
        the PJSUA-LIB.

        Unlike shutdown(), this method throws an Error exception on failure.
        By default (force=false), if there are active calls still using this
        account, it will throw an Error with PJ_EBUSY status. Set force=true
        to always delete the account regardless.

        :type prm: :py:class:`AccountShutdownParam`
        :param prm:               Shutdown parameters.
        """
        return _pjsua2.Account_shutdown2(self, prm)

    def modify(self, cfg):
        r"""
        Modify the account to use the specified account configuration.
        Depending on the changes, this may cause unregistration or
        reregistration on the account.

        :type cfg: :py:class:`AccountConfig`
        :param cfg:               New account config to be applied to the
                                     account.
        """
        return _pjsua2.Account_modify(self, cfg)

    def isValid(self):
        r"""
        Check if this account is still valid.

        :rtype: boolean
        :return: True if it is.
        """
        return _pjsua2.Account_isValid(self)

    def setDefault(self):
        r"""
        Set this as default account to be used when incoming and outgoing
        requests don't match any accounts.
        """
        return _pjsua2.Account_setDefault(self)

    def isDefault(self):
        r"""
        Check if this account is the default account. Default account will be
        used for incoming and outgoing requests that don't match any other
        accounts.

        :rtype: boolean
        :return: True if this is the default account.
        """
        return _pjsua2.Account_isDefault(self)

    def getId(self):
        r"""
        Get PJSUA-LIB account ID or index associated with this account.

        :rtype: int
        :return: Integer greater than or equal to zero.
        """
        return _pjsua2.Account_getId(self)

    @staticmethod
    def lookup(acc_id):
        r"""
        Get the Account class for the specified account Id.

        :type acc_id: int
        :param acc_id:            The account ID to lookup

        :rtype: :py:class:`Account`
        :return: The Account instance or NULL if not found.
        """
        return _pjsua2.Account_lookup(acc_id)

    def getInfo(self):
        r"""
        Get account info.

        :rtype: :py:class:`AccountInfo`
        :return: Account info.
        """
        return _pjsua2.Account_getInfo(self)

    def sendRequest(self, prm):
        r"""
        Send arbitrary requests using the account. Application should only use
        this function to create auxiliary requests outside dialog, such as
        OPTIONS, and use the call or presence API to create dialog related
        requests.

        :param prm.method:    SIP method of the request.
        :param prm.txOption:  Optional message body and/or list of headers to be
                                 included in outgoing request.
        """
        return _pjsua2.Account_sendRequest(self, prm)

    def sendResponse(self, prm):
        r"""
        Send response for incoming request that was deferred earlier
        using DeferredResponse object.

        :type prm: :py:class:`SendResponseParam`
        :param prm:                   The response's parameters.
        :param prm.deferredResponse:  The deferred response object
                                         identifying the incoming request to
                                         respond to.
        :param prm.code:              The status code of the response.
        :param prm.reason:            Optional reason phrase of the response.
        """
        return _pjsua2.Account_sendResponse(self, prm)

    def setRegistration(self, renew):
        r"""
        Update registration or perform unregistration. Application normally
        only needs to call this function if it wants to manually update the
        registration or to unregister from the server.

        :type renew: boolean
        :param renew:             If False, this will start unregistration
                                     process.
        """
        return _pjsua2.Account_setRegistration(self, renew)

    def setOnlineStatus(self, pres_st):
        r"""
        Set or modify account's presence online status to be advertised to
        remote/presence subscribers. This would trigger the sending of
        outgoing NOTIFY request if there are server side presence subscription
        for this account, and/or outgoing PUBLISH if presence publication is
        enabled for this account.

        :type pres_st: :py:class:`PresenceStatus`
        :param pres_st:           Presence online status.
        """
        return _pjsua2.Account_setOnlineStatus(self, pres_st)

    def setTransport(self, tp_id):
        r"""
        Lock/bind this account to a specific transport/listener. Normally
        application shouldn't need to do this, as transports will be selected
        automatically by the library according to the destination.

        When account is locked/bound to a specific transport, all outgoing
        requests from this account will use the specified transport (this
        includes SIP registration, dialog (call and event subscription), and
        out-of-dialog requests such as MESSAGE).

        Note that transport id may be specified in AccountConfig too.

        :type tp_id: int
        :param tp_id:             The transport ID.
        """
        return _pjsua2.Account_setTransport(self, tp_id)

    def presNotify(self, prm):
        r"""
        Send NOTIFY to inform account presence status or to terminate server
        side presence subscription. If application wants to reject the incoming
        request, it should set the param *PresNotifyParam.state* to
        PJSIP_EVSUB_STATE_TERMINATED.

        :type prm: :py:class:`PresNotifyParam`
        :param prm:               The sending NOTIFY parameter.
        """
        return _pjsua2.Account_presNotify(self, prm)

    def enumBuddies2(self):
        r"""
        Enumerate all buddies of the account.

        :rtype: :py:class:`BuddyVector2`
        :return: The buddy list.
        """
        return _pjsua2.Account_enumBuddies2(self)

    def findBuddy2(self, uri):
        r"""
        Find a buddy in the buddy list with the specified URI.

        Exception: if buddy is not found, PJ_ENOTFOUND will be thrown.

        :type uri: string
        :param uri:               The buddy URI.

        :rtype: :py:class:`Buddy`
        :return: The pointer to buddy.
        """
        return _pjsua2.Account_findBuddy2(self, uri)

    def onIncomingCall(self, prm):
        r"""
        Notify application on incoming call.

        :type prm: :py:class:`OnIncomingCallParam`
        :param prm:       Callback parameter.
        """
        return _pjsua2.Account_onIncomingCall(self, prm)

    def onRegStarted(self, prm):
        r"""
        Notify application when registration or unregistration has been
        initiated. Note that this only notifies the initial registration
        and unregistration. Once registration session is active, subsequent
        refresh will not cause this callback to be called.

        :type prm: :py:class:`OnRegStartedParam`
        :param prm:           Callback parameter.
        """
        return _pjsua2.Account_onRegStarted(self, prm)

    def onRegState(self, prm):
        r"""
        Notify application when registration status has changed.
        Application may then query the account info to get the
        registration details.

        :type prm: :py:class:`OnRegStateParam`
        :param prm:           Callback parameter.
        """
        return _pjsua2.Account_onRegState(self, prm)

    def onIncomingSubscribe(self, prm):
        r"""
        Notification when incoming SUBSCRIBE request is received. Application
        may use this callback to authorize the incoming subscribe request
        (e.g. ask user permission if the request should be granted).

        If this callback is not implemented, all incoming presence subscription
        requests will be accepted.

        If this callback is implemented, application has several choices on
        what to do with the incoming request:
         - it may reject the request immediately by specifying non-200 class
           final response in the IncomingSubscribeParam.code parameter.
         - it may immediately accept the request by specifying 200 as the
           IncomingSubscribeParam.code parameter. This is the default value if
           application doesn't set any value to the IncomingSubscribeParam.code
           parameter. In this case, the library will automatically send NOTIFY
           request upon returning from this callback.
         - it may delay the processing of the request, for example to request
           user permission whether to accept or reject the request. In this
           case, the application MUST set the IncomingSubscribeParam.code
           argument to 202, then IMMEDIATELY calls presNotify() with
           state PJSIP_EVSUB_STATE_PENDING and later calls presNotify()
           again to accept or reject the subscription request.

        Any IncomingSubscribeParam.code other than 200 and 202 will be treated
        as 200.

        Application MUST return from this callback immediately (e.g. it must
        not block in this callback while waiting for user confirmation).

        :type prm: :py:class:`OnIncomingSubscribeParam`
        :param prm:           Callback parameter.
        """
        return _pjsua2.Account_onIncomingSubscribe(self, prm)

    def onInstantMessage(self, prm):
        r"""
        Notify application on incoming instant message or pager (i.e. MESSAGE
        request) that was received outside call context.

        :type prm: :py:class:`OnInstantMessageParam`
        :param prm:           Callback parameter.
        """
        return _pjsua2.Account_onInstantMessage(self, prm)

    def onInstantMessageStatus(self, prm):
        r"""
        Notify application about the delivery status of outgoing pager/instant
        message (i.e. MESSAGE) request.

        :type prm: :py:class:`OnInstantMessageStatusParam`
        :param prm:           Callback parameter.
        """
        return _pjsua2.Account_onInstantMessageStatus(self, prm)

    def onSendRequest(self, prm):
        r"""
        Notify application when a transaction started by Account::sendRequest()
        has been completed,i.e. when a response has been received.

        :type prm: :py:class:`OnSendRequestParam`
        :param prm:       Callback parameter.
        """
        return _pjsua2.Account_onSendRequest(self, prm)

    def onTypingIndication(self, prm):
        r"""
        Notify application about typing indication.

        :type prm: :py:class:`OnTypingIndicationParam`
        :param prm:           Callback parameter.
        """
        return _pjsua2.Account_onTypingIndication(self, prm)

    def onMwiInfo(self, prm):
        r"""
        Notification about MWI (Message Waiting Indication) status change.
        This callback can be called upon the status change of the
        SUBSCRIBE request (for example, 202/Accepted to SUBSCRIBE is received)
        or when a NOTIFY reqeust is received.

        :type prm: :py:class:`OnMwiInfoParam`
        :param prm:           Callback parameter.
        """
        return _pjsua2.Account_onMwiInfo(self, prm)

    def onAuthChallenge(self, prm):
        r"""
        Called when a 401/407 challenge is received. Override to handle
        authentication challenges. Three usage patterns are supported:

        - Synchronous: call prm.challenge.respond() or
          prm.challenge.respond(creds) directly within this callback.
        - Asynchronous: call prm.challenge.defer() to obtain a
          heap-allocated AuthChallenge, then call respond() or abandon()
          on it later from any context. The caller owns the returned object.
        - Default: if neither respond(), abandon(), nor defer() is called,
          the library handles authentication automatically using configured
          credentials.

        :type prm: :py:class:`OnAuthChallengeParam`
        :param prm:       Callback parameter.

        See also: AuthChallenge
        See also: OnAuthChallengeParam
        """
        return _pjsua2.Account_onAuthChallenge(self, prm)
    def __disown__(self):
        self.this.disown()
        _pjsua2.disown_Account(self)
        return weakref.proxy(self)

# Register Account in _pjsua2:
_pjsua2.Account_swigregister(Account)
class MathStat(object):
    r"""This structure describes statistics state."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    n = property(_pjsua2.MathStat_n_get, _pjsua2.MathStat_n_set, doc=r"""number of samples""")
    max = property(_pjsua2.MathStat_max_get, _pjsua2.MathStat_max_set, doc=r"""maximum value""")
    min = property(_pjsua2.MathStat_min_get, _pjsua2.MathStat_min_set, doc=r"""minimum value""")
    last = property(_pjsua2.MathStat_last_get, _pjsua2.MathStat_last_set, doc=r"""last value""")
    mean = property(_pjsua2.MathStat_mean_get, _pjsua2.MathStat_mean_set, doc=r"""mean""")

    def __init__(self):
        r"""Default constructor"""
        _pjsua2.MathStat_swiginit(self, _pjsua2.new_MathStat())
    __swig_destroy__ = _pjsua2.delete_MathStat

# Register MathStat in _pjsua2:
_pjsua2.MathStat_swigregister(MathStat)
class LossType(object):
    r"""Types of loss detected."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    burst = property(_pjsua2.LossType_burst_get, _pjsua2.LossType_burst_set, doc=r"""Burst/sequential packet lost detected""")
    random = property(_pjsua2.LossType_random_get, _pjsua2.LossType_random_set, doc=r"""Random packet lost detected.""")

    def __init__(self):
        _pjsua2.LossType_swiginit(self, _pjsua2.new_LossType())
    __swig_destroy__ = _pjsua2.delete_LossType

# Register LossType in _pjsua2:
_pjsua2.LossType_swigregister(LossType)
class RtcpStreamStat(object):
    r"""Unidirectional RTP stream statistics."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    update = property(_pjsua2.RtcpStreamStat_update_get, _pjsua2.RtcpStreamStat_update_set, doc=r"""Time of last update.""")
    updateCount = property(_pjsua2.RtcpStreamStat_updateCount_get, _pjsua2.RtcpStreamStat_updateCount_set, doc=r"""Number of updates (to calculate avg)""")
    pkt = property(_pjsua2.RtcpStreamStat_pkt_get, _pjsua2.RtcpStreamStat_pkt_set, doc=r"""Total number of packets""")
    bytes = property(_pjsua2.RtcpStreamStat_bytes_get, _pjsua2.RtcpStreamStat_bytes_set, doc=r"""Total number of payload/bytes""")
    discard = property(_pjsua2.RtcpStreamStat_discard_get, _pjsua2.RtcpStreamStat_discard_set, doc=r"""Total number of discarded packets.""")
    loss = property(_pjsua2.RtcpStreamStat_loss_get, _pjsua2.RtcpStreamStat_loss_set, doc=r"""Total number of packets lost""")
    reorder = property(_pjsua2.RtcpStreamStat_reorder_get, _pjsua2.RtcpStreamStat_reorder_set, doc=r"""Total number of out of order packets""")
    dup = property(_pjsua2.RtcpStreamStat_dup_get, _pjsua2.RtcpStreamStat_dup_set, doc=r"""Total number of duplicates packets""")
    lossPeriodUsec = property(_pjsua2.RtcpStreamStat_lossPeriodUsec_get, _pjsua2.RtcpStreamStat_lossPeriodUsec_set, doc=r"""Loss period statistics""")
    lossType = property(_pjsua2.RtcpStreamStat_lossType_get, _pjsua2.RtcpStreamStat_lossType_set, doc=r"""Types of loss detected.""")
    jitterUsec = property(_pjsua2.RtcpStreamStat_jitterUsec_get, _pjsua2.RtcpStreamStat_jitterUsec_set, doc=r"""Jitter statistics""")

    def __init__(self):
        _pjsua2.RtcpStreamStat_swiginit(self, _pjsua2.new_RtcpStreamStat())
    __swig_destroy__ = _pjsua2.delete_RtcpStreamStat

# Register RtcpStreamStat in _pjsua2:
_pjsua2.RtcpStreamStat_swigregister(RtcpStreamStat)
class RtcpSdes(object):
    r"""RTCP SDES structure."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    cname = property(_pjsua2.RtcpSdes_cname_get, _pjsua2.RtcpSdes_cname_set, doc=r"""RTCP SDES type CNAME.""")
    name = property(_pjsua2.RtcpSdes_name_get, _pjsua2.RtcpSdes_name_set, doc=r"""RTCP SDES type NAME.""")
    email = property(_pjsua2.RtcpSdes_email_get, _pjsua2.RtcpSdes_email_set, doc=r"""RTCP SDES type EMAIL.""")
    phone = property(_pjsua2.RtcpSdes_phone_get, _pjsua2.RtcpSdes_phone_set, doc=r"""RTCP SDES type PHONE.""")
    loc = property(_pjsua2.RtcpSdes_loc_get, _pjsua2.RtcpSdes_loc_set, doc=r"""RTCP SDES type LOC.""")
    tool = property(_pjsua2.RtcpSdes_tool_get, _pjsua2.RtcpSdes_tool_set, doc=r"""RTCP SDES type TOOL.""")
    note = property(_pjsua2.RtcpSdes_note_get, _pjsua2.RtcpSdes_note_set, doc=r"""RTCP SDES type NOTE.""")

    def __init__(self):
        _pjsua2.RtcpSdes_swiginit(self, _pjsua2.new_RtcpSdes())
    __swig_destroy__ = _pjsua2.delete_RtcpSdes

# Register RtcpSdes in _pjsua2:
_pjsua2.RtcpSdes_swigregister(RtcpSdes)
class RtcpStat(object):
    r"""Bidirectional RTP stream statistics."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    start = property(_pjsua2.RtcpStat_start_get, _pjsua2.RtcpStat_start_set, doc=r"""Time when session was created""")
    txStat = property(_pjsua2.RtcpStat_txStat_get, _pjsua2.RtcpStat_txStat_set, doc=r"""Encoder stream statistics.""")
    rxStat = property(_pjsua2.RtcpStat_rxStat_get, _pjsua2.RtcpStat_rxStat_set, doc=r"""Decoder stream statistics.""")
    rttUsec = property(_pjsua2.RtcpStat_rttUsec_get, _pjsua2.RtcpStat_rttUsec_set, doc=r"""Round trip delay statistic.""")
    rtpTxLastTs = property(_pjsua2.RtcpStat_rtpTxLastTs_get, _pjsua2.RtcpStat_rtpTxLastTs_set, doc=r"""Last TX RTP timestamp.""")
    rtpTxLastSeq = property(_pjsua2.RtcpStat_rtpTxLastSeq_get, _pjsua2.RtcpStat_rtpTxLastSeq_set, doc=r"""Last TX RTP sequence.""")
    rxIpdvUsec = property(_pjsua2.RtcpStat_rxIpdvUsec_get, _pjsua2.RtcpStat_rxIpdvUsec_set, doc=r"""
    Statistics of IP packet delay
                                                variation in receiving
                                                direction. It is only used when
                                                PJMEDIA_RTCP_STAT_HAS_IPDV is
                                                set to non-zero.
    """)
    rxRawJitterUsec = property(_pjsua2.RtcpStat_rxRawJitterUsec_get, _pjsua2.RtcpStat_rxRawJitterUsec_set, doc=r"""
    Statistic of raw jitter in
                                                receiving direction. It is only
                                                used when
                                                PJMEDIA_RTCP_STAT_HAS_RAW_JITTER
                                                is set to non-zero.
    """)
    peerSdes = property(_pjsua2.RtcpStat_peerSdes_get, _pjsua2.RtcpStat_peerSdes_set, doc=r"""Peer SDES.""")

    def __init__(self):
        _pjsua2.RtcpStat_swiginit(self, _pjsua2.new_RtcpStat())
    __swig_destroy__ = _pjsua2.delete_RtcpStat

# Register RtcpStat in _pjsua2:
_pjsua2.RtcpStat_swigregister(RtcpStat)
class JbufState(object):
    r"""This structure describes jitter buffer state."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    frameSize = property(_pjsua2.JbufState_frameSize_get, _pjsua2.JbufState_frameSize_set, doc=r"""Individual frame size, in bytes.""")
    minPrefetch = property(_pjsua2.JbufState_minPrefetch_get, _pjsua2.JbufState_minPrefetch_set, doc=r"""Minimum allowed prefetch, in frms.""")
    maxPrefetch = property(_pjsua2.JbufState_maxPrefetch_get, _pjsua2.JbufState_maxPrefetch_set, doc=r"""Maximum allowed prefetch, in frms.""")
    burst = property(_pjsua2.JbufState_burst_get, _pjsua2.JbufState_burst_set, doc=r"""Current burst level, in frames""")
    prefetch = property(_pjsua2.JbufState_prefetch_get, _pjsua2.JbufState_prefetch_set, doc=r"""Current prefetch value, in frames""")
    size = property(_pjsua2.JbufState_size_get, _pjsua2.JbufState_size_set, doc=r"""Current buffer size, in frames.""")
    avgDelayMsec = property(_pjsua2.JbufState_avgDelayMsec_get, _pjsua2.JbufState_avgDelayMsec_set, doc=r"""Average delay, in ms.""")
    minDelayMsec = property(_pjsua2.JbufState_minDelayMsec_get, _pjsua2.JbufState_minDelayMsec_set, doc=r"""Minimum delay, in ms.""")
    maxDelayMsec = property(_pjsua2.JbufState_maxDelayMsec_get, _pjsua2.JbufState_maxDelayMsec_set, doc=r"""Maximum delay, in ms.""")
    devDelayMsec = property(_pjsua2.JbufState_devDelayMsec_get, _pjsua2.JbufState_devDelayMsec_set, doc=r"""Standard deviation of delay, in ms.""")
    avgBurst = property(_pjsua2.JbufState_avgBurst_get, _pjsua2.JbufState_avgBurst_set, doc=r"""Average burst, in frames.""")
    lost = property(_pjsua2.JbufState_lost_get, _pjsua2.JbufState_lost_set, doc=r"""Number of lost frames.""")
    discard = property(_pjsua2.JbufState_discard_get, _pjsua2.JbufState_discard_set, doc=r"""Number of discarded frames.""")
    empty = property(_pjsua2.JbufState_empty_get, _pjsua2.JbufState_empty_set, doc=r"""Number of empty on GET events.""")

    def __init__(self):
        _pjsua2.JbufState_swiginit(self, _pjsua2.new_JbufState())
    __swig_destroy__ = _pjsua2.delete_JbufState

# Register JbufState in _pjsua2:
_pjsua2.JbufState_swigregister(JbufState)
class SdpSession(object):
    r"""
    This structure describes SDP session description. It corresponds to the
    pjmedia_sdp_session structure.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    wholeSdp = property(_pjsua2.SdpSession_wholeSdp_get, _pjsua2.SdpSession_wholeSdp_set, doc=r"""The whole SDP as a string.""")
    pjSdpSession = property(_pjsua2.SdpSession_pjSdpSession_get, _pjsua2.SdpSession_pjSdpSession_set, doc=r"""
    Pointer to its original pjmedia_sdp_session. Only valid when the struct
    is converted from PJSIP's pjmedia_sdp_session.
    """)

    def __init__(self):
        _pjsua2.SdpSession_swiginit(self, _pjsua2.new_SdpSession())
    __swig_destroy__ = _pjsua2.delete_SdpSession

# Register SdpSession in _pjsua2:
_pjsua2.SdpSession_swigregister(SdpSession)
class MediaTransportInfo(object):
    r"""
    This structure describes media transport informations. It corresponds to the
    pjmedia_transport_info structure. The address name field can be empty string
    if the address in the pjmedia_transport_info is invalid.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    localRtpName = property(_pjsua2.MediaTransportInfo_localRtpName_get, _pjsua2.MediaTransportInfo_localRtpName_set, doc=r"""
    Address to be advertised as the local address for the RTP socket,
    which does not need to be equal as the bound address (for example,
    this address can be the address resolved with STUN).
    """)
    localRtcpName = property(_pjsua2.MediaTransportInfo_localRtcpName_get, _pjsua2.MediaTransportInfo_localRtcpName_set, doc=r"""
    Address to be advertised as the local address for the RTCP socket,
    which does not need to be equal as the bound address (for example,
    this address can be the address resolved with STUN).
    """)
    srcRtpName = property(_pjsua2.MediaTransportInfo_srcRtpName_get, _pjsua2.MediaTransportInfo_srcRtpName_set, doc=r"""
    Remote address where RTP originated from. This can be empty string if
    no data is received from the remote.
    """)
    srcRtcpName = property(_pjsua2.MediaTransportInfo_srcRtcpName_get, _pjsua2.MediaTransportInfo_srcRtcpName_set, doc=r"""
    Remote address where RTCP originated from. This can be empty string if
    no data is recevied from the remote.
    """)

    def __init__(self):
        _pjsua2.MediaTransportInfo_swiginit(self, _pjsua2.new_MediaTransportInfo())
    __swig_destroy__ = _pjsua2.delete_MediaTransportInfo

# Register MediaTransportInfo in _pjsua2:
_pjsua2.MediaTransportInfo_swigregister(MediaTransportInfo)
class CallSetting(object):
    r"""Call settings."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    flag = property(_pjsua2.CallSetting_flag_get, _pjsua2.CallSetting_flag_set, doc=r"""
    Bitmask of pjsua_call_flag constants.

    Default: 0
    (PJSUA_CALL_INCLUDE_DISABLED_MEDIA is the legacy default value).
    """)
    reqKeyframeMethod = property(_pjsua2.CallSetting_reqKeyframeMethod_get, _pjsua2.CallSetting_reqKeyframeMethod_set, doc=r"""
    This flag controls what methods to request keyframe are allowed on
    the call. Value is bitmask of pjsua_vid_req_keyframe_method.

    Default: PJSUA_VID_REQ_KEYFRAME_SIP_INFO |
             PJSUA_VID_REQ_KEYFRAME_RTCP_PLI
    """)
    audioCount = property(_pjsua2.CallSetting_audioCount_get, _pjsua2.CallSetting_audioCount_set, doc=r"""
    Number of simultaneous active audio streams for this call. Setting
    this to zero will disable audio in this call.

    Default: 1
    """)
    videoCount = property(_pjsua2.CallSetting_videoCount_get, _pjsua2.CallSetting_videoCount_set, doc=r"""
    Number of simultaneous active video streams for this call. Setting
    this to zero will disable video in this call.

    Default: 1 (if video feature is enabled, otherwise it is zero)
    """)
    textCount = property(_pjsua2.CallSetting_textCount_get, _pjsua2.CallSetting_textCount_set, doc=r"""
    Number of simultaneous active text streams for this call. Setting
    this to zero will disable text in this call.

    Default: 1
    """)
    mediaDir = property(_pjsua2.CallSetting_mediaDir_get, _pjsua2.CallSetting_mediaDir_set, doc=r"""
    Media direction. This setting will only be used if the flag
    PJSUA_CALL_SET_MEDIA_DIR is set, and it will persist for subsequent
    offers or answers.
    For example, a media that is set as PJMEDIA_DIR_ENCODING can only
    mark the stream in the SDP as sendonly or inactive, but will not
    become sendrecv in subsequent offers and answers.
    Application can update the media direction in any API or callback
    that accepts CallSetting as a parameter, such as via
    Call::reinvite/update() or in onCallRxOffer/Reinvite()
    callback.

    The index of the media dir will correspond to the provisional media
    in CallInfo.provMedia.
    For offers that involve adding new medias (such as initial offer),
    the index will correspond to all new audio media first, then video.
    For example, for a new call with 2 audios and 1 video, mediaDir[0]
    and mediaDir[1] will be for the audios, and mediaDir[2] video.

    Default: empty vector
    """)
    customCallId = property(_pjsua2.CallSetting_customCallId_get, _pjsua2.CallSetting_customCallId_set, doc=r"""
    User defined Call-ID to be sent out with outgoing INVITE.

    Note: It is up to the developer to verify uniqueness of the
    Call-ID as there will be no verification. The developer must
    change the Call-ID between calls creating a unique id for each
    outgoing call.

    This setting will only be used when creating a new outgoing call
    via Call::makeCall().
    """)

    def __init__(self, useDefaultValues=False):
        r"""Default constructor initializes with empty or default values."""
        _pjsua2.CallSetting_swiginit(self, _pjsua2.new_CallSetting(useDefaultValues))

    def isEmpty(self):
        r"""
        Check if the settings are set with empty values.

        :rtype: boolean
        :return: True if the settings are empty.
        """
        return _pjsua2.CallSetting_isEmpty(self)
    __swig_destroy__ = _pjsua2.delete_CallSetting

# Register CallSetting in _pjsua2:
_pjsua2.CallSetting_swigregister(CallSetting)
class CallMediaInfo(object):
    r"""
    Call media information.

    Application can query conference bridge port of this media using
    Call::getAudioMedia() if the media type is audio,
    or Call::getEncodingVideoMedia() / Call::getDecodingVideoMedia()
    if the media type is video.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    index = property(_pjsua2.CallMediaInfo_index_get, _pjsua2.CallMediaInfo_index_set, doc=r"""Media index in SDP.""")
    type = property(_pjsua2.CallMediaInfo_type_get, _pjsua2.CallMediaInfo_type_set, doc=r"""Media type.""")
    dir = property(_pjsua2.CallMediaInfo_dir_get, _pjsua2.CallMediaInfo_dir_set, doc=r"""Media direction.""")
    status = property(_pjsua2.CallMediaInfo_status_get, _pjsua2.CallMediaInfo_status_set, doc=r"""Call media status.""")
    audioConfSlot = property(_pjsua2.CallMediaInfo_audioConfSlot_get, _pjsua2.CallMediaInfo_audioConfSlot_set, doc=r"""
    Warning: this is deprecated, application can query conference bridge
    port of this media using Call::getAudioMedia().

    The conference port number for the call. Only valid if the media type
    is audio.
    """)
    videoIncomingWindowId = property(_pjsua2.CallMediaInfo_videoIncomingWindowId_get, _pjsua2.CallMediaInfo_videoIncomingWindowId_set, doc=r"""
    The window id for incoming video, if any, or
    PJSUA_INVALID_ID. Only valid if the media type is video.
    """)
    videoWindow = property(_pjsua2.CallMediaInfo_videoWindow_get, _pjsua2.CallMediaInfo_videoWindow_set, doc=r"""
    The video window instance for incoming video. Only valid if
    videoIncomingWindowId is not PJSUA_INVALID_ID and
    the media type is video.
    """)
    videoCapDev = property(_pjsua2.CallMediaInfo_videoCapDev_get, _pjsua2.CallMediaInfo_videoCapDev_set, doc=r"""
    The video capture device for outgoing transmission, if any,
    or PJMEDIA_VID_INVALID_DEV. Only valid if the media type is video.
    """)

    def __init__(self):
        r"""Default constructor"""
        _pjsua2.CallMediaInfo_swiginit(self, _pjsua2.new_CallMediaInfo())
    __swig_destroy__ = _pjsua2.delete_CallMediaInfo

# Register CallMediaInfo in _pjsua2:
_pjsua2.CallMediaInfo_swigregister(CallMediaInfo)
class CallInfo(object):
    r"""
    Call information. Application can query the call information
    by calling Call::getInfo().
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    id = property(_pjsua2.CallInfo_id_get, _pjsua2.CallInfo_id_set, doc=r"""Call identification.""")
    role = property(_pjsua2.CallInfo_role_get, _pjsua2.CallInfo_role_set, doc=r"""Initial call role (UAC == caller)""")
    accId = property(_pjsua2.CallInfo_accId_get, _pjsua2.CallInfo_accId_set, doc=r"""The account ID where this call belongs.""")
    localUri = property(_pjsua2.CallInfo_localUri_get, _pjsua2.CallInfo_localUri_set, doc=r"""Local URI""")
    localContact = property(_pjsua2.CallInfo_localContact_get, _pjsua2.CallInfo_localContact_set, doc=r"""Local Contact""")
    remoteUri = property(_pjsua2.CallInfo_remoteUri_get, _pjsua2.CallInfo_remoteUri_set, doc=r"""Remote URI""")
    remoteContact = property(_pjsua2.CallInfo_remoteContact_get, _pjsua2.CallInfo_remoteContact_set, doc=r"""Remote contact""")
    callIdString = property(_pjsua2.CallInfo_callIdString_get, _pjsua2.CallInfo_callIdString_set, doc=r"""Dialog Call-ID string.""")
    setting = property(_pjsua2.CallInfo_setting_get, _pjsua2.CallInfo_setting_set, doc=r"""Call setting""")
    state = property(_pjsua2.CallInfo_state_get, _pjsua2.CallInfo_state_set, doc=r"""Call state""")
    stateText = property(_pjsua2.CallInfo_stateText_get, _pjsua2.CallInfo_stateText_set, doc=r"""Text describing the state""")
    lastStatusCode = property(_pjsua2.CallInfo_lastStatusCode_get, _pjsua2.CallInfo_lastStatusCode_set, doc=r"""Last status code heard, which can be used as cause code""")
    lastReason = property(_pjsua2.CallInfo_lastReason_get, _pjsua2.CallInfo_lastReason_set, doc=r"""The reason phrase describing the last status.""")
    media = property(_pjsua2.CallInfo_media_get, _pjsua2.CallInfo_media_set, doc=r"""Array of active media information.""")
    provMedia = property(_pjsua2.CallInfo_provMedia_get, _pjsua2.CallInfo_provMedia_set, doc=r"""
    Array of provisional media information. This contains the media info
    in the provisioning state, that is when the media session is being
    created/updated (SDP offer/answer is on progress).
    """)
    connectDuration = property(_pjsua2.CallInfo_connectDuration_get, _pjsua2.CallInfo_connectDuration_set, doc=r"""
    Up-to-date call connected duration (zero when call is not
    established)
    """)
    totalDuration = property(_pjsua2.CallInfo_totalDuration_get, _pjsua2.CallInfo_totalDuration_set, doc=r"""Total call duration, including set-up time""")
    remOfferer = property(_pjsua2.CallInfo_remOfferer_get, _pjsua2.CallInfo_remOfferer_set, doc=r"""Flag if remote was SDP offerer""")
    remAudioCount = property(_pjsua2.CallInfo_remAudioCount_get, _pjsua2.CallInfo_remAudioCount_set, doc=r"""Number of audio streams offered by remote""")
    remVideoCount = property(_pjsua2.CallInfo_remVideoCount_get, _pjsua2.CallInfo_remVideoCount_set, doc=r"""Number of video streams offered by remote""")
    remTextCount = property(_pjsua2.CallInfo_remTextCount_get, _pjsua2.CallInfo_remTextCount_set, doc=r"""Number of text streams offered by remote""")

    def __init__(self):
        r"""Default constructor"""
        _pjsua2.CallInfo_swiginit(self, _pjsua2.new_CallInfo())
    __swig_destroy__ = _pjsua2.delete_CallInfo

# Register CallInfo in _pjsua2:
_pjsua2.CallInfo_swigregister(CallInfo)
class StreamInfo(object):
    r"""Media stream info."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    type = property(_pjsua2.StreamInfo_type_get, _pjsua2.StreamInfo_type_set, doc=r"""Media type of this stream.""")
    proto = property(_pjsua2.StreamInfo_proto_get, _pjsua2.StreamInfo_proto_set, doc=r"""Transport protocol (RTP/AVP, etc.)""")
    dir = property(_pjsua2.StreamInfo_dir_get, _pjsua2.StreamInfo_dir_set, doc=r"""Media direction.""")
    remoteRtpAddress = property(_pjsua2.StreamInfo_remoteRtpAddress_get, _pjsua2.StreamInfo_remoteRtpAddress_set, doc=r"""Remote RTP address""")
    remoteRtcpAddress = property(_pjsua2.StreamInfo_remoteRtcpAddress_get, _pjsua2.StreamInfo_remoteRtcpAddress_set, doc=r"""Optional remote RTCP address""")
    txPt = property(_pjsua2.StreamInfo_txPt_get, _pjsua2.StreamInfo_txPt_set, doc=r"""Outgoing codec payload type.""")
    rxPt = property(_pjsua2.StreamInfo_rxPt_get, _pjsua2.StreamInfo_rxPt_set, doc=r"""Incoming codec payload type.""")
    audTxEventPt = property(_pjsua2.StreamInfo_audTxEventPt_get, _pjsua2.StreamInfo_audTxEventPt_set, doc=r"""Outgoing pt for audio telephone-events.""")
    audRxEventPt = property(_pjsua2.StreamInfo_audRxEventPt_get, _pjsua2.StreamInfo_audRxEventPt_set, doc=r"""Incoming pt for audio telephone-events.""")
    codecName = property(_pjsua2.StreamInfo_codecName_get, _pjsua2.StreamInfo_codecName_set, doc=r"""Codec name.""")
    codecClockRate = property(_pjsua2.StreamInfo_codecClockRate_get, _pjsua2.StreamInfo_codecClockRate_set, doc=r"""Codec clock rate.""")
    audCodecParam = property(_pjsua2.StreamInfo_audCodecParam_get, _pjsua2.StreamInfo_audCodecParam_set, doc=r"""Optional audio codec param.""")
    vidCodecParam = property(_pjsua2.StreamInfo_vidCodecParam_get, _pjsua2.StreamInfo_vidCodecParam_set, doc=r"""Optional video codec param.""")
    jbInit = property(_pjsua2.StreamInfo_jbInit_get, _pjsua2.StreamInfo_jbInit_set, doc=r"""Jitter buffer init delay in msec.""")
    jbMinPre = property(_pjsua2.StreamInfo_jbMinPre_get, _pjsua2.StreamInfo_jbMinPre_set, doc=r"""Jitter buffer minimum prefetch delay in msec.""")
    jbMaxPre = property(_pjsua2.StreamInfo_jbMaxPre_get, _pjsua2.StreamInfo_jbMaxPre_set, doc=r"""Jitter buffer maximum prefetch delay in msec.""")
    jbMax = property(_pjsua2.StreamInfo_jbMax_get, _pjsua2.StreamInfo_jbMax_set, doc=r"""Jitter buffer max delay in msec.""")
    jbDiscardAlgo = property(_pjsua2.StreamInfo_jbDiscardAlgo_get, _pjsua2.StreamInfo_jbDiscardAlgo_set, doc=r"""Jitter buffer discard algorithm.""")
    rtcpSdesByeDisabled = property(_pjsua2.StreamInfo_rtcpSdesByeDisabled_get, _pjsua2.StreamInfo_rtcpSdesByeDisabled_set, doc=r"""Disable automatic sending of RTCP SDES and BYE.""")

    def __init__(self):
        r"""Default constructor"""
        _pjsua2.StreamInfo_swiginit(self, _pjsua2.new_StreamInfo())
    __swig_destroy__ = _pjsua2.delete_StreamInfo

# Register StreamInfo in _pjsua2:
_pjsua2.StreamInfo_swigregister(StreamInfo)
class StreamStat(object):
    r"""Media stream statistic."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    rtcp = property(_pjsua2.StreamStat_rtcp_get, _pjsua2.StreamStat_rtcp_set, doc=r"""RTCP statistic.""")
    jbuf = property(_pjsua2.StreamStat_jbuf_get, _pjsua2.StreamStat_jbuf_set, doc=r"""Jitter buffer statistic.""")

    def __init__(self):
        _pjsua2.StreamStat_swiginit(self, _pjsua2.new_StreamStat())
    __swig_destroy__ = _pjsua2.delete_StreamStat

# Register StreamStat in _pjsua2:
_pjsua2.StreamStat_swigregister(StreamStat)
class OnCallStateParam(object):
    r"""This structure contains parameters for Call::onCallState() callback."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    e = property(_pjsua2.OnCallStateParam_e_get, _pjsua2.OnCallStateParam_e_set, doc=r"""Event which causes the call state to change.""")

    def __init__(self):
        _pjsua2.OnCallStateParam_swiginit(self, _pjsua2.new_OnCallStateParam())
    __swig_destroy__ = _pjsua2.delete_OnCallStateParam

# Register OnCallStateParam in _pjsua2:
_pjsua2.OnCallStateParam_swigregister(OnCallStateParam)
class OnCallTsxStateParam(object):
    r"""This structure contains parameters for Call::onCallTsxState() callback."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    e = property(_pjsua2.OnCallTsxStateParam_e_get, _pjsua2.OnCallTsxStateParam_e_set, doc=r"""Transaction event that caused the state change.""")

    def __init__(self):
        _pjsua2.OnCallTsxStateParam_swiginit(self, _pjsua2.new_OnCallTsxStateParam())
    __swig_destroy__ = _pjsua2.delete_OnCallTsxStateParam

# Register OnCallTsxStateParam in _pjsua2:
_pjsua2.OnCallTsxStateParam_swigregister(OnCallTsxStateParam)
class OnCallMediaStateParam(object):
    r"""This structure contains parameters for Call::onCallMediaState() callback."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def __init__(self):
        _pjsua2.OnCallMediaStateParam_swiginit(self, _pjsua2.new_OnCallMediaStateParam())
    __swig_destroy__ = _pjsua2.delete_OnCallMediaStateParam

# Register OnCallMediaStateParam in _pjsua2:
_pjsua2.OnCallMediaStateParam_swigregister(OnCallMediaStateParam)
class OnCallSdpCreatedParam(object):
    r"""This structure contains parameters for Call::onCallSdpCreated() callback."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    sdp = property(_pjsua2.OnCallSdpCreatedParam_sdp_get, _pjsua2.OnCallSdpCreatedParam_sdp_set, doc=r"""The SDP has just been created.""")
    remSdp = property(_pjsua2.OnCallSdpCreatedParam_remSdp_get, _pjsua2.OnCallSdpCreatedParam_remSdp_set, doc=r"""The remote SDP, will be empty if local is SDP offerer.""")

    def __init__(self):
        _pjsua2.OnCallSdpCreatedParam_swiginit(self, _pjsua2.new_OnCallSdpCreatedParam())
    __swig_destroy__ = _pjsua2.delete_OnCallSdpCreatedParam

# Register OnCallSdpCreatedParam in _pjsua2:
_pjsua2.OnCallSdpCreatedParam_swigregister(OnCallSdpCreatedParam)
class OnStreamPreCreateParam(object):
    r"""
    This structure contains parameters for Call::onStreamPreCreate()
    callback.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    streamIdx = property(_pjsua2.OnStreamPreCreateParam_streamIdx_get, _pjsua2.OnStreamPreCreateParam_streamIdx_set, doc=r"""Stream index in the media session, read-only.""")
    streamInfo = property(_pjsua2.OnStreamPreCreateParam_streamInfo_get, _pjsua2.OnStreamPreCreateParam_streamInfo_set, doc=r"""Parameters that the stream will be created from.""")

    def __init__(self):
        _pjsua2.OnStreamPreCreateParam_swiginit(self, _pjsua2.new_OnStreamPreCreateParam())
    __swig_destroy__ = _pjsua2.delete_OnStreamPreCreateParam

# Register OnStreamPreCreateParam in _pjsua2:
_pjsua2.OnStreamPreCreateParam_swigregister(OnStreamPreCreateParam)
class OnStreamCreatedParam(object):
    r"""
    This structure contains parameters for Call::onStreamCreated()
    callback.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    stream = property(_pjsua2.OnStreamCreatedParam_stream_get, _pjsua2.OnStreamCreatedParam_stream_set, doc=r"""Audio media stream, read-only.""")
    streamIdx = property(_pjsua2.OnStreamCreatedParam_streamIdx_get, _pjsua2.OnStreamCreatedParam_streamIdx_set, doc=r"""Stream index in the audio media session, read-only.""")
    destroyPort = property(_pjsua2.OnStreamCreatedParam_destroyPort_get, _pjsua2.OnStreamCreatedParam_destroyPort_set, doc=r"""
    Specify if PJSUA2 should take ownership of the port returned in
    the pPort parameter below. If set to true,
    pjmedia_port_destroy() will be called on the port when it is
    no longer needed.

    Default: false
    """)
    pPort = property(_pjsua2.OnStreamCreatedParam_pPort_get, _pjsua2.OnStreamCreatedParam_pPort_set, doc=r"""
    On input, it specifies the audio media port of the stream. Application
    may modify this pointer to point to different media port to be
    registered to the conference bridge.
    """)

    def __init__(self):
        _pjsua2.OnStreamCreatedParam_swiginit(self, _pjsua2.new_OnStreamCreatedParam())
    __swig_destroy__ = _pjsua2.delete_OnStreamCreatedParam

# Register OnStreamCreatedParam in _pjsua2:
_pjsua2.OnStreamCreatedParam_swigregister(OnStreamCreatedParam)
class OnStreamDestroyedParam(object):
    r"""
    This structure contains parameters for Call::onStreamDestroyed()
    callback.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    stream = property(_pjsua2.OnStreamDestroyedParam_stream_get, _pjsua2.OnStreamDestroyedParam_stream_set, doc=r"""Audio media stream.""")
    streamIdx = property(_pjsua2.OnStreamDestroyedParam_streamIdx_get, _pjsua2.OnStreamDestroyedParam_streamIdx_set, doc=r"""Stream index in the audio media session.""")

    def __init__(self):
        _pjsua2.OnStreamDestroyedParam_swiginit(self, _pjsua2.new_OnStreamDestroyedParam())
    __swig_destroy__ = _pjsua2.delete_OnStreamDestroyedParam

# Register OnStreamDestroyedParam in _pjsua2:
_pjsua2.OnStreamDestroyedParam_swigregister(OnStreamDestroyedParam)
class OnDtmfDigitParam(object):
    r"""
    This structure contains parameters for Call::onDtmfDigit()
    callback.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    method = property(_pjsua2.OnDtmfDigitParam_method_get, _pjsua2.OnDtmfDigitParam_method_set, doc=r"""DTMF sending method.""")
    digit = property(_pjsua2.OnDtmfDigitParam_digit_get, _pjsua2.OnDtmfDigitParam_digit_set, doc=r"""DTMF ASCII digit.""")
    duration = property(_pjsua2.OnDtmfDigitParam_duration_get, _pjsua2.OnDtmfDigitParam_duration_set, doc=r"""
    DTMF signal duration. If the duration is unknown, this value is set to
    PJSUA_UNKNOWN_DTMF_DURATION.
    """)

    def __init__(self):
        _pjsua2.OnDtmfDigitParam_swiginit(self, _pjsua2.new_OnDtmfDigitParam())
    __swig_destroy__ = _pjsua2.delete_OnDtmfDigitParam

# Register OnDtmfDigitParam in _pjsua2:
_pjsua2.OnDtmfDigitParam_swigregister(OnDtmfDigitParam)
class OnDtmfEventParam(object):
    r"""
    This structure contains parameters for Call::onDtmfEvent()
    callback.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    method = property(_pjsua2.OnDtmfEventParam_method_get, _pjsua2.OnDtmfEventParam_method_set, doc=r"""DTMF sending method.""")
    timestamp = property(_pjsua2.OnDtmfEventParam_timestamp_get, _pjsua2.OnDtmfEventParam_timestamp_set, doc=r"""
    The timestamp identifying the begin of the event. Timestamp units are
    expressed in milliseconds.
    Note that this value should only be used to compare multiple events
    received via the same method relatively to each other, as the time-base
    is randomized.
    """)
    digit = property(_pjsua2.OnDtmfEventParam_digit_get, _pjsua2.OnDtmfEventParam_digit_set, doc=r"""DTMF ASCII digit.""")
    duration = property(_pjsua2.OnDtmfEventParam_duration_get, _pjsua2.OnDtmfEventParam_duration_set, doc=r"""
    DTMF signal duration in milliseconds. Interpretation of the duration
    depends on the flag PJMEDIA_STREAM_DTMF_IS_END.
    depends on the method.
    If the method is PJSUA_DTMF_METHOD_SIP_INFO, this contains the total
    duration of the DTMF signal or PJSUA_UNKNOWN_DTMF_DURATION if no signal
    duration was indicated.
    If the method is PJSUA_DTMF_METHOD_RFC2833, this contains the total
    duration of the DTMF signal received up to this point in time.
    """)
    flags = property(_pjsua2.OnDtmfEventParam_flags_get, _pjsua2.OnDtmfEventParam_flags_set, doc=r"""
    Flags indicating additional information about the DTMF event.
    If PJMEDIA_STREAM_DTMF_IS_UPDATE is set, the event was already
    indicated earlier. The new indication contains an updated event
    duration.
    If PJMEDIA_STREAM_DTMF_IS_END is set, the event has ended and this
    indication contains the final event duration. Note that end
    indications might get lost. Hence it is not guaranteed to receive
    an event with PJMEDIA_STREAM_DTMF_IS_END for every event.
    """)

    def __init__(self):
        _pjsua2.OnDtmfEventParam_swiginit(self, _pjsua2.new_OnDtmfEventParam())
    __swig_destroy__ = _pjsua2.delete_OnDtmfEventParam

# Register OnDtmfEventParam in _pjsua2:
_pjsua2.OnDtmfEventParam_swigregister(OnDtmfEventParam)
class OnCallRxTextParam(object):
    r"""
    This structure contains parameters for Call::onCallRxText()
    callback.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    seq = property(_pjsua2.OnCallRxTextParam_seq_get, _pjsua2.OnCallRxTextParam_seq_set, doc=r"""The sequence of the incoming text block data.""")
    ts = property(_pjsua2.OnCallRxTextParam_ts_get, _pjsua2.OnCallRxTextParam_ts_set, doc=r"""The timestamp of the text block data.""")
    text = property(_pjsua2.OnCallRxTextParam_text_get, _pjsua2.OnCallRxTextParam_text_set, doc=r"""
    The content of the text block.
    Note that the text can be empty.
    """)

    def __init__(self):
        _pjsua2.OnCallRxTextParam_swiginit(self, _pjsua2.new_OnCallRxTextParam())
    __swig_destroy__ = _pjsua2.delete_OnCallRxTextParam

# Register OnCallRxTextParam in _pjsua2:
_pjsua2.OnCallRxTextParam_swigregister(OnCallRxTextParam)
class OnCallTransferRequestParam(object):
    r"""
    This structure contains parameters for Call::onCallTransferRequest()
    callback.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    dstUri = property(_pjsua2.OnCallTransferRequestParam_dstUri_get, _pjsua2.OnCallTransferRequestParam_dstUri_set, doc=r"""The destination where the call will be transferred to.""")
    statusCode = property(_pjsua2.OnCallTransferRequestParam_statusCode_get, _pjsua2.OnCallTransferRequestParam_statusCode_set, doc=r"""
    Status code to be returned for the call transfer request. On input,
    it contains status code 202.
    """)
    opt = property(_pjsua2.OnCallTransferRequestParam_opt_get, _pjsua2.OnCallTransferRequestParam_opt_set, doc=r"""
    The current call setting, application can update this setting
    for the call being transferred.
    """)
    newCall = property(_pjsua2.OnCallTransferRequestParam_newCall_get, _pjsua2.OnCallTransferRequestParam_newCall_set, doc=r"""
    New Call derived object instantiated by application when the call
    transfer is about to be accepted.
    """)

    def __init__(self):
        _pjsua2.OnCallTransferRequestParam_swiginit(self, _pjsua2.new_OnCallTransferRequestParam())
    __swig_destroy__ = _pjsua2.delete_OnCallTransferRequestParam

# Register OnCallTransferRequestParam in _pjsua2:
_pjsua2.OnCallTransferRequestParam_swigregister(OnCallTransferRequestParam)
class OnCallTransferStatusParam(object):
    r"""
    This structure contains parameters for Call::onCallTransferStatus()
    callback.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    statusCode = property(_pjsua2.OnCallTransferStatusParam_statusCode_get, _pjsua2.OnCallTransferStatusParam_statusCode_set, doc=r"""Status progress of the transfer request.""")
    reason = property(_pjsua2.OnCallTransferStatusParam_reason_get, _pjsua2.OnCallTransferStatusParam_reason_set, doc=r"""Status progress reason.""")
    finalNotify = property(_pjsua2.OnCallTransferStatusParam_finalNotify_get, _pjsua2.OnCallTransferStatusParam_finalNotify_set, doc=r"""
    If true, no further notification will be reported. The statusCode
    specified in this callback is the final status.
    """)
    cont = property(_pjsua2.OnCallTransferStatusParam_cont_get, _pjsua2.OnCallTransferStatusParam_cont_set, doc=r"""
    Initially will be set to true, application can set this to false
    if it no longer wants to receive further notification (for example,
    after it hangs up the call).
    """)

    def __init__(self):
        _pjsua2.OnCallTransferStatusParam_swiginit(self, _pjsua2.new_OnCallTransferStatusParam())
    __swig_destroy__ = _pjsua2.delete_OnCallTransferStatusParam

# Register OnCallTransferStatusParam in _pjsua2:
_pjsua2.OnCallTransferStatusParam_swigregister(OnCallTransferStatusParam)
class OnCallReplaceRequestParam(object):
    r"""
    This structure contains parameters for Call::onCallReplaceRequest()
    callback.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    rdata = property(_pjsua2.OnCallReplaceRequestParam_rdata_get, _pjsua2.OnCallReplaceRequestParam_rdata_set, doc=r"""The incoming INVITE request to replace the call.""")
    statusCode = property(_pjsua2.OnCallReplaceRequestParam_statusCode_get, _pjsua2.OnCallReplaceRequestParam_statusCode_set, doc=r"""
    Status code to be set by application. Application should only
    return a final status (>= PJSIP_SC_OK (200))
    """)
    reason = property(_pjsua2.OnCallReplaceRequestParam_reason_get, _pjsua2.OnCallReplaceRequestParam_reason_set, doc=r"""Optional status text to be set by application.""")
    opt = property(_pjsua2.OnCallReplaceRequestParam_opt_get, _pjsua2.OnCallReplaceRequestParam_opt_set, doc=r"""
    The current call setting, application can update this setting for
    the call being replaced.
    """)
    newCall = property(_pjsua2.OnCallReplaceRequestParam_newCall_get, _pjsua2.OnCallReplaceRequestParam_newCall_set, doc=r"""New Call derived object instantiated by application.""")

    def __init__(self):
        _pjsua2.OnCallReplaceRequestParam_swiginit(self, _pjsua2.new_OnCallReplaceRequestParam())
    __swig_destroy__ = _pjsua2.delete_OnCallReplaceRequestParam

# Register OnCallReplaceRequestParam in _pjsua2:
_pjsua2.OnCallReplaceRequestParam_swigregister(OnCallReplaceRequestParam)
class OnCallReplacedParam(object):
    r"""This structure contains parameters for Call::onCallReplaced() callback."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    newCallId = property(_pjsua2.OnCallReplacedParam_newCallId_get, _pjsua2.OnCallReplacedParam_newCallId_set, doc=r"""The new call id.""")
    newCall = property(_pjsua2.OnCallReplacedParam_newCall_get, _pjsua2.OnCallReplacedParam_newCall_set, doc=r"""New Call derived object instantiated by application.""")

    def __init__(self):
        _pjsua2.OnCallReplacedParam_swiginit(self, _pjsua2.new_OnCallReplacedParam())
    __swig_destroy__ = _pjsua2.delete_OnCallReplacedParam

# Register OnCallReplacedParam in _pjsua2:
_pjsua2.OnCallReplacedParam_swigregister(OnCallReplacedParam)
class OnCallRxOfferParam(object):
    r"""This structure contains parameters for Call::onCallRxOffer() callback."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    offer = property(_pjsua2.OnCallRxOfferParam_offer_get, _pjsua2.OnCallRxOfferParam_offer_set, doc=r"""The new offer received.""")
    statusCode = property(_pjsua2.OnCallRxOfferParam_statusCode_get, _pjsua2.OnCallRxOfferParam_statusCode_set, doc=r"""
    Status code to be returned for answering the offer. On input,
    it contains status code PJSIP_SC_OK (200). Currently, valid values are only
    PJSIP_SC_OK (200) and PJSIP_SC_NOT_ACCEPTABLE_HERE (488).
    """)
    opt = property(_pjsua2.OnCallRxOfferParam_opt_get, _pjsua2.OnCallRxOfferParam_opt_set, doc=r"""
    The current call setting, application can update this setting for
    answering the offer.
    """)

    def __init__(self):
        _pjsua2.OnCallRxOfferParam_swiginit(self, _pjsua2.new_OnCallRxOfferParam())
    __swig_destroy__ = _pjsua2.delete_OnCallRxOfferParam

# Register OnCallRxOfferParam in _pjsua2:
_pjsua2.OnCallRxOfferParam_swigregister(OnCallRxOfferParam)
class OnCallRxReinviteParam(object):
    r"""This structure contains parameters for Call::onCallRxReinvite() callback."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    offer = property(_pjsua2.OnCallRxReinviteParam_offer_get, _pjsua2.OnCallRxReinviteParam_offer_set, doc=r"""The new offer received.""")
    rdata = property(_pjsua2.OnCallRxReinviteParam_rdata_get, _pjsua2.OnCallRxReinviteParam_rdata_set, doc=r"""The incoming re-INVITE.""")
    isAsync = property(_pjsua2.OnCallRxReinviteParam_isAsync_get, _pjsua2.OnCallRxReinviteParam_isAsync_set, doc=r"""
    On input, it is false. Set to true if app wants to manually answer
    the re-INVITE.
    """)
    statusCode = property(_pjsua2.OnCallRxReinviteParam_statusCode_get, _pjsua2.OnCallRxReinviteParam_statusCode_set, doc=r"""
    Status code to be returned for answering the offer. On input,
    it contains status code PJSIP_SC_OK (200). Currently, valid values are only
    PJSIP_SC_OK (200) and PJSIP_SC_NOT_ACCEPTABLE_HERE (488).
    """)
    opt = property(_pjsua2.OnCallRxReinviteParam_opt_get, _pjsua2.OnCallRxReinviteParam_opt_set, doc=r"""
    The current call setting, application can update this setting for
    answering the offer.
    """)

    def __init__(self):
        _pjsua2.OnCallRxReinviteParam_swiginit(self, _pjsua2.new_OnCallRxReinviteParam())
    __swig_destroy__ = _pjsua2.delete_OnCallRxReinviteParam

# Register OnCallRxReinviteParam in _pjsua2:
_pjsua2.OnCallRxReinviteParam_swigregister(OnCallRxReinviteParam)
class OnCallTxOfferParam(object):
    r"""This structure contains parameters for Call::onCallTxOffer() callback."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    opt = property(_pjsua2.OnCallTxOfferParam_opt_get, _pjsua2.OnCallTxOfferParam_opt_set, doc=r"""
    The current call setting, application can update this setting for
    generating the offer. Note that application should maintain any
    active media to avoid the need for the peer to reject the offer.
    """)

    def __init__(self):
        _pjsua2.OnCallTxOfferParam_swiginit(self, _pjsua2.new_OnCallTxOfferParam())
    __swig_destroy__ = _pjsua2.delete_OnCallTxOfferParam

# Register OnCallTxOfferParam in _pjsua2:
_pjsua2.OnCallTxOfferParam_swigregister(OnCallTxOfferParam)
class OnCallRedirectedParam(object):
    r"""This structure contains parameters for Call::onCallRedirected() callback."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    targetUri = property(_pjsua2.OnCallRedirectedParam_targetUri_get, _pjsua2.OnCallRedirectedParam_targetUri_set, doc=r"""The current target to be tried.""")
    e = property(_pjsua2.OnCallRedirectedParam_e_get, _pjsua2.OnCallRedirectedParam_e_set, doc=r"""
    The event that caused this callback to be called.
    This could be the receipt of 3xx response, or 4xx/5xx response
    received for the INVITE sent to subsequent targets, or empty
    (e.type == PJSIP_EVENT_UNKNOWN) if this callback is called from
    within Call::processRedirect() context.
    """)

    def __init__(self):
        _pjsua2.OnCallRedirectedParam_swiginit(self, _pjsua2.new_OnCallRedirectedParam())
    __swig_destroy__ = _pjsua2.delete_OnCallRedirectedParam

# Register OnCallRedirectedParam in _pjsua2:
_pjsua2.OnCallRedirectedParam_swigregister(OnCallRedirectedParam)
class OnCallMediaEventParam(object):
    r"""This structure contains parameters for Call::onCallMediaEvent() callback."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    medIdx = property(_pjsua2.OnCallMediaEventParam_medIdx_get, _pjsua2.OnCallMediaEventParam_medIdx_set, doc=r"""The media stream index.""")
    ev = property(_pjsua2.OnCallMediaEventParam_ev_get, _pjsua2.OnCallMediaEventParam_ev_set, doc=r"""The media event.""")

    def __init__(self, *args):
        _pjsua2.OnCallMediaEventParam_swiginit(self, _pjsua2.new_OnCallMediaEventParam(*args))
    __swig_destroy__ = _pjsua2.delete_OnCallMediaEventParam

# Register OnCallMediaEventParam in _pjsua2:
_pjsua2.OnCallMediaEventParam_swigregister(OnCallMediaEventParam)
class OnCallMediaTransportStateParam(object):
    r"""
    This structure contains parameters for Call::onCallMediaTransportState()
    callback.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    medIdx = property(_pjsua2.OnCallMediaTransportStateParam_medIdx_get, _pjsua2.OnCallMediaTransportStateParam_medIdx_set, doc=r"""The media index.""")
    state = property(_pjsua2.OnCallMediaTransportStateParam_state_get, _pjsua2.OnCallMediaTransportStateParam_state_set, doc=r"""The media transport state""")
    status = property(_pjsua2.OnCallMediaTransportStateParam_status_get, _pjsua2.OnCallMediaTransportStateParam_status_set, doc=r"""The last error code related to the media transport state.""")
    sipErrorCode = property(_pjsua2.OnCallMediaTransportStateParam_sipErrorCode_get, _pjsua2.OnCallMediaTransportStateParam_sipErrorCode_set, doc=r"""Optional SIP error code.""")

    def __init__(self):
        _pjsua2.OnCallMediaTransportStateParam_swiginit(self, _pjsua2.new_OnCallMediaTransportStateParam())
    __swig_destroy__ = _pjsua2.delete_OnCallMediaTransportStateParam

# Register OnCallMediaTransportStateParam in _pjsua2:
_pjsua2.OnCallMediaTransportStateParam_swigregister(OnCallMediaTransportStateParam)
class OnCreateMediaTransportParam(object):
    r"""
    This structure contains parameters for Call::onCreateMediaTransport()
    callback.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    mediaIdx = property(_pjsua2.OnCreateMediaTransportParam_mediaIdx_get, _pjsua2.OnCreateMediaTransportParam_mediaIdx_set, doc=r"""The media index in the SDP for which this media transport will be used.""")
    mediaTp = property(_pjsua2.OnCreateMediaTransportParam_mediaTp_get, _pjsua2.OnCreateMediaTransportParam_mediaTp_set, doc=r"""
    The media transport which otherwise will be used by the call has this
    callback not been implemented. Application can change this to its own
    instance of media transport to be used by the call.
    """)
    flags = property(_pjsua2.OnCreateMediaTransportParam_flags_get, _pjsua2.OnCreateMediaTransportParam_flags_set, doc=r"""Bitmask from pjsua_create_media_transport_flag.""")

    def __init__(self):
        _pjsua2.OnCreateMediaTransportParam_swiginit(self, _pjsua2.new_OnCreateMediaTransportParam())
    __swig_destroy__ = _pjsua2.delete_OnCreateMediaTransportParam

# Register OnCreateMediaTransportParam in _pjsua2:
_pjsua2.OnCreateMediaTransportParam_swigregister(OnCreateMediaTransportParam)
class OnCreateMediaTransportSrtpParam(object):
    r"""
    This structure contains parameters for Call::onCreateMediaTransportSrtp()
    callback.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    mediaIdx = property(_pjsua2.OnCreateMediaTransportSrtpParam_mediaIdx_get, _pjsua2.OnCreateMediaTransportSrtpParam_mediaIdx_set, doc=r"""
    The media index in the SDP for which the SRTP media transport
    will be used.
    """)
    srtpUse = property(_pjsua2.OnCreateMediaTransportSrtpParam_srtpUse_get, _pjsua2.OnCreateMediaTransportSrtpParam_srtpUse_set, doc=r"""
    Specify whether secure media transport should be used. Application
    can modify this only for initial INVITE.
    Valid values are PJMEDIA_SRTP_DISABLED, PJMEDIA_SRTP_OPTIONAL, and
    PJMEDIA_SRTP_MANDATORY.
    """)
    cryptos = property(_pjsua2.OnCreateMediaTransportSrtpParam_cryptos_get, _pjsua2.OnCreateMediaTransportSrtpParam_cryptos_set, doc=r"""
    Application can modify this to specify the cryptos and keys
    which are going to be used.
    """)

    def __init__(self):
        _pjsua2.OnCreateMediaTransportSrtpParam_swiginit(self, _pjsua2.new_OnCreateMediaTransportSrtpParam())
    __swig_destroy__ = _pjsua2.delete_OnCreateMediaTransportSrtpParam

# Register OnCreateMediaTransportSrtpParam in _pjsua2:
_pjsua2.OnCreateMediaTransportSrtpParam_swigregister(OnCreateMediaTransportSrtpParam)
class CallOpParam(object):
    r"""
    // PJSUA2_Call_Data_Structure

    This structure contains parameters for Call::answer(), Call::hangup(),
    Call::reinvite(), Call::update(), Call::xfer(), Call::xferReplaces(),
    Call::setHold().
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    opt = property(_pjsua2.CallOpParam_opt_get, _pjsua2.CallOpParam_opt_set, doc=r"""The call setting.""")
    statusCode = property(_pjsua2.CallOpParam_statusCode_get, _pjsua2.CallOpParam_statusCode_set, doc=r"""Status code.""")
    reason = property(_pjsua2.CallOpParam_reason_get, _pjsua2.CallOpParam_reason_set, doc=r"""Reason phrase.""")
    options = property(_pjsua2.CallOpParam_options_get, _pjsua2.CallOpParam_options_set, doc=r"""Options.""")
    txOption = property(_pjsua2.CallOpParam_txOption_get, _pjsua2.CallOpParam_txOption_set, doc=r"""
    List of headers etc to be added to outgoing response message.
    Note that this message data will be persistent in all next
    answers/responses for this INVITE request.
    """)
    sdp = property(_pjsua2.CallOpParam_sdp_get, _pjsua2.CallOpParam_sdp_set, doc=r"""SDP answer. Currently only used for Call::answer().""")

    def __init__(self, useDefaultCallSetting=False):
        r"""
        Default constructor initializes with zero/empty values.
        Setting useDefaultCallSetting to true will initialize opt with default
        call setting values.
        """
        _pjsua2.CallOpParam_swiginit(self, _pjsua2.new_CallOpParam(useDefaultCallSetting))
    __swig_destroy__ = _pjsua2.delete_CallOpParam

# Register CallOpParam in _pjsua2:
_pjsua2.CallOpParam_swigregister(CallOpParam)
class CallSendRequestParam(object):
    r"""This structure contains parameters for Call::sendRequest()"""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    method = property(_pjsua2.CallSendRequestParam_method_get, _pjsua2.CallSendRequestParam_method_set, doc=r"""SIP method of the request.""")
    txOption = property(_pjsua2.CallSendRequestParam_txOption_get, _pjsua2.CallSendRequestParam_txOption_set, doc=r"""
    Message body and/or list of headers etc to be included in
    outgoing request.
    """)

    def __init__(self):
        r"""Default constructor initializes with zero/empty values."""
        _pjsua2.CallSendRequestParam_swiginit(self, _pjsua2.new_CallSendRequestParam())
    __swig_destroy__ = _pjsua2.delete_CallSendRequestParam

# Register CallSendRequestParam in _pjsua2:
_pjsua2.CallSendRequestParam_swigregister(CallSendRequestParam)
class CallVidSetStreamParam(object):
    r"""This structure contains parameters for Call::vidSetStream()"""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    medIdx = property(_pjsua2.CallVidSetStreamParam_medIdx_get, _pjsua2.CallVidSetStreamParam_medIdx_set, doc=r"""
    Specify the media stream index. This can be set to -1 to denote
    the default video stream in the call, which is the first active
    video stream or any first video stream if none is active.

    This field is valid for all video stream operations, except
    PJSUA_CALL_VID_STRM_ADD.

    Default: -1 (first active video stream, or any first video stream
                 if none is active)
    """)
    dir = property(_pjsua2.CallVidSetStreamParam_dir_get, _pjsua2.CallVidSetStreamParam_dir_set, doc=r"""
    Specify the media stream direction.

    This field is valid for the following video stream operations:
    PJSUA_CALL_VID_STRM_ADD and PJSUA_CALL_VID_STRM_CHANGE_DIR.

    Default: PJMEDIA_DIR_ENCODING_DECODING
    """)
    capDev = property(_pjsua2.CallVidSetStreamParam_capDev_get, _pjsua2.CallVidSetStreamParam_capDev_set, doc=r"""
    Specify the video capture device ID. This can be set to
    PJMEDIA_VID_DEFAULT_CAPTURE_DEV to specify the default capture
    device as configured in the account.

    This field is valid for the following video stream operations:
    PJSUA_CALL_VID_STRM_ADD and PJSUA_CALL_VID_STRM_CHANGE_CAP_DEV.

    Default: PJMEDIA_VID_DEFAULT_CAPTURE_DEV.
    """)

    def __init__(self):
        r"""Default constructor"""
        _pjsua2.CallVidSetStreamParam_swiginit(self, _pjsua2.new_CallVidSetStreamParam())
    __swig_destroy__ = _pjsua2.delete_CallVidSetStreamParam

# Register CallVidSetStreamParam in _pjsua2:
_pjsua2.CallVidSetStreamParam_swigregister(CallVidSetStreamParam)
class CallSendDtmfParam(object):
    r"""This structure contains parameters for Call::sendDtmf()"""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    method = property(_pjsua2.CallSendDtmfParam_method_get, _pjsua2.CallSendDtmfParam_method_set, doc=r"""
    The method used to send DTMF.

    Default: PJSUA_DTMF_METHOD_RFC2833
    """)
    duration = property(_pjsua2.CallSendDtmfParam_duration_get, _pjsua2.CallSendDtmfParam_duration_set, doc=r"""
    The signal duration used for the DTMF.

    Default: PJSUA_CALL_SEND_DTMF_DURATION_DEFAULT
    """)
    digits = property(_pjsua2.CallSendDtmfParam_digits_get, _pjsua2.CallSendDtmfParam_digits_set, doc=r"""The DTMF digits to be sent.""")

    def __init__(self):
        r"""Default constructor initialize with default value."""
        _pjsua2.CallSendDtmfParam_swiginit(self, _pjsua2.new_CallSendDtmfParam())
    __swig_destroy__ = _pjsua2.delete_CallSendDtmfParam

# Register CallSendDtmfParam in _pjsua2:
_pjsua2.CallSendDtmfParam_swigregister(CallSendDtmfParam)
class CallSendTextParam(object):
    r"""This structure contains parameters for Call::sendText()"""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    medIdx = property(_pjsua2.CallSendTextParam_medIdx_get, _pjsua2.CallSendTextParam_medIdx_set, doc=r"""
    Specify the text media stream index. This can be set to -1 to denote
    the first text stream in the call.

    Default: -1 (first text stream)
    """)
    text = property(_pjsua2.CallSendTextParam_text_get, _pjsua2.CallSendTextParam_text_set, doc=r"""The text data to be sent.""")

    def __init__(self):
        r"""Default constructor initializes with default value."""
        _pjsua2.CallSendTextParam_swiginit(self, _pjsua2.new_CallSendTextParam())
    __swig_destroy__ = _pjsua2.delete_CallSendTextParam

# Register CallSendTextParam in _pjsua2:
_pjsua2.CallSendTextParam_swigregister(CallSendTextParam)
class Call(object):
    r"""Call."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def __init__(self, acc, call_id=PJSUA_INVALID_ID):
        r"""Constructor."""
        if self.__class__ == Call:
            _self = None
        else:
            _self = self
        _pjsua2.Call_swiginit(self, _pjsua2.new_Call(_self, acc, call_id))
    __swig_destroy__ = _pjsua2.delete_Call

    def getInfo(self):
        r"""
        Obtain detail information about this call.

        :rtype: :py:class:`CallInfo`
        :return: Call info.
        """
        return _pjsua2.Call_getInfo(self)

    def isActive(self):
        r"""
        Check if this call has active INVITE session and the INVITE
        session has not been disconnected.

        :rtype: boolean
        :return: True if call is active.
        """
        return _pjsua2.Call_isActive(self)

    def getId(self):
        r"""
        Get PJSUA-LIB call ID or index associated with this call.

        :rtype: int
        :return: Integer greater than or equal to zero.
        """
        return _pjsua2.Call_getId(self)

    @staticmethod
    def lookup(call_id):
        r"""
        Get the Call class for the specified call Id.

        :type call_id: int
        :param call_id:       The call ID to lookup

        :rtype: :py:class:`Call`
        :return: The Call instance or NULL if not found.
        """
        return _pjsua2.Call_lookup(call_id)

    def hasMedia(self):
        r"""
        Check if call has an active media session.

        :rtype: boolean
        :return: True if yes.
        """
        return _pjsua2.Call_hasMedia(self)

    def getMedia(self, med_idx):
        r"""
        Warning: deprecated, use getAudioMedia() instead. This function is not
        safe in multithreaded environment.

        Get media for the specified media index.

        :type med_idx: int
        :param med_idx:       Media index.

        :rtype: :py:class:`Media`
        :return: The media or NULL if invalid or inactive.
        """
        return _pjsua2.Call_getMedia(self, med_idx)

    def getAudioMedia(self, med_idx):
        r"""
        Get audio media for the specified media index. If the specified media
        index is not audio or invalid or inactive, exception will be thrown.

        :type med_idx: int
        :param med_idx:       Media index, or -1 to specify any first audio
                                 media registered in the conference bridge.

        :rtype: :py:class:`AudioMedia`
        :return: The audio media.
        """
        return _pjsua2.Call_getAudioMedia(self, med_idx)

    def getEncodingVideoMedia(self, med_idx):
        r"""
        Get video media in encoding direction for the specified media index.
        If the specified media index is not video or invalid or the direction
        is receive only, exception will be thrown.

        :type med_idx: int
        :param med_idx:       Media index, or -1 to specify any first video
                                 media with encoding direction registered in the
                                 conference bridge.

        :rtype: :py:class:`VideoMedia`
        :return: The video media.
        """
        return _pjsua2.Call_getEncodingVideoMedia(self, med_idx)

    def getDecodingVideoMedia(self, med_idx):
        r"""
        Get video media in decoding direction for the specified media index.
        If the specified media index is not video or invalid or the direction
        is send only, exception will be thrown.

        :type med_idx: int
        :param med_idx:       Media index, or -1 to specify any first video
                                 media with decoding direction registered in the
                                 conference bridge.

        :rtype: :py:class:`VideoMedia`
        :return: The video media.
        """
        return _pjsua2.Call_getDecodingVideoMedia(self, med_idx)

    def remoteHasCap(self, htype, hname, token):
        r"""
        Check if remote peer support the specified capability.

        :type htype: int
        :param htype:         The header type (pjsip_hdr_e) to be checked, which
                                 value may be:
                                 - PJSIP_H_ACCEPT
                                 - PJSIP_H_ALLOW
                                 - PJSIP_H_SUPPORTED
        :type hname: string
        :param hname:         If htype specifies PJSIP_H_OTHER, then the header
                                 name must be supplied in this argument. Otherwise
                                 the value must be set to empty string ("").
        :type token: string
        :param token:         The capability token to check. For example, if
            *htype* is PJSIP_H_ALLOW, then *token* specifies the
                                 method names; if *htype* is PJSIP_H_SUPPORTED, then
                                 *token* specifies the extension names such as
                                 "100rel".

        :rtype: int
        :return: PJSIP_DIALOG_CAP_SUPPORTED if the specified
                                 capability is explicitly supported, see
                                 pjsip_dialog_cap_status for more info.
        """
        return _pjsua2.Call_remoteHasCap(self, htype, hname, token)

    def setUserData(self, user_data):
        r"""
        Attach application specific data to the call. Application can then
        inspect this data by calling getUserData().

        :type user_data: void
        :param user_data:     Arbitrary data to be attached to the call.
        """
        return _pjsua2.Call_setUserData(self, user_data)

    def getUserData(self):
        r"""
        Get user data attached to the call, which has been previously set with
        setUserData().

        :rtype: void
        :return: The user data.
        """
        return _pjsua2.Call_getUserData(self)

    def getRemNatType(self):
        r"""
        Get the NAT type of remote's endpoint. This is a proprietary feature
        of PJSUA-LIB which sends its NAT type in the SDP when *natTypeInSdp*
        is set in UaConfig.

        This function can only be called after SDP has been received from remote,
        which means for incoming call, this function can be called as soon as
        call is received as long as incoming call contains SDP, and for outgoing
        call, this function can be called only after SDP is received (normally in
        PJSIP_SC_OK (200) response to INVITE). As a general case, application
        should call this function after or in *onCallMediaState()* callback.

        :rtype: int
        :return: The NAT type.

        See also: Endpoint::natGetType(), natTypeInSdp
        """
        return _pjsua2.Call_getRemNatType(self)

    def makeCall(self, dst_uri, prm):
        r"""
        Make outgoing call to the specified URI.

        :type dst_uri: string
        :param dst_uri:       URI to be put in the To header (normally is the same
                                 as the target URI).
        :param prm.opt:       Optional call setting.
        :param prm.txOption:  Optional headers etc to be added to outgoing INVITE
                                 request.
        """
        return _pjsua2.Call_makeCall(self, dst_uri, prm)

    def answer(self, prm):
        r"""
        Send response to incoming INVITE request with call setting param.
        Depending on the status code specified as parameter, this function may
        send provisional response, establish the call, or terminate the call.
        Notes about call setting:
         - if call setting is changed in the subsequent call to this function,
           only the first call setting supplied will applied. So normally
           application will not supply call setting before getting confirmation
           from the user.
         - if no call setting is supplied when SDP has to be sent, i.e: answer
           with status code 183 or 2xx, the default call setting will be used,
           check CallSetting for its default values.

        :param prm.opt:       Optional call setting.
        :param prm.statusCode:   Status code, (>= PJSIP_SC_TRYING (100)).
        :param prm.reason:    Optional reason phrase. If empty, default text
                                 will be used.
        :param prm.txOption:  Optional list of headers etc to be added to outgoing
                                 response message. Note that this message data will
                                 be persistent in all next answers/responses for this
                                 INVITE request.
        """
        return _pjsua2.Call_answer(self, prm)

    def hangup(self, prm):
        r"""
        Hangup call by using method that is appropriate according to the
        call state. This function is different than answering the call with
        3xx-6xx response (with answer()), in that this function
        will hangup the call regardless of the state and role of the call,
        while answer() only works with incoming calls on EARLY
        state.

        :param prm.statusCode:
                                 Optional status code to be sent when we're rejecting
                                 incoming call. If the value is zero, "603/Decline"
                                 will be sent.
        :param prm.reason:    Optional reason phrase to be sent when we're
                                 rejecting incoming call. If empty, default text
                                 will be used.
        :param prm.txOption:  Optional list of headers etc to be added to outgoing
                                 request/response message.
        """
        return _pjsua2.Call_hangup(self, prm)

    def setHold(self, prm):
        r"""
        Put the specified call on hold. This will send re-INVITE with the
        appropriate SDP to inform remote that the call is being put on hold.
        The final status of the request itself will be reported on the
        *onCallMediaState()* callback, which inform the application that
        the media state of the call has changed.

        :param prm.options:   Bitmask of pjsua_call_flag constants. Currently,
                                 only the flag PJSUA_CALL_UPDATE_CONTACT can be used.
        :param prm.txOption:  Optional message components to be sent with
                                 the request.
        """
        return _pjsua2.Call_setHold(self, prm)

    def reinvite(self, prm):
        r"""
        Send re-INVITE.
        The final status of the request itself will be reported on the
        *onCallMediaState()* callback, which inform the application that
        the media state of the call has changed.

        :param prm.opt:       Optional call setting, if empty, the current call
                                 setting will remain unchanged.
        :param prm.opt.flag:  Bitmask of pjsua_call_flag constants. Specifying
                                 PJSUA_CALL_UNHOLD here will release call hold.
        :param prm.txOption:  Optional message components to be sent with
                                 the request.
        """
        return _pjsua2.Call_reinvite(self, prm)

    def update(self, prm):
        r"""
        Send UPDATE request.

        :param prm.opt:       Optional call setting, if empty, the current call
                                 setting will remain unchanged.
        :param prm.txOption:  Optional message components to be sent with
                                 the request.
        """
        return _pjsua2.Call_update(self, prm)

    def xfer(self, dest, prm):
        r"""
        Initiate call transfer to the specified address. This function will send
        REFER request to instruct remote call party to initiate a new INVITE
        session to the specified destination/target.

        If application is interested to monitor the successfulness and
        the progress of the transfer request, it can implement
        *onCallTransferStatus()* callback which will report the progress
        of the call transfer request.

        :type dest: string
        :param dest:          URI of new target to be contacted. The URI may be
                                 in name address or addr-spec format.
        :param prm.txOption:  Optional message components to be sent with
                                 the request.
        """
        return _pjsua2.Call_xfer(self, dest, prm)

    def xferReplaces(self, dest_call, prm):
        r"""
        Initiate attended call transfer. This function will send REFER request
        to instruct remote call party to initiate new INVITE session to the URL
        of *destCall*. The party at *dest_call* then should "replace"
        the call with us with the new call from the REFER recipient.

        :type dest_call: :py:class:`Call`
        :param dest_call:     The call to be replaced.
        :param prm.options:   Application may specify
                                 PJSUA_XFER_NO_REQUIRE_REPLACES to suppress the
                                 inclusion of "Require: replaces" in
                                 the outgoing INVITE request created by the REFER
                                 request.
        :param prm.txOption:  Optional message components to be sent with
                                 the request.
        """
        return _pjsua2.Call_xferReplaces(self, dest_call, prm)

    def processRedirect(self, cmd):
        r"""
        Accept or reject redirection response. Application MUST call this
        function after it signaled PJSIP_REDIRECT_PENDING in the
        *onCallRedirected()* callback,
        to notify the call whether to accept or reject the redirection
        to the current target. Application can use the combination of
        PJSIP_REDIRECT_PENDING command in *onCallRedirected()* callback and
        this function to ask for user permission before redirecting the call.

        Note that if the application chooses to reject or stop redirection (by
        using PJSIP_REDIRECT_REJECT or PJSIP_REDIRECT_STOP respectively), the
        call disconnection callback will be called before this function returns.
        And if the application rejects the target, the *onCallRedirected()*
        callback may also be called before this function returns if there is
        another target to try.

        :type cmd: int
        :param cmd:           Redirection operation to be applied to the current
                                 target. The semantic of this argument is similar
                                 to the description in the *onCallRedirected()*
                                 callback, except that the PJSIP_REDIRECT_PENDING is
                                 not accepted here.
        """
        return _pjsua2.Call_processRedirect(self, cmd)

    def dialDtmf(self, digits):
        r"""
        Send DTMF digits to remote using RFC 2833 payload formats.

        :type digits: string
        :param digits:        DTMF string digits to be sent.
        """
        return _pjsua2.Call_dialDtmf(self, digits)

    def sendDtmf(self, param):
        r"""
        Send DTMF digits to remote.

        :type param: :py:class:`CallSendDtmfParam`
        :param param:     The send DTMF parameter.
        """
        return _pjsua2.Call_sendDtmf(self, param)

    def sendText(self, param):
        r"""
        Send real-time text to remote via RTP stream. This only works if
        the call has text media.

        :type param: :py:class:`CallSendTextParam`
        :param param:     The send text parameter.
        """
        return _pjsua2.Call_sendText(self, param)

    def sendInstantMessage(self, prm):
        r"""
        Send instant messaging inside INVITE session.

        :param prm.contentType:
                                 MIME type.
        :param prm.content:   The message content.
        :param prm.txOption:  Optional list of headers etc to be included in
                                 outgoing request. The body descriptor in the
                                 txOption is ignored.
        :param prm.userData:  Optional user data, which will be given back when
                                 the IM callback is called.
        """
        return _pjsua2.Call_sendInstantMessage(self, prm)

    def sendTypingIndication(self, prm):
        r"""
        Send IM typing indication inside INVITE session.

        :param prm.isTyping:  True to indicate to remote that local person is
                                 currently typing an IM.
        :param prm.txOption:  Optional list of headers etc to be included in
                                 outgoing request.
        """
        return _pjsua2.Call_sendTypingIndication(self, prm)

    def sendRequest(self, prm):
        r"""
        Send arbitrary request with the call. This is useful for example to send
        INFO request. Note that application should not use this function to send
        requests which would change the invite session's state, such as
        re-INVITE, UPDATE, PRACK, and BYE.

        :param prm.method:    SIP method of the request.
        :param prm.txOption:  Optional message body and/or list of headers to be
                                 included in outgoing request.
        """
        return _pjsua2.Call_sendRequest(self, prm)

    def dump(self, with_media, indent):
        r"""
        Dump call and media statistics to string.

        :type with_media: boolean
        :param with_media:    True to include media information too.
        :type indent: string
        :param indent:        Spaces for left indentation.

        :rtype: string
        :return: Call dump and media statistics string.
        """
        return _pjsua2.Call_dump(self, with_media, indent)

    def vidGetStreamIdx(self):
        r"""
        Get the media stream index of the default video stream in the call.
        Typically this will just retrieve the stream index of the first
        activated video stream in the call. If none is active, it will return
        the first inactive video stream.

        :rtype: int
        :return: The media stream index or -1 if no video stream
                                 is present in the call.
        """
        return _pjsua2.Call_vidGetStreamIdx(self)

    def vidStreamIsRunning(self, med_idx, dir):
        r"""
        Determine if video stream for the specified call is currently running
        (i.e. has been created, started, and not being paused) for the specified
        direction.

        :type med_idx: int
        :param med_idx:       Media stream index, or -1 to specify default video
                                 media.
        :type dir: int
        :param dir:           The direction to be checked.

        :rtype: boolean
        :return: True if stream is currently running for the
                                 specified direction.
        """
        return _pjsua2.Call_vidStreamIsRunning(self, med_idx, dir)

    def vidSetStream(self, op, param):
        r"""
        Add, remove, modify, and/or manipulate video media stream for the
        specified call. This may trigger a re-INVITE or UPDATE to be sent
        for the call.

        :type op: int
        :param op:            The video stream operation to be performed,
                                 possible values are pjsua_call_vid_strm_op.
        :type param: :py:class:`CallVidSetStreamParam`
        :param param:         The parameters for the video stream operation
                                 (see CallVidSetStreamParam).
        """
        return _pjsua2.Call_vidSetStream(self, op, param)

    def vidStreamModifyCodecParam(self, med_idx, param):
        r"""
        Modify the video stream's codec parameter after the codec is opened.
        Note that not all codec backends support modifying parameters during
        runtime and only certain parameters can be changed.

        Currently, only Video Toolbox and OpenH264 backends support runtime
        adjustment of encoding bitrate (avg_bps and max_bps).

        :type med_idx: int
        :param med_idx:       Video stream index.
        :type param: :py:class:`VidCodecParam`
        :param param:         The new codec parameter.

        :rtype: void
        :return: PJ_SUCCESS on success.
        """
        return _pjsua2.Call_vidStreamModifyCodecParam(self, med_idx, param)

    def audStreamModifyCodecParam(self, med_idx, param):
        r"""
        Modify the audio stream's codec parameter after the codec is opened.
        Note that not all codec parameters can be modified during run-time.
        Currently, only Opus codec supports changing key codec parameters
        such as bitrate and bandwidth, while other codecs may only be able to
        modify minor settings such as VAD or PLC.

        :type med_idx: int
        :param med_idx:       Media stream index, or -1 to specify default audio
                                 media.
        :type param: :py:class:`CodecParam`
        :param param:         The new codec parameter.

        :rtype: void
        :return: PJ_SUCCESS on success.
        """
        return _pjsua2.Call_audStreamModifyCodecParam(self, med_idx, param)

    def getStreamInfo(self, med_idx):
        r"""
        Get media stream info for the specified media index.

        :type med_idx: int
        :param med_idx:       Media stream index.

        :rtype: :py:class:`StreamInfo`
        :return: The stream info.
        """
        return _pjsua2.Call_getStreamInfo(self, med_idx)

    def getStreamStat(self, med_idx):
        r"""
        Get media stream statistic for the specified media index.

        :type med_idx: int
        :param med_idx:       Media stream index.

        :rtype: :py:class:`StreamStat`
        :return: The stream statistic.
        """
        return _pjsua2.Call_getStreamStat(self, med_idx)

    def getMedTransportInfo(self, med_idx):
        r"""
        Get media transport info for the specified media index.

        :type med_idx: int
        :param med_idx:       Media stream index.

        :rtype: :py:class:`MediaTransportInfo`
        :return: The transport info.
        """
        return _pjsua2.Call_getMedTransportInfo(self, med_idx)

    def processMediaUpdate(self, prm):
        r"""
        Internal function (callled by Endpoint( to process update to call
        medias when call media state changes.
        """
        return _pjsua2.Call_processMediaUpdate(self, prm)

    def processStateChange(self, prm):
        r"""Internal function (called by Endpoint) to process call state change."""
        return _pjsua2.Call_processStateChange(self, prm)

    def onCallState(self, prm):
        r"""
        Notify application when call state has changed.
        Application may then query the call info to get the
        detail call states by calling getInfo() function.

        :type prm: :py:class:`OnCallStateParam`
        :param prm:       Callback parameter.
        """
        return _pjsua2.Call_onCallState(self, prm)

    def onCallTsxState(self, prm):
        r"""
        This is a general notification callback which is called whenever
        a transaction within the call has changed state. Application can
        implement this callback for example to monitor the state of
        outgoing requests, or to answer unhandled incoming requests
        (such as INFO) with a final response.

        :type prm: :py:class:`OnCallTsxStateParam`
        :param prm:       Callback parameter.
        """
        return _pjsua2.Call_onCallTsxState(self, prm)

    def onCallMediaState(self, prm):
        r"""
        Notify application when media state in the call has changed.
        Normal application would need to implement this callback, e.g.
        to connect the call's media to sound device. When ICE is used,
        this callback will also be called to report ICE negotiation
        failure.

        :type prm: :py:class:`OnCallMediaStateParam`
        :param prm:       Callback parameter.
        """
        return _pjsua2.Call_onCallMediaState(self, prm)

    def onCallSdpCreated(self, prm):
        r"""
        Notify application when a call has just created a local SDP (for
        initial or subsequent SDP offer/answer). Application can implement
        this callback to modify the SDP, before it is being sent and/or
        negotiated with remote SDP, for example to apply per account/call
        basis codecs priority or to add custom/proprietary SDP attributes.

        :type prm: :py:class:`OnCallSdpCreatedParam`
        :param prm:       Callback parameter.
        """
        return _pjsua2.Call_onCallSdpCreated(self, prm)

    def onStreamPreCreate(self, prm):
        r"""
        Notify application when an audio media session is about to be created
        (as opposed to onStreamCreated(), which is called *after* the session
        has been created). The application may change
        some stream info parameter values, i.e: jbInit, jbMinPre, jbMaxPre,
        jbMax, useKa, startCountKa, startIntervalKa, intervalKa,
        rtcpSdesByeDisabled, jbDiscardAlgo (audio), vidCodecParam.encFmt (video).

        :type prm: :py:class:`OnStreamPreCreateParam`
        :param prm:       Callback parameter.
        """
        return _pjsua2.Call_onStreamPreCreate(self, prm)

    def onStreamCreated(self, prm):
        r"""
        Notify application when audio media session is created and before it is
        registered to the conference bridge. Application may return different
        audio media port if it has added media processing port to the stream.
        This media port then will be added to the conference bridge instead.

        :type prm: :py:class:`OnStreamCreatedParam`
        :param prm:       Callback parameter.
        """
        return _pjsua2.Call_onStreamCreated(self, prm)

    def onStreamDestroyed(self, prm):
        r"""
        Notify application when audio media session has been unregistered from
        the conference bridge and about to be destroyed.

        :type prm: :py:class:`OnStreamDestroyedParam`
        :param prm:       Callback parameter.
        """
        return _pjsua2.Call_onStreamDestroyed(self, prm)

    def onDtmfDigit(self, prm):
        r"""
        Notify application upon incoming DTMF digits.

        :type prm: :py:class:`OnDtmfDigitParam`
        :param prm:       Callback parameter.
        """
        return _pjsua2.Call_onDtmfDigit(self, prm)

    def onDtmfEvent(self, prm):
        r"""
        Notify application upon incoming DTMF events.

        :type prm: :py:class:`OnDtmfEventParam`
        :param prm:       Callback parameter.
        """
        return _pjsua2.Call_onDtmfEvent(self, prm)

    def onCallRxText(self, prm):
        r"""
        Notify application upon incoming text data from the text stream.
        Note that the received text can be empty.

        :type prm: :py:class:`OnCallRxTextParam`
        :param prm:       Callback parameter.
        """
        return _pjsua2.Call_onCallRxText(self, prm)

    def onCallTransferRequest(self, prm):
        r"""
        Notify application on call being transferred (i.e. REFER is received).
        Application can decide to accept/reject transfer request by setting
        the code (default is 202). When this callback is not implemented,
        the default behavior is to accept the transfer.

        If application decides to accept the transfer request, it must also
        instantiate the new Call object for the transfer operation and return
        this new Call object to prm.newCall. For the new Call instance,
        the account should use the same account as this call and the call ID
        must be set to PJSUA_INVALID_ID.

        If application does not specify new Call object, library will reuse the
        existing Call object for initiating the new call (to the transfer
        destination). In this case, any events from both calls (transferred and
        transferring) will be delivered to the same Call object, where the call
        ID will be switched back and forth between callbacks. Application must
        be careful to not destroy the Call object when receiving disconnection
        event of the transferred call after the transfer process is completed.

        :type prm: :py:class:`OnCallTransferRequestParam`
        :param prm:       Callback parameter.
        """
        return _pjsua2.Call_onCallTransferRequest(self, prm)

    def onCallTransferStatus(self, prm):
        r"""
        Notify application of the status of previously sent call
        transfer request. Application can monitor the status of the
        call transfer request, for example to decide whether to
        terminate existing call.

        :type prm: :py:class:`OnCallTransferStatusParam`
        :param prm:       Callback parameter.
        """
        return _pjsua2.Call_onCallTransferStatus(self, prm)

    def onCallReplaceRequest(self, prm):
        r"""
        Notify application about incoming INVITE with Replaces header.
        Application may reject the request by setting non-2xx code.

        In this callback, application should create a new Call instance and
        return the Call object via prm.newCall. In creating the new Call
        instance, the account should use the same account as this call and
        the call ID must be set to PJSUA_INVALID_ID.

        If application does not specify new Call object, library will reuse the
        existing Call object for callbacks. In this case, any events from
        both calls (replaced and new) will be delivered to the same Call object,
        where the call ID will be switched back and forth between callbacks.
        Application must be careful to not destroy the Call object when
        receiving disconnection event of the replaced call after the transfer
        process is completed.

        :type prm: :py:class:`OnCallReplaceRequestParam`
        :param prm:       Callback parameter.
        """
        return _pjsua2.Call_onCallReplaceRequest(self, prm)

    def onCallReplaced(self, prm):
        r"""
        Notify application that an existing call has been replaced with
        a new call. This happens when PJSUA-API receives incoming INVITE
        request with Replaces header.

        After this callback is called, normally PJSUA-API will disconnect
        this call and establish a new call.

        If not yet done in onCallReplaceRequest(), application can create
        the new Call instance and return the Call object via prm.newCall.
        In creating the new Call instance, the account should use the same
        account as this call and the call ID must be set to prm.newCallId.

        If the new Call instance has been setup in onCallReplaceRequest(),
        the prm.newCall should contain the new Call instance and application
        MUST not change it.

        If application does not specify new Call object, library will reuse the
        existing Call object for callbacks. In this case, any events from
        both calls (replaced and new) will be delivered to the same Call object,
        where the call ID will be switched back and forth between callbacks.
        Application must be careful to not destroy the Call object when
        receiving disconnection event of the replaced call after the transfer
        process is completed.

        :type prm: :py:class:`OnCallReplacedParam`
        :param prm:       Callback parameter.
        """
        return _pjsua2.Call_onCallReplaced(self, prm)

    def onCallRxOffer(self, prm):
        r"""
        Notify application when call has received new offer from remote
        (i.e. re-INVITE/UPDATE with SDP is received). Application can
        decide to accept/reject the offer by setting the code (default
        is PJSIP_SC_OK (200)). If the offer is accepted, application can update
        the call setting to be applied in the answer. When this callback is
        not implemented, the default behavior is to accept the offer using
        current call setting.

        :type prm: :py:class:`OnCallRxOfferParam`
        :param prm:       Callback parameter.
        """
        return _pjsua2.Call_onCallRxOffer(self, prm)

    def onCallRxReinvite(self, prm):
        r"""
        Notify application when call has received a re-INVITE offer from
        the peer. It allows more fine-grained control over the response to
        a re-INVITE. If application sets prm.isAsync to true, it can send
        the reply manually using the function #pj::Call::answer() and setting
        the SDP answer. Otherwise, by default the re-INVITE will be
        answered automatically after the callback returns.

        Currently, this callback is only called for re-INVITE with
        SDP, but app should be prepared to handle the case of re-INVITE
        without SDP.

        Remarks: If manually answering at a later timing, application may
        need to monitor onCallTsxState() callback to check whether
        the re-INVITE is already answered automatically with
        PJSIP_SC_REQUEST_TERMINATED (487) due to being cancelled.

        Note: onCallRxOffer() will still be called after this callback,
        but only if prm.isAsync is false and prm.statusCode is PJSIP_SC_OK
        (200).

        :type prm: :py:class:`OnCallRxReinviteParam`
        :param prm:       Callback parameter.
        """
        return _pjsua2.Call_onCallRxReinvite(self, prm)

    def onCallTxOffer(self, prm):
        r"""
        Notify application when call has received INVITE with no SDP offer.
        Application can update the call setting (e.g: add audio/video), or
        enable/disable codecs, or update other media session settings from
        within the callback, however, as mandated by the standard (RFC3261
        section 14.2), it must ensure that the update overlaps with the
        existing media session (in codecs, transports, or other parameters)
        that require support from the peer, this is to avoid the need for
        the peer to reject the offer.

        When this callback is not implemented, the default behavior is to send
        SDP offer using current active media session (with all enabled codecs
        on each media type).

        :type prm: :py:class:`OnCallTxOfferParam`
        :param prm:       Callback parameter.
        """
        return _pjsua2.Call_onCallTxOffer(self, prm)

    def onInstantMessage(self, prm):
        r"""
        Notify application on incoming MESSAGE request.

        :type prm: :py:class:`OnInstantMessageParam`
        :param prm:       Callback parameter.
        """
        return _pjsua2.Call_onInstantMessage(self, prm)

    def onInstantMessageStatus(self, prm):
        r"""
        Notify application about the delivery status of outgoing MESSAGE
        request.

        :type prm: :py:class:`OnInstantMessageStatusParam`
        :param prm:       Callback parameter.
        """
        return _pjsua2.Call_onInstantMessageStatus(self, prm)

    def onTypingIndication(self, prm):
        r"""
        Notify application about typing indication.

        :type prm: :py:class:`OnTypingIndicationParam`
        :param prm:       Callback parameter.
        """
        return _pjsua2.Call_onTypingIndication(self, prm)

    def onCallRedirected(self, prm):
        r"""
        This callback is called when the call is about to resend the
        INVITE request to the specified target, following the previously
        received redirection response.

        Application may accept the redirection to the specified target,
        reject this target only and make the session continue to try the next
        target in the list if such target exists, stop the whole
        redirection process altogether and cause the session to be
        disconnected, or defer the decision to ask for user confirmation.

        This callback is optional,
        the default behavior is to NOT follow the redirection response.

        :type prm: :py:class:`OnCallRedirectedParam`
        :param prm:       Callback parameter.

        :rtype: int
        :return: Action to be performed for the target. Set this
                             parameter to one of the value below:
                             - PJSIP_REDIRECT_ACCEPT: immediately accept the
                               redirection. When set, the call will immediately
                               resend INVITE request to the target.
                             - PJSIP_REDIRECT_ACCEPT_REPLACE: immediately accept
                               the redirection and replace the To header with the
                               current target. When set, the call will immediately
                               resend INVITE request to the target.
                             - PJSIP_REDIRECT_REJECT: immediately reject this
                               target. The call will continue retrying with
                               next target if present, or disconnect the call
                               if there is no more target to try.
                             - PJSIP_REDIRECT_STOP: stop the whole redirection
                               process and immediately disconnect the call. The
                               onCallState() callback will be called with
                               PJSIP_INV_STATE_DISCONNECTED state immediately
                               after this callback returns.
                             - PJSIP_REDIRECT_PENDING: set to this value if
                               no decision can be made immediately (for example
                               to request confirmation from user). Application
                               then MUST call processRedirect()
                               to either accept or reject the redirection upon
                               getting user decision.
        """
        return _pjsua2.Call_onCallRedirected(self, prm)

    def onCallMediaTransportState(self, prm):
        r"""
        This callback is called when media transport state is changed.

        :type prm: :py:class:`OnCallMediaTransportStateParam`
        :param prm:       Callback parameter.
        """
        return _pjsua2.Call_onCallMediaTransportState(self, prm)

    def onCallMediaEvent(self, prm):
        r"""
        Notification about media events such as video notifications. This
        callback will most likely be called from media threads, thus
        application must not perform heavy processing in this callback.
        Especially, application must not destroy the call or media in this
        callback. If application needs to perform more complex tasks to
        handle the event, it should post the task to another thread.

        :type prm: :py:class:`OnCallMediaEventParam`
        :param prm:       Callback parameter.
        """
        return _pjsua2.Call_onCallMediaEvent(self, prm)

    def onCreateMediaTransport(self, prm):
        r"""
        This callback can be used by application to implement custom media
        transport adapter for the call, or to replace the media transport
        with something completely new altogether.

        This callback is called when a new call is created. The library has
        created a media transport for the call, and it is provided as the
        *mediaTp* argument of this callback. The callback may change it
        with the instance of media transport to be used by the call.

        :type prm: :py:class:`OnCreateMediaTransportParam`
        :param prm:       Callback parameter.
        """
        return _pjsua2.Call_onCreateMediaTransport(self, prm)

    def onCreateMediaTransportSrtp(self, prm):
        r"""
        Warning: deprecated and may be removed in future release.
        Application can set SRTP crypto settings (including keys) and
        keying methods via AccountConfig.mediaConfig.srtpOpt.
        See also ticket #2100.

        This callback is called when SRTP media transport is created.
        Application can modify the SRTP setting *srtpOpt* to specify
        the cryptos and keys which are going to be used. Note that
        application should not modify the field
        *pjmedia_srtp_setting.close_member_tp* and can only modify
        the field *pjmedia_srtp_setting.use* for initial INVITE.

        :type prm: :py:class:`OnCreateMediaTransportSrtpParam`
        :param prm:       Callback parameter.
        """
        return _pjsua2.Call_onCreateMediaTransportSrtp(self, prm)
    def __disown__(self):
        self.this.disown()
        _pjsua2.disown_Call(self)
        return weakref.proxy(self)

# Register Call in _pjsua2:
_pjsua2.Call_swigregister(Call)
class JsonDocument(PersistentDocument):
    r"""Persistent document (file) with JSON format."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def __init__(self):
        r"""Default constructor"""
        _pjsua2.JsonDocument_swiginit(self, _pjsua2.new_JsonDocument())
    __swig_destroy__ = _pjsua2.delete_JsonDocument

    def loadFile(self, filename):
        r"""
        Load this document from a file.

        :type filename: string
        :param filename:          The file name.
        """
        return _pjsua2.JsonDocument_loadFile(self, filename)

    def loadString(self, input):
        r"""
        Load this document from string.

        :type input: string
        :param input:             The string.
        """
        return _pjsua2.JsonDocument_loadString(self, input)

    def saveFile(self, filename):
        r"""
        Write this document to a file.

        :type filename: string
        :param filename:          The file name.
        """
        return _pjsua2.JsonDocument_saveFile(self, filename)

    def saveString(self):
        r"""Write this document to string."""
        return _pjsua2.JsonDocument_saveString(self)

    def getRootContainer(self):
        r"""Get the root container node for this document"""
        return _pjsua2.JsonDocument_getRootContainer(self)

# Register JsonDocument in _pjsua2:
_pjsua2.JsonDocument_swigregister(JsonDocument)
class OnNatDetectionCompleteParam(object):
    r"""Argument to Endpoint::onNatDetectionComplete() callback."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    status = property(_pjsua2.OnNatDetectionCompleteParam_status_get, _pjsua2.OnNatDetectionCompleteParam_status_set, doc=r"""
    Status of the detection process. If this value is not PJ_SUCCESS,
    the detection has failed and *nat_type* field will contain
    PJ_STUN_NAT_TYPE_UNKNOWN.
    """)
    reason = property(_pjsua2.OnNatDetectionCompleteParam_reason_get, _pjsua2.OnNatDetectionCompleteParam_reason_set, doc=r"""The text describing the status, if the status is not PJ_SUCCESS.""")
    natType = property(_pjsua2.OnNatDetectionCompleteParam_natType_get, _pjsua2.OnNatDetectionCompleteParam_natType_set, doc=r"""
    This contains the NAT type as detected by the detection procedure.
    This value is only valid when the *status* is PJ_SUCCESS.
    """)
    natTypeName = property(_pjsua2.OnNatDetectionCompleteParam_natTypeName_get, _pjsua2.OnNatDetectionCompleteParam_natTypeName_set, doc=r"""Text describing that NAT type.""")

    def __init__(self):
        _pjsua2.OnNatDetectionCompleteParam_swiginit(self, _pjsua2.new_OnNatDetectionCompleteParam())
    __swig_destroy__ = _pjsua2.delete_OnNatDetectionCompleteParam

# Register OnNatDetectionCompleteParam in _pjsua2:
_pjsua2.OnNatDetectionCompleteParam_swigregister(OnNatDetectionCompleteParam)
class OnNatCheckStunServersCompleteParam(object):
    r"""Argument to Endpoint::onNatCheckStunServersComplete() callback."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    userData = property(_pjsua2.OnNatCheckStunServersCompleteParam_userData_get, _pjsua2.OnNatCheckStunServersCompleteParam_userData_set, doc=r"""
    Arbitrary user data that was passed to Endpoint::natCheckStunServers()
    function.
    """)
    status = property(_pjsua2.OnNatCheckStunServersCompleteParam_status_get, _pjsua2.OnNatCheckStunServersCompleteParam_status_set, doc=r"""
    This will contain PJ_SUCCESS if at least one usable STUN server
    is found, otherwise it will contain the last error code during
    the operation.
    """)
    name = property(_pjsua2.OnNatCheckStunServersCompleteParam_name_get, _pjsua2.OnNatCheckStunServersCompleteParam_name_set, doc=r"""
    The server name that yields successful result. This will only
    contain value if status is successful.
    """)
    addr = property(_pjsua2.OnNatCheckStunServersCompleteParam_addr_get, _pjsua2.OnNatCheckStunServersCompleteParam_addr_set, doc=r"""
    The server IP address and port in "IP:port" format. This will only
    contain value if status is successful.
    """)

    def __init__(self):
        _pjsua2.OnNatCheckStunServersCompleteParam_swiginit(self, _pjsua2.new_OnNatCheckStunServersCompleteParam())
    __swig_destroy__ = _pjsua2.delete_OnNatCheckStunServersCompleteParam

# Register OnNatCheckStunServersCompleteParam in _pjsua2:
_pjsua2.OnNatCheckStunServersCompleteParam_swigregister(OnNatCheckStunServersCompleteParam)
class OnTimerParam(object):
    r"""Parameter of Endpoint::onTimer() callback."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    userData = property(_pjsua2.OnTimerParam_userData_get, _pjsua2.OnTimerParam_userData_set, doc=r"""
    Arbitrary user data that was passed to Endpoint::utilTimerSchedule()
    function.
    """)
    msecDelay = property(_pjsua2.OnTimerParam_msecDelay_get, _pjsua2.OnTimerParam_msecDelay_set, doc=r"""The interval of this timer, in miliseconds.""")

    def __init__(self):
        _pjsua2.OnTimerParam_swiginit(self, _pjsua2.new_OnTimerParam())
    __swig_destroy__ = _pjsua2.delete_OnTimerParam

# Register OnTimerParam in _pjsua2:
_pjsua2.OnTimerParam_swigregister(OnTimerParam)
class SslCertName(object):
    r"""SSL certificate type and name structure."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    type = property(_pjsua2.SslCertName_type_get, _pjsua2.SslCertName_type_set, doc=r"""Name type""")
    name = property(_pjsua2.SslCertName_name_get, _pjsua2.SslCertName_name_set, doc=r"""The name""")

    def __init__(self):
        r"""Default constructor"""
        _pjsua2.SslCertName_swiginit(self, _pjsua2.new_SslCertName())
    __swig_destroy__ = _pjsua2.delete_SslCertName

# Register SslCertName in _pjsua2:
_pjsua2.SslCertName_swigregister(SslCertName)
class SslCertInfo(object):
    r"""SSL certificate information."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    version = property(_pjsua2.SslCertInfo_version_get, _pjsua2.SslCertInfo_version_set, doc=r"""Certificate version""")
    serialNo = property(_pjsua2.SslCertInfo_serialNo_get, _pjsua2.SslCertInfo_serialNo_set, doc=r"""
    Serial number, array
                                                    of octets, first index
                                                    is MSB
    """)
    subjectCn = property(_pjsua2.SslCertInfo_subjectCn_get, _pjsua2.SslCertInfo_subjectCn_set, doc=r"""Subject common name""")
    subjectInfo = property(_pjsua2.SslCertInfo_subjectInfo_get, _pjsua2.SslCertInfo_subjectInfo_set, doc=r"""
    One line subject, fields
                                                    are separated by slash, e.g:
                                                    "CN=sample.org/OU=HRD"
    """)
    issuerCn = property(_pjsua2.SslCertInfo_issuerCn_get, _pjsua2.SslCertInfo_issuerCn_set, doc=r"""Issuer common name""")
    issuerInfo = property(_pjsua2.SslCertInfo_issuerInfo_get, _pjsua2.SslCertInfo_issuerInfo_set, doc=r"""
    One line subject, fields
                                                    are separated by slash
    """)
    validityStart = property(_pjsua2.SslCertInfo_validityStart_get, _pjsua2.SslCertInfo_validityStart_set, doc=r"""Validity start""")
    validityEnd = property(_pjsua2.SslCertInfo_validityEnd_get, _pjsua2.SslCertInfo_validityEnd_set, doc=r"""Validity end""")
    validityGmt = property(_pjsua2.SslCertInfo_validityGmt_get, _pjsua2.SslCertInfo_validityGmt_set, doc=r"""
    Flag if validity
                                                    date/time use GMT
    """)
    subjectAltName = property(_pjsua2.SslCertInfo_subjectAltName_get, _pjsua2.SslCertInfo_subjectAltName_set, doc=r"""
    Subject alternative
                                                    name extension
    """)
    raw = property(_pjsua2.SslCertInfo_raw_get, _pjsua2.SslCertInfo_raw_set, doc=r"""
    Raw certificate in PEM
                                                    format, only available
                                                    for remote certificate
    """)

    def __init__(self):
        r"""Constructor."""
        _pjsua2.SslCertInfo_swiginit(self, _pjsua2.new_SslCertInfo())

    def isEmpty(self):
        r"""
        Check if the info is set with empty values.

        :rtype: boolean
        :return: True if the info is empty.
        """
        return _pjsua2.SslCertInfo_isEmpty(self)
    __swig_destroy__ = _pjsua2.delete_SslCertInfo

# Register SslCertInfo in _pjsua2:
_pjsua2.SslCertInfo_swigregister(SslCertInfo)
class TlsInfo(object):
    r"""TLS transport information."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    established = property(_pjsua2.TlsInfo_established_get, _pjsua2.TlsInfo_established_set, doc=r"""
    Describes whether secure socket connection is established, i.e: TLS/SSL
    handshaking has been done successfully.
    """)
    protocol = property(_pjsua2.TlsInfo_protocol_get, _pjsua2.TlsInfo_protocol_set, doc=r"""
    Describes secure socket protocol being used, see #pj_ssl_sock_proto.
    Use bitwise OR operation to combine the protocol type.
    """)
    cipher = property(_pjsua2.TlsInfo_cipher_get, _pjsua2.TlsInfo_cipher_set, doc=r"""
    Describes cipher suite being used, this will only be set when connection
    is established.
    """)
    cipherName = property(_pjsua2.TlsInfo_cipherName_get, _pjsua2.TlsInfo_cipherName_set, doc=r"""
    Describes cipher name being used, this will only be set when connection
    is established.
    """)
    localAddr = property(_pjsua2.TlsInfo_localAddr_get, _pjsua2.TlsInfo_localAddr_set, doc=r"""Describes local address.""")
    remoteAddr = property(_pjsua2.TlsInfo_remoteAddr_get, _pjsua2.TlsInfo_remoteAddr_set, doc=r"""Describes remote address.""")
    localCertInfo = property(_pjsua2.TlsInfo_localCertInfo_get, _pjsua2.TlsInfo_localCertInfo_set, doc=r"""
    Describes active local certificate info. Use SslCertInfo.isEmpty()
    to check if the local cert info is available.
    """)
    remoteCertInfo = property(_pjsua2.TlsInfo_remoteCertInfo_get, _pjsua2.TlsInfo_remoteCertInfo_set, doc=r"""
    Describes active remote certificate info. Use SslCertInfo.isEmpty()
    to check if the remote cert info is available.
    """)
    verifyStatus = property(_pjsua2.TlsInfo_verifyStatus_get, _pjsua2.TlsInfo_verifyStatus_set, doc=r"""Status of peer certificate verification.""")
    verifyMsgs = property(_pjsua2.TlsInfo_verifyMsgs_get, _pjsua2.TlsInfo_verifyMsgs_set, doc=r"""
    Error messages (if any) of peer certificate verification, based on
    the field verifyStatus above.
    """)

    def __init__(self):
        r"""Constructor."""
        _pjsua2.TlsInfo_swiginit(self, _pjsua2.new_TlsInfo())

    def isEmpty(self):
        r"""
        Check if the info is set with empty values.

        :rtype: boolean
        :return: True if the info is empty.
        """
        return _pjsua2.TlsInfo_isEmpty(self)
    __swig_destroy__ = _pjsua2.delete_TlsInfo

# Register TlsInfo in _pjsua2:
_pjsua2.TlsInfo_swigregister(TlsInfo)
class OnTransportStateParam(object):
    r"""Parameter of Endpoint::onTransportState() callback."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    hnd = property(_pjsua2.OnTransportStateParam_hnd_get, _pjsua2.OnTransportStateParam_hnd_set, doc=r"""The transport handle.""")
    type = property(_pjsua2.OnTransportStateParam_type_get, _pjsua2.OnTransportStateParam_type_set, doc=r"""The transport type.""")
    state = property(_pjsua2.OnTransportStateParam_state_get, _pjsua2.OnTransportStateParam_state_set, doc=r"""Transport current state.""")
    lastError = property(_pjsua2.OnTransportStateParam_lastError_get, _pjsua2.OnTransportStateParam_lastError_set, doc=r"""The last error code related to the transport state.""")
    tlsInfo = property(_pjsua2.OnTransportStateParam_tlsInfo_get, _pjsua2.OnTransportStateParam_tlsInfo_set, doc=r"""
    TLS transport info, only used if transport type is TLS. Use
    TlsInfo.isEmpty() to check if this info is available.
    """)

    def __init__(self):
        _pjsua2.OnTransportStateParam_swiginit(self, _pjsua2.new_OnTransportStateParam())
    __swig_destroy__ = _pjsua2.delete_OnTransportStateParam

# Register OnTransportStateParam in _pjsua2:
_pjsua2.OnTransportStateParam_swigregister(OnTransportStateParam)
class OnSelectAccountParam(object):
    r"""Parameter of Endpoint::onSelectAccount() callback."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    rdata = property(_pjsua2.OnSelectAccountParam_rdata_get, _pjsua2.OnSelectAccountParam_rdata_set, doc=r"""The incoming request.""")
    accountIndex = property(_pjsua2.OnSelectAccountParam_accountIndex_get, _pjsua2.OnSelectAccountParam_accountIndex_set, doc=r"""
    The account index to be used to handle the request.
    Upon entry, this will be filled by the account index
    chosen by the library. Application may change it to
    another value to use another account.
    """)

    def __init__(self):
        _pjsua2.OnSelectAccountParam_swiginit(self, _pjsua2.new_OnSelectAccountParam())
    __swig_destroy__ = _pjsua2.delete_OnSelectAccountParam

# Register OnSelectAccountParam in _pjsua2:
_pjsua2.OnSelectAccountParam_swigregister(OnSelectAccountParam)
class IpChangeParam(object):
    r"""Parameter of Endpoint::handleIpChange()."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    restartListener = property(_pjsua2.IpChangeParam_restartListener_get, _pjsua2.IpChangeParam_restartListener_set, doc=r"""
    If set to PJ_TRUE, this will restart the transport listener.

    Default : PJ_TRUE
    """)
    restartLisDelay = property(_pjsua2.IpChangeParam_restartLisDelay_get, _pjsua2.IpChangeParam_restartLisDelay_set, doc=r"""
    If *restartListener* is set to PJ_TRUE, some delay might be needed
    for the listener to be restarted. Use this to set the delay.

    Default : PJSUA_TRANSPORT_RESTART_DELAY_TIME
    """)
    shutdownTransport = property(_pjsua2.IpChangeParam_shutdownTransport_get, _pjsua2.IpChangeParam_shutdownTransport_set, doc=r"""
    If set to PJ_TRUE, this will forcefully shutdown all transports.
    Note that this will shutdown TCP/TLS transports only, UDP transport
    should be restarted via restart_listener.

    Default : PJ_TRUE
    """)

    def __init__(self):
        r"""Constructor."""
        _pjsua2.IpChangeParam_swiginit(self, _pjsua2.new_IpChangeParam())
    __swig_destroy__ = _pjsua2.delete_IpChangeParam

# Register IpChangeParam in _pjsua2:
_pjsua2.IpChangeParam_swigregister(IpChangeParam)
class RegProgressParam(object):
    r"""Information of Update contact on IP change progress."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    isRegister = property(_pjsua2.RegProgressParam_isRegister_get, _pjsua2.RegProgressParam_isRegister_set, doc=r"""Indicate if this is a Register or Un-Register message.""")
    code = property(_pjsua2.RegProgressParam_code_get, _pjsua2.RegProgressParam_code_set, doc=r"""SIP status code received.""")

    def __init__(self):
        _pjsua2.RegProgressParam_swiginit(self, _pjsua2.new_RegProgressParam())
    __swig_destroy__ = _pjsua2.delete_RegProgressParam

# Register RegProgressParam in _pjsua2:
_pjsua2.RegProgressParam_swigregister(RegProgressParam)
class OnIpChangeProgressParam(object):
    r"""Parameter of Endpoint::onIpChangeProgress()."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    op = property(_pjsua2.OnIpChangeProgressParam_op_get, _pjsua2.OnIpChangeProgressParam_op_set, doc=r"""The IP change progress operation.""")
    status = property(_pjsua2.OnIpChangeProgressParam_status_get, _pjsua2.OnIpChangeProgressParam_status_set, doc=r"""The operation progress status.""")
    transportId = property(_pjsua2.OnIpChangeProgressParam_transportId_get, _pjsua2.OnIpChangeProgressParam_transportId_set, doc=r"""
    Information of the transport id. This is only available when the
    operation is PJSUA_IP_CHANGE_OP_RESTART_LIS.
    """)
    accId = property(_pjsua2.OnIpChangeProgressParam_accId_get, _pjsua2.OnIpChangeProgressParam_accId_set, doc=r"""
    Information of the account id. This is only available when the
    operation is:
    - PJSUA_IP_CHANGE_OP_ACC_SHUTDOWN_TP
    - PJSUA_IP_CHANGE_OP_ACC_UPDATE_CONTACT
    - PJSUA_IP_CHANGE_OP_ACC_HANGUP_CALLS
    - PJSUA_IP_CHANGE_OP_ACC_REINVITE_CALLS
    """)
    callId = property(_pjsua2.OnIpChangeProgressParam_callId_get, _pjsua2.OnIpChangeProgressParam_callId_set, doc=r"""
    Information of the call id. This is only available when the operation is
    PJSUA_IP_CHANGE_OP_ACC_HANGUP_CALLS or
    PJSUA_IP_CHANGE_OP_ACC_REINVITE_CALLS
    """)
    regInfo = property(_pjsua2.OnIpChangeProgressParam_regInfo_get, _pjsua2.OnIpChangeProgressParam_regInfo_set, doc=r"""
    Registration information. This is only available when the operation is
    PJSUA_IP_CHANGE_OP_ACC_UPDATE_CONTACT
    """)

    def __init__(self):
        _pjsua2.OnIpChangeProgressParam_swiginit(self, _pjsua2.new_OnIpChangeProgressParam())
    __swig_destroy__ = _pjsua2.delete_OnIpChangeProgressParam

# Register OnIpChangeProgressParam in _pjsua2:
_pjsua2.OnIpChangeProgressParam_swigregister(OnIpChangeProgressParam)
class OnMediaEventParam(object):
    r"""Parameter of Endpoint::onCallMediaEvent() callback."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    ev = property(_pjsua2.OnMediaEventParam_ev_get, _pjsua2.OnMediaEventParam_ev_set, doc=r"""The media event.""")

    def __init__(self):
        _pjsua2.OnMediaEventParam_swiginit(self, _pjsua2.new_OnMediaEventParam())
    __swig_destroy__ = _pjsua2.delete_OnMediaEventParam

# Register OnMediaEventParam in _pjsua2:
_pjsua2.OnMediaEventParam_swigregister(OnMediaEventParam)
class OnRejectedIncomingCallParam(object):
    r"""Parameter of Endpoint::onRejectedIncomingCall() callback."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    callId = property(_pjsua2.OnRejectedIncomingCallParam_callId_get, _pjsua2.OnRejectedIncomingCallParam_callId_set, doc=r"""
    The incoming call id. This will be set to PJSUA_INVALID_ID when there is
    no available call slot at the time.
    """)
    localInfo = property(_pjsua2.OnRejectedIncomingCallParam_localInfo_get, _pjsua2.OnRejectedIncomingCallParam_localInfo_set, doc=r"""Local URI.""")
    remoteInfo = property(_pjsua2.OnRejectedIncomingCallParam_remoteInfo_get, _pjsua2.OnRejectedIncomingCallParam_remoteInfo_set, doc=r"""Remote URI.""")
    statusCode = property(_pjsua2.OnRejectedIncomingCallParam_statusCode_get, _pjsua2.OnRejectedIncomingCallParam_statusCode_set, doc=r"""Rejection code.""")
    reason = property(_pjsua2.OnRejectedIncomingCallParam_reason_get, _pjsua2.OnRejectedIncomingCallParam_reason_set, doc=r"""Rejection text.""")
    rdata = property(_pjsua2.OnRejectedIncomingCallParam_rdata_get, _pjsua2.OnRejectedIncomingCallParam_rdata_set, doc=r"""The original INVITE message, on some cases it is not available.""")

    def __init__(self):
        _pjsua2.OnRejectedIncomingCallParam_swiginit(self, _pjsua2.new_OnRejectedIncomingCallParam())
    __swig_destroy__ = _pjsua2.delete_OnRejectedIncomingCallParam

# Register OnRejectedIncomingCallParam in _pjsua2:
_pjsua2.OnRejectedIncomingCallParam_swigregister(OnRejectedIncomingCallParam)
class AudioMediaAddInfo(object):
    r"""This structure describes audio media's register/add of operation info."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    mediaId = property(_pjsua2.AudioMediaAddInfo_mediaId_get, _pjsua2.AudioMediaAddInfo_mediaId_set, doc=r"""The media port id.""")

    def __init__(self):
        _pjsua2.AudioMediaAddInfo_swiginit(self, _pjsua2.new_AudioMediaAddInfo())
    __swig_destroy__ = _pjsua2.delete_AudioMediaAddInfo

# Register AudioMediaAddInfo in _pjsua2:
_pjsua2.AudioMediaAddInfo_swigregister(AudioMediaAddInfo)
class AudioMediaRemoveInfo(object):
    r"""This structure describes audio media's unregister/remove of operation info."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    mediaId = property(_pjsua2.AudioMediaRemoveInfo_mediaId_get, _pjsua2.AudioMediaRemoveInfo_mediaId_set, doc=r"""The media port id.""")

    def __init__(self):
        _pjsua2.AudioMediaRemoveInfo_swiginit(self, _pjsua2.new_AudioMediaRemoveInfo())
    __swig_destroy__ = _pjsua2.delete_AudioMediaRemoveInfo

# Register AudioMediaRemoveInfo in _pjsua2:
_pjsua2.AudioMediaRemoveInfo_swigregister(AudioMediaRemoveInfo)
class AudioMediaConnectInfo(object):
    r"""
    This structure describes an audio media's start transmit/connect operation
    info.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    mediaId = property(_pjsua2.AudioMediaConnectInfo_mediaId_get, _pjsua2.AudioMediaConnectInfo_mediaId_set, doc=r"""The source media port id.""")
    targetMediaId = property(_pjsua2.AudioMediaConnectInfo_targetMediaId_get, _pjsua2.AudioMediaConnectInfo_targetMediaId_set, doc=r"""The destination media port id.""")
    adjLevel = property(_pjsua2.AudioMediaConnectInfo_adjLevel_get, _pjsua2.AudioMediaConnectInfo_adjLevel_set, doc=r"""The adjustment level.""")

    def __init__(self):
        _pjsua2.AudioMediaConnectInfo_swiginit(self, _pjsua2.new_AudioMediaConnectInfo())
    __swig_destroy__ = _pjsua2.delete_AudioMediaConnectInfo

# Register AudioMediaConnectInfo in _pjsua2:
_pjsua2.AudioMediaConnectInfo_swigregister(AudioMediaConnectInfo)
class AudioMediaDisconnectInfo(object):
    r"""
    This structure describes an audio media's stop transmit/disconnect operation
    info.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    mediaId = property(_pjsua2.AudioMediaDisconnectInfo_mediaId_get, _pjsua2.AudioMediaDisconnectInfo_mediaId_set, doc=r"""
    The source media port id.
                                                  For multiple port operation,
                                                  this will be set to - 1.
    """)
    targetMediaId = property(_pjsua2.AudioMediaDisconnectInfo_targetMediaId_get, _pjsua2.AudioMediaDisconnectInfo_targetMediaId_set, doc=r"""
    The destination media port id.
                                                  For multiple port operation,
                                                  this will be set to - 1.
    """)

    def __init__(self):
        _pjsua2.AudioMediaDisconnectInfo_swiginit(self, _pjsua2.new_AudioMediaDisconnectInfo())
    __swig_destroy__ = _pjsua2.delete_AudioMediaDisconnectInfo

# Register AudioMediaDisconnectInfo in _pjsua2:
_pjsua2.AudioMediaDisconnectInfo_swigregister(AudioMediaDisconnectInfo)
class AudioMediaOpParam(object):
    r"""Audio media operation parameter."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    addInfo = property(_pjsua2.AudioMediaOpParam_addInfo_get, _pjsua2.AudioMediaOpParam_addInfo_set, doc=r"""The information for adding audio media operation.""")
    removeInfo = property(_pjsua2.AudioMediaOpParam_removeInfo_get, _pjsua2.AudioMediaOpParam_removeInfo_set, doc=r"""The information for removing audio media operation.""")
    connectInfo = property(_pjsua2.AudioMediaOpParam_connectInfo_get, _pjsua2.AudioMediaOpParam_connectInfo_set, doc=r"""The information for start transmitting/connecting audio media operation.""")
    disconnectInfo = property(_pjsua2.AudioMediaOpParam_disconnectInfo_get, _pjsua2.AudioMediaOpParam_disconnectInfo_set, doc=r"""
    The information for stop transmitting/disconnecting audio media
    operation.
    """)

    def __init__(self):
        _pjsua2.AudioMediaOpParam_swiginit(self, _pjsua2.new_AudioMediaOpParam())
    __swig_destroy__ = _pjsua2.delete_AudioMediaOpParam

# Register AudioMediaOpParam in _pjsua2:
_pjsua2.AudioMediaOpParam_swigregister(AudioMediaOpParam)
class OnAudioMediaOpCompletedParam(object):
    r"""Parameter of Endpoint::onAudioMediaOpCompleted() callback."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    opType = property(_pjsua2.OnAudioMediaOpCompletedParam_opType_get, _pjsua2.OnAudioMediaOpCompletedParam_opType_set, doc=r"""The operation type.""")
    status = property(_pjsua2.OnAudioMediaOpCompletedParam_status_get, _pjsua2.OnAudioMediaOpCompletedParam_status_set, doc=r"""The operation status.""")
    opParam = property(_pjsua2.OnAudioMediaOpCompletedParam_opParam_get, _pjsua2.OnAudioMediaOpCompletedParam_opParam_set, doc=r"""
    The audio media operation information.

    App can use *AudioMediaHelper* to get the AudioMedia instance based on
    the audio media port id.
    """)

    def __init__(self):
        _pjsua2.OnAudioMediaOpCompletedParam_swiginit(self, _pjsua2.new_OnAudioMediaOpCompletedParam())
    __swig_destroy__ = _pjsua2.delete_OnAudioMediaOpCompletedParam

# Register OnAudioMediaOpCompletedParam in _pjsua2:
_pjsua2.OnAudioMediaOpCompletedParam_swigregister(OnAudioMediaOpCompletedParam)
class VideoMediaAddInfo(object):
    r"""This structure describes video media's register/add of operation info."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    mediaId = property(_pjsua2.VideoMediaAddInfo_mediaId_get, _pjsua2.VideoMediaAddInfo_mediaId_set, doc=r"""The media port id.""")

    def __init__(self):
        _pjsua2.VideoMediaAddInfo_swiginit(self, _pjsua2.new_VideoMediaAddInfo())
    __swig_destroy__ = _pjsua2.delete_VideoMediaAddInfo

# Register VideoMediaAddInfo in _pjsua2:
_pjsua2.VideoMediaAddInfo_swigregister(VideoMediaAddInfo)
class VideoMediaRemoveInfo(object):
    r"""This structure describes video media's unregister/remove of operation info."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    mediaId = property(_pjsua2.VideoMediaRemoveInfo_mediaId_get, _pjsua2.VideoMediaRemoveInfo_mediaId_set, doc=r"""The media port id.""")

    def __init__(self):
        _pjsua2.VideoMediaRemoveInfo_swiginit(self, _pjsua2.new_VideoMediaRemoveInfo())
    __swig_destroy__ = _pjsua2.delete_VideoMediaRemoveInfo

# Register VideoMediaRemoveInfo in _pjsua2:
_pjsua2.VideoMediaRemoveInfo_swigregister(VideoMediaRemoveInfo)
class VideoMediaConnectInfo(object):
    r"""
    This structure describes an video media's start transmit/connect operation
    info.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    mediaId = property(_pjsua2.VideoMediaConnectInfo_mediaId_get, _pjsua2.VideoMediaConnectInfo_mediaId_set, doc=r"""The source media port id.""")
    targetMediaId = property(_pjsua2.VideoMediaConnectInfo_targetMediaId_get, _pjsua2.VideoMediaConnectInfo_targetMediaId_set, doc=r"""The destination media port id.""")

    def __init__(self):
        _pjsua2.VideoMediaConnectInfo_swiginit(self, _pjsua2.new_VideoMediaConnectInfo())
    __swig_destroy__ = _pjsua2.delete_VideoMediaConnectInfo

# Register VideoMediaConnectInfo in _pjsua2:
_pjsua2.VideoMediaConnectInfo_swigregister(VideoMediaConnectInfo)
class VideoMediaDisconnectInfo(object):
    r"""
    This structure describes an video media's stop transmit/disconnect operation
    info.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    mediaId = property(_pjsua2.VideoMediaDisconnectInfo_mediaId_get, _pjsua2.VideoMediaDisconnectInfo_mediaId_set, doc=r"""The source media port id.""")
    targetMediaId = property(_pjsua2.VideoMediaDisconnectInfo_targetMediaId_get, _pjsua2.VideoMediaDisconnectInfo_targetMediaId_set, doc=r"""The destination media port id.""")

    def __init__(self):
        _pjsua2.VideoMediaDisconnectInfo_swiginit(self, _pjsua2.new_VideoMediaDisconnectInfo())
    __swig_destroy__ = _pjsua2.delete_VideoMediaDisconnectInfo

# Register VideoMediaDisconnectInfo in _pjsua2:
_pjsua2.VideoMediaDisconnectInfo_swigregister(VideoMediaDisconnectInfo)
class VideoMediaUpdateInfo(object):
    r"""This structure describes an video media's update operation info."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    mediaId = property(_pjsua2.VideoMediaUpdateInfo_mediaId_get, _pjsua2.VideoMediaUpdateInfo_mediaId_set, doc=r"""The media port id.""")

    def __init__(self):
        _pjsua2.VideoMediaUpdateInfo_swiginit(self, _pjsua2.new_VideoMediaUpdateInfo())
    __swig_destroy__ = _pjsua2.delete_VideoMediaUpdateInfo

# Register VideoMediaUpdateInfo in _pjsua2:
_pjsua2.VideoMediaUpdateInfo_swigregister(VideoMediaUpdateInfo)
class VideoMediaOpParam(object):
    r"""Video media operation parameter."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    addInfo = property(_pjsua2.VideoMediaOpParam_addInfo_get, _pjsua2.VideoMediaOpParam_addInfo_set, doc=r"""The information for adding video media operation.""")
    removeInfo = property(_pjsua2.VideoMediaOpParam_removeInfo_get, _pjsua2.VideoMediaOpParam_removeInfo_set, doc=r"""The information for removing video media operation.""")
    connectInfo = property(_pjsua2.VideoMediaOpParam_connectInfo_get, _pjsua2.VideoMediaOpParam_connectInfo_set, doc=r"""The information for start transmitting/connecting video media operation.""")
    disconnectInfo = property(_pjsua2.VideoMediaOpParam_disconnectInfo_get, _pjsua2.VideoMediaOpParam_disconnectInfo_set, doc=r"""
    The information for stop transmitting/disconnecting video media
    operation.
    """)
    updateInfo = property(_pjsua2.VideoMediaOpParam_updateInfo_get, _pjsua2.VideoMediaOpParam_updateInfo_set, doc=r"""The information for updating video media operation.""")

    def __init__(self):
        _pjsua2.VideoMediaOpParam_swiginit(self, _pjsua2.new_VideoMediaOpParam())
    __swig_destroy__ = _pjsua2.delete_VideoMediaOpParam

# Register VideoMediaOpParam in _pjsua2:
_pjsua2.VideoMediaOpParam_swigregister(VideoMediaOpParam)
class OnVideoMediaOpCompletedParam(object):
    r"""Parameter of Endpoint::onVideoMediaOpCompleted() callback."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    opType = property(_pjsua2.OnVideoMediaOpCompletedParam_opType_get, _pjsua2.OnVideoMediaOpCompletedParam_opType_set, doc=r"""The operation type.""")
    status = property(_pjsua2.OnVideoMediaOpCompletedParam_status_get, _pjsua2.OnVideoMediaOpCompletedParam_status_set, doc=r"""The operation status.""")
    opParam = property(_pjsua2.OnVideoMediaOpCompletedParam_opParam_get, _pjsua2.OnVideoMediaOpCompletedParam_opParam_set, doc=r"""
    Represents the VideoMedia's port id associated with the operation.

    App can use *VIdeoMediaHelper* to get the VideoMedia instance based on
    the video media port id.
    """)

    def __init__(self):
        _pjsua2.OnVideoMediaOpCompletedParam_swiginit(self, _pjsua2.new_OnVideoMediaOpCompletedParam())
    __swig_destroy__ = _pjsua2.delete_OnVideoMediaOpCompletedParam

# Register OnVideoMediaOpCompletedParam in _pjsua2:
_pjsua2.OnVideoMediaOpCompletedParam_swigregister(OnVideoMediaOpCompletedParam)
class DigestChallenge(object):
    r"""
    This structure describes authentication challenge used in Proxy-Authenticate
    or WWW-Authenticate for digest authentication scheme.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    realm = property(_pjsua2.DigestChallenge_realm_get, _pjsua2.DigestChallenge_realm_set, doc=r"""Realm for the challenge.""")
    otherParam = property(_pjsua2.DigestChallenge_otherParam_get, _pjsua2.DigestChallenge_otherParam_set, doc=r"""Other parameters.""")
    domain = property(_pjsua2.DigestChallenge_domain_get, _pjsua2.DigestChallenge_domain_set, doc=r"""Domain.""")
    nonce = property(_pjsua2.DigestChallenge_nonce_get, _pjsua2.DigestChallenge_nonce_set, doc=r"""Nonce challenge.""")
    opaque = property(_pjsua2.DigestChallenge_opaque_get, _pjsua2.DigestChallenge_opaque_set, doc=r"""Opaque value.""")
    stale = property(_pjsua2.DigestChallenge_stale_get, _pjsua2.DigestChallenge_stale_set, doc=r"""Stale parameter.""")
    algorithm = property(_pjsua2.DigestChallenge_algorithm_get, _pjsua2.DigestChallenge_algorithm_set, doc=r"""Algorithm parameter.""")
    qop = property(_pjsua2.DigestChallenge_qop_get, _pjsua2.DigestChallenge_qop_set, doc=r"""Quality of protection.""")

    def __init__(self):
        _pjsua2.DigestChallenge_swiginit(self, _pjsua2.new_DigestChallenge())
    __swig_destroy__ = _pjsua2.delete_DigestChallenge

# Register DigestChallenge in _pjsua2:
_pjsua2.DigestChallenge_swigregister(DigestChallenge)
class DigestCredential(object):
    r"""
    This structure describe credential used in Authorization and
    Proxy-Authorization header for digest authentication scheme.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    realm = property(_pjsua2.DigestCredential_realm_get, _pjsua2.DigestCredential_realm_set, doc=r"""Realm of the credential""")
    otherParam = property(_pjsua2.DigestCredential_otherParam_get, _pjsua2.DigestCredential_otherParam_set, doc=r"""Other parameters.""")
    username = property(_pjsua2.DigestCredential_username_get, _pjsua2.DigestCredential_username_set, doc=r"""Username parameter.""")
    nonce = property(_pjsua2.DigestCredential_nonce_get, _pjsua2.DigestCredential_nonce_set, doc=r"""Nonce parameter.""")
    uri = property(_pjsua2.DigestCredential_uri_get, _pjsua2.DigestCredential_uri_set, doc=r"""URI parameter.""")
    response = property(_pjsua2.DigestCredential_response_get, _pjsua2.DigestCredential_response_set, doc=r"""Response digest.""")
    algorithm = property(_pjsua2.DigestCredential_algorithm_get, _pjsua2.DigestCredential_algorithm_set, doc=r"""Algorithm.""")
    cnonce = property(_pjsua2.DigestCredential_cnonce_get, _pjsua2.DigestCredential_cnonce_set, doc=r"""Cnonce.""")
    opaque = property(_pjsua2.DigestCredential_opaque_get, _pjsua2.DigestCredential_opaque_set, doc=r"""Opaque value.""")
    qop = property(_pjsua2.DigestCredential_qop_get, _pjsua2.DigestCredential_qop_set, doc=r"""Quality of protection.""")
    nc = property(_pjsua2.DigestCredential_nc_get, _pjsua2.DigestCredential_nc_set, doc=r"""Nonce count.""")

    def __init__(self):
        _pjsua2.DigestCredential_swiginit(self, _pjsua2.new_DigestCredential())
    __swig_destroy__ = _pjsua2.delete_DigestCredential

# Register DigestCredential in _pjsua2:
_pjsua2.DigestCredential_swigregister(DigestCredential)
class OnCredAuthParam(object):
    r"""Parameter of Endpoint::onCredAuth() callback."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    digestChallenge = property(_pjsua2.OnCredAuthParam_digestChallenge_get, _pjsua2.OnCredAuthParam_digestChallenge_set, doc=r"""
    Digest challenge.
    The authentication challenge sent by server in 401 or 401 response,
    as either Proxy-Authenticate or WWW-Authenticate header.
    """)
    credentialInfo = property(_pjsua2.OnCredAuthParam_credentialInfo_get, _pjsua2.OnCredAuthParam_credentialInfo_set, doc=r"""Credential info.""")
    method = property(_pjsua2.OnCredAuthParam_method_get, _pjsua2.OnCredAuthParam_method_set, doc=r"""The request method.""")
    digestCredential = property(_pjsua2.OnCredAuthParam_digestCredential_get, _pjsua2.OnCredAuthParam_digestCredential_set, doc=r"""
    The digest credential where the digest response will be placed to.

    Upon calling this function, the nonce, nc, cnonce, qop, uri, and realm
    fields of this structure must be set by the caller.

    Upon return, the callback must set the response in
    *DigestCredential.response*.
    """)

    def __init__(self):
        _pjsua2.OnCredAuthParam_swiginit(self, _pjsua2.new_OnCredAuthParam())
    __swig_destroy__ = _pjsua2.delete_OnCredAuthParam

# Register OnCredAuthParam in _pjsua2:
_pjsua2.OnCredAuthParam_swigregister(OnCredAuthParam)
class UaConfig(PersistentObject):
    r"""SIP User Agent related settings."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    maxCalls = property(_pjsua2.UaConfig_maxCalls_get, _pjsua2.UaConfig_maxCalls_set, doc=r"""
    Maximum calls to support (default: 4). The value specified here
    must be smaller than the compile time maximum settings
    PJSUA_MAX_CALLS, which by default is 32. To increase this
    limit, the library must be recompiled with new PJSUA_MAX_CALLS
    value.
    """)
    threadCnt = property(_pjsua2.UaConfig_threadCnt_get, _pjsua2.UaConfig_threadCnt_set, doc=r"""
    Number of worker threads. Normally application will want to have at
    least one worker thread, unless when it wants to poll the library
    periodically, which in this case the worker thread can be set to
    zero.
    """)
    mainThreadOnly = property(_pjsua2.UaConfig_mainThreadOnly_get, _pjsua2.UaConfig_mainThreadOnly_set, doc=r"""
    When this flag is non-zero, all callbacks that come from thread
    other than main thread will be posted to the main thread and
    to be executed by Endpoint::libHandleEvents() function. This
    includes the logging callback. Note that this will only work if
    threadCnt is set to zero and Endpoint::libHandleEvents() is
    performed by main thread. By default, the main thread is set
    from the thread that invoke Endpoint::libCreate()

    Default: false
    """)
    nameserver = property(_pjsua2.UaConfig_nameserver_get, _pjsua2.UaConfig_nameserver_set, doc=r"""
    Array of nameservers to be used by the SIP resolver subsystem.
    The order of the name server specifies the priority (first name
    server will be used first, unless it is not reachable).
    """)
    outboundProxies = property(_pjsua2.UaConfig_outboundProxies_get, _pjsua2.UaConfig_outboundProxies_set, doc=r"""
    Specify the URL of outbound proxies to visit for all outgoing requests.
    The outbound proxies will be used for all accounts, and it will
    be used to build the route set for outgoing requests. The final
    route set for outgoing requests will consists of the outbound proxies
    and the proxy configured in the account.
    """)
    userAgent = property(_pjsua2.UaConfig_userAgent_get, _pjsua2.UaConfig_userAgent_set, doc=r"""
    Optional user agent string (default empty). If it's empty, no
    User-Agent header will be sent with outgoing requests.
    """)
    stunServer = property(_pjsua2.UaConfig_stunServer_get, _pjsua2.UaConfig_stunServer_set, doc=r"""
    Array of STUN servers to try. The library will try to resolve and
    contact each of the STUN server entry until it finds one that is
    usable. Each entry may be a domain name, host name, IP address, and
    it may contain an optional port number. For example:
     - "pjsip.org" (domain name)
     - "sip.pjsip.org" (host name)
     - "pjsip.org:33478" (domain name and a non-standard port number)
     - "10.0.0.1:3478" (IP address and port number)

    When nameserver is configured in the *pjsua_config.nameserver* field,
    if entry is not an IP address, it will be resolved with DNS SRV
    resolution first, and it will fallback to use DNS A resolution if this
    fails. Port number may be specified even if the entry is a domain name,
    in case the DNS SRV resolution should fallback to a non-standard port.

    When nameserver is not configured, entries will be resolved with
    pj_gethostbyname() if it's not an IP address. Port number may be
    specified if the server is not listening in standard STUN port.
    """)
    stunTryIpv6 = property(_pjsua2.UaConfig_stunTryIpv6_get, _pjsua2.UaConfig_stunTryIpv6_set, doc=r"""
    This specifies if the library should try to do an IPv6 resolution of
    the STUN servers if the IPv4 resolution fails. It can be useful
    in an IPv6-only environment, including on NAT64.

    Default: FALSE
    """)
    stunIgnoreFailure = property(_pjsua2.UaConfig_stunIgnoreFailure_get, _pjsua2.UaConfig_stunIgnoreFailure_set, doc=r"""
    This specifies if the library startup should ignore failure with the
    STUN servers. If this is set to PJ_FALSE, the library will refuse to
    start if it fails to resolve or contact any of the STUN servers.

    Default: TRUE
    """)
    natTypeInSdp = property(_pjsua2.UaConfig_natTypeInSdp_get, _pjsua2.UaConfig_natTypeInSdp_set, doc=r"""
    Support for adding and parsing NAT type in the SDP to assist
    troubleshooting. The valid values are:
     - 0: no information will be added in SDP, and parsing is disabled.
     - 1: only the NAT type number is added.
     - 2: add both NAT type number and name.

    Default: 1
    """)
    mwiUnsolicitedEnabled = property(_pjsua2.UaConfig_mwiUnsolicitedEnabled_get, _pjsua2.UaConfig_mwiUnsolicitedEnabled_set, doc=r"""
    Handle unsolicited NOTIFY requests containing message waiting
    indication (MWI) info. Unsolicited MWI is incoming NOTIFY requests
    which are not requested by client with SUBSCRIBE request.

    If this is enabled, the library will respond 200/OK to the NOTIFY
    request and forward the request to Endpoint::onMwiInfo() callback.

    Note: the callback will not be invoked and 481/"No account to handle" response
    will be sent if this is enabled but no account is configured.

    See also AccountMwiConfig.enabled.

    Default: PJ_TRUE
    """)
    enableUpnp = property(_pjsua2.UaConfig_enableUpnp_get, _pjsua2.UaConfig_enableUpnp_set, doc=r"""
    Specify whether to enable UPnP.

    Note that this setting can be further customized in account
    configuration (#pjsua_acc_config).

    Default: FALSE
    """)
    upnpIfName = property(_pjsua2.UaConfig_upnpIfName_get, _pjsua2.UaConfig_upnpIfName_set, doc=r"""
    Specify which interface to use for UPnP. If empty, UPnP will use
    the first suitable interface found.

    Note that this setting is only applicable if UPnP is enabled.

    Default: empty string
    """)
    noRefersub = property(_pjsua2.UaConfig_noRefersub_get, _pjsua2.UaConfig_noRefersub_set, doc=r"""
    When set to true, "norefersub" is advertised in the SIP Supported
    header per RFC 4488, indicating that this endpoint is capable of
    suppressing the implicit REFER event subscription.  The actual
    suppression is negotiated per-call via the Refer-Sub header; this
    flag only controls whether the capability is announced.

    Default: true
    """)

    def __init__(self):
        r"""Default constructor to initialize with default values."""
        _pjsua2.UaConfig_swiginit(self, _pjsua2.new_UaConfig())

    def readObject(self, node):
        r"""
        Read this object from a container.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to write values from.
        """
        return _pjsua2.UaConfig_readObject(self, node)

    def writeObject(self, node):
        r"""
        Write this object to a container.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to write values to.
        """
        return _pjsua2.UaConfig_writeObject(self, node)
    __swig_destroy__ = _pjsua2.delete_UaConfig

# Register UaConfig in _pjsua2:
_pjsua2.UaConfig_swigregister(UaConfig)
class LogEntry(object):
    r"""Data containing log entry to be written by the LogWriter."""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    level = property(_pjsua2.LogEntry_level_get, _pjsua2.LogEntry_level_set, doc=r"""Log verbosity level of this message""")
    msg = property(_pjsua2.LogEntry_msg_get, _pjsua2.LogEntry_msg_set, doc=r"""The log message""")
    threadId = property(_pjsua2.LogEntry_threadId_get, _pjsua2.LogEntry_threadId_set, doc=r"""ID of current thread""")
    threadName = property(_pjsua2.LogEntry_threadName_get, _pjsua2.LogEntry_threadName_set, doc=r"""The name of the thread that writes this log""")

    def __init__(self):
        _pjsua2.LogEntry_swiginit(self, _pjsua2.new_LogEntry())
    __swig_destroy__ = _pjsua2.delete_LogEntry

# Register LogEntry in _pjsua2:
_pjsua2.LogEntry_swigregister(LogEntry)
class LogWriter(object):
    r"""
    Interface for writing log messages. Applications can inherit this class
    and supply it in the LogConfig structure to implement custom log
    writing facility.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    __swig_destroy__ = _pjsua2.delete_LogWriter

    def write(self, entry):
        r"""Write a log entry."""
        return _pjsua2.LogWriter_write(self, entry)

    def __init__(self):
        if self.__class__ == LogWriter:
            _self = None
        else:
            _self = self
        _pjsua2.LogWriter_swiginit(self, _pjsua2.new_LogWriter(_self, ))
    def __disown__(self):
        self.this.disown()
        _pjsua2.disown_LogWriter(self)
        return weakref.proxy(self)

# Register LogWriter in _pjsua2:
_pjsua2.LogWriter_swigregister(LogWriter)
class LogConfig(PersistentObject):
    r"""
    Logging configuration, which can be (optionally) specified when calling
    Lib::init().
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    msgLogging = property(_pjsua2.LogConfig_msgLogging_get, _pjsua2.LogConfig_msgLogging_set, doc=r"""Log incoming and outgoing SIP message? Yes!""")
    level = property(_pjsua2.LogConfig_level_get, _pjsua2.LogConfig_level_set, doc=r"""Input verbosity level. Value 5 is reasonable.""")
    consoleLevel = property(_pjsua2.LogConfig_consoleLevel_get, _pjsua2.LogConfig_consoleLevel_set, doc=r"""Verbosity level for console. Value 4 is reasonable.""")
    decor = property(_pjsua2.LogConfig_decor_get, _pjsua2.LogConfig_decor_set, doc=r"""Log decoration.""")
    filename = property(_pjsua2.LogConfig_filename_get, _pjsua2.LogConfig_filename_set, doc=r"""Optional log filename if app wishes the library to write to log file.""")
    fileFlags = property(_pjsua2.LogConfig_fileFlags_get, _pjsua2.LogConfig_fileFlags_set, doc=r"""
    Additional flags to be given to pj_file_open() when opening
    the log file. By default, the flag is PJ_O_WRONLY. Application
    may set PJ_O_APPEND here so that logs are appended to existing
    file instead of overwriting it.

    Default is 0.
    """)
    writer = property(_pjsua2.LogConfig_writer_get, _pjsua2.LogConfig_writer_set, doc=r"""
    Custom log writer, if required. This instance will be destroyed
    by the endpoint when the endpoint is destroyed.
    """)

    def __init__(self):
        r"""Default constructor initialises with default values"""
        _pjsua2.LogConfig_swiginit(self, _pjsua2.new_LogConfig())

    def readObject(self, node):
        r"""
        Read this object from a container.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to write values from.
        """
        return _pjsua2.LogConfig_readObject(self, node)

    def writeObject(self, node):
        r"""
        Write this object to a container.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to write values to.
        """
        return _pjsua2.LogConfig_writeObject(self, node)
    __swig_destroy__ = _pjsua2.delete_LogConfig

# Register LogConfig in _pjsua2:
_pjsua2.LogConfig_swigregister(LogConfig)
class MediaConfig(PersistentObject):
    r"""
    This structure describes media configuration, which will be specified
    when calling Lib::init().
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    clockRate = property(_pjsua2.MediaConfig_clockRate_get, _pjsua2.MediaConfig_clockRate_set, doc=r"""
    Clock rate to be applied to the conference bridge.
    If value is zero, default clock rate will be used
    (PJSUA_DEFAULT_CLOCK_RATE, which by default is 16KHz).
    """)
    sndClockRate = property(_pjsua2.MediaConfig_sndClockRate_get, _pjsua2.MediaConfig_sndClockRate_set, doc=r"""
    Clock rate to be applied when opening the sound device.
    If value is zero, conference bridge clock rate will be used.
    """)
    sndUseSwClock = property(_pjsua2.MediaConfig_sndUseSwClock_get, _pjsua2.MediaConfig_sndUseSwClock_set, doc=r"""
    Sound device uses 'PJMEDIA_CLOCK' instead of native sound device
    clock, generally this will be able to reduce jitter and clock drift.

    This option is not applicable for encoded/non-PCM format.

    Default value: PJSUA_DEFAULT_SND_USE_SW_CLOCK
    """)
    channelCount = property(_pjsua2.MediaConfig_channelCount_get, _pjsua2.MediaConfig_channelCount_set, doc=r"""
    Channel count be applied when opening the sound device and
    conference bridge.
    """)
    audioFramePtime = property(_pjsua2.MediaConfig_audioFramePtime_get, _pjsua2.MediaConfig_audioFramePtime_set, doc=r"""
    Specify audio frame ptime. The value here will affect the
    samples per frame of both the sound device and the conference
    bridge. Specifying lower ptime will normally reduce the
    latency.

    Default value: PJSUA_DEFAULT_AUDIO_FRAME_PTIME
    """)
    maxMediaPorts = property(_pjsua2.MediaConfig_maxMediaPorts_get, _pjsua2.MediaConfig_maxMediaPorts_set, doc=r"""
    Specify maximum number of media ports to be created in the
    conference bridge. Since all media terminate in the bridge
    (calls, file player, file recorder, etc), the value must be
    large enough to support all of them. However, the larger
    the value, the more computations are performed.

    Default value: PJSUA_MAX_CONF_PORTS
    """)
    confThreads = property(_pjsua2.MediaConfig_confThreads_get, _pjsua2.MediaConfig_confThreads_set, doc=r"""
    Total number of threads that can be used by the conference bridge
    including get_frame() thread.
    This value is used to determine if the conference bridge should be
    implemented as a parallel bridge or not.
    If this value is set to 1, the conference bridge will be implemented as a
    serial bridge, otherwise it will be implemented as a parallel bridge.
    Should not be less than 1.
    This value is ignored by all conference backends except for the
    multithreaded conference bridge backend
    (PJMEDIA_CONF_PARALLEL_BRIDGE_BACKEND).

    Default value: PJMEDIA_CONF_THREADS
    """)
    hasIoqueue = property(_pjsua2.MediaConfig_hasIoqueue_get, _pjsua2.MediaConfig_hasIoqueue_set, doc=r"""
    Specify whether the media manager should manage its own
    ioqueue for the RTP/RTCP sockets. If yes, ioqueue will be created
    and at least one worker thread will be created too. If no,
    the RTP/RTCP sockets will share the same ioqueue as SIP sockets,
    and no worker thread is needed.

    Normally application would say yes here, unless it wants to
    run everything from a single thread.
    """)
    threadCnt = property(_pjsua2.MediaConfig_threadCnt_get, _pjsua2.MediaConfig_threadCnt_set, doc=r"""
    Specify the number of worker threads to handle incoming RTP
    packets. A value of one is recommended for most applications.
    """)
    quality = property(_pjsua2.MediaConfig_quality_get, _pjsua2.MediaConfig_quality_set, doc=r"""
    Media quality, 0-10, according to this table:
      5-10: resampling use large filter,
      3-4:  resampling use small filter,
      1-2:  resampling use linear.
    The media quality also sets speex codec quality/complexity to the
    number.

    Default: PJSUA_DEFAULT_CODEC_QUALITY.
    """)
    ptime = property(_pjsua2.MediaConfig_ptime_get, _pjsua2.MediaConfig_ptime_set, doc=r"""
    Specify default codec ptime.

    Default: 0 (codec specific)
    """)
    noVad = property(_pjsua2.MediaConfig_noVad_get, _pjsua2.MediaConfig_noVad_set, doc=r"""
    Disable VAD?

    Default: 0 (codec specific)
    """)
    ilbcMode = property(_pjsua2.MediaConfig_ilbcMode_get, _pjsua2.MediaConfig_ilbcMode_set, doc=r"""
    iLBC mode (20 or 30).

    Default: 30 (PJSUA_DEFAULT_ILBC_MODE)
    """)
    txDropPct = property(_pjsua2.MediaConfig_txDropPct_get, _pjsua2.MediaConfig_txDropPct_set, doc=r"""
    Percentage of RTP packet to drop in TX direction
    (to simulate packet lost).

    Default: 0
    """)
    rxDropPct = property(_pjsua2.MediaConfig_rxDropPct_get, _pjsua2.MediaConfig_rxDropPct_set, doc=r"""
    Percentage of RTP packet to drop in RX direction
    (to simulate packet lost).

    Default: 0
    """)
    ecOptions = property(_pjsua2.MediaConfig_ecOptions_get, _pjsua2.MediaConfig_ecOptions_set, doc=r"""
    Echo canceller options (see pjmedia_echo_create()).
    Specify PJMEDIA_ECHO_USE_SW_ECHO here if application wishes
    to use software echo canceller instead of device EC.

    Default: 0.
    """)
    ecTailLen = property(_pjsua2.MediaConfig_ecTailLen_get, _pjsua2.MediaConfig_ecTailLen_set, doc=r"""
    Echo canceller tail length, in miliseconds. Setting this to zero
    will disable echo cancellation.

    Default: PJSUA_DEFAULT_EC_TAIL_LEN
    """)
    sndRecLatency = property(_pjsua2.MediaConfig_sndRecLatency_get, _pjsua2.MediaConfig_sndRecLatency_set, doc=r"""
    Audio capture buffer length, in milliseconds.

    Default: PJMEDIA_SND_DEFAULT_REC_LATENCY
    """)
    sndPlayLatency = property(_pjsua2.MediaConfig_sndPlayLatency_get, _pjsua2.MediaConfig_sndPlayLatency_set, doc=r"""
    Audio playback buffer length, in milliseconds.

    Default: PJMEDIA_SND_DEFAULT_PLAY_LATENCY
    """)
    jbInit = property(_pjsua2.MediaConfig_jbInit_get, _pjsua2.MediaConfig_jbInit_set, doc=r"""
    Jitter buffer initial prefetch delay in msec. The value must be
    between jb_min_pre and jb_max_pre below. If the value is 0,
    prefetching will be disabled.

    Default: -1 (to use default stream settings, currently 0)
    """)
    jbMinPre = property(_pjsua2.MediaConfig_jbMinPre_get, _pjsua2.MediaConfig_jbMinPre_set, doc=r"""
    Jitter buffer minimum prefetch delay in msec.

    Default: -1 (to use default stream settings, currently codec ptime)
    """)
    jbMaxPre = property(_pjsua2.MediaConfig_jbMaxPre_get, _pjsua2.MediaConfig_jbMaxPre_set, doc=r"""
    Jitter buffer maximum prefetch delay in msec.

    Default: -1 (to use default stream settings, currently 80% of jbMax)
    """)
    jbMax = property(_pjsua2.MediaConfig_jbMax_get, _pjsua2.MediaConfig_jbMax_set, doc=r"""
    Set maximum delay that can be accomodated by the jitter buffer msec.

    Default: -1 (to use default stream settings, currently 500 msec)
    """)
    jbDiscardAlgo = property(_pjsua2.MediaConfig_jbDiscardAlgo_get, _pjsua2.MediaConfig_jbDiscardAlgo_set, doc=r"""
    Set the algorithm the jitter buffer uses to discard frames in order to
    adjust the latency.

    Default: PJMEDIA_JB_DISCARD_PROGRESSIVE
    """)
    sndAutoCloseTime = property(_pjsua2.MediaConfig_sndAutoCloseTime_get, _pjsua2.MediaConfig_sndAutoCloseTime_set, doc=r"""
    Specify idle time of sound device before it is automatically closed,
    in seconds. Use value -1 to disable the auto-close feature of sound
    device

    Default : 1
    """)
    vidPreviewEnableNative = property(_pjsua2.MediaConfig_vidPreviewEnableNative_get, _pjsua2.MediaConfig_vidPreviewEnableNative_set, doc=r"""
    Specify whether built-in/native preview should be used if available.
    In some systems, video input devices have built-in capability to show
    preview window of the device. Using this built-in preview is preferable
    as it consumes less CPU power. If built-in preview is not available,
    the library will perform software rendering of the input. If this
    field is set to PJ_FALSE, software preview will always be used.

    Default: PJ_TRUE
    """)

    def __init__(self):
        r"""Default constructor initialises with default values"""
        _pjsua2.MediaConfig_swiginit(self, _pjsua2.new_MediaConfig())

    def readObject(self, node):
        r"""
        Read this object from a container.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to write values from.
        """
        return _pjsua2.MediaConfig_readObject(self, node)

    def writeObject(self, node):
        r"""
        Write this object to a container.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to write values to.
        """
        return _pjsua2.MediaConfig_writeObject(self, node)
    __swig_destroy__ = _pjsua2.delete_MediaConfig

# Register MediaConfig in _pjsua2:
_pjsua2.MediaConfig_swigregister(MediaConfig)
class EpConfig(PersistentObject):
    r"""Endpoint configuration"""

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    uaConfig = property(_pjsua2.EpConfig_uaConfig_get, _pjsua2.EpConfig_uaConfig_set, doc=r"""UA config""")
    logConfig = property(_pjsua2.EpConfig_logConfig_get, _pjsua2.EpConfig_logConfig_set, doc=r"""Logging config""")
    medConfig = property(_pjsua2.EpConfig_medConfig_get, _pjsua2.EpConfig_medConfig_set, doc=r"""Media config""")

    def readObject(self, node):
        r"""
        Read this object from a container.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to write values from.
        """
        return _pjsua2.EpConfig_readObject(self, node)

    def writeObject(self, node):
        r"""
        Write this object to a container.

        :type node: :py:class:`ContainerNode`
        :param node:              Container to write values to.
        """
        return _pjsua2.EpConfig_writeObject(self, node)

    def __init__(self):
        _pjsua2.EpConfig_swiginit(self, _pjsua2.new_EpConfig())
    __swig_destroy__ = _pjsua2.delete_EpConfig

# Register EpConfig in _pjsua2:
_pjsua2.EpConfig_swigregister(EpConfig)
class PendingJob(object):
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    def execute(self, is_pending):
        r"""Perform the job"""
        return _pjsua2.PendingJob_execute(self, is_pending)
    __swig_destroy__ = _pjsua2.delete_PendingJob

    def __init__(self):
        if self.__class__ == PendingJob:
            _self = None
        else:
            _self = self
        _pjsua2.PendingJob_swiginit(self, _pjsua2.new_PendingJob(_self, ))
    def __disown__(self):
        self.this.disown()
        _pjsua2.disown_PendingJob(self)
        return weakref.proxy(self)

# Register PendingJob in _pjsua2:
_pjsua2.PendingJob_swigregister(PendingJob)
class Endpoint(object):
    r"""
    Endpoint represents an instance of pjsua library. There can only be
    one instance of pjsua library in an application, hence this class
    is a singleton.
    """

    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr

    @staticmethod
    def instance():
        r"""Retrieve the singleton instance of the endpoint"""
        return _pjsua2.Endpoint_instance()

    def __init__(self):
        r"""Default constructor"""
        if self.__class__ == Endpoint:
            _self = None
        else:
            _self = self
        _pjsua2.Endpoint_swiginit(self, _pjsua2.new_Endpoint(_self, ))
    __swig_destroy__ = _pjsua2.delete_Endpoint

    def libVersion(self):
        r"""Get library version."""
        return _pjsua2.Endpoint_libVersion(self)

    def libCreate(self):
        r"""
        Instantiate pjsua application. Application must call this function before
        calling any other functions, to make sure that the underlying libraries
        are properly initialized. Once this function has returned success,
        application must call libDestroy() before quitting.
        """
        return _pjsua2.Endpoint_libCreate(self)

    def libGetState(self):
        r"""
        Get library state.

        :rtype: int
        :return: library state.
        """
        return _pjsua2.Endpoint_libGetState(self)

    def libInit(self, prmEpConfig):
        r"""
        Initialize pjsua with the specified settings. All the settings are
        optional, and the default values will be used when the config is not
        specified.

        Note that create() MUST be called before calling this function.

        :type prmEpConfig: :py:class:`EpConfig`
        :param prmEpConfig:       Endpoint configurations
        """
        return _pjsua2.Endpoint_libInit(self, prmEpConfig)

    def libStart(self):
        r"""
        Call this function after all initialization is done, so that the
        library can do additional checking set up. Application may call this
        function any time after init().
        """
        return _pjsua2.Endpoint_libStart(self)

    def libRegisterThread(self, name):
        r"""
        Register a thread that was created by external or native API to the
        library. Note that each time this function is called, it will allocate
        some memory to store the thread description, which will only be freed
        when the library is destroyed.

        :type name: string
        :param name:      The optional name to be assigned to the thread.
        """
        return _pjsua2.Endpoint_libRegisterThread(self, name)

    def libIsThreadRegistered(self):
        r"""
        Check if this thread has been registered to the library. Note that
        this function is only applicable for library main & worker threads and
        external/native threads registered using libRegisterThread().
        """
        return _pjsua2.Endpoint_libIsThreadRegistered(self)

    def libStopWorkerThreads(self):
        r"""Stop all worker threads."""
        return _pjsua2.Endpoint_libStopWorkerThreads(self)

    def libHandleEvents(self, msec_timeout):
        r"""
        Poll pjsua for events, and if necessary block the caller thread for
        the specified maximum interval (in miliseconds).

        Application doesn't normally need to call this function if it has
        configured worker thread (*thread_cnt* field) in pjsua_config
        structure, because polling then will be done by these worker threads
        instead.

        If EpConfig::UaConfig::mainThreadOnly is enabled and this function
        is called from the main thread (by default the main thread is thread
        that calls libCreate()), this function will also scan and run any
        pending jobs in the list.

        :type msec_timeout: int
        :param msec_timeout: Maximum time to wait, in miliseconds.

        :rtype: int
        :return: The number of events that have been handled during the
                             poll. Negative value indicates error, and application
                             can retrieve the error as (status = -return_value).
        """
        return _pjsua2.Endpoint_libHandleEvents(self, msec_timeout)

    def libDestroy(self, prmFlags=0):
        r"""
        Destroy pjsua. Application is recommended to perform graceful shutdown
        before calling this function (such as unregister the account from the
        SIP server, terminate presense subscription, and hangup active calls),
        however, this function will do all of these if it finds there are
        active sessions that need to be terminated. This function will
        block for few seconds to wait for replies from remote.

        Application.may safely call this function more than once if it doesn't
        keep track of it's state.

        :type prmFlags: int, optional
        :param prmFlags:  Combination of pjsua_destroy_flag enumeration.
        """
        return _pjsua2.Endpoint_libDestroy(self, prmFlags)

    def libGetSipIoqueueHandle(self):
        r"""
        Get the OS handle pointer associated with pjsua's SIP IO queue.

        :rtype: pj_oshandle_t
        :return: For epoll/kqueue backends a pointer to a POSIX file
                             descriptor. For all other backends a pointer to a
                             platform-specific handle. If the backend does not
                             expose a handle NULL is returned.
        """
        return _pjsua2.Endpoint_libGetSipIoqueueHandle(self)

    def utilStrError(self, prmErr):
        r"""
        Retrieve the error string for the specified status code.

        :type prmErr: int
        :param prmErr:            The error code.
        """
        return _pjsua2.Endpoint_utilStrError(self, prmErr)

    def utilLogWrite(self, *args):
        r"""
        *Overload 1:*

        Write a log message.

        :type prmLevel: int
        :param prmLevel:          Log verbosity level (1-5)
        :type prmSender: string
        :param prmSender:         The log sender.
        :type prmMsg: string
        :param prmMsg:            The log message.

        |

        *Overload 2:*

        Write a log entry.
        Application must implement its own custom LogWriter and
        this function will then call the LogWriter::write() method.
        Note that this function does not call PJSIP's internal
        logging functionality. For that, you should use
        utilLogWrite(prmLevel, prmSender, prmMsg) above.

        :type e: :py:class:`LogEntry`
        :param e:                 The log entry.
        """
        return _pjsua2.Endpoint_utilLogWrite(self, *args)

    def utilVerifySipUri(self, prmUri):
        r"""
        This is a utility function to verify that valid SIP url is given. If the
        URL is a valid SIP/SIPS scheme, PJ_SUCCESS will be returned.

        :type prmUri: string
        :param prmUri:            The URL string.

        :rtype: int
        :return: PJ_SUCCESS on success, or the appropriate error
                                     code.

        See also: utilVerifyUri()
        """
        return _pjsua2.Endpoint_utilVerifySipUri(self, prmUri)

    def utilVerifyUri(self, prmUri):
        r"""
        This is a utility function to verify that valid URI is given. Unlike
        utilVerifySipUri(), this function will return PJ_SUCCESS if tel: URI
        is given.

        :type prmUri: string
        :param prmUri:            The URL string.

        :rtype: int
        :return: PJ_SUCCESS on success, or the appropriate error
                                     code.

        See also: pjsua_verify_sip_url()
        """
        return _pjsua2.Endpoint_utilVerifyUri(self, prmUri)

    def utilTimerSchedule(self, prmMsecDelay, prmUserData):
        r"""
        Schedule a timer with the specified interval and user data. When the
        interval elapsed, onTimer() callback will be
        called. Note that the callback may be executed by different thread,
        depending on whether worker thread is enabled or not.

        :type prmMsecDelay: int
        :param prmMsecDelay:      The time interval in msec.
        :type prmUserData: void
        :param prmUserData:       Arbitrary user data, to be given back to
                                     application in the callback.

        :rtype: void
        :return: Token to identify the timer, which could be
                                     given to utilTimerCancel().
        """
        return _pjsua2.Endpoint_utilTimerSchedule(self, prmMsecDelay, prmUserData)

    def utilTimerCancel(self, prmToken):
        r"""
        Cancel previously scheduled timer with the specified timer token.

        :type prmToken: void
        :param prmToken:          The timer token, which was returned from
                                     previous utilTimerSchedule() call.
        """
        return _pjsua2.Endpoint_utilTimerCancel(self, prmToken)

    def utilAddPendingJob(self, job):
        r"""
        Utility to register a pending job to be executed by main thread.
        If EpConfig::UaConfig::mainThreadOnly is false, the job will be
        executed immediately.

        :type job: :py:class:`PendingJob`
        :param job:               The job class.
        """

            # print('disowning job')
        job.__disown__()


        return _pjsua2.Endpoint_utilAddPendingJob(self, job)


    def utilSslGetAvailableCiphers(self):
        r"""Get cipher list supported by SSL/TLS backend."""
        return _pjsua2.Endpoint_utilSslGetAvailableCiphers(self)

    def natDetectType(self):
        r"""
        This is a utility function to detect NAT type in front of this endpoint.
        Once invoked successfully, this function will complete asynchronously
        and report the result in onNatDetectionComplete().

        After NAT has been detected and the callback is called, application can
        get the detected NAT type by calling natGetType(). Application
        can also perform NAT detection by calling natDetectType()
        again at later time.

        Note that STUN must be enabled to run this function successfully.
        """
        return _pjsua2.Endpoint_natDetectType(self)

    def natGetType(self):
        r"""
        Get the NAT type as detected by natDetectType() function. This
        function will only return useful NAT type after natDetectType()
        has completed successfully and onNatDetectionComplete()
        callback has been called.

        Exception: if this function is called while detection is in progress,
        PJ_EPENDING exception will be raised.
        """
        return _pjsua2.Endpoint_natGetType(self)

    def natUpdateStunServers(self, prmServers, prmWait):
        r"""
        Update the STUN servers list. The libInit() must have been called
        before calling this function.

        :type prmServers: :py:class:`StringVector`
        :param prmServers:        Array of STUN servers to try. The endpoint
                                     will try to resolve and contact each of the
                                     STUN server entry until it finds one that is
                                     usable. Each entry may be a domain name, host
                                     name, IP address, and it may contain an
                                     optional port number. For example:
                                     - "pjsip.org" (domain name)
                                     - "sip.pjsip.org" (host name)
                                     - "pjsip.org:33478" (domain name and a non-
                                        standard port number)
                                     - "10.0.0.1:3478" (IP address and port number)
        :type prmWait: boolean
        :param prmWait:           Specify if the function should block until
                                     it gets the result. In this case, the
                                     function will block while the resolution
                                     is being done, and the callback
                                     onNatCheckStunServersComplete() will be called
                                     before this function returns.
        """
        return _pjsua2.Endpoint_natUpdateStunServers(self, prmServers, prmWait)

    def natCheckStunServers(self, prmServers, prmWait, prmUserData):
        r"""
        Auxiliary function to resolve and contact each of the STUN server
        entries (sequentially) to find which is usable. The libInit() must
        have been called before calling this function.

        :type prmServers: :py:class:`StringVector`
        :param prmServers:        Array of STUN servers to try. The endpoint
                                     will try to resolve and contact each of the
                                     STUN server entry until it finds one that is
                                     usable. Each entry may be a domain name, host
                                     name, IP address, and it may contain an
                                     optional port number. For example:
                                     - "pjsip.org" (domain name)
                                     - "sip.pjsip.org" (host name)
                                     - "pjsip.org:33478" (domain name and a non-
                                        standard port number)
                                     - "10.0.0.1:3478" (IP address and port number)
        :type prmWait: boolean
        :param prmWait:           Specify if the function should block until
                                     it gets the result. In this case, the function
                                     will block while the resolution is being done,
                                     and the callback will be called before this
                                     function returns.
        :type prmUserData: void
        :param prmUserData:       Arbitrary user data to be passed back to
                                     application in the callback.

        See also: natCancelCheckStunServers()
        """
        return _pjsua2.Endpoint_natCheckStunServers(self, prmServers, prmWait, prmUserData)

    def natCancelCheckStunServers(self, token, notify_cb=False):
        r"""
        Cancel pending STUN resolution which match the specified token.

        :type token: void
        :param token:             The token to match. This token was given to
                                     natCheckStunServers()
        :type notify_cb: boolean, optional
        :param notify_cb:         Boolean to control whether the callback should
                                     be called for cancelled resolutions. When the
                                     callback is called, the status in the result
                                     will be set as PJ_ECANCELLED.

        Exception: PJ_ENOTFOUND if there is no matching one, or other error.
        """
        return _pjsua2.Endpoint_natCancelCheckStunServers(self, token, notify_cb)

    def transportCreate(self, type, cfg):
        r"""
        Create and start a new SIP transport according to the specified
        settings.

        :type type: int
        :param type:              Transport type.
        :type cfg: :py:class:`TransportConfig`
        :param cfg:               Transport configuration.

        :rtype: int
        :return: The transport ID.
        """
        return _pjsua2.Endpoint_transportCreate(self, type, cfg)

    def transportEnum(self):
        r"""
        Enumerate all transports currently created in the system. This
        function will return all transport IDs, and application may then
        call transportGetInfo() function to retrieve detailed information
        about the transport.

        :rtype: :py:class:`IntVector`
        :return: Array of transport IDs.
        """
        return _pjsua2.Endpoint_transportEnum(self)

    def transportGetInfo(self, id):
        r"""
        Get information about transport.

        :type id: int
        :param id:                Transport ID.

        :rtype: :py:class:`TransportInfo`
        :return: Transport info.
        """
        return _pjsua2.Endpoint_transportGetInfo(self, id)

    def transportClose(self, id):
        r"""
        Close the transport. The system will wait until all transactions are
        closed while preventing new users from using the transport, and will
        close the transport when its usage count reaches zero.

        :type id: int
        :param id:                Transport ID.
        """
        return _pjsua2.Endpoint_transportClose(self, id)

    def transportShutdown(self, tp):
        r"""
        Start graceful shutdown procedure for this transport handle. After
        graceful shutdown has been initiated, no new reference can be
        obtained for the transport. However, existing objects that currently
        uses the transport may still use this transport to send and receive
        packets. After all objects release their reference to this transport,
        the transport will be destroyed immediately.

        Note: application normally uses this API after obtaining the handle
        from onTransportState() callback.

        :type tp: void
        :param tp:                The transport.
        """
        return _pjsua2.Endpoint_transportShutdown(self, tp)

    def hangupAllCalls(self):
        r"""
        Terminate all calls. This will initiate call hangup for all
        currently active calls.
        """
        return _pjsua2.Endpoint_hangupAllCalls(self)

    def mediaAdd(self, media):
        r"""
        Add media to the media list.

        :type media: :py:class:`AudioMedia`
        :param media:     media to be added.
        """
        return _pjsua2.Endpoint_mediaAdd(self, media)

    def mediaRemove(self, media):
        r"""
        Remove media from the media list.

        :type media: :py:class:`AudioMedia`
        :param media:     media to be removed.
        """
        return _pjsua2.Endpoint_mediaRemove(self, media)

    def mediaExists(self, media):
        r"""
        Check if media has been added to the media list.

        :type media: :py:class:`AudioMedia`
        :param media:     media to be check.

        :rtype: boolean
        :return: True if media has been added, false otherwise.
        """
        return _pjsua2.Endpoint_mediaExists(self, media)

    def mediaMaxPorts(self):
        r"""
        Get maximum number of media port.

        :rtype: int
        :return: Maximum number of media port in the conference bridge.
        """
        return _pjsua2.Endpoint_mediaMaxPorts(self)

    def mediaActivePorts(self):
        r"""
        Get current number of active media port in the bridge.

        :rtype: int
        :return: The number of active media port.
        """
        return _pjsua2.Endpoint_mediaActivePorts(self)

    def mediaEnumPorts2(self):
        r"""
        Enumerate all audio media port.

        :rtype: :py:class:`AudioMediaVector2`
        :return: The list of audio media port.
        """
        return _pjsua2.Endpoint_mediaEnumPorts2(self)

    def mediaEnumVidPorts(self):
        r"""
        Enumerate all video media port.

        :rtype: :py:class:`VideoMediaVector`
        :return: The list of video media port.
        """
        return _pjsua2.Endpoint_mediaEnumVidPorts(self)

    def audDevManager(self):
        r"""
        Get the instance of Audio Device Manager.

        :rtype: :py:class:`AudDevManager`
        :return: The Audio Device Manager.
        """
        return _pjsua2.Endpoint_audDevManager(self)

    def vidDevManager(self):
        r"""
        Get the instance of Video Device Manager.

        :rtype: :py:class:`VidDevManager`
        :return: The Video Device Manager.
        """
        return _pjsua2.Endpoint_vidDevManager(self)

    def codecEnum2(self):
        r"""
        Enum all supported codecs in the system.

        :rtype: :py:class:`CodecInfoVector2`
        :return: Array of codec info.
        """
        return _pjsua2.Endpoint_codecEnum2(self)

    def codecSetPriority(self, codec_id, priority):
        r"""
        Change codec priority.

        :type codec_id: string
        :param codec_id:  Codec ID, which is a string that uniquely identify
                             the codec (such as "speex/8000").
        :type priority: pj_uint8_t
        :param priority:  Codec priority, 0-255, where zero means to disable
                             the codec.
        """
        return _pjsua2.Endpoint_codecSetPriority(self, codec_id, priority)

    def codecGetParam(self, codec_id):
        r"""
        Get codec parameters.

        :type codec_id: string
        :param codec_id:  Codec ID.

        :rtype: :py:class:`CodecParam`
        :return: Codec parameters. If codec is not found, Error
                             will be thrown.
        """
        return _pjsua2.Endpoint_codecGetParam(self, codec_id)

    def codecSetParam(self, codec_id, param):
        r"""
        Set codec parameters.

        :type codec_id: string
        :param codec_id:  Codec ID.
        :type param: :py:class:`CodecParam`
        :param param:     Codec parameter to set. Set to NULL to reset
                             codec parameter to library default settings.
        """
        return _pjsua2.Endpoint_codecSetParam(self, codec_id, param)

    def videoCodecEnum2(self):
        r"""
        Enum all supported video codecs in the system.

        :rtype: :py:class:`CodecInfoVector2`
        :return: Array of video codec info.
        """
        return _pjsua2.Endpoint_videoCodecEnum2(self)

    def videoCodecSetPriority(self, codec_id, priority):
        r"""
        Change video codec priority.

        :type codec_id: string
        :param codec_id:  Codec ID, which is a string that uniquely identify
                             the codec (such as "H263/90000"). Please see pjsua
                             manual or pjmedia codec reference for details.
        :type priority: pj_uint8_t
        :param priority:  Codec priority, 0-255, where zero means to disable
                             the codec.
        """
        return _pjsua2.Endpoint_videoCodecSetPriority(self, codec_id, priority)

    def getVideoCodecParam(self, codec_id):
        r"""
        Get video codec parameters.

        :type codec_id: string
        :param codec_id:  Codec ID.

        :rtype: :py:class:`VidCodecParam`
        :return: Codec parameters. If codec is not found, Error
                             will be thrown.
        """
        return _pjsua2.Endpoint_getVideoCodecParam(self, codec_id)

    def setVideoCodecParam(self, codec_id, param):
        r"""
        Set video codec parameters.

        :type codec_id: string
        :param codec_id:  Codec ID.
        :type param: :py:class:`VidCodecParam`
        :param param:     Codec parameter to set.
        """
        return _pjsua2.Endpoint_setVideoCodecParam(self, codec_id, param)

    def resetVideoCodecParam(self, codec_id):
        r"""
        Reset video codec parameters to library default settings.

        :type codec_id: string
        :param codec_id:  Codec ID.
        """
        return _pjsua2.Endpoint_resetVideoCodecParam(self, codec_id)

    def getCodecOpusConfig(self):
        r"""Get codec Opus config."""
        return _pjsua2.Endpoint_getCodecOpusConfig(self)

    def setCodecOpusConfig(self, opus_cfg):
        r"""
        Set codec Opus config.

        :type opus_cfg: :py:class:`CodecOpusConfig`
        :param opus_cfg:  Codec Opus configuration.
        """
        return _pjsua2.Endpoint_setCodecOpusConfig(self, opus_cfg)

    def getCodecLyraConfig(self):
        r"""Get codec Lyra config."""
        return _pjsua2.Endpoint_getCodecLyraConfig(self)

    def setCodecLyraConfig(self, lyra_cfg):
        r"""
        Set codec Lyra config.

        :type lyra_cfg: :py:class:`CodecLyraConfig`
        :param lyra_cfg:  Codec Lyra configuration.
        """
        return _pjsua2.Endpoint_setCodecLyraConfig(self, lyra_cfg)

    def srtpCryptoEnum(self):
        r"""
        Enumerate all SRTP crypto-suite names.

        :rtype: :py:class:`StringVector`
        :return: The list of SRTP crypto-suite name.
        """
        return _pjsua2.Endpoint_srtpCryptoEnum(self)

    def handleIpChange(self, param):
        r"""
        Inform the stack that IP address change event was detected.
        The stack will:
        1. Restart the listener (this step is configurable via
           *IpChangeParam.restartListener)*.
        2. Shutdown the transport used by account registration (this step is
           configurable via *AccountConfig.ipChangeConfig.shutdownTp)*.
        3. Update contact URI by sending re-Registration (this step is
           configurable via a\ AccountConfig.natConfig.contactRewriteUse and
           a\ AccountConfig.natConfig.contactRewriteMethod)
        4. Hangup active calls (this step is configurable via
           a\ AccountConfig.ipChangeConfig.hangupCalls) or
           continue the call by sending re-INVITE
           (configurable via *AccountConfig.ipChangeConfig.reinviteFlags)*.

        :type param: :py:class:`IpChangeParam`
        :param param:     The IP change parameter, have a look at IpChangeParam.
        """
        return _pjsua2.Endpoint_handleIpChange(self, param)

    def onNatDetectionComplete(self, prm):
        r"""
        Callback when the Endpoint has finished performing NAT type
        detection that is initiated with natDetectType().

        :type prm: :py:class:`OnNatDetectionCompleteParam`
        :param prm:       Callback parameters containing the detection
                             result.
        """
        return _pjsua2.Endpoint_onNatDetectionComplete(self, prm)

    def onNatCheckStunServersComplete(self, prm):
        r"""
        Callback when the Endpoint has finished performing STUN server
        checking that is initiated when calling libInit(), or by
        calling natCheckStunServers() or natUpdateStunServers().

        :type prm: :py:class:`OnNatCheckStunServersCompleteParam`
        :param prm:       Callback parameters.
        """
        return _pjsua2.Endpoint_onNatCheckStunServersComplete(self, prm)

    def onTransportState(self, prm):
        r"""
        This callback is called when transport state has changed.

        :type prm: :py:class:`OnTransportStateParam`
        :param prm:       Callback parameters.
        """
        return _pjsua2.Endpoint_onTransportState(self, prm)

    def onTimer(self, prm):
        r"""
        Callback when a timer has fired. The timer was scheduled by
        utilTimerSchedule().

        :type prm: :py:class:`OnTimerParam`
        :param prm:       Callback parameters.
        """
        return _pjsua2.Endpoint_onTimer(self, prm)

    def onSelectAccount(self, prm):
        r"""
        This callback can be used by application to override the account
        to be used to handle an incoming message. Initially, the account to
        be used will be calculated automatically by the library. This initial
        account will be used if application does not implement this callback,
        or application sets an invalid account upon returning from this
        callback.

        Note that currently the incoming messages requiring account assignment
        are INVITE, MESSAGE, SUBSCRIBE, and unsolicited NOTIFY. This callback
        may be called before the callback of the SIP event itself, i.e:
        incoming call, pager, subscription, or unsolicited-event.

        :type prm: :py:class:`OnSelectAccountParam`
        :param prm:       Callback parameters.
        """
        return _pjsua2.Endpoint_onSelectAccount(self, prm)

    def onIpChangeProgress(self, prm):
        r"""
        Calling #handleIpChange() may involve different operation. This
        callback is called to report the progress of each enabled operation.

        :type prm: :py:class:`OnIpChangeProgressParam`
        :param prm:       Callback parameters.
        """
        return _pjsua2.Endpoint_onIpChangeProgress(self, prm)

    def onMediaEvent(self, prm):
        r"""
        Notification about media events such as video notifications. This
        callback will most likely be called from media threads, thus
        application must not perform heavy processing in this callback.
        If application needs to perform more complex tasks to handle the
        event, it should post the task to another thread.

        :type prm: :py:class:`OnMediaEventParam`
        :param prm:       Callback parameter.
        """
        return _pjsua2.Endpoint_onMediaEvent(self, prm)

    def onCredAuth(self, prm):
        r"""
        Callback for custom computation of the digest AKA response.

        Usually an application does not need to implement (overload) this
        callback because by default the response digest AKA is automatically
        computed using **libmilenage**.

        To use Digest AKA authentication, add *PJSIP_CRED_DATA_EXT_AKA* flag
        in the AuthCredInfo's *dataType* field of the AccountConfig, and
        fill up other AKA specific information in AuthCredInfo.
        Please see 'PJSIP_AUTH_AKA_API' for more information.

        :type prm: :py:class:`OnCredAuthParam`
        :param prm:       Callback parameter.

        :rtype: int
        :return: Return PJ_ENOTSUP to let the library compute
                             the response digest automatically.
                             Return PJ_SUCCESS if application does the computation
                             and sets the response digest in
                             *prm.DigestCredential.response*.
        """
        return _pjsua2.Endpoint_onCredAuth(self, prm)

    def onRejectedIncomingCall(self, prm):
        r"""
        This callback will be invoked when the library implicitly rejects
        an incoming call.

        In addition to being declined explicitly using the Call::answer()
        method, the library may also automatically reject the incoming call
        due to different scenarios, e.g:
        - no available call slot.
        - no available account to handle the call.
        - when an incoming INVITE is received with, for instance, a message
          containing invalid SDP.

        :type prm: :py:class:`OnRejectedIncomingCallParam`
        :param prm:       Callback parameters.
        """
        return _pjsua2.Endpoint_onRejectedIncomingCall(self, prm)

    def onAudioMediaOpCompleted(self, prm):
        r"""
        This callback will be invoked when an AudioMedia operation has been
        completed. This callback will most likely be called from media threads,
        thus application must not perform long/blocking processing in this
        callback.

        :type prm: :py:class:`OnAudioMediaOpCompletedParam`
        :param prm:       Callback parameters.
        """
        return _pjsua2.Endpoint_onAudioMediaOpCompleted(self, prm)

    def onVideoMediaOpCompleted(self, prm):
        r"""
        This callback will be invoked when a VideoMedia operation has been
        completed. This callback will most likely be called from media threads,
        thus application must not perform long/blocking processing in this
        callback.

        :type prm: :py:class:`OnVideoMediaOpCompletedParam`
        :param prm:       Callback parameters.
        """
        return _pjsua2.Endpoint_onVideoMediaOpCompleted(self, prm)
    def __disown__(self):
        self.this.disown()
        _pjsua2.disown_Endpoint(self)
        return weakref.proxy(self)

# Register Endpoint in _pjsua2:
_pjsua2.Endpoint_swigregister(Endpoint)

