222 lines
9.7 KiB
C
222 lines
9.7 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@
|
||
|
*
|
||
|
*/
|
||
|
//
|
||
|
// 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
|