📄 connection.cxx
字号:
silenceDetector = NULL;
echoCanceler = NULL;
sendUserInputMode = ep.GetSendUserInputMode();
rfc2833Handler = new OpalRFC2833Proto(PCREATE_NOTIFIER(OnUserInputInlineRFC2833));
t120handler = NULL;
t38handler = NULL;
h224Handler = NULL;
}
OpalConnection::~OpalConnection()
{
delete silenceDetector;
delete echoCanceler;
delete rfc2833Handler;
ownerCall.SafeDereference();
PTRACE(3, "OpalCon\tConnection " << *this << " destroyed.");
}
void OpalConnection::PrintOn(ostream & strm) const
{
strm << ownerCall << '-'<< endpoint << '[' << callToken << ']';
}
BOOL OpalConnection::OnSetUpConnection()
{
PTRACE(3, "OpalCon\tOnSetUpConnection" << *this);
return endpoint.OnSetUpConnection(*this);
}
void OpalConnection::HoldConnection()
{
}
void OpalConnection::RetrieveConnection()
{
}
BOOL OpalConnection::IsConnectionOnHold()
{
return FALSE;
}
void OpalConnection::SetCallEndReason(CallEndReason reason)
{
// Only set reason if not already set to something
if (callEndReason == NumCallEndReasons) {
PTRACE(3, "OpalCon\tCall end reason for " << GetToken() << " set to " << reason);
callEndReason = reason;
}
}
void OpalConnection::ClearCall(CallEndReason reason)
{
// Now set reason for the connection close
SetCallEndReason(reason);
ownerCall.Clear(reason);
}
void OpalConnection::ClearCallSynchronous(PSyncPoint * sync, CallEndReason reason)
{
// Now set reason for the connection close
SetCallEndReason(reason);
ownerCall.Clear(reason, sync);
}
void OpalConnection::TransferConnection(const PString & PTRACE_PARAM(remoteParty),
const PString & /*callIdentity*/)
{
PTRACE(3, "OpalCon\tCan not transfer connection to " << remoteParty);
}
void OpalConnection::Release(CallEndReason reason)
{
PSafeLockReadWrite safeLock(*this);
if (!safeLock.IsLocked() || phase >= ReleasingPhase) {
PTRACE(3, "OpalCon\tAlready released " << *this);
return;
}
PTRACE(3, "OpalCon\tReleasing " << *this);
// Now set reason for the connection close
SetCallEndReason(reason);
SetPhase(ReleasingPhase);
// Add a reference for the thread we are about to start
SafeReference();
PThread::Create(PCREATE_NOTIFIER(OnReleaseThreadMain), 0,
PThread::AutoDeleteThread,
PThread::NormalPriority,
"OnRelease:%x");
}
void OpalConnection::OnReleaseThreadMain(PThread &, INT)
{
OnReleased();
PTRACE(3, "OpalCon\tOnRelease thread completed for " << GetToken());
// Dereference on the way out of the thread
SafeDereference();
}
void OpalConnection::OnReleased()
{
PTRACE(3, "OpalCon\tOnReleased " << *this);
CloseMediaStreams();
endpoint.OnReleased(*this);
}
BOOL OpalConnection::OnIncomingConnection()
{
return endpoint.OnIncomingConnection(*this);
}
PString OpalConnection::GetDestinationAddress()
{
return "*";
}
BOOL OpalConnection::ForwardCall(const PString & /*forwardParty*/)
{
return FALSE;
}
void OpalConnection::OnAlerting()
{
endpoint.OnAlerting(*this);
}
OpalConnection::AnswerCallResponse OpalConnection::OnAnswerCall(const PString & callerName)
{
return endpoint.OnAnswerCall(*this, callerName);
}
void OpalConnection::AnsweringCall(AnswerCallResponse /*response*/)
{
}
void OpalConnection::OnConnected()
{
endpoint.OnConnected(*this);
}
void OpalConnection::OnProgress()
{
endpoint.OnProgress(*this);
}
void OpalConnection::OnEstablished()
{
endpoint.OnEstablished(*this);
}
void OpalConnection::AdjustMediaFormats(OpalMediaFormatList & mediaFormats) const
{
endpoint.AdjustMediaFormats(*this, mediaFormats);
}
BOOL OpalConnection::OpenSourceMediaStream(const OpalMediaFormatList & mediaFormats,
unsigned sessionID)
{
// See if already opened
if (GetMediaStream(sessionID, TRUE) != NULL) {
PTRACE(3, "OpalCon\tOpenSourceMediaStream (already opened) for session "
<< sessionID << " on " << *this);
return TRUE;
}
PTRACE(3, "OpalCon\tOpenSourceMediaStream for session " << sessionID << " on " << *this);
OpalMediaFormat sourceFormat, destinationFormat;
if (!OpalTranscoder::SelectFormats(sessionID,
GetMediaFormats(),
mediaFormats,
sourceFormat,
destinationFormat)) {
PTRACE(2, "OpalCon\tOpenSourceMediaStream session " << sessionID
<< ", could not find compatible media format:\n"
" source formats=" << setfill(',') << GetMediaFormats() << "\n"
" sink formats=" << mediaFormats << setfill(' '));
return FALSE;
}
PTRACE(3, "OpalCon\tSelected media stream " << sourceFormat << " -> " << destinationFormat);
OpalMediaStream *stream = CreateMediaStream(sourceFormat, sessionID, TRUE);
if (stream == NULL) {
PTRACE(1, "OpalCon\tCreateMediaStream returned NULL for session "
<< sessionID << " on " << *this);
return FALSE;
}
if (stream->Open()) {
if (OnOpenMediaStream(*stream))
return TRUE;
PTRACE(2, "OpalCon\tSource media OnOpenMediaStream open of " << sourceFormat << " failed.");
}
else {
PTRACE(2, "OpalCon\tSource media stream open of " << sourceFormat << " failed.");
}
delete stream;
return FALSE;
}
OpalMediaStream * OpalConnection::OpenSinkMediaStream(OpalMediaStream & source)
{
unsigned sessionID = source.GetSessionID();
PTRACE(3, "OpalCon\tOpenSinkMediaStream " << *this << " session=" << sessionID);
OpalMediaFormat sourceFormat = source.GetMediaFormat();
// Reorder the media formats from this protocol so we give preference
// to what has been selected in the source media stream.
OpalMediaFormatList destinationFormats = GetMediaFormats();
PStringArray order = sourceFormat;
// Second preference is given to the previous media stream already
// opened to maintain symmetric codecs, if possible.
{
PWaitAndSignal m(mediaStreamMutex);
OpalMediaStream * otherStream = GetMediaStream(sessionID, TRUE);
if (otherStream != NULL)
order += otherStream->GetMediaFormat();
destinationFormats.Reorder(order);
}
OpalMediaFormat destinationFormat;
if (!OpalTranscoder::SelectFormats(sessionID,
sourceFormat, // Only use selected format on source
destinationFormats,
sourceFormat,
destinationFormat)) {
PTRACE(2, "OpalCon\tOpenSinkMediaStream, could not find compatible media format:\n"
" source formats=" << setfill(',') << sourceFormat << "\n"
" sink formats=" << destinationFormats << setfill(' '));
return NULL;
}
/*
*/
PTRACE(3, "OpalCon\tOpenSinkMediaStream, selected " << sourceFormat << " -> " << destinationFormat);
OpalMediaStream * stream = CreateMediaStream(destinationFormat, sessionID, FALSE);
if (stream == NULL) {
PTRACE(1, "OpalCon\tCreateMediaStream " << *this << " returned NULL");
return NULL;
}
if (stream->Open()) {
if (OnOpenMediaStream(*stream))
return stream;
PTRACE(2, "OpalCon\tSink media stream OnOpenMediaStream of " << destinationFormat << " failed.");
}
else {
PTRACE(2, "OpalCon\tSink media stream open of " << destinationFormat << " failed.");
}
delete stream;
return NULL;
}
void OpalConnection::StartMediaStreams()
{
PWaitAndSignal mutex(mediaStreamMutex);
for (PINDEX i = 0; i < mediaStreams.GetSize(); i++)
mediaStreams[i].Start();
PTRACE(2, "OpalCon\tMedia stream threads started.");
}
void OpalConnection::CloseMediaStreams()
{
PWaitAndSignal mutex(mediaStreamMutex);
for (PINDEX i = 0; i < mediaStreams.GetSize(); i++) {
if (mediaStreams[i].IsOpen()) {
OnClosedMediaStream(mediaStreams[i]);
mediaStreams[i].Close();
}
}
PTRACE(2, "OpalCon\tMedia stream threads closed.");
}
void OpalConnection::RemoveMediaStreams()
{
CloseMediaStreams();
PWaitAndSignal mutex(mediaStreamMutex);
mediaStreams.RemoveAll();
PTRACE(2, "OpalCon\tMedia stream threads removed from session.");
}
void OpalConnection::PauseMediaStreams(BOOL paused)
{
PWaitAndSignal mutex(mediaStreamMutex);
for (PINDEX i = 0; i < mediaStreams.GetSize(); i++)
mediaStreams[i].SetPaused(paused);
}
OpalMediaStream * OpalConnection::CreateMediaStream(const OpalMediaFormat & mediaFormat,
unsigned sessionID,
BOOL isSource)
{
if (sessionID == OpalMediaFormat::DefaultVideoSessionID) {
if (isSource) {
PVideoInputDevice * videoDevice;
BOOL autoDelete;
if (CreateVideoInputDevice(mediaFormat, videoDevice, autoDelete)) {
PVideoOutputDevice * previewDevice;
if (!CreateVideoOutputDevice(mediaFormat, TRUE, previewDevice, autoDelete))
previewDevice = NULL;
return new OpalVideoMediaStream(mediaFormat, sessionID, videoDevice, previewDevice, autoDelete);
}
}
else {
PVideoOutputDevice * videoDevice;
BOOL autoDelete;
if (CreateVideoOutputDevice(mediaFormat, FALSE, videoDevice, autoDelete))
return new OpalVideoMediaStream(mediaFormat, sessionID, NULL, videoDevice, autoDelete);
}
}
return NULL;
}
BOOL OpalConnection::OnOpenMediaStream(OpalMediaStream & stream)
{
if (!endpoint.OnOpenMediaStream(*this, stream))
return FALSE;
{
PWaitAndSignal m(mediaStreamMutex);
mediaStreams.Append(&stream);
}
if (phase == ConnectedPhase) {
SetPhase(EstablishedPhase);
OnEstablished();
}
return TRUE;
}
void OpalConnection::OnClosedMediaStream(const OpalMediaStream & stream)
{
endpoint.OnClosedMediaStream(stream);
}
void OpalConnection::OnPatchMediaStream(BOOL /*isSource*/, OpalMediaPatch & /*patch*/)
{
PTRACE(3, "OpalCon\tNew patch created");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -