⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 servermediasession.cpp

📁 rtsp协议的主要实现代码.对开发流媒体
💻 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 + -