Darwin-Streaming-Server/APIModules/QTSSRTPFileModule/RTPFileSession.h
Darren VanBuren 849723c9cf Add even more of the source
This should be about everything needed to build so far?
2017-03-07 17:14:16 -08:00

227 lines
6.5 KiB
C++

/*
*
* @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: RTPFileSession.h
Contains:
*/
#ifndef __RTPFILESESSIONH__
#define __RTPFILESESSIONH__
#include "RTPFileDefs.h"
#include "OSHeaders.h"
#include "OSRef.h"
#include "QTSS.h" // This object uses QTSS API file I/O
#include "SDPSourceInfo.h"
class RTPFile;
class RTPFileSession
{
public:
// One per client
RTPFileSession();
~RTPFileSession();
//
// Class error codes
enum ErrorCode
{
errNoError = 0,
errFileNotFound = 1,
errTrackAlreadyAdded = 2,
errTrackDoesntExist = 3,
errSeekToNonexistentTime = 4
};
//
// INITIALIZE
ErrorCode Initialize(StrPtrLen& inFilePath, Float32 inBufferSeconds);
//
// ACCESSORS
//
// Global information
inline Float64 GetMovieDuration();
inline StrPtrLen* GetSDPFile();
inline SourceInfo* GetSourceInfo();
inline StrPtrLen* GetMoviePath();
UInt64 GetAddedTracksRTPBytes() { return fAddedTracksRTPBytes; }
//
// Track functions
inline Float64 GetTrackDuration(UInt32 inTrackID);
inline UInt32 GetTrackTimeScale(UInt32 inTrackID);
UInt16 GetNextTrackSequenceNumber(UInt32 inTrackID);
UInt32 GetSeekTimestamp(UInt32 TrackID);
//
// MODIFIERS
//
// Track modifiers
ErrorCode AddTrack(UInt32 inTrackID);
void SetTrackSSRC(UInt32 inTrackID, UInt32 inSSRC) { fTrackInfo[inTrackID].fSSRC = inSSRC; }
void SetTrackCookie(UInt32 inTrackID, void *inCookie){ fTrackInfo[inTrackID].fCookie = inCookie; }
// Seek to a time
ErrorCode Seek(Float64 inTime);
// GetNextPacket. Returns the transmit time for this packet
Float64 GetNextPacket(UInt8** outPacket, UInt32* outPacketLength, void** outCookie);
private:
// Utility functions
void SkipToNextPacket(RTPFilePacket* inCurPacket);
void ReadAndAdvise();
UInt32 PowerOf2Floor(UInt32 inNumToFloor);
enum
{
kMaxDataBufferSize = 262144
};
struct RTPFileSessionTrackInfo
{
Bool16 fEnabled;
Bool16 fMarked; // is the seek timestamp, seq num recorded?
UInt32 fSSRC;
UInt32 fSeekTimestamp;
UInt16 fSeekSeqNumber;
void* fCookie;
};
QTSS_Object fFileSource;
//OSFileSource fFileSource;
UInt64 fFileLength;
UInt64 fCurrentPosition;
RTPFile* fFile;
RTPFileSessionTrackInfo* fTrackInfo;
UInt32 fNumTracksEnabled;
UInt8* fReadBuffer; // Buffer that file data gets read into.
// Usually same as fDataBuffer
UInt32 fReadBufferOffset;
UInt8* fDataBuffer; // Buffer for file data
UInt32 fDataBufferSize;
UInt32 fDataBufferLen;
UInt8* fCurrentPacket;
UInt64 fAddedTracksRTPBytes;
friend class RTPFile;
};
class RTPFile
{
public:
// One per file
RTPFile();
~RTPFile();
RTPFileSession::ErrorCode Initialize(const StrPtrLen& inFilePath);
Float64 GetMovieDuration() { return fHeader.fMovieDuration; }
Float64 GetTrackDuration(UInt32 inTrackID);
UInt32 GetTrackTimeScale(UInt32 inTrackID);
UInt64 GetTrackBytes(UInt32 inTrackID);
Bool16 TrackExists(UInt32 inTrackID);
UInt32 GetBytesPerSecond() { return fBytesPerSecond; }
UInt32 GetMaxTrackNumber() { return fMaxTrackNumber; }
StrPtrLen* GetSDPFile() { return &fSDPData; }
SourceInfo* GetSourceInfo() { return &fSourceInfo; }
OSRef* GetRef() { return &fRef; }
// Returns the location in the file corresponding to this time,
// rounded to the nearest start of block.
SInt64 GetBlockLocation(Float64 inTimeInSecs);
private:
RTPFileTrackInfo* fTrackInfo;
RTPFileHeader fHeader;
UInt8* fBlockMap;
StrPtrLen fSDPData;
SDPSourceInfo fSourceInfo;
UInt32 fBytesPerSecond;
UInt32 fMaxTrackNumber;
OSRef fRef;
StrPtrLen fFilePath;
friend class RTPFileSession;
};
inline StrPtrLen* RTPFileSession::GetSDPFile()
{
return fFile->GetSDPFile();
}
inline SourceInfo* RTPFileSession::GetSourceInfo()
{
return &fFile->fSourceInfo;
}
inline StrPtrLen* RTPFileSession::GetMoviePath()
{
return &fFile->fFilePath;
}
inline Float64 RTPFileSession::GetMovieDuration()
{
return fFile->fHeader.fMovieDuration;
}
inline Float64 RTPFileSession::GetTrackDuration(UInt32 inTrackID)
{
return fFile->GetTrackDuration(inTrackID);
}
inline UInt32 RTPFileSession::GetTrackTimeScale(UInt32 inTrackID)
{
return fFile->GetTrackTimeScale(inTrackID);
}
#endif