mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-14 12:13:22 +00:00
Bug 817065: Replace vcm_media_payload_t with structure leveraging rtp_ptype constants r=ehugg,jesup
This commit is contained in:
parent
629d8a0ae2
commit
8a57275446
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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
@ -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_;
|
||||
|
@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -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_ */
|
@ -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";
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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.
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user