Darwin-Streaming-Server/APICommonCode/SourceInfo.h

175 lines
8 KiB
C
Raw Normal View History

/*
*
* @APPLE_LICENSE_HEADER_START@
*
* Copyright (c) 1999-2008 Apple Inc. All Rights Reserved.
*
* This file contains Original Code and/or Modifications of Original Code
* as defined in and that are subject to the Apple Public Source License
* Version 2.0 (the 'License'). You may not use this file except in
* compliance with the License. Please obtain a copy of the License at
* http://www.opensource.apple.com/apsl/ and read it before using this
* file.
*
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
* Please see the License for the specific language governing rights and
* limitations under the License.
*
* @APPLE_LICENSE_HEADER_END@
*
*/
/*
File: SourceInfo.h
Contains: This object contains an interface for getting at any bit
of "interesting" information regarding a content source in a
format - independent manner.
For instance, the derived object SDPSourceInfo parses an
SDP file and retrieves all the SourceInfo information from that file.
*/
#ifndef __SOURCE_INFO_H__
#define __SOURCE_INFO_H__
#include "QTSS.h"
#include "StrPtrLen.h"
#include "OSQueue.h"
#include "OS.h"
class SourceInfo
{
public:
SourceInfo() : fStreamArray(NULL), fNumStreams(0),
fOutputArray(NULL), fNumOutputs(0),
fTimeSet(false),fStartTimeUnixSecs(0),fEndTimeUnixSecs(0),
fSessionControlType(kRTSPSessionControl) {}
SourceInfo(const SourceInfo& copy);// Does copy dynamically allocated data
virtual ~SourceInfo(); // Deletes the dynamically allocated data
enum
{
eDefaultBufferDelay = 3
};
// Returns whether this source is reflectable.
Bool16 IsReflectable();
// Each source is comprised of a set of streams. Those streams have
// the following metadata.
struct StreamInfo
{
StreamInfo() : fSrcIPAddr(0), fDestIPAddr(0), fPort(0), fTimeToLive(0), fPayloadType(0), fPayloadName(NULL), fTrackID(0), fBufferDelay((Float32) eDefaultBufferDelay), fIsTCP(false),fSetupToReceive(false), fTimeScale(0){}
~StreamInfo(); // Deletes the memory allocated for the fPayloadName string
void Copy(const StreamInfo& copy);// Does copy dynamically allocated data
UInt32 fSrcIPAddr; // Src IP address of content (this may be 0 if not known for sure)
UInt32 fDestIPAddr; // Dest IP address of content (destination IP addr for source broadcast!)
UInt16 fPort; // Dest (RTP) port of source content
UInt16 fTimeToLive; // Ttl for this stream
QTSS_RTPPayloadType fPayloadType; // Payload type of this stream
StrPtrLen fPayloadName; // Payload name of this stream
UInt32 fTrackID; // ID of this stream
Float32 fBufferDelay; // buffer delay (default is 3 seconds)
Bool16 fIsTCP; // Is this a TCP broadcast? If this is the case, the port and ttl are not valid
Bool16 fSetupToReceive; // If true then a push to the server is setup on this stream.
UInt32 fTimeScale;
};
// Returns the number of StreamInfo objects (number of Streams in this source)
UInt32 GetNumStreams() { return fNumStreams; }
StreamInfo* GetStreamInfo(UInt32 inStreamIndex);
StreamInfo* GetStreamInfoByTrackID(UInt32 inTrackID);
// If this source is to be Relayed, it may have "Output" information. This
// tells the reader where to forward the incoming streams onto. There may be
// 0 -> N OutputInfo objects in this SourceInfo. Each OutputInfo refers to a
// single, complete copy of ALL the input streams. The fPortArray field
// contains one RTP port for each incoming stream.
struct OutputInfo
{
OutputInfo() : fDestAddr(0), fLocalAddr(0), fTimeToLive(0), fPortArray(NULL), fNumPorts(0), fBasePort(0), fAlreadySetup(false) {}
~OutputInfo(); // Deletes the memory allocated for fPortArray
// Returns true if the two are equal
Bool16 Equal(const OutputInfo& info);
void Copy(const OutputInfo& copy);// Does copy dynamically allocated data
UInt32 fDestAddr; // Destination address to forward the input onto
UInt32 fLocalAddr; // Address of local interface to send out on (may be 0)
UInt16 fTimeToLive; // Time to live for resulting output (if multicast)
UInt16* fPortArray; // 1 destination RTP port for each Stream.
UInt32 fNumPorts; // Size of the fPortArray (usually equal to fNumStreams)
UInt16 fBasePort; // The base destination RTP port - for i=1 to fNumStreams fPortArray[i] = fPortArray[i-1] + 2
Bool16 fAlreadySetup; // A flag used in QTSSReflectorModule.cpp
};
// Returns the number of OutputInfo objects.
UInt32 GetNumOutputs() { return fNumOutputs; }
UInt32 GetNumNewOutputs(); // Returns # of outputs not already setup
OutputInfo* GetOutputInfo(UInt32 inOutputIndex);
// GetLocalSDP. This may or may not be supported by sources. Typically, if
// the source is reflectable, this must be supported. It returns a newly
// allocated buffer (that the caller is responsible for) containing an SDP
// description of the source, stripped of all network info.
virtual char* GetLocalSDP(UInt32* /*newSDPLen*/) { return NULL; }
// This is only supported by the RTSPSourceInfo sub class
virtual Bool16 IsRTSPSourceInfo() { return false; }
// This is only supported by the RCFSourceInfo sub class and its derived classes
virtual char* Name() { return NULL; }
virtual Bool16 Equal(SourceInfo* inInfo);
// SDP scheduled times supports earliest start and latest end -- doesn't handle repeat times or multiple active times.
#define kNTP_Offset_From_1970 2208988800LU
time_t NTPSecs_to_UnixSecs(time_t time) {return (time_t) (time - (UInt32)kNTP_Offset_From_1970);}
UInt32 UnixSecs_to_NTPSecs(time_t time) {return (UInt32) (time + (UInt32)kNTP_Offset_From_1970);}
Bool16 SetActiveNTPTimes(UInt32 startNTPTime,UInt32 endNTPTime);
Bool16 IsValidNTPSecs(UInt32 time) {return time >= (UInt32) kNTP_Offset_From_1970 ? true : false;}
Bool16 IsPermanentSource() { return ((fStartTimeUnixSecs == 0) && (fEndTimeUnixSecs == 0)) ? true : false; }
Bool16 IsActiveTime(time_t unixTimeSecs);
Bool16 IsActiveNow() { return IsActiveTime(OS::UnixTime_Secs()); }
Bool16 IsRTSPControlled() {return (fSessionControlType == kRTSPSessionControl) ? true : false; }
Bool16 HasTCPStreams();
Bool16 HasIncomingBroacast();
time_t GetStartTimeUnixSecs() {return fStartTimeUnixSecs; }
time_t GetEndTimeUnixSecs() {return fEndTimeUnixSecs; }
UInt32 GetDurationSecs();
enum {kSDPTimeControl, kRTSPSessionControl};
protected:
//utility function used by IsReflectable
Bool16 IsReflectableIPAddr(UInt32 inIPAddr);
StreamInfo* fStreamArray;
UInt32 fNumStreams;
OutputInfo* fOutputArray;
UInt32 fNumOutputs;
Bool16 fTimeSet;
time_t fStartTimeUnixSecs;
time_t fEndTimeUnixSecs;
UInt32 fSessionControlType;
Bool16 fHasValidTime;
};
#endif //__SOURCE_INFO_H__