/* * The contents of this file are subject to the Mozilla Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. * * The Original Code is MPEG4IP. * * The Initial Developer of the Original Code is Cisco Systems Inc. * Portions created by Cisco Systems Inc. are * Copyright (C) Cisco Systems Inc. 2001 - 2004. All Rights Reserved. * * 3GPP features implementation is based on 3GPP's TS26.234-v5.60, * and was contributed by Ximpo Group Ltd. * * Portions created by Ximpo Group Ltd. are * Copyright (C) Ximpo Group Ltd. 2003, 2004. All Rights Reserved. * * Contributor(s): * Dave Mackie dmackie@cisco.com * Ximpo Group Ltd. mp4v2@ximpo.com */ #ifndef MP4V2_IMPL_MP4TRACK_H #define MP4V2_IMPL_MP4TRACK_H namespace mp4v2 { namespace impl { /////////////////////////////////////////////////////////////////////////////// typedef uint32_t MP4ChunkId; // forward declarations class MP4File; class MP4Atom; class MP4Property; class MP4IntegerProperty; class MP4Integer8Property; class MP4Integer16Property; class MP4Integer32Property; class MP4Integer64Property; class MP4StringProperty; class MP4Track { public: MP4Track(MP4File& file, MP4Atom& trakAtom); virtual ~MP4Track(); MP4TrackId GetId() { return m_trackId; } const char* GetType(); void SetType(const char* type); MP4File& GetFile() { return m_File; } MP4Atom& GetTrakAtom() { return m_trakAtom; } void ReadSample( // input parameters MP4SampleId sampleId, // output parameters uint8_t** ppBytes, uint32_t* pNumBytes, MP4Timestamp* pStartTime = NULL, MP4Duration* pDuration = NULL, MP4Duration* pRenderingOffset = NULL, bool* pIsSyncSample = NULL, bool* hasDependencyFlags = NULL, uint32_t* dependencyFlags = NULL ); void WriteSample( const uint8_t* pBytes, uint32_t numBytes, MP4Duration duration = 0, MP4Duration renderingOffset = 0, bool isSyncSample = true); void WriteSampleDependency( const uint8_t* pBytes, uint32_t numBytes, MP4Duration duration, MP4Duration renderingOffset, bool isSyncSample, uint32_t dependencyFlags ); virtual void FinishWrite(uint32_t options = 0); uint64_t GetDuration(); // in track timeScale units uint32_t GetTimeScale(); uint32_t GetNumberOfSamples(); uint32_t GetSampleSize(MP4SampleId sampleId); uint32_t GetMaxSampleSize(); uint64_t GetTotalOfSampleSizes(); uint32_t GetAvgBitrate(); // in bps uint32_t GetMaxBitrate(); // in bps MP4Duration GetFixedSampleDuration(); void SetFixedSampleDuration(MP4Duration duration); void GetSampleTimes(MP4SampleId sampleId, MP4Timestamp* pStartTime, MP4Duration* pDuration); bool IsSyncSample(MP4SampleId sampleId); MP4SampleId GetSampleIdFromTime( MP4Timestamp when, bool wantSyncSample = false); MP4Duration GetSampleRenderingOffset(MP4SampleId sampleId); void SetSampleRenderingOffset(MP4SampleId sampleId, MP4Duration renderingOffset); MP4EditId AddEdit( MP4EditId editId = MP4_INVALID_EDIT_ID); void DeleteEdit( MP4EditId editId); MP4Timestamp GetEditStart( MP4EditId editId); MP4Timestamp GetEditTotalDuration( MP4EditId editId); MP4SampleId GetSampleIdFromEditTime( MP4Timestamp editWhen, MP4Timestamp* pStartTime = NULL, MP4Duration* pDuration = NULL); // special operation for use during hint track packet assembly void ReadSampleFragment( MP4SampleId sampleId, uint32_t sampleOffset, uint16_t sampleLength, uint8_t* pDest); // special operations for use during optimization uint32_t GetNumberOfChunks(); MP4Timestamp GetChunkTime(MP4ChunkId chunkId); void ReadChunk(MP4ChunkId chunkId, uint8_t** ppChunk, uint32_t* pChunkSize); void RewriteChunk(MP4ChunkId chunkId, uint8_t* pChunk, uint32_t chunkSize); MP4Duration GetDurationPerChunk(); void SetDurationPerChunk( MP4Duration ); protected: bool InitEditListProperties(); File* GetSampleFile( MP4SampleId sampleId ); uint64_t GetSampleFileOffset(MP4SampleId sampleId); uint32_t GetSampleStscIndex(MP4SampleId sampleId); uint32_t GetChunkStscIndex(MP4ChunkId chunkId); uint32_t GetChunkSize(MP4ChunkId chunkId); uint32_t GetSampleCttsIndex(MP4SampleId sampleId, MP4SampleId* pFirstSampleId = NULL); MP4SampleId GetNextSyncSample(MP4SampleId sampleId); void UpdateSampleSizes(MP4SampleId sampleId, uint32_t numBytes); bool IsChunkFull(MP4SampleId sampleId); void UpdateSampleToChunk(MP4SampleId sampleId, MP4ChunkId chunkId, uint32_t samplesPerChunk); void UpdateChunkOffsets(uint64_t chunkOffset); void UpdateSampleTimes(MP4Duration duration); void UpdateRenderingOffsets(MP4SampleId sampleId, MP4Duration renderingOffset); void UpdateSyncSamples(MP4SampleId sampleId, bool isSyncSample); MP4Atom* AddAtom(const char* parentName, const char* childName); void UpdateDurations(MP4Duration duration); MP4Duration ToMovieDuration(MP4Duration trackDuration); void UpdateModificationTimes(); void WriteChunkBuffer(); void CalculateBytesPerSample(); void FinishSdtp(); protected: MP4File& m_File; MP4Atom& m_trakAtom; // moov.trak[] MP4TrackId m_trackId; // moov.trak[].tkhd.trackId MP4StringProperty* m_pTypeProperty; // moov.trak[].mdia.hdlr.handlerType uint32_t m_lastStsdIndex; File* m_lastSampleFile; // for efficient construction of hint track packets MP4SampleId m_cachedReadSampleId; uint8_t* m_pCachedReadSample; uint32_t m_cachedReadSampleSize; // for writing MP4SampleId m_writeSampleId; MP4Duration m_fixedSampleDuration; uint8_t* m_pChunkBuffer; uint32_t m_chunkBufferSize; // Actual size of our chunk buffer. uint32_t m_sizeOfDataInChunkBuffer; // Size of the data in the chunk buffer. uint32_t m_chunkSamples; MP4Duration m_chunkDuration; // controls for chunking uint32_t m_samplesPerChunk; MP4Duration m_durationPerChunk; uint32_t m_bytesPerSample; // controls for AMR chunking int m_isAmr; uint8_t m_curMode; MP4Integer32Property* m_pTimeScaleProperty; MP4IntegerProperty* m_pTrackDurationProperty; // 32 or 64 bits MP4IntegerProperty* m_pMediaDurationProperty; // 32 or 64 bits MP4IntegerProperty* m_pTrackModificationProperty; // 32 or 64 bits MP4IntegerProperty* m_pMediaModificationProperty; // 32 or 64 bits MP4Integer32Property* m_pStszFixedSampleSizeProperty; MP4Integer32Property* m_pStszSampleCountProperty; void SampleSizePropertyAddValue(uint32_t bytes); uint8_t m_stsz_sample_bits; bool m_have_stz2_4bit_sample; uint8_t m_stz2_4bit_sample_value; MP4IntegerProperty* m_pStszSampleSizeProperty; MP4Integer32Property* m_pStscCountProperty; MP4Integer32Property* m_pStscFirstChunkProperty; MP4Integer32Property* m_pStscSamplesPerChunkProperty; MP4Integer32Property* m_pStscSampleDescrIndexProperty; MP4Integer32Property* m_pStscFirstSampleProperty; MP4Integer32Property* m_pChunkCountProperty; MP4IntegerProperty* m_pChunkOffsetProperty; // 32 or 64 bits MP4Integer32Property* m_pSttsCountProperty; MP4Integer32Property* m_pSttsSampleCountProperty; MP4Integer32Property* m_pSttsSampleDeltaProperty; // for improve sequental timestamp index access uint32_t m_cachedSttsIndex; MP4SampleId m_cachedSttsSid; MP4Timestamp m_cachedSttsElapsed; uint32_t m_cachedCttsIndex; MP4SampleId m_cachedCttsSid; MP4Integer32Property* m_pCttsCountProperty; MP4Integer32Property* m_pCttsSampleCountProperty; MP4Integer32Property* m_pCttsSampleOffsetProperty; MP4Integer32Property* m_pStssCountProperty; MP4Integer32Property* m_pStssSampleProperty; MP4Integer32Property* m_pElstCountProperty; MP4IntegerProperty* m_pElstMediaTimeProperty; // 32 or 64 bits MP4IntegerProperty* m_pElstDurationProperty; // 32 or 64 bits MP4Integer16Property* m_pElstRateProperty; MP4Integer16Property* m_pElstReservedProperty; string m_sdtpLog; // records frame types for H264 samples }; MP4ARRAY_DECL(MP4Track, MP4Track*); /////////////////////////////////////////////////////////////////////////////// }} // namespace mp4v2::impl #endif // MP4V2_IMPL_MP4TRACK_H