QTSS_Error EasyHLSOpen(Easy_RecordOpen_Params* inParams) { OSRefTable* sHLSSessionMap = QTSServerInterface::GetServer()->GetRecordSessionMap(); OSMutexLocker locker (sHLSSessionMap->GetMutex()); EasyRecordSession* session = NULL; //首先查找MAP里面是否已经有了对应的流 StrPtrLen streamName(inParams->inStreamName); OSRef* clientSesRef = sHLSSessionMap->Resolve(&streamName); if(clientSesRef != NULL) { session = (EasyRecordSession*)clientSesRef->GetObject(); } else { session = NEW EasyRecordSession(&streamName); OS_Error theErr = sHLSSessionMap->Register(session->GetRef()); Assert(theErr == QTSS_NoErr); //增加一次对RelaySession的无效引用,后面会统一释放 OSRef* debug = sHLSSessionMap->Resolve(&streamName); Assert(debug == session->GetRef()); } //到这里,肯定是有一个EasyRecordSession可用的 session->HLSSessionStart(inParams->inRTSPUrl, inParams->inTimeout); sHLSSessionMap->Release(session->GetRef()); return QTSS_NoErr; }
QTSS_Error EasyHLSClose(Easy_HLSClose_Params* inParams) { OSRefTable* sHLSSessionMap = QTSServerInterface::GetServer()->GetHLSSessionMap(); OSMutexLocker locker (sHLSSessionMap->GetMutex()); //首先查找Map里面是否已经有了对应的流 StrPtrLen streamName(inParams->inStreamName); OSRef* clientSesRef = sHLSSessionMap->Resolve(&streamName); if(NULL == clientSesRef) return QTSS_RequestFailed; EasyHLSSession* session = (EasyHLSSession*)clientSesRef->GetObject(); session->HLSSessionRelease(); sHLSSessionMap->Release(session->GetRef()); if (session->GetRef()->GetRefCount() == 0) { qtss_printf("EasyHLSModule.cpp:EasyHLSClose UnRegister and delete session =%p refcount=%"_U32BITARG_"\n", session->GetRef(), session->GetRef()->GetRefCount() ) ; sHLSSessionMap->UnRegister(session->GetRef()); delete session; } return QTSS_NoErr; }
char* GetHLSUrl(char* inSessionName) { OSRefTable* sHLSSessionMap = QTSServerInterface::GetServer()->GetHLSSessionMap(); OSMutexLocker locker (sHLSSessionMap->GetMutex()); char* hlsURL = NULL; //首先查找Map里面是否已经有了对应的流 StrPtrLen streamName(inSessionName); OSRef* clientSesRef = sHLSSessionMap->Resolve(&streamName); if(NULL == clientSesRef) return NULL; EasyHLSSession* session = (EasyHLSSession*)clientSesRef->GetObject(); hlsURL = session->GetHLSURL(); sHLSSessionMap->Release(session->GetRef()); return hlsURL; }
RTPFileSession::ErrorCode RTPFileSession::Initialize(StrPtrLen& inFilePath, Float32 inBufferSeconds) { Assert(fFile == NULL); // Check to see if this file is already open OSMutexLocker locker(sOpenFileMap.GetMutex()); OSRef* theFileRef = sOpenFileMap.Resolve((StrPtrLen*)&inFilePath); if (theFileRef == NULL) { //qtss_printf("Didn't find file in map. Creating new one\n"); fFile = NEW RTPFile(); ErrorCode theErr = fFile->Initialize(inFilePath); if (theErr != errNoError) { delete fFile; fFile = NULL; return theErr; } OS_Error osErr = sOpenFileMap.Register(fFile->GetRef()); Assert(osErr == OS_NoErr); //unless we do this, the refcount won't increment (and we'll delete the session prematurely OSRef* debug = sOpenFileMap.Resolve((StrPtrLen*)&inFilePath); Assert(debug == fFile->GetRef()); } else { //qtss_printf("Found file. Refcounting.\n"); fFile = (RTPFile*)theFileRef->GetObject(); } //Open the file no matter what //fFileSource.Set(inFilePath.Ptr); //Assert(fFileSource.GetLength() > 0); QTSS_Error theErr = QTSS_OpenFileObject(inFilePath.Ptr, 0, &fFileSource); Assert(theErr == QTSS_NoErr); // // Get the file length UInt32 theLen = sizeof(fFileLength); theErr = QTSS_GetValue(fFileSource, qtssFlObjLength, 0, &fFileLength, &theLen); Assert(theErr == QTSS_NoErr); Assert(theLen == sizeof(fFileLength)); // Allocate our data buffer fDataBufferSize = this->PowerOf2Floor((UInt32)(inBufferSeconds * fFile->GetBytesPerSecond())); // Check to see if the size is out of range. If so, adjust it if (fDataBufferSize > kMaxDataBufferSize) fDataBufferSize = kMaxDataBufferSize; if (fDataBufferSize < kBlockSize) fDataBufferSize = kBlockSize; fReadBuffer = fDataBuffer = NEW UInt8[fDataBufferSize]; // Allocate a buffer of TrackInfos fTrackInfo = NEW RTPFileSessionTrackInfo[fFile->GetMaxTrackNumber() + 1]; ::memset(fTrackInfo, 0, fFile->GetMaxTrackNumber() * sizeof(RTPFileSessionTrackInfo)); return errNoError; }