Bug 817065: Replace vcm_media_payload_t with structure leveraging rtp_ptype constants r=ehugg,jesup

This commit is contained in:
Adam Roach [:abr] 2012-12-06 11:36:43 -06:00
parent 629d8a0ae2
commit 8a57275446
12 changed files with 786 additions and 887 deletions

View File

@ -333,7 +333,6 @@
'./src/sipcc/core/common/text_strings.c',
'./src/sipcc/core/common/text_strings.h',
'./src/sipcc/core/common/ui.c',
'./src/sipcc/core/common/vcm_util.c',
# GSM
'./src/sipcc/core/gsm/ccapi.c',
'./src/sipcc/core/gsm/ccapi_strings.c',
@ -412,7 +411,6 @@
'./src/sipcc/core/includes/util_ios_queue.h',
'./src/sipcc/core/includes/util_parse.h',
'./src/sipcc/core/includes/util_string.h',
'./src/sipcc/core/includes/vcm_util.h',
'./src/sipcc/core/includes/www.h',
'./src/sipcc/core/includes/xml_defs.h',
# SDP

View File

@ -64,19 +64,6 @@ VcmSIPCCBinding * VcmSIPCCBinding::_pSelf = NULL;
int VcmSIPCCBinding::mAudioCodecMask = 0;
int VcmSIPCCBinding::mVideoCodecMask = 0;
/**
* Convert a combined payload type value to a config value
*
* @param [in] payload - the combined payload type integer
* @param [out] config - the returned config value
*
* return int
*/
static int vcmPayloadType2AudioCodec(vcm_media_payload_type_t payload,
mozilla::AudioCodecConfig **config);
static int vcmPayloadType2VideoCodec(vcm_media_payload_type_t payload,
mozilla::VideoCodecConfig **config);
static mozilla::RefPtr<TransportFlow> vcmCreateTransportFlow(sipcc::PeerConnectionImpl *pc,
int level, bool rtcp,
const char *fingerprint_alg,
@ -238,39 +225,6 @@ struct h264_video
int tias_bw;
};
#if 0
static RingMode
map_ring_mode (vcm_ring_mode_t mode)
{
switch ( mode )
{
case VCM_INSIDE_RING:
return RingMode_INSIDE_RING;
case VCM_OUTSIDE_RING:
return RingMode_OUTSIDE_RING;
case VCM_FEATURE_RING:
return RingMode_FEATURE_RING;
case VCM_BELLCORE_DR1:
return RingMode_BELLCORE_DR1;
case VCM_BELLCORE_DR2:
return RingMode_BELLCORE_DR2;
case VCM_BELLCORE_DR3:
return RingMode_BELLCORE_DR3;
case VCM_BELLCORE_DR4:
return RingMode_BELLCORE_DR4;
case VCM_BELLCORE_DR5:
return RingMode_BELLCORE_DR5;
case VCM_FLASHONLY_RING:
return RingMode_FLASHONLY_RING;
case VCM_STATION_PRECEDENCE_RING:
return RingMode_PRECEDENCE_RING;
default:
CSFLogDebugS( logTag, "map_ring_mode(): Wrong ringmode passed");
return RingMode_INSIDE_RING;
}
}
#endif
/**
* start/stop ringing
*
@ -328,93 +282,6 @@ void vcmEnableSidetone(cc_uint16_t side_tone)
CSFLogDebug( logTag, "vcmEnableSidetone: vcmEnableSidetone(): called");
}
/*
* Function:map_VCM_Media_Payload_type
*
* Parameters:payload
*
* Description: Converts VCM payload type to MediaManager Payload defs.
*
* Returns:payload type corresponding to VCM payload
*
*/
#define MAKE_VCM_MEDIA_PAYLOAD_MAP_ENTRY(VCMPayloadItem, CIPPayloadItem)\
vcmToCIP_Mappings[VCMPayloadItem] = CIPPayloadItem
static int
map_VCM_Media_Payload_type( vcm_media_payload_type_t payload )
{
static bool mappingInitialised = false;
static int vcmToCIP_Mappings[VCM_Media_Payload_Max] = { };
if (!mappingInitialised)
{
int numElements = csf_countof(vcmToCIP_Mappings);
std::fill_n(vcmToCIP_Mappings, numElements, cip_mmgr_MediaDefinitions_MEDIA_TYPE_NONSTANDARD);
MAKE_VCM_MEDIA_PAYLOAD_MAP_ENTRY(VCM_Media_Payload_NonStandard, cip_mmgr_MediaDefinitions_MEDIA_TYPE_NONSTANDARD);
MAKE_VCM_MEDIA_PAYLOAD_MAP_ENTRY(VCM_Media_Payload_G711Alaw64k, cip_mmgr_MediaDefinitions_MEDIA_TYPE_G711ALAW64K);
MAKE_VCM_MEDIA_PAYLOAD_MAP_ENTRY(VCM_Media_Payload_G711Alaw56k, cip_mmgr_MediaDefinitions_MEDIA_TYPE_G711ALAW56K);
MAKE_VCM_MEDIA_PAYLOAD_MAP_ENTRY(VCM_Media_Payload_G711Ulaw64k, cip_mmgr_MediaDefinitions_MEDIA_TYPE_G711ULAW64K);
MAKE_VCM_MEDIA_PAYLOAD_MAP_ENTRY(VCM_Media_Payload_G711Ulaw56k, cip_mmgr_MediaDefinitions_MEDIA_TYPE_G711ULAW56K);
MAKE_VCM_MEDIA_PAYLOAD_MAP_ENTRY(VCM_Media_Payload_G722_64k, cip_mmgr_MediaDefinitions_MEDIA_TYPE_G722_64K);
MAKE_VCM_MEDIA_PAYLOAD_MAP_ENTRY(VCM_Media_Payload_G722_56k, cip_mmgr_MediaDefinitions_MEDIA_TYPE_G722_56K);
MAKE_VCM_MEDIA_PAYLOAD_MAP_ENTRY(VCM_Media_Payload_G722_48k, cip_mmgr_MediaDefinitions_MEDIA_TYPE_G722_48K);
MAKE_VCM_MEDIA_PAYLOAD_MAP_ENTRY(VCM_Media_Payload_ILBC20, cip_mmgr_MediaDefinitions_MEDIA_TYPE_ILBC20 | (VCM_Media_Payload_ILBC20 & 0XFFFF0000));
MAKE_VCM_MEDIA_PAYLOAD_MAP_ENTRY(VCM_Media_Payload_ILBC30, cip_mmgr_MediaDefinitions_MEDIA_TYPE_ILBC30 | (cip_mmgr_MediaDefinitions_MEDIA_TYPE_ILBC30 & 0XFFFF0000));
MAKE_VCM_MEDIA_PAYLOAD_MAP_ENTRY(VCM_Media_Payload_G7231, cip_mmgr_MediaDefinitions_MEDIA_TYPE_G7231_5P3K);
MAKE_VCM_MEDIA_PAYLOAD_MAP_ENTRY(VCM_Media_Payload_G728, cip_mmgr_MediaDefinitions_MEDIA_TYPE_G728);
MAKE_VCM_MEDIA_PAYLOAD_MAP_ENTRY(VCM_Media_Payload_G729, cip_mmgr_MediaDefinitions_MEDIA_TYPE_G729);
MAKE_VCM_MEDIA_PAYLOAD_MAP_ENTRY(VCM_Media_Payload_G729AnnexA, cip_mmgr_MediaDefinitions_MEDIA_TYPE_G729ANNEXA);
MAKE_VCM_MEDIA_PAYLOAD_MAP_ENTRY(VCM_Media_Payload_Is11172AudioCap, cip_mmgr_MediaDefinitions_MEDIA_TYPE_IS11172AUDIOCAP);
MAKE_VCM_MEDIA_PAYLOAD_MAP_ENTRY(VCM_Media_Payload_Is13818AudioCap, cip_mmgr_MediaDefinitions_MEDIA_TYPE_IS13818AUDIOCAP);
MAKE_VCM_MEDIA_PAYLOAD_MAP_ENTRY(VCM_Media_Payload_G729AnnexB, cip_mmgr_MediaDefinitions_MEDIA_TYPE_G729ANNEXB);
MAKE_VCM_MEDIA_PAYLOAD_MAP_ENTRY(VCM_Media_Payload_GSM_Full_Rate, cip_mmgr_MediaDefinitions_MEDIA_TYPE_GSM_FULL_RATE);
MAKE_VCM_MEDIA_PAYLOAD_MAP_ENTRY(VCM_Media_Payload_GSM_Half_Rate, cip_mmgr_MediaDefinitions_MEDIA_TYPE_GSM_HALF_RATE);
MAKE_VCM_MEDIA_PAYLOAD_MAP_ENTRY(VCM_Media_Payload_GSM_Enhanced_Full_Rate, cip_mmgr_MediaDefinitions_MEDIA_TYPE_GSM_ENHANCED_FULL_RATE);
MAKE_VCM_MEDIA_PAYLOAD_MAP_ENTRY(VCM_Media_Payload_Wide_Band_256k, cip_mmgr_MediaDefinitions_MEDIA_TYPE_WIDE_BAND_256K);
MAKE_VCM_MEDIA_PAYLOAD_MAP_ENTRY(VCM_Media_Payload_Data64, cip_mmgr_MediaDefinitions_MEDIA_TYPE_DATA64);
MAKE_VCM_MEDIA_PAYLOAD_MAP_ENTRY(VCM_Media_Payload_Data56, cip_mmgr_MediaDefinitions_MEDIA_TYPE_DATA56);
MAKE_VCM_MEDIA_PAYLOAD_MAP_ENTRY(VCM_Media_Payload_GSM, cip_mmgr_MediaDefinitions_MEDIA_TYPE_GSM);
MAKE_VCM_MEDIA_PAYLOAD_MAP_ENTRY(VCM_Media_Payload_ActiveVoice, cip_mmgr_MediaDefinitions_MEDIA_TYPE_ACTIVEVOICE);
MAKE_VCM_MEDIA_PAYLOAD_MAP_ENTRY(VCM_Media_Payload_G726_32K, cip_mmgr_MediaDefinitions_MEDIA_TYPE_G726_32K);
MAKE_VCM_MEDIA_PAYLOAD_MAP_ENTRY(VCM_Media_Payload_G726_24K, cip_mmgr_MediaDefinitions_MEDIA_TYPE_G726_24K);
MAKE_VCM_MEDIA_PAYLOAD_MAP_ENTRY(VCM_Media_Payload_G726_16K, cip_mmgr_MediaDefinitions_MEDIA_TYPE_G726_16K);
MAKE_VCM_MEDIA_PAYLOAD_MAP_ENTRY(VCM_Media_Payload_VP8, cip_mmgr_MediaDefinitions_MEDIA_TYPE_VP8);
MAKE_VCM_MEDIA_PAYLOAD_MAP_ENTRY(VCM_Media_Payload_OPUS, cip_mmgr_MediaDefinitions_MEDIA_TYPE_OPUS);
mappingInitialised = true;
}
int vcmIndex = payload & 0XFFFF;
switch (vcmIndex)
{
case VCM_Media_Payload_ILBC20:
return ((payload & 0XFFFF0000) | cip_mmgr_MediaDefinitions_MEDIA_TYPE_ILBC20);
case VCM_Media_Payload_ILBC30:
return ((payload & 0XFFFF0000) | cip_mmgr_MediaDefinitions_MEDIA_TYPE_ILBC30);
case VCM_Media_Payload_H263:
return ((payload & 0XFFFF0000) | cip_mmgr_MediaDefinitions_MEDIA_TYPE_H263);
case VCM_Media_Payload_H264:
return ((payload & 0XFFFF0000) | RTP_H264_P0);
case VCM_Media_Payload_ISAC:
return ((payload & 0XFFFF0000) | cip_mmgr_MediaDefinitions_MEDIA_TYPE_ISAC);
case VCM_Media_Payload_VP8:
return ((payload & 0XFFFF0000) | cip_mmgr_MediaDefinitions_MEDIA_TYPE_VP8);
default:
//use the static array
if (vcmIndex < VCM_Media_Payload_Max)
{
return vcmToCIP_Mappings[vcmIndex];
}
return cip_mmgr_MediaDefinitions_MEDIA_TYPE_NONSTANDARD;
}
}
/*
* Function:map_algorithmID
*
@ -847,8 +714,7 @@ short vcmSetIceMediaParams(const char *peerconnection, int level, char *ufrag, c
short vcmCreateRemoteStream(
cc_mcapid_t mcap_id,
const char *peerconnection,
int *pc_stream_id,
vcm_media_payload_type_t payload) {
int *pc_stream_id) {
uint32_t hints = 0;
nsresult res;
@ -1052,8 +918,8 @@ short vcmRxOpen(cc_mcapid_t mcap_id,
* @param[in] mcap_id - media type id
* @param[in] group_id - group identifier associated with the stream
* @param[in] stream_id - id of the stream one per each media line
* @param[in] call_handle - call identifier
* @param[in] payload - payload type
* @param[in] call_handle - call identifier
* @param[in] payload - payload information
* @param[in] local_addr - local ip address to use.
* @param[in] port - local port (receive)
* @param[in] algorithmID - crypto alogrithm ID
@ -1067,22 +933,22 @@ int vcmRxStart(cc_mcapid_t mcap_id,
cc_groupid_t group_id,
cc_streamid_t stream_id,
cc_call_handle_t call_handle,
vcm_media_payload_type_t payload,
const vcm_payload_info_t *payload,
cpr_ip_addr_t *local_addr,
cc_uint16_t port,
vcm_crypto_algorithmID algorithmID,
vcm_crypto_key_t *rx_key,
vcm_mediaAttrs_t *attrs)
{
int pt;
uint8_t *key;
uint8_t *salt;
cc_uint16_t key_len;
cc_uint16_t salt_len;
char fname[] = "vcmRxStart";
CSFLogDebug( logTag, "%s: group_id=%d call_handle=%d payload=%d port=%d algID=%d",
fname, group_id, call_handle, payload, port, algorithmID);
CSFLogDebug( logTag, "%s: group_id=%d call_handle=%d payload=%d port=%d"
" algID=%d", fname, group_id, call_handle, payload->remote_rtp_pt,
port, algorithmID);
if (call_handle == CC_NO_CALL_ID) {
/* no operation when no call ID */
@ -1116,26 +982,24 @@ int vcmRxStart(cc_mcapid_t mcap_id,
break;
}
pt = map_VCM_Media_Payload_type(payload);
switch ( mcap_id )
{
case CC_AUDIO_1:
if ( VcmSIPCCBinding::getAudioTermination() != NULL )
return VcmSIPCCBinding::getAudioTermination()->rxStart( group_id, stream_id, DYNAMIC_PAYLOAD_TYPE(pt),
attrs->audio.packetization_period, port, attrs->audio.avt_payload_type,
map_algorithmID(algorithmID), key, key_len, salt, salt_len,
attrs->audio.mixing_mode, attrs->audio.mixing_party );
return VcmSIPCCBinding::getAudioTermination()->rxStart(
group_id, stream_id, payload->remote_rtp_pt,
attrs->audio.packetization_period, port,
attrs->audio.avt_payload_type, map_algorithmID(algorithmID),
key, key_len, salt, salt_len, attrs->audio.mixing_mode,
attrs->audio.mixing_party );
break;
case CC_VIDEO_1:
if ( VcmSIPCCBinding::getVideoTermination() != NULL )
return VcmSIPCCBinding::getVideoTermination()->rxStart( group_id, stream_id, DYNAMIC_PAYLOAD_TYPE(pt),
0,
port,
0,
map_algorithmID(algorithmID), key, key_len, salt, salt_len,
0, 0);
return VcmSIPCCBinding::getVideoTermination()->rxStart(
group_id, stream_id, payload->remote_rtp_pt,
0, port, 0, map_algorithmID(algorithmID), key, key_len,
salt, salt_len, 0, 0);
break;
default:
@ -1156,9 +1020,9 @@ int vcmRxStart(cc_mcapid_t mcap_id,
* @param[in] pc_stream_id - the media stream index (from PC.addStream())
* @param[i]n pc_track_id - the track within the media stream
* @param[in] call_handle - call handle
* @param[in] peerconnection - the peerconnection in use
* @param[in] num_payloads - number of negotiated payloads
* @param[in] payloads - negotiated codec details list
* @param[in] peerconnection - the peerconnection in use
* @param[in] num_payloads - number of negotiated payloads
* @param[in] payloads - negotiated codec details list
* @param[in] fingerprint_alg - the DTLS fingerprint algorithm
* @param[in] fingerprint - the DTLS fingerprint
* @param[in] attrs - media attributes
@ -1175,7 +1039,7 @@ int vcmRxStartICE(cc_mcapid_t mcap_id,
cc_call_handle_t call_handle,
const char *peerconnection,
int num_payloads,
const vcm_media_payload_type_t* payloads,
const vcm_payload_info_t* payloads,
const char *fingerprint_alg,
const char *fingerprint,
vcm_mediaAttrs_t *attrs)
@ -1231,11 +1095,13 @@ int vcmRxStartICE(cc_mcapid_t mcap_id,
for(int i=0; i <num_payloads ; i++)
{
int ret = vcmPayloadType2AudioCodec(payloads[i], &config_raw);
if (ret) {
PR_ASSERT(PR_FALSE);
return VCM_ERROR;
}
config_raw = new mozilla::AudioCodecConfig(
payloads[i].remote_rtp_pt,
ccsdpCodecName(payloads[i].codec_type),
payloads[i].audio.frequency,
payloads[i].audio.packet_size,
payloads[i].audio.channels,
payloads[i].audio.bitrate);
configs.push_back(config_raw);
}
@ -1263,11 +1129,11 @@ int vcmRxStartICE(cc_mcapid_t mcap_id,
for(int i=0; i <num_payloads; i++)
{
int ret = vcmPayloadType2VideoCodec(payloads[i], &config_raw);
if (ret) {
PR_ASSERT(PR_FALSE);
return VCM_ERROR;
}
config_raw = new mozilla::VideoCodecConfig(
payloads[i].remote_rtp_pt,
ccsdpCodecName(payloads[i].codec_type),
payloads[i].video.width,
payloads[i].video.height);
configs.push_back(config_raw);
}
@ -1606,7 +1472,7 @@ short vcmTxOpen(cc_mcapid_t mcap_id,
* @param[in] group_id - group identifier to which the stream belongs
* @param[in] stream_id - stream id of the given media type.
* @param[in] call_handle - call identifier
* @param[in] payload - payload type
* @param[in] payload - payload information
* @param[in] tos - bit marking
* @param[in] local_addr - local address
* @param[in] local_port - local port
@ -1623,7 +1489,7 @@ int vcmTxStart(cc_mcapid_t mcap_id,
cc_groupid_t group_id,
cc_streamid_t stream_id,
cc_call_handle_t call_handle,
vcm_media_payload_type_t payload,
const vcm_payload_info_t *payload,
short tos,
cpr_ip_addr_t *local_addr,
cc_uint16_t local_port,
@ -1634,7 +1500,6 @@ int vcmTxStart(cc_mcapid_t mcap_id,
vcm_mediaAttrs_t *attrs)
{
const char fname[] = "vcmTxStart";
int pt;
uint8_t *key;
uint8_t *salt;
cc_uint16_t key_len;
@ -1646,7 +1511,7 @@ int vcmTxStart(cc_mcapid_t mcap_id,
(remote_ip_addr->u.ip4 >> 8) & 0xff, remote_ip_addr->u.ip4 & 0xff );
CSFLogDebug( logTag, "%s: group_id=%d call_handle=%d payload=%d tos=%d local_port=%d remote=%s:%d algID=%d",
fname, group_id, call_handle, payload, tos, local_port,
fname, group_id, call_handle, payload->remote_rtp_pt, tos, local_port,
dottedIP, remote_port, algorithmID);
if (call_handle == CC_NO_CALL_ID) {
@ -1680,24 +1545,25 @@ int vcmTxStart(cc_mcapid_t mcap_id,
break;
}
pt = map_VCM_Media_Payload_type(payload);
switch ( mcap_id )
{
case CC_AUDIO_1:
if ( VcmSIPCCBinding::getAudioTermination() != NULL )
return VcmSIPCCBinding::getAudioTermination()->txStart( group_id, stream_id, pt,
attrs->audio.packetization_period, (attrs->audio.vad != 0),
tos, dottedIP, remote_port, attrs->audio.avt_payload_type,
map_algorithmID(algorithmID), key, key_len, salt, salt_len,
attrs->audio.mixing_mode, attrs->audio.mixing_party );
return VcmSIPCCBinding::getAudioTermination()->txStart(
group_id, stream_id, payload->remote_rtp_pt,
attrs->audio.packetization_period, (attrs->audio.vad != 0),
tos, dottedIP, remote_port, attrs->audio.avt_payload_type,
map_algorithmID(algorithmID), key, key_len, salt, salt_len,
attrs->audio.mixing_mode, attrs->audio.mixing_party );
break;
case CC_VIDEO_1:
if ( VcmSIPCCBinding::getVideoTermination() != NULL )
return VcmSIPCCBinding::getVideoTermination()->txStart( group_id, stream_id, pt,
0, 0, tos, dottedIP, remote_port, 0,
map_algorithmID(algorithmID), key, key_len, salt, salt_len, 0, 0 );
return VcmSIPCCBinding::getVideoTermination()->txStart(
group_id, stream_id, payload->remote_rtp_pt,
0, 0, tos, dottedIP, remote_port, 0,
map_algorithmID(algorithmID), key, key_len, salt, salt_len, 0, 0);
break;
default:
@ -1718,8 +1584,8 @@ int vcmTxStart(cc_mcapid_t mcap_id,
* @param[in] pc_stream_id - the media stream index (from PC.addStream())
* @param[i]n pc_track_id - the track within the media stream
* @param[in] call_handle - call handle
* @param[in] peerconnection - the peerconnection in use
* @param[in] payload - payload type
* @param[in] peerconnection - the peerconnection in use
* @param[in] payload - payload information
* @param[in] tos - bit marking
* @param[in] fingerprint_alg - the DTLS fingerprint algorithm
* @param[in] fingerprint - the DTLS fingerprint
@ -1738,7 +1604,7 @@ int vcmTxStartICE(cc_mcapid_t mcap_id,
int pc_track_id,
cc_call_handle_t call_handle,
const char *peerconnection,
vcm_media_payload_type_t payload,
const vcm_payload_info_t *payload,
short tos,
const char *fingerprint_alg,
const char *fingerprint,
@ -1773,12 +1639,14 @@ int vcmTxStartICE(cc_mcapid_t mcap_id,
}
if (CC_IS_AUDIO(mcap_id)) {
// Find the appropriate media conduit config
mozilla::AudioCodecConfig *config_raw;
int ret = vcmPayloadType2AudioCodec(payload, &config_raw);
if (ret) {
return VCM_ERROR;
}
config_raw = new mozilla::AudioCodecConfig(
payload->remote_rtp_pt,
ccsdpCodecName(payload->codec_type),
payload->audio.frequency,
payload->audio.packet_size,
payload->audio.channels,
payload->audio.bitrate);
// Take possession of this pointer
mozilla::ScopedDeletePtr<mozilla::AudioCodecConfig> config(config_raw);
@ -1805,10 +1673,11 @@ int vcmTxStartICE(cc_mcapid_t mcap_id,
} else if (CC_IS_VIDEO(mcap_id)) {
mozilla::VideoCodecConfig *config_raw;
int ret = vcmPayloadType2VideoCodec(payload, &config_raw);
if (ret) {
return VCM_ERROR;
}
config_raw = new mozilla::VideoCodecConfig(
payload->remote_rtp_pt,
ccsdpCodecName(payload->codec_type),
payload->video.width,
payload->video.height);
// Take possession of this pointer
mozilla::ScopedDeletePtr<mozilla::VideoCodecConfig> config(config_raw);
@ -2327,104 +2196,6 @@ int vcmGetILBCMode()
} // extern "C"
#define EXTRACT_DYNAMIC_PAYLOAD_TYPE(PTYPE) ((PTYPE)>>16)
#define CLEAR_DYNAMIC_PAYLOAD_TYPE(PTYPE) (PTYPE & 0x0000FFFF)
#define CHECK_DYNAMIC_PAYLOAD_TYPE(PTYPE) (PTYPE & 0xFFFF0000)
static int vcmPayloadType2AudioCodec(vcm_media_payload_type_t payload_in,
mozilla::AudioCodecConfig **config) {
int wire_payload = -1;
// payload_in has the following bit setup
// upper 16 bits : Dynamic payload type
// lower 16 bits : VCM payload type
// Ex: For ISAC Codec: 103:41
// For VP8 Codec: 120:120
int payload = -1;
*config = NULL;
if (CHECK_DYNAMIC_PAYLOAD_TYPE(payload_in)) {
wire_payload = EXTRACT_DYNAMIC_PAYLOAD_TYPE(payload_in);
payload = CLEAR_DYNAMIC_PAYLOAD_TYPE(payload_in);
}
else {
//static payload type
wire_payload = payload_in;
payload = payload_in;
}
switch(payload) {
case VCM_Media_Payload_G711Alaw64k:
*config = new mozilla::AudioCodecConfig(wire_payload, "PCMA", 8000, 80, 1, 64000);
break;
case VCM_Media_Payload_G711Ulaw64k:
*config = new mozilla::AudioCodecConfig(wire_payload, "PCMU", 8000, 80, 1, 64000);
break;
case VCM_Media_Payload_OPUS:
*config = new mozilla::AudioCodecConfig(wire_payload, "OPUS", 48000, 480, 1, 64000);
break;
case VCM_Media_Payload_ISAC:
//adaptive rate ISAC,30ms sample
*config = new mozilla::AudioCodecConfig(wire_payload, "ISAC", 16000, 480, 1, -1);
break;
case VCM_Media_Payload_ILBC20:
//ilBC 20ms sample
*config = new mozilla::AudioCodecConfig(wire_payload, "iLBC", 8000, 160, 1, 15200);
break;
case VCM_Media_Payload_ILBC30:
//ilBC 30ms sample
*config = new mozilla::AudioCodecConfig(wire_payload, "iLBC", 8000, 240, 1, 13300);
break;
case VCM_Media_Payload_G722_64k:
case VCM_Media_Payload_G722_56k:
//TODO: Check with Ekr, Derf if 64k and 56K are valid frequency rates for G722.1
// or G722.2
CSFLogError(logTag, "vcmPayloadType2AudioCodec Codec Not Implemented !");
PR_ASSERT(PR_FALSE);
return VCM_ERROR;
default:
CSFLogError(logTag, "vcmPayloadType2AudioCodec unknown codec. Apparent internal error");
PR_ASSERT(PR_FALSE);
return VCM_ERROR;
}
return 0;
}
static int vcmPayloadType2VideoCodec(vcm_media_payload_type_t payload_in,
mozilla::VideoCodecConfig **config) {
int wire_payload = -1;
int payload = -1;
*config = NULL;
if (CHECK_DYNAMIC_PAYLOAD_TYPE(payload_in)) {
wire_payload = EXTRACT_DYNAMIC_PAYLOAD_TYPE(payload_in);
payload = CLEAR_DYNAMIC_PAYLOAD_TYPE(payload_in);
}
else {
//static payload type
wire_payload = payload_in;
payload = payload_in;
}
switch(payload)
{
case VCM_Media_Payload_I420:
*config = new mozilla::VideoCodecConfig(wire_payload, "I420", 176, 144);
break;
case VCM_Media_Payload_VP8:
*config = new mozilla::VideoCodecConfig(wire_payload, "VP8", 640, 480);
break;
default:
CSFLogError(logTag, "vcmPayloadType2VideoCodec unknown codec. Apparent internal error");
PR_ASSERT(PR_FALSE);
return VCM_ERROR;
}
return 0;
}
static mozilla::RefPtr<TransportFlow>
vcmCreateTransportFlow(sipcc::PeerConnectionImpl *pc, int level, bool rtcp,
const char *fingerprint_alg,

View File

@ -1,153 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "debug.h"
#include "rtp_defs.h"
#include "vcm_util.h"
#include "ccsdp.h"
#define CREATE_MT_MAP(a,b) ((a << 16) | b)
/**
* map the VCM RTP enums to MS format payload enums
* @param [in] ptype: payload type
* @param [in] dynamic_ptype_value : dynamic payload
* @param [in] mode for some codecs
* @return Corresponding MS payload type
*/
vcm_media_payload_type_t vcmRtpToMediaPayload (int32_t ptype,
int32_t dynamic_ptype_value,
uint16_t mode)
{
vcm_media_payload_type_t type = VCM_Media_Payload_G711Ulaw64k;
const char fname[] = "vcm_rtp_to_media_payload";
DEF_DEBUG(DEB_F_PREFIX"%d: %d: %d\n",
DEB_F_PREFIX_ARGS(MED_API, fname), ptype, dynamic_ptype_value,
mode);
switch (ptype) {
case RTP_PCMU:
type = VCM_Media_Payload_G711Ulaw64k;
break;
case RTP_PCMA:
type = VCM_Media_Payload_G711Alaw64k;
break;
case RTP_G729:
type = VCM_Media_Payload_G729;
break;
case RTP_L16:
type = CREATE_MT_MAP(dynamic_ptype_value, VCM_Media_Payload_Wide_Band_256k);
break;
case RTP_G722:
type = VCM_Media_Payload_G722_64k;
break;
case RTP_ILBC:
if (mode == SIPSDP_ILBC_MODE20) {
type = CREATE_MT_MAP(dynamic_ptype_value, VCM_Media_Payload_ILBC20);
} else {
type = CREATE_MT_MAP(dynamic_ptype_value, VCM_Media_Payload_ILBC30);
}
break;
case RTP_ISAC:
type = CREATE_MT_MAP(dynamic_ptype_value, VCM_Media_Payload_ISAC);
break;
case RTP_H263:
type = CREATE_MT_MAP(dynamic_ptype_value, VCM_Media_Payload_H263);
break;
case RTP_H264_P0:
case RTP_H264_P1:
type = CREATE_MT_MAP(dynamic_ptype_value, VCM_Media_Payload_H264);
break;
case RTP_VP8:
type = CREATE_MT_MAP(dynamic_ptype_value, VCM_Media_Payload_VP8);
break;
case RTP_OPUS:
type = CREATE_MT_MAP(dynamic_ptype_value, VCM_Media_Payload_OPUS);
break;
default:
type = VCM_Media_Payload_NonStandard;
err_msg(DEB_F_PREFIX "Can not map payload type=%d\n",
DEB_F_PREFIX_ARGS(MED_API, fname), ptype);
}
return type;
}
#define EXTRACT_DYNAMIC_PAYLOAD_TYPE(PTYPE) ((PTYPE)>>16)
#define CLEAR_DYNAMIC_PAYLOAD_TYPE(PTYPE) (PTYPE & 0x0000FFFF)
#define CHECK_DYNAMIC_PAYLOAD_TYPE(PTYPE) (PTYPE & 0xFFFF0000)
/* TODO -- This function is temporary, to deal with the fact
that we currently have two different codec representations.
It should be removed when the media types are unified. */
int32_t mediaPayloadToVcmRtp (vcm_media_payload_type_t payload_in)
{
int vcmPayload = -1;
int rtp_payload = -1;
if (CHECK_DYNAMIC_PAYLOAD_TYPE(payload_in)) {
vcmPayload = CLEAR_DYNAMIC_PAYLOAD_TYPE(payload_in);
} else {
//static payload type
vcmPayload = payload_in;
}
switch(vcmPayload) {
case VCM_Media_Payload_G711Ulaw64k:
rtp_payload = RTP_PCMU;
break;
case VCM_Media_Payload_G729:
rtp_payload = RTP_G729;
break;
case VCM_Media_Payload_Wide_Band_256k:
rtp_payload = RTP_L16;
break;
case VCM_Media_Payload_G722_64k:
rtp_payload = RTP_G722;
break;
case VCM_Media_Payload_ILBC20:
case VCM_Media_Payload_ILBC30:
rtp_payload = RTP_ILBC;
break;
case VCM_Media_Payload_ISAC:
rtp_payload = RTP_ISAC;
break;
case VCM_Media_Payload_H263:
rtp_payload = RTP_H263;
break;
case VCM_Media_Payload_H264:
rtp_payload = RTP_H264_P0;
break;
case VCM_Media_Payload_VP8:
rtp_payload = RTP_VP8;
break;
case VCM_Media_Payload_OPUS:
rtp_payload = RTP_OPUS;
break;
default:
rtp_payload = RTP_NONE;
break;
}
return rtp_payload;
}

File diff suppressed because it is too large Load Diff

View File

@ -12,6 +12,7 @@
#include "ccsip_core.h"
#include "sll_lite.h"
#include "sessionConstants.h"
#include "ccsdp.h"
/* TODO: BLASBERG
* fsm.h only needs the following from ccsip_core.h
@ -127,8 +128,13 @@ typedef struct fsmdef_previous_sdp_ {
uint16_t dest_port;
cpr_ip_addr_t dest_addr;
int32_t avt_payload_type;
int32_t payload_type;
int32_t local_payload_type;
/*
* This field contains the number of elements in the payloads field.
*/
int32_t num_payloads;
vcm_payload_info_t* payloads;
uint16_t packetization_period;
uint16_t max_packetization_period;
sdp_direction_e direction;
@ -141,13 +147,6 @@ typedef struct fsmdef_media_t_ {
media_refid_t refid; /* media reference id */
sdp_media_e type; /* audio, video etc. media */
sdp_addrtype_e addr_type;/* ipv4, ipv6 */
/*
* NOTE: this is to support asymmetric payload type values for a given dynamic payload type.
* We answer with the same payload type value that the remote offers.
* If remote choses to answer with different value than we offer, we support asymmetric.
*/
int32_t local_dynamic_payload_type_value; // dynamic payload type value offered/answered by us
int32_t remote_dynamic_payload_type_value; // dynamic payload type value offered/answered by remote
int32_t avt_payload_type;
vcm_vad_t vad;
uint16_t packetization_period;
@ -211,12 +210,15 @@ typedef struct fsmdef_media_t_ {
* capability index. The index into the media capbilty table
* that this media entry is coresponding to.
*/
uint8_t cap_index;
uint8_t cap_index;
/* Values cached from attributes */
int32_t tias_bw;
int32_t profile_level;
void *video;
/* ICE Candidates */
char **candidatesp;
int candidate_ct;
@ -237,29 +239,15 @@ typedef struct fsmdef_media_t_ {
char *protocol;
/*
* This field contains the size of the payloads,
* local_dpt_list, and remote_dpt_list fields.
* This field contains the number of elements in the payloads field.
*/
int32_t num_payloads;
/*
* List of active lists of payloads negotiated
* There needs to be 1-1 mapping between the 3 arrays
* TODO:crypt: Move these to a aggregate structure per payload
* since we need to include codec type, local rtp type, remote rty type,
* codec specific parameters as generated by any SDP action.
*/
vcm_media_payload_type_t* payloads;
vcm_payload_info_t* payloads;
/*
* dynamic payload type value offered/answered by us
*/
uint8_t* local_dpt_list;
/*
* dynamic payload type value offered/answered by remote
*/
uint8_t* remote_dpt_list;
} fsmdef_media_t;
struct fsm_fcb_t_;

View File

@ -33,7 +33,6 @@
#include "fim.h"
#include "util_string.h"
#include "platform_api.h"
#include "vcm_util.h"
#ifndef NO
#define NO (0)
@ -51,10 +50,6 @@
static cc_rcs_t lsm_stop_tone (lsm_lcb_t *lcb, cc_action_data_tone_t *data);
extern cc_media_cap_table_t g_media_table;
vcm_media_payload_type_t vcmRtpToMediaPayload (int32_t ptype,
int32_t dynamic_ptype_value,
uint16_t mode);
static lsm_lcb_t *lsm_lcbs;
static uint32_t lsm_call_perline[MAX_REG_LINES];
@ -994,10 +989,6 @@ lsm_rx_start (lsm_lcb_t *lcb, const char *fname, fsmdef_media_t *media)
}
pc_track_id = 0;
dcb->cur_video_avail &= ~CC_ATTRIB_CAST;
if (media->local_dynamic_payload_type_value == RTP_NONE) {
media->local_dynamic_payload_type_value =
media->num_payloads ? media->payloads[0] : RTP_NONE;
}
config_get_value(CFGID_SDPMODE, &sdpmode, sizeof(sdpmode));
if (dcb->peerconnection) {
@ -1013,17 +1004,13 @@ lsm_rx_start (lsm_lcb_t *lcb, const char *fname, fsmdef_media_t *media)
FSM_NEGOTIATED_CRYPTO_DIGEST(media),
&attrs);
} else if (!sdpmode) {
if (media->payloads == NULL) {
LSM_ERR_MSG(get_debug_string(DEBUG_INPUT_NULL), fname1);
return;
}
ret_val = vcmRxStart(media->cap_index, group_id, media->refid,
lsm_get_ms_ui_call_handle(dcb->line, call_id, CC_NO_CALL_ID),
/* RTP_NONE is not technically a valid
value for vcm_media_payload_type_t.
However, we really should never
reach this part of the code with
num_payloads < 1, so the RTP_NONE
shouldn't ever be used. It's only
here are extra protection against
an invalid pointer deref.*/
media->num_payloads ? media->payloads[0] : RTP_NONE,
media->payloads,
media->is_multicast ? &media->dest_addr:&media->src_addr,
port,
FSM_NEGOTIATED_CRYPTO_ALGORITHM_ID(media),
@ -1238,11 +1225,15 @@ lsm_tx_start (lsm_lcb_t *lcb, const char *fname, fsmdef_media_t *media)
dcb->cur_video_avail &= ~CC_ATTRIB_CAST;
if (media->payloads == NULL) {
LSM_ERR_MSG(get_debug_string(DEBUG_INPUT_NULL), fname1);
return;
}
if (!strlen(dcb->peerconnection)){
if (vcmTxStart(media->cap_index, group_id,
media->refid,
lsm_get_ms_ui_call_handle(dcb->line, call_id, CC_NO_CALL_ID),
media->num_payloads ? media->payloads[0] : RTP_NONE,
media->payloads,
(short)dscp,
&media->src_addr,
media->src_port,
@ -1268,7 +1259,7 @@ lsm_tx_start (lsm_lcb_t *lcb, const char *fname, fsmdef_media_t *media)
dcb->media_cap_tbl->cap[media->cap_index].pc_track,
lsm_get_ms_ui_call_handle(dcb->line, call_id, CC_NO_CALL_ID),
dcb->peerconnection,
media->num_payloads ? media->payloads[0] : RTP_NONE,
media->payloads,
(short)dscp,
FSM_NEGOTIATED_CRYPTO_DIGEST_ALGORITHM(media),
FSM_NEGOTIATED_CRYPTO_DIGEST(media),
@ -5298,8 +5289,7 @@ void lsm_add_remote_stream (line_t line, callid_t call_id, fsmdef_media_t *media
}
vcmCreateRemoteStream(media->cap_index, dcb->peerconnection,
pc_stream_id,
media->num_payloads ? media->payloads[0] : RTP_NONE);
pc_stream_id);
}
}

View File

@ -1,23 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef VCM_UTIL_H_
#define VCM_UTIL_H_
#include "vcm.h"
#include "phone_types.h"
/**
* map the VCM RTP enums to MS format payload enums
* @param [in] ptype: payload type
* @param [in] dynamic_ptype_value : dynamic payload
* @param [in] mode for some codecs
* @return Corresponding MS payload type
*/
vcm_media_payload_type_t vcm_rtp_to_media_payload (int32_t ptype,
int32_t dynamic_ptype_value,
uint16_t mode);
int32_t mediaPayloadToVcmRtp (vcm_media_payload_type_t payload_in);
#endif /* VCM_UTIL_H_ */

View File

@ -290,3 +290,37 @@ sdp_result_e ccsdpSetBandwidth (void *sdp_ptr, u16 level, u16 inst_num,
return sdp_set_bw(sdpp->src_sdp, level, inst_num, bw_modifier, bw_val);
}
const char * ccsdpCodecName(rtp_ptype ptype)
{
switch (ptype)
{
case RTP_NONE: return "NONE";
case RTP_PCMU: return "PCMU";
case RTP_CELP: return "CELP";
case RTP_G726: return "G726";
case RTP_GSM: return "GSM";
case RTP_G723: return "G723";
case RTP_DVI4: return "DVI4";
case RTP_DVI4_II: return "DVI4_II";
case RTP_LPC: return "LPC";
case RTP_PCMA: return "PCMA";
case RTP_G722: return "G722";
case RTP_G728: return "G728";
case RTP_G729: return "G729";
case RTP_JPEG: return "JPEG";
case RTP_NV: return "NV";
case RTP_H261: return "H261";
case RTP_H264_P0: return "H264_P0";
case RTP_H264_P1: return "H264_P1";
case RTP_AVT: return "AVT";
case RTP_L16: return "L16";
case RTP_H263: return "H263";
case RTP_ILBC: return "iLBC";
case RTP_OPUS: return "OPUS";
case RTP_VP8: return "VP8";
case RTP_I420: return "I420";
/* case RTP_ISAC: return "ISAC"; */
}
return "UNKNOWN";
}

View File

@ -83,6 +83,38 @@ typedef enum rtp_ptype_
RTP_ISAC = 124
} rtp_ptype;
/**
* IANA-registered static payload types for the RTP/AVP profile.
* See http://www.iana.org/assignments/rtp-parameters/rtp-parameters.xml
*/
typedef enum static_rtp_ptype_
{
STATIC_RTP_AVP_PCMU_8000_1 = 0,
STATIC_RTP_AVP_GSM_8000_1 = 3,
STATIC_RTP_AVP_G723_8000_1 = 4,
STATIC_RTP_AVP_DVI4_8000_1 = 5,
STATIC_RTP_AVP_DVI4_16000_1 = 6,
STATIC_RTP_AVP_LPC_8000_1 = 7,
STATIC_RTP_AVP_PCMA_8000_1 = 8,
STATIC_RTP_AVP_G722_8000_1 = 9,
STATIC_RTP_AVP_L16_44100_2 = 10,
STATIC_RTP_AVP_L16_44100_1 = 11,
STATIC_RTP_AVP_QCELP_8000_1 = 12,
STATIC_RTP_AVP_CN_8000_1 = 13,
STATIC_RTP_AVP_MPA_90000_1 = 14,
STATIC_RTP_AVP_G728_8000_1 = 15,
STATIC_RTP_AVP_DVI4_11025_1 = 16,
STATIC_RTP_AVP_DVI4_22050_1 = 17,
STATIC_RTP_AVP_G729_8000_1 = 18,
STATIC_RTP_AVP_CELB_90000_1 = 25,
STATIC_RTP_AVP_JPEG_90000_1 = 26,
STATIC_RTP_AVP_NV_90000_1 = 28,
STATIC_RTP_AVP_H261_90000_1 = 31,
STATIC_RTP_AVP_MPV_90000_1 = 32,
STATIC_RTP_AVP_MP2T_90000_1 = 33,
STATIC_RTP_AVP_H263_90000_1 = 34
} static_rtp_ptype;
typedef struct {
const char *name;
int value;
@ -615,4 +647,13 @@ sdp_result_e ccsdpAddNewBandwidthLine (void *sdp_handle, uint16_t level, sdp_bw_
sdp_result_e ccsdpSetBandwidth (void *sdp_handle, uint16_t level, uint16_t inst_num,
sdp_bw_modifier_e bw_modifier, uint32_t bw_val);
/**
* Returns a string representation of a codec's name.
*
* @param[in] rtp_ptype The value taken from the rtp_ptype enumeration
*
* @return A string representing the name of the codec
*/
const char * ccsdpCodecName(rtp_ptype ptype);
#endif

View File

@ -22,15 +22,8 @@
#include "cpr_types.h"
#include "cc_constants.h"
#include "ccsdp.h"
/**
* Macro definitions to retrieve dynamic payload type and media payload type from vcm_media_payload_type_t payload
* for using in vcmRx/TxStart.
*/
//The result maps to RTP payload type for using internally.
#define GET_DYNAMIC_PAY_LOAD_TYPE(payload) (payload>>16)
//The result maps to the enum vcm_media_payload_type_t.
#define GET_MEDIA_PAYLOAD_TYPE_ENUM(payload) (payload & 0xFFFF)
/** Evaluates to TRUE for audio media streams where id is the mcap_id of the given stream */
#define CC_IS_AUDIO(id) ((id == CC_AUDIO_1) ? TRUE:FALSE)
@ -154,49 +147,64 @@ typedef enum {
vcm_station_single_ring = 0x2
} vcm_ring_duration_t;
/**
* Media payload type definitions
* Structure to carry key codec information
*/
typedef enum
typedef struct
{
VCM_Media_Payload_NonStandard = 1,
VCM_Media_Payload_G711Alaw64k = 2,
VCM_Media_Payload_G711Alaw56k = 3, // "restricted"
VCM_Media_Payload_G711Ulaw64k = 4,
VCM_Media_Payload_G711Ulaw56k = 5, // "restricted"
VCM_Media_Payload_G722_64k = 6,
VCM_Media_Payload_G722_56k = 7,
VCM_Media_Payload_G722_48k = 8,
VCM_Media_Payload_G7231 = 9,
VCM_Media_Payload_G728 = 10,
VCM_Media_Payload_G729 = 11,
VCM_Media_Payload_G729AnnexA = 12,
VCM_Media_Payload_Is11172AudioCap = 13,
VCM_Media_Payload_Is13818AudioCap = 14,
VCM_Media_Payload_G729AnnexB = 15,
VCM_Media_Payload_G729AnnexAwAnnexB = 16,
VCM_Media_Payload_GSM_Full_Rate = 18,
VCM_Media_Payload_GSM_Half_Rate = 19,
VCM_Media_Payload_GSM_Enhanced_Full_Rate = 20,
VCM_Media_Payload_Wide_Band_256k = 25,
VCM_Media_Payload_H263 = 31,
VCM_Media_Payload_H264 = 34,
VCM_Media_Payload_Data64 = 32,
VCM_Media_Payload_Data56 = 33,
VCM_Media_Payload_ILBC20 = 39,
VCM_Media_Payload_ILBC30 = 40,
VCM_Media_Payload_ISAC = 41,
VCM_Media_Payload_GSM = 80,
VCM_Media_Payload_ActiveVoice = 81,
VCM_Media_Payload_G726_32K = 82,
VCM_Media_Payload_G726_24K = 83,
VCM_Media_Payload_G726_16K = 84,
VCM_Media_Payload_OPUS = 109,
VCM_Media_Payload_VP8 = 120,
VCM_Media_Payload_I420 = 124,
VCM_Media_Payload_Max // Please leave this so we won't get compile errors.
} vcm_media_payload_type_t;
rtp_ptype codec_type;
/*
* NOTE: We keep track of the RTP "PT" field for sending separate from the
* one for receiving. This is to support asymmetric payload type values
* for a given codec. When we get an offer, we answer with the same payload
* type value that the remote offers. If we send an offer and the remote
* choses to answer with different value than we offer, we support asymmetric.
*/
/* RTP "PT" field we use to send this codec ("remote") */
int remote_rtp_pt;
/* RTP "PT" field we use to receive this codec ("local") */
int local_rtp_pt;
/* Parameters for specific media types */
union
{
struct
{
int frequency;
int packet_size; /* Number of samples in a packet */
int channels;
int bitrate; /* Wire bitrate of RTP packet payloads */
} audio;
struct
{
int width;
int height;
} video;
};
/* Codec-specific parameters */
union
{
struct {
uint16_t mode;
} ilbc;
/* These are outdated, and need to be updated to match the current
specification. */
struct {
uint32_t max_average_bitrate;
const char *maxcodedaudiobandwidth;
boolean usedtx;
boolean stereo;
boolean useinbandfec;
boolean cbr;
} opus;
};
} vcm_payload_info_t;
/**
* vcm_vad_t
@ -488,8 +496,7 @@ short vcmStartIceChecks(const char *peerconnection);
short vcmCreateRemoteStream(
cc_mcapid_t mcap_id,
const char *peerconnection,
int *pc_stream_id,
vcm_media_payload_type_t payload);
int *pc_stream_id);
/*!
* Release the allocated port
@ -520,7 +527,7 @@ void vcmRxReleasePort(cc_mcapid_t mcap_id,
* @param[in] group_id - group identifier associated with the stream
* @param[in] stream_id - id of the stream one per each media line
* @param[in] call_handle - call handle
* @param[in] payload - payload type
* @param[in] payload - payload information
* @param[in] local_addr - local ip address to use.
* @param[in] port - local port (receive)
* @param[in] algorithmID - crypto alogrithm ID
@ -535,7 +542,7 @@ int vcmRxStart(cc_mcapid_t mcap_id,
cc_groupid_t group_id,
cc_streamid_t stream_id,
cc_call_handle_t call_handle,
vcm_media_payload_type_t payload,
const vcm_payload_info_t *payload,
cpr_ip_addr_t *local_addr,
cc_uint16_t port,
vcm_crypto_algorithmID algorithmID,
@ -574,7 +581,7 @@ int vcmRxStartICE(cc_mcapid_t mcap_id,
cc_call_handle_t call_handle,
const char *peerconnection,
int num_payloads,
const vcm_media_payload_type_t* payloads,
const vcm_payload_info_t* payloads,
const char *fingerprint_alg,
const char *fingerprint,
vcm_mediaAttrs_t *attrs);
@ -592,7 +599,7 @@ int vcmRxStartICE(cc_mcapid_t mcap_id,
* @param[in] group_id - group identifier to which the stream belongs
* @param[in] stream_id - stream id of the given media type.
* @param[in] call_handle - call handle
* @param[in] payload - payload type
* @param[in] payload - payload information
* @param[in] tos - bit marking
* @param[in] local_addr - local address
* @param[in] local_port - local port
@ -610,7 +617,7 @@ int vcmTxStart(cc_mcapid_t mcap_id,
cc_groupid_t group_id,
cc_streamid_t stream_id,
cc_call_handle_t call_handle,
vcm_media_payload_type_t payload,
const vcm_payload_info_t *payload,
short tos,
cpr_ip_addr_t *local_addr,
cc_uint16_t local_port,
@ -633,7 +640,7 @@ int vcmTxStart(cc_mcapid_t mcap_id,
* @param[in] pc_track_id - the track within the media stream
* @param[in] call_handle - call handle
* @param[in] peerconnection - the peerconnection in use
* @param[in] payload - payload type
* @param[in] payload - payload information
* @param[in] tos - bit marking
* @param[in] fingerprint_alg - the DTLS fingerprint algorithm
* @param[in] fingerprint - the DTLS fingerprint
@ -651,7 +658,7 @@ int vcmTxStart(cc_mcapid_t mcap_id,
int pc_track_id,
cc_call_handle_t call_handle,
const char *peerconnection,
vcm_media_payload_type_t payload,
const vcm_payload_info_t *payload,
short tos,
const char *fingerprint_alg,
const char *fingerprint,

View File

@ -133,10 +133,11 @@ void vcmRxReleasePort(cc_mcapid_t mcap_id, cc_groupid_t group_id,cc_streamid_t s
*
*/
int vcmRxStart(cc_mcapid_t mcap_id, cc_groupid_t group_id, cc_streamid_t stream_id, cc_call_handle_t call_handle,
vcm_media_payload_type_t payload, cpr_ip_addr_t *local_addr, uint16_t port,
vcm_crypto_algorithmID algorithmID,
vcm_crypto_key_t *rx_key, vcm_mediaAttrs_t *attrs)
int vcmRxStart(cc_mcapid_t mcap_id, cc_groupid_t group_id, cc_streamid_t
stream_id, cc_call_handle_t call_handle,
const vcm_payload_info_t *payload, cpr_ip_addr_t *local_addr,
uint16_t port, vcm_crypto_algorithmID algorithmID,
vcm_crypto_key_t *rx_key, vcm_mediaAttrs_t *attrs)
{
return 0;
}
@ -168,12 +169,13 @@ int vcmRxStart(cc_mcapid_t mcap_id, cc_groupid_t group_id, cc_streamid_t stream_
*
*/
int vcmTxStart(cc_mcapid_t mcap_id, cc_groupid_t group_id, cc_streamid_t stream_id, cc_call_handle_t call_handle,
vcm_media_payload_type_t payload, short tos, cpr_ip_addr_t *local_addr, uint16_t local_port, cpr_ip_addr_t *remote_ip_addr,
uint16_t remote_port,
vcm_crypto_algorithmID algorithmID,
vcm_crypto_key_t *tx_key,
vcm_mediaAttrs_t *attrs)
int vcmTxStart(cc_mcapid_t mcap_id, cc_groupid_t group_id,
cc_streamid_t stream_id, cc_call_handle_t call_handle,
const vcm_payload_info_t *payload, short tos,
cpr_ip_addr_t *local_addr, uint16_t local_port,
cpr_ip_addr_t *remote_ip_addr, uint16_t remote_port,
vcm_crypto_algorithmID algorithmID, vcm_crypto_key_t *tx_key,
vcm_mediaAttrs_t *attrs)
{
return 0;
}

View File

@ -1366,7 +1366,45 @@ TEST_F(SignalingTest, ChromeOfferAnswer)
std::string answer = a2_.answer();
}
TEST_F(SignalingTest, OfferAllDynamicTypes)
{
sipcc::MediaConstraints constraints;
std::string offer;
for (int i = 96; i < 128; i++)
{
std::stringstream ss;
ss << i;
std::cout << "Trying dynamic pt = " << i << std::endl;
offer =
"v=0\r\n"
"o=- 1 1 IN IP4 148.147.200.251\r\n"
"s=-\r\n"
"b=AS:64\r\n"
"t=0 0\r\n"
"a=fingerprint:sha-256 F3:FA:20:C0:CD:48:C4:5F:02:5F:A5:D3:21:D0:2D:48:"
"7B:31:60:5C:5A:D8:0D:CD:78:78:6C:6D:CE:CC:0C:67\r\n"
"m=audio 9000 RTP/AVP " + ss.str() + "\r\n"
"c=IN IP4 148.147.200.251\r\n"
"b=TIAS:64000\r\n"
"a=rtpmap:" + ss.str() +" opus/48000/2\r\n"
"a=candidate:0 1 udp 2130706432 148.147.200.251 9000 typ host\r\n"
"a=candidate:0 2 udp 2130706432 148.147.200.251 9005 typ host\r\n"
"a=ice-ufrag:cYuakxkEKH+RApYE\r\n"
"a=ice-pwd:bwtpzLZD+3jbu8vQHvEa6Xuq\r\n"
"a=sendrecv\r\n";
//std::cout << "Setting offer to:" << std::endl << offer << std::endl;
a2_.SetRemote(TestObserver::OFFER, offer);
//std::cout << "Creating answer:" << std::endl;
a2_.CreateAnswer(constraints, offer, OFFER_AUDIO | ANSWER_AUDIO);
std::string answer = a2_.answer();
ASSERT_NE(answer.find(ss.str() + " opus/"), std::string::npos);
}
}
} // End namespace test.