mp4track.h
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:7k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is MPEG4IP.
  13.  * 
  14.  * The Initial Developer of the Original Code is Cisco Systems Inc.
  15.  * Portions created by Cisco Systems Inc. are
  16.  * Copyright (C) Cisco Systems Inc. 2001.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  * Dave Mackie dmackie@cisco.com
  20.  */
  21. #ifndef __MP4_TRACK_INCLUDED__
  22. #define __MP4_TRACK_INCLUDED__
  23. typedef u_int32_t MP4ChunkId;
  24. // forward declarations
  25. class MP4File;
  26. class MP4Atom;
  27. class MP4Property;
  28. class MP4IntegerProperty;
  29. class MP4Integer16Property;
  30. class MP4Integer32Property;
  31. class MP4Integer64Property;
  32. class MP4StringProperty;
  33. class MP4Track {
  34. public:
  35. MP4Track(MP4File* pFile, MP4Atom* pTrakAtom);
  36. virtual ~MP4Track();
  37. MP4TrackId GetId() {
  38. return m_trackId;
  39. }
  40. const char* GetType();
  41. void SetType(const char* type);
  42. MP4File* GetFile() {
  43. return m_pFile;
  44. }
  45. MP4Atom* GetTrakAtom() {
  46. return m_pTrakAtom;
  47. }
  48. void ReadSample(
  49. // input parameters
  50. MP4SampleId sampleId,
  51. // output parameters
  52. u_int8_t** ppBytes, 
  53. u_int32_t* pNumBytes, 
  54. MP4Timestamp* pStartTime = NULL, 
  55. MP4Duration* pDuration = NULL,
  56. MP4Duration* pRenderingOffset = NULL, 
  57. bool* pIsSyncSample = NULL);
  58. void WriteSample(
  59. u_int8_t* pBytes, 
  60. u_int32_t numBytes,
  61. MP4Duration duration = 0,
  62. MP4Duration renderingOffset = 0, 
  63. bool isSyncSample = true);
  64. virtual void FinishWrite();
  65. u_int64_t  GetDuration(); // in track timeScale units
  66. u_int32_t GetTimeScale();
  67. u_int32_t GetNumberOfSamples();
  68. u_int32_t GetSampleSize(MP4SampleId sampleId);
  69. u_int32_t GetMaxSampleSize();
  70. u_int64_t  GetTotalOfSampleSizes();
  71. u_int32_t GetAvgBitrate(); // in bps
  72. u_int32_t GetMaxBitrate(); // in bps
  73. MP4Duration GetFixedSampleDuration();
  74. bool SetFixedSampleDuration(MP4Duration duration);
  75. void GetSampleTimes(MP4SampleId sampleId,
  76. MP4Timestamp* pStartTime, MP4Duration* pDuration);
  77. bool IsSyncSample(MP4SampleId sampleId);
  78. MP4SampleId GetSampleIdFromTime(
  79. MP4Timestamp when, 
  80. bool wantSyncSample = false);
  81. MP4Duration GetSampleRenderingOffset(MP4SampleId sampleId);
  82. void SetSampleRenderingOffset(MP4SampleId sampleId,
  83. MP4Duration renderingOffset);
  84. MP4EditId AddEdit(
  85. MP4EditId editId = MP4_INVALID_EDIT_ID);
  86. void DeleteEdit(
  87. MP4EditId editId);
  88. MP4Timestamp GetEditStart(
  89. MP4EditId editId);
  90. MP4Timestamp GetEditTotalDuration(
  91. MP4EditId editId);
  92. MP4SampleId GetSampleIdFromEditTime(
  93. MP4Timestamp editWhen, 
  94. MP4Timestamp* pStartTime = NULL, 
  95. MP4Duration* pDuration = NULL);
  96. static const char* NormalizeTrackType(const char* type);
  97. // special operation for use during hint track packet assembly
  98. void ReadSampleFragment(
  99. MP4SampleId sampleId,
  100. u_int32_t sampleOffset,
  101. u_int16_t sampleLength,
  102. u_int8_t* pDest);
  103. // special operations for use during optimization
  104. u_int32_t GetNumberOfChunks();
  105. MP4Timestamp GetChunkTime(MP4ChunkId chunkId);
  106. void ReadChunk(MP4ChunkId chunkId, 
  107. u_int8_t** ppChunk, u_int32_t* pChunkSize);
  108. void RewriteChunk(MP4ChunkId chunkId, 
  109. u_int8_t* pChunk, u_int32_t chunkSize);
  110. protected:
  111. bool InitEditListProperties();
  112. FILE* GetSampleFile(MP4SampleId sampleId);
  113. u_int64_t GetSampleFileOffset(MP4SampleId sampleId);
  114. u_int32_t GetSampleStscIndex(MP4SampleId sampleId);
  115. u_int32_t GetChunkStscIndex(MP4ChunkId chunkId);
  116. u_int32_t GetChunkSize(MP4ChunkId chunkId);
  117. u_int32_t GetSampleCttsIndex(MP4SampleId sampleId, 
  118. MP4SampleId* pFirstSampleId = NULL);
  119. MP4SampleId GetNextSyncSample(MP4SampleId sampleId);
  120. void UpdateSampleSizes(MP4SampleId sampleId, 
  121. u_int32_t numBytes);
  122. bool IsChunkFull(MP4SampleId sampleId);
  123. void UpdateSampleToChunk(MP4SampleId sampleId,
  124.  MP4ChunkId chunkId, u_int32_t samplesPerChunk);
  125. void UpdateChunkOffsets(u_int64_t chunkOffset);
  126. void UpdateSampleTimes(MP4Duration duration);
  127. void UpdateRenderingOffsets(MP4SampleId sampleId, 
  128. MP4Duration renderingOffset);
  129. void UpdateSyncSamples(MP4SampleId sampleId, 
  130. bool isSyncSample);
  131. MP4Atom* AddAtom(char* parentName, char* childName);
  132. void UpdateDurations(MP4Duration duration);
  133. MP4Duration ToMovieDuration(MP4Duration trackDuration);
  134. void UpdateModificationTimes();
  135. void WriteChunkBuffer();
  136. protected:
  137. MP4File* m_pFile;
  138. MP4Atom*  m_pTrakAtom; // moov.trak[]
  139. MP4TrackId m_trackId; // moov.trak[].tkhd.trackId
  140. MP4StringProperty* m_pTypeProperty; // moov.trak[].mdia.hdlr.handlerType
  141. u_int32_t m_lastStsdIndex;
  142. FILE*   m_lastSampleFile;
  143. // for efficient construction of hint track packets
  144. MP4SampleId m_cachedReadSampleId;
  145. u_int8_t*  m_pCachedReadSample;
  146. u_int32_t m_cachedReadSampleSize;
  147. // for writing
  148. MP4SampleId m_writeSampleId;
  149. MP4Duration m_fixedSampleDuration;
  150. u_int8_t*  m_pChunkBuffer;
  151. u_int32_t m_chunkBufferSize;
  152. u_int32_t m_chunkSamples;
  153. MP4Duration m_chunkDuration;
  154. // controls for chunking
  155. u_int32_t  m_samplesPerChunk;
  156. MP4Duration m_durationPerChunk;
  157. MP4Integer32Property* m_pTimeScaleProperty;
  158. MP4IntegerProperty* m_pTrackDurationProperty; // 32 or 64 bits
  159. MP4IntegerProperty* m_pMediaDurationProperty; // 32 or 64 bits
  160. MP4IntegerProperty* m_pTrackModificationProperty; // 32 or 64 bits
  161. MP4IntegerProperty* m_pMediaModificationProperty; // 32 or 64 bits
  162. MP4Integer32Property* m_pStszFixedSampleSizeProperty;
  163. MP4Integer32Property* m_pStszSampleCountProperty;
  164. MP4Integer32Property* m_pStszSampleSizeProperty;
  165. MP4Integer32Property* m_pStscCountProperty;
  166. MP4Integer32Property* m_pStscFirstChunkProperty;
  167. MP4Integer32Property* m_pStscSamplesPerChunkProperty;
  168. MP4Integer32Property* m_pStscSampleDescrIndexProperty;
  169. MP4Integer32Property* m_pStscFirstSampleProperty;
  170. MP4Integer32Property* m_pChunkCountProperty;
  171. MP4IntegerProperty*   m_pChunkOffsetProperty; // 32 or 64 bits
  172. MP4Integer32Property* m_pSttsCountProperty;
  173. MP4Integer32Property* m_pSttsSampleCountProperty;
  174. MP4Integer32Property* m_pSttsSampleDeltaProperty;
  175. MP4Integer32Property* m_pCttsCountProperty;
  176. MP4Integer32Property* m_pCttsSampleCountProperty;
  177. MP4Integer32Property* m_pCttsSampleOffsetProperty;
  178. MP4Integer32Property* m_pStssCountProperty;
  179. MP4Integer32Property* m_pStssSampleProperty;
  180. MP4Integer32Property* m_pElstCountProperty;
  181. MP4IntegerProperty*   m_pElstMediaTimeProperty; // 32 or 64 bits
  182. MP4IntegerProperty*   m_pElstDurationProperty; // 32 or 64 bits
  183. MP4Integer16Property* m_pElstRateProperty;
  184. MP4Integer16Property* m_pElstReservedProperty;
  185. };
  186. MP4ARRAY_DECL(MP4Track, MP4Track*);
  187. #endif /* __MP4_TRACK_INCLUDED__ */