📄 servermediasession.cpp
字号:
// ServerMediaSession.cpp: implementation of the ServerMediaSession class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ServerMediaSession.h"
static char const* const libNameStr = "LIVE.COM Streaming Media v";
char const* const libVersionStr = LIVEMEDIA_LIBRARY_VERSION_STRING;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
ServerMediaSession::ServerMediaSession(char const* streamName, char const* info,
char const* description,char const* miscSDPLines) :
fSubsessionCounter(0), fReferenceCount(0)
{
fStreamName = strDup(streamName == NULL ? "" : streamName);
fInfoSDPString = strDup(info == NULL ? libNameStr : info);
fDescriptionSDPString
= strDup(description == NULL ? libNameStr : description);
fMiscSDPLines = strDup(miscSDPLines == NULL ? "" : miscSDPLines);
gettimeofday(&fCreationTime, NULL);
}
ServerMediaSession::~ServerMediaSession()
{
}
Boolean ServerMediaSession::addSubsession(ServerMediaSubsession* subsession)
{
subsession->fTrackNumber = ++fSubsessionCounter;
fServerMediaSubSession.push_back(subsession);
return TRUE;
}
char * ServerMediaSession::generateSDPDescription()
{
struct in_addr ourIPAddress;
ourIPAddress.s_addr = 0;//ourSourceAddressForMulticast(envir());
char* const ourIPAddressStr
= strDup(our_inet_ntoa(ourIPAddress));
unsigned ourIPAddressStrSize = strlen(ourIPAddressStr);
// For a SSM sessions, we need a "a=source-filter: incl ..." line also:
char* sourceFilterLine;
sourceFilterLine = strDup("");
char* rangeLine = NULL; // for now
char* sdp = NULL; // for now
do {
// Count the lengths of each subsession's media-level SDP lines.
// (We do this first, because the call to "subsession->sdpLines()"
// causes correct subsession 'duration()'s to be calculated later.)
unsigned sdpLength = 0;
ServerMediaSubsession* subsession;
list<ServerMediaSubsession *>::iterator it;
for(it = fServerMediaSubSession.begin(); it != fServerMediaSubSession.end(); it++)
{
subsession = (*it);
char const* sdpLines = subsession->sdpLines();
if (sdpLines == NULL)
{
fprintf(stderr,"the media's not available\n");
break; // the media's not available
}
sdpLength += strlen(sdpLines);
}
// Unless subsessions have differing durations, we also have a "a=range:" line:
float dur = duration();
if (dur == 0.0) {
rangeLine = strDup("a=range:npt=0-\r\n");
} else if (dur > 0.0) {
char buf[100];
sprintf(buf, "a=range:npt=0-%.3f\r\n", dur);
rangeLine = strDup(buf);
} else { // subsessions have differing durations, so "a=range:" lines go there
rangeLine = strDup("");
}
char const* const sdpPrefixFmt =
"v=0\r\n"
"o=- %ld%06ld %d IN IP4 %s\r\n"
"s=%s\r\n"
"i=%s\r\n"
"t=0 0\r\n"
"a=tool:%s%s\r\n"
"a=type:broadcast\r\n"
"a=control:*\r\n"
"%s"
"%s"
"a=x-qt-text-nam:%s\r\n"
"a=x-qt-text-inf:%s\r\n"
"%s";
sdpLength += strlen(sdpPrefixFmt)
+ 20 + 6 + 20 + ourIPAddressStrSize
+ strlen(fDescriptionSDPString)
+ strlen(fInfoSDPString)
+ strlen(libNameStr) + strlen(libVersionStr)
+ strlen(sourceFilterLine)
+ strlen(rangeLine)
+ strlen(fDescriptionSDPString)
+ strlen(fInfoSDPString)
+ strlen(fMiscSDPLines);
sdp = new char[sdpLength];
if (sdp == NULL) break;
// Generate the SDP prefix (session-level lines):
sprintf(sdp, sdpPrefixFmt,
fCreationTime.tv_sec, fCreationTime.tv_usec, // o= <session id>
1, // o= <version> // (needs to change if params are modified)
ourIPAddressStr, // o= <address>
fDescriptionSDPString, // s= <description>
fInfoSDPString, // i= <info>
libNameStr, libVersionStr, // a=tool:
sourceFilterLine, // a=source-filter: incl (if a SSM session)
rangeLine, // a=range: line
fDescriptionSDPString, // a=x-qt-text-nam: line
fInfoSDPString, // a=x-qt-text-inf: line
fMiscSDPLines); // miscellaneous session SDP lines (if any)
// Then, add the (media-level) lines for each subsession:
char* mediaSDP = sdp;
for (it = fServerMediaSubSession.begin(); it != fServerMediaSubSession.end(); it++)
{
subsession = (*it);
mediaSDP += strlen(mediaSDP);
sprintf(mediaSDP, "%s", subsession->sdpLines());
}
} while (0);
delete[] rangeLine; delete[] sourceFilterLine; delete[] ourIPAddressStr;
return sdp;
}
float ServerMediaSession::duration()
{
float minSubsessionDuration = 0.0;
float maxSubsessionDuration = 0.0;
list<ServerMediaSubsession *>::iterator it;
ServerMediaSubsession* subsession;
for(it = fServerMediaSubSession.begin(); it != fServerMediaSubSession.end(); it++)
{
subsession = (*it);
float ssduration = subsession->duration();
if (it == fServerMediaSubSession.begin()) { // this is the first subsession
minSubsessionDuration = maxSubsessionDuration = ssduration;
} else if (ssduration < minSubsessionDuration) {
minSubsessionDuration = ssduration;
} else if (ssduration > maxSubsessionDuration) {
maxSubsessionDuration = ssduration;
}
}
if (maxSubsessionDuration != minSubsessionDuration) {
return -maxSubsessionDuration; // because subsession durations differ
} else {
return maxSubsessionDuration; // all subsession durations are the same
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -