Darwin-Streaming-Server/QTFileLib/QTTrack.h

222 lines
9.7 KiB
C
Raw Permalink 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@
*
*/
//
// QTTrack:
// The central point of control for a track in a QTFile.
#ifndef QTTrack_H
#define QTTrack_H
//
// Includes
#include "QTAtom_dref.h"
#include "QTAtom_elst.h"
#include "QTAtom_mdhd.h"
#include "QTAtom_tkhd.h"
#include "QTAtom_stco.h"
#include "QTAtom_stsc.h"
#include "QTAtom_stsd.h"
#include "QTAtom_stss.h"
#include "QTAtom_stsz.h"
#include "QTAtom_stts.h"
//
// External classes
class QTFile;
class QTFile_FileControlBlock;
class QTAtom_stsc_SampleTableControlBlock;
class QTAtom_stts_SampleTableControlBlock;
//
// QTTrack class
class QTTrack {
public:
//
// Class error codes
enum ErrorCode {
errNoError = 0,
errInvalidQuickTimeFile = 1,
errParamError = 2,
errIsSkippedPacket = 3,
errInternalError = 100
};
public:
//
// Constructors and destructor.
QTTrack(QTFile * File, QTFile::AtomTOCEntry * trakAtom,
Bool16 Debug = false, Bool16 DeepDebug = false);
virtual ~QTTrack(void);
//
// Initialization functions.
virtual ErrorCode Initialize(void);
//
// Accessors.
inline Bool16 IsInitialized(void) { return fIsInitialized; }
inline const char *GetTrackName(void) { return (fTrackName ? fTrackName : ""); }
inline UInt32 GetTrackID(void) { return fTrackHeaderAtom->GetTrackID(); }
inline UInt64 GetCreationTime(void) { return fTrackHeaderAtom->GetCreationTime(); }
inline UInt64 GetModificationTime(void) { return fTrackHeaderAtom->GetModificationTime(); }
inline SInt64 GetDuration(void) { return (SInt64) fTrackHeaderAtom->GetDuration(); }
inline Float64 GetTimeScale(void) { return fMediaHeaderAtom->GetTimeScale(); }
inline Float64 GetTimeScaleRecip(void) { return fMediaHeaderAtom->GetTimeScaleRecip(); }
inline Float64 GetDurationInSeconds(void) { return GetDuration() / (Float64)GetTimeScale(); }
inline UInt64 GetFirstEditMovieTime(void)
{ if(fEditListAtom != NULL) return fEditListAtom->FirstEditMovieTime();
else return 0; }
inline UInt32 GetFirstEditMediaTime(void) { return fFirstEditMediaTime; }
//
// Sample functions
Bool16 GetSizeOfSamplesInChunk(UInt32 chunkNumber, UInt32 * const sizePtr, UInt32 * const firstSampleNumPtr, UInt32 * const lastSampleNumPtr, QTAtom_stsc_SampleTableControlBlock * stcbPtr);
inline Bool16 GetChunkFirstLastSample(UInt32 chunkNumber, UInt32 *firstSample, UInt32 *lastSample,
QTAtom_stsc_SampleTableControlBlock *STCB)
{ return fSampleToChunkAtom->GetChunkFirstLastSample(chunkNumber,firstSample, lastSample, STCB);
}
inline Bool16 SampleToChunkInfo(UInt32 SampleNumber, UInt32 *samplesPerChunk, UInt32 *ChunkNumber, UInt32 *SampleDescriptionIndex, UInt32 *SampleOffsetInChunk,
QTAtom_stsc_SampleTableControlBlock * STCB)
{ return fSampleToChunkAtom->SampleToChunkInfo(SampleNumber,samplesPerChunk, ChunkNumber, SampleDescriptionIndex, SampleOffsetInChunk, STCB);
}
inline Bool16 SampleNumberToChunkNumber(UInt32 SampleNumber, UInt32 *ChunkNumber, UInt32 *SampleDescriptionIndex, UInt32 *SampleOffsetInChunk,
QTAtom_stsc_SampleTableControlBlock * STCB)
{ return fSampleToChunkAtom->SampleNumberToChunkNumber(SampleNumber, ChunkNumber, SampleDescriptionIndex, SampleOffsetInChunk, STCB);
}
inline UInt32 GetChunkFirstSample(UInt32 chunkNumber)
{ return fSampleToChunkAtom->GetChunkFirstSample(chunkNumber);
}
inline Bool16 ChunkOffset(UInt32 ChunkNumber, UInt64 *Offset = NULL)
{ return fChunkOffsetAtom->ChunkOffset(ChunkNumber, Offset);
}
inline Bool16 SampleSize(UInt32 SampleNumber, UInt32 *Size = NULL)
{ return fSampleSizeAtom->SampleSize(SampleNumber, Size);
}
inline Bool16 SampleRangeSize(UInt32 firstSample, UInt32 lastSample, UInt32 *sizePtr = NULL)
{ return fSampleSizeAtom->SampleRangeSize(firstSample, lastSample, sizePtr);
}
Bool16 GetSampleInfo(UInt32 SampleNumber, UInt32 * const Length, UInt64 * const Offset, UInt32 * const SampleDescriptionIndex,
QTAtom_stsc_SampleTableControlBlock * STCB);
Bool16 GetSample(UInt32 SampleNumber, char * Buffer, UInt32 * Length,QTFile_FileControlBlock * FCB,
QTAtom_stsc_SampleTableControlBlock * STCB);
inline Bool16 GetSampleMediaTime(UInt32 SampleNumber, UInt32 * const MediaTime,
QTAtom_stts_SampleTableControlBlock * STCB)
{ return fTimeToSampleAtom->SampleNumberToMediaTime(SampleNumber, MediaTime, STCB);
}
inline Bool16 GetSampleNumberFromMediaTime(UInt32 MediaTime, UInt32 * const SampleNumber,
QTAtom_stts_SampleTableControlBlock * STCB)
{ return fTimeToSampleAtom->MediaTimeToSampleNumber(MediaTime, SampleNumber, STCB);
}
inline void GetPreviousSyncSample(UInt32 SampleNumber, UInt32 * SyncSampleNumber)
{ if(fSyncSampleAtom != NULL) fSyncSampleAtom->PreviousSyncSample(SampleNumber, SyncSampleNumber);
else *SyncSampleNumber = SampleNumber;
}
inline void GetNextSyncSample(UInt32 SampleNumber, UInt32 * SyncSampleNumber)
{ if(fSyncSampleAtom != NULL) fSyncSampleAtom->NextSyncSample(SampleNumber, SyncSampleNumber);
else *SyncSampleNumber = SampleNumber + 1;
}
inline Bool16 IsSyncSample(UInt32 SampleNumber, UInt32 SyncSampleCursor)
{ if (fSyncSampleAtom != NULL) return fSyncSampleAtom->IsSyncSample(SampleNumber, SyncSampleCursor);
else return true;
}
//
// Read functions.
inline Bool16 Read(UInt32 SampleDescriptionID, UInt64 Offset, char * const Buffer, UInt32 Length,
QTFile_FileControlBlock * FCB = NULL)
{ return fDataReferenceAtom->Read(fSampleDescriptionAtom->SampleDescriptionToDataReference(SampleDescriptionID), Offset, Buffer, Length, FCB);
}
inline Bool16 GetSampleMediaTimeOffset(UInt32 SampleNumber, UInt32 *mediaTimeOffset, QTAtom_ctts_SampleTableControlBlock * STCB)
{
if (fCompTimeToSampleAtom)
return fCompTimeToSampleAtom->SampleNumberToMediaTimeOffset(SampleNumber, mediaTimeOffset, STCB);
else
return false;
}
//
// Debugging functions.
virtual void DumpTrack(void);
inline void DumpSampleToChunkTable(void) { fSampleToChunkAtom->DumpTable(); }
inline void DumpChunkOffsetTable(void) { fChunkOffsetAtom->DumpTable(); }
inline void DumpSampleSizeTable(void) { fSampleSizeAtom->DumpTable(); }
inline void DumpTimeToSampleTable(void) { fTimeToSampleAtom->DumpTable(); }
inline void DumpCompTimeToSampleTable(void) { if (fCompTimeToSampleAtom) fCompTimeToSampleAtom->DumpTable(); else printf("*** no ctts table ****\n"); }
protected:
//
// Protected member variables.
Bool16 fDebug, fDeepDebug;
QTFile *fFile;
QTFile::AtomTOCEntry fTOCEntry;
Bool16 fIsInitialized;
QTAtom_tkhd *fTrackHeaderAtom;
char *fTrackName;
QTAtom_mdhd *fMediaHeaderAtom;
QTAtom_elst *fEditListAtom;
QTAtom_dref *fDataReferenceAtom;
QTAtom_stts *fTimeToSampleAtom;
QTAtom_ctts *fCompTimeToSampleAtom;
QTAtom_stsc *fSampleToChunkAtom;
QTAtom_stsd *fSampleDescriptionAtom;
QTAtom_stco *fChunkOffsetAtom;
QTAtom_stsz *fSampleSizeAtom;
QTAtom_stss *fSyncSampleAtom;
UInt32 fFirstEditMediaTime;
};
#endif // QTTrack_H