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

流媒体/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_FILE_INCLUDED__
  22. #define __MP4_FILE_INCLUDED__
  23. // forward declarations
  24. class MP4Atom;
  25. class MP4Property;
  26. class MP4Float32Property;
  27. class MP4StringProperty;
  28. class MP4BytesProperty;
  29. class MP4Descriptor;
  30. class MP4DescriptorProperty;
  31. class MP4File {
  32. public: /* equivalent to MP4 library API */
  33. MP4File(u_int32_t verbosity = 0);
  34. ~MP4File();
  35. /* file operations */
  36. void Read(const char* fileName);
  37. void Create(const char* fileName, bool use64bits);
  38. void Modify(const char* fileName);
  39. void Optimize(const char* orgFileName, 
  40. const char* newFileName = NULL);
  41. void Dump(FILE* pDumpFile = NULL, bool dumpImplicits = false);
  42. void Close();
  43. /* library property per file */
  44. u_int32_t GetVerbosity() {
  45. return m_verbosity;
  46. }
  47. void SetVerbosity(u_int32_t verbosity) {
  48. m_verbosity = verbosity;
  49. }
  50. bool Use64Bits() {
  51. return m_use64bits;
  52. }
  53. /* file properties */
  54. u_int64_t GetIntegerProperty(const char* name);
  55. float GetFloatProperty(const char* name);
  56. const char* GetStringProperty(const char* name);
  57. void GetBytesProperty(const char* name,
  58. u_int8_t** ppValue, u_int32_t* pValueSize);
  59. void SetIntegerProperty(const char* name, u_int64_t value);
  60. void SetFloatProperty(const char* name, float value);
  61. void SetStringProperty(const char* name, const char* value);
  62. void SetBytesProperty(const char* name, 
  63. const u_int8_t* pValue, u_int32_t valueSize);
  64. // file level convenience functions
  65. MP4Duration GetDuration();
  66. void SetDuration(MP4Duration value);
  67. u_int32_t GetTimeScale();
  68. void SetTimeScale(u_int32_t value);
  69. u_int8_t GetODProfileLevel();
  70. void SetODProfileLevel(u_int8_t value);
  71. u_int8_t GetSceneProfileLevel();
  72. void SetSceneProfileLevel(u_int8_t value);
  73. u_int8_t GetVideoProfileLevel();
  74. void SetVideoProfileLevel(u_int8_t value);
  75. u_int8_t GetAudioProfileLevel();
  76. void SetAudioProfileLevel(u_int8_t value);
  77. u_int8_t GetGraphicsProfileLevel();
  78. void SetGraphicsProfileLevel(u_int8_t value);
  79. const char* GetSessionSdp();
  80. void SetSessionSdp(const char* sdpString);
  81. void AppendSessionSdp(const char* sdpString);
  82. /* track operations */
  83. MP4TrackId AddTrack(const char* type, u_int32_t timeScale = 1000);
  84. void DeleteTrack(MP4TrackId trackId);
  85. u_int32_t GetNumberOfTracks(const char* type = NULL, u_int8_t subType = 0);
  86. MP4TrackId AllocTrackId();
  87. MP4TrackId FindTrackId(u_int16_t trackIndex, 
  88. const char* type = NULL, u_int8_t subType = 0);
  89. u_int16_t FindTrackIndex(MP4TrackId trackId);
  90. u_int16_t FindTrakAtomIndex(MP4TrackId trackId);
  91. /* track properties */
  92. u_int64_t GetTrackIntegerProperty(
  93. MP4TrackId trackId, const char* name);
  94. float GetTrackFloatProperty(
  95. MP4TrackId trackId, const char* name);
  96. const char* GetTrackStringProperty(
  97. MP4TrackId trackId, const char* name);
  98. void GetTrackBytesProperty(
  99. MP4TrackId trackId, const char* name,
  100. u_int8_t** ppValue, u_int32_t* pValueSize);
  101. void SetTrackIntegerProperty(
  102. MP4TrackId trackId, const char* name, int64_t value);
  103. void SetTrackFloatProperty(
  104. MP4TrackId trackId, const char* name, float value);
  105. void SetTrackStringProperty(
  106. MP4TrackId trackId, const char* name, const char* value);
  107. void SetTrackBytesProperty(
  108. MP4TrackId trackId, const char* name, 
  109. const u_int8_t* pValue, u_int32_t valueSize);
  110. /* sample operations */
  111. u_int32_t GetSampleSize(MP4TrackId trackId, MP4SampleId sampleId);
  112. u_int32_t GetTrackMaxSampleSize(MP4TrackId trackId);
  113. MP4SampleId GetSampleIdFromTime(MP4TrackId trackId, 
  114. MP4Timestamp when, bool wantSyncSample = false);
  115. MP4Timestamp GetSampleTime(
  116. MP4TrackId trackId, MP4SampleId sampleId);
  117. MP4Duration GetSampleDuration(
  118. MP4TrackId trackId, MP4SampleId sampleId);
  119. MP4Duration GetSampleRenderingOffset(
  120. MP4TrackId trackId, MP4SampleId sampleId);
  121. bool GetSampleSync(
  122. MP4TrackId trackId, MP4SampleId sampleId);
  123. void ReadSample(
  124. // input parameters
  125. MP4TrackId trackId, 
  126. MP4SampleId sampleId,
  127. // output parameters
  128. u_int8_t** ppBytes, 
  129. u_int32_t* pNumBytes, 
  130. MP4Timestamp* pStartTime = NULL, 
  131. MP4Duration* pDuration = NULL,
  132. MP4Duration* pRenderingOffset = NULL, 
  133. bool* pIsSyncSample = NULL);
  134. void WriteSample(
  135. MP4TrackId trackId,
  136. u_int8_t* pBytes, 
  137. u_int32_t numBytes,
  138. MP4Duration duration = 0,
  139. MP4Duration renderingOffset = 0, 
  140. bool isSyncSample = true);
  141. void SetSampleRenderingOffset(
  142. MP4TrackId trackId, 
  143. MP4SampleId sampleId,
  144. MP4Duration renderingOffset);
  145. /* track level convenience functions */
  146. MP4TrackId AddSystemsTrack(const char* type);
  147. MP4TrackId AddODTrack();
  148. MP4TrackId AddSceneTrack();
  149. MP4TrackId AddAudioTrack(
  150. u_int32_t timeScale, 
  151. MP4Duration sampleDuration,
  152. u_int8_t audioType);
  153. MP4TrackId AddVideoTrack(
  154. u_int32_t timeScale, 
  155. MP4Duration sampleDuration,
  156. u_int16_t width, 
  157. u_int16_t height, 
  158. u_int8_t videoType);
  159. MP4TrackId AddHintTrack(MP4TrackId refTrackId);
  160. MP4SampleId GetTrackNumberOfSamples(MP4TrackId trackId);
  161. const char* GetTrackType(MP4TrackId trackId);
  162. MP4Duration GetTrackDuration(MP4TrackId trackId);
  163. u_int32_t GetTrackTimeScale(MP4TrackId trackId);
  164. void SetTrackTimeScale(MP4TrackId trackId, u_int32_t value);
  165. u_int8_t GetTrackAudioType(MP4TrackId trackId);
  166. u_int8_t GetTrackAudioMpeg4Type(MP4TrackId trackId);
  167. u_int8_t GetTrackVideoType(MP4TrackId trackId);
  168. MP4Duration GetTrackFixedSampleDuration(MP4TrackId trackId);
  169. float GetTrackVideoFrameRate(MP4TrackId trackId);
  170. void GetTrackESConfiguration(MP4TrackId trackId, 
  171. u_int8_t** ppConfig, u_int32_t* pConfigSize);
  172. void SetTrackESConfiguration(MP4TrackId trackId, 
  173. const u_int8_t* pConfig, u_int32_t configSize);
  174. const char* GetHintTrackSdp(MP4TrackId hintTrackId);
  175. void SetHintTrackSdp(MP4TrackId hintTrackId, const char* sdpString);
  176. void AppendHintTrackSdp(MP4TrackId hintTrackId, const char* sdpString);
  177. // ISMA specific functions
  178. void MakeIsmaCompliant(bool addIsmaComplianceSdp = true);
  179. void CreateIsmaIodFromParams(
  180. u_int8_t videoProfile,
  181. u_int32_t videoBitrate,
  182. u_int8_t* videoConfig,
  183. u_int32_t videoConfigLength,
  184. u_int8_t audioProfile,
  185. u_int32_t audioBitrate,
  186. u_int8_t* audioConfig,
  187. u_int32_t audioConfigLength,
  188. u_int8_t** ppBytes,
  189. u_int64_t* pNumBytes);
  190. // time convenience functions
  191. u_int64_t ConvertFromMovieDuration(
  192. MP4Duration duration,
  193. u_int32_t timeScale);
  194. u_int64_t ConvertFromTrackTimestamp(
  195. MP4TrackId trackId, 
  196. MP4Timestamp timeStamp,
  197. u_int32_t timeScale);
  198. MP4Timestamp ConvertToTrackTimestamp(
  199. MP4TrackId trackId, 
  200. u_int64_t timeStamp,
  201. u_int32_t timeScale);
  202. u_int64_t ConvertFromTrackDuration(
  203. MP4TrackId trackId, 
  204. MP4Duration duration,
  205. u_int32_t timeScale);
  206. MP4Duration ConvertToTrackDuration(
  207. MP4TrackId trackId, 
  208. u_int64_t duration,
  209. u_int32_t timeScale);
  210. // specialized operations
  211. void GetHintTrackRtpPayload(
  212. MP4TrackId hintTrackId,
  213. char** ppPayloadName = NULL,
  214. u_int8_t* pPayloadNumber = NULL,
  215. u_int16_t* pMaxPayloadSize = NULL);
  216. void SetHintTrackRtpPayload(
  217. MP4TrackId hintTrackId,
  218. const char* payloadName,
  219. u_int8_t* pPayloadNumber,
  220. u_int16_t maxPayloadSize);
  221. MP4TrackId GetHintTrackReferenceTrackId(
  222. MP4TrackId hintTrackId);
  223. void ReadRtpHint(
  224. MP4TrackId hintTrackId,
  225. MP4SampleId hintSampleId,
  226. u_int16_t* pNumPackets = NULL);
  227. u_int16_t GetRtpHintNumberOfPackets(
  228. MP4TrackId hintTrackId);
  229. int8_t GetRtpPacketBFrame(
  230. MP4TrackId hintTrackId,
  231. u_int16_t packetIndex);
  232. int32_t GetRtpPacketTransmitOffset(
  233. MP4TrackId hintTrackId,
  234. u_int16_t packetIndex);
  235. void ReadRtpPacket(
  236. MP4TrackId hintTrackId,
  237. u_int16_t packetIndex,
  238. u_int8_t** ppBytes, 
  239. u_int32_t* pNumBytes,
  240. u_int32_t ssrc = 0,
  241. bool includeHeader = true,
  242. bool includePayload = true);
  243. MP4Timestamp GetRtpTimestampStart(
  244. MP4TrackId hintTrackId);
  245. void SetRtpTimestampStart(
  246. MP4TrackId hintTrackId,
  247. MP4Timestamp rtpStart);
  248. void AddRtpHint(
  249. MP4TrackId hintTrackId,
  250. bool isBframe, 
  251. u_int32_t timestampOffset);
  252. void AddRtpPacket(
  253. MP4TrackId hintTrackId, 
  254. bool setMbit,
  255. int32_t transmitOffset);
  256. void AddRtpImmediateData(
  257. MP4TrackId hintTrackId,
  258. const u_int8_t* pBytes,
  259. u_int32_t numBytes);
  260. void AddRtpSampleData(
  261. MP4TrackId hintTrackId,
  262. MP4SampleId sampleId,
  263. u_int32_t dataOffset,
  264. u_int32_t dataLength);
  265. void AddRtpESConfigurationPacket(
  266. MP4TrackId hintTrackId);
  267. void WriteRtpHint(
  268. MP4TrackId hintTrackId,
  269. MP4Duration duration,
  270. bool isSyncSample);
  271. u_int8_t AllocRtpPayloadNumber();
  272. // edit list related
  273. char* MakeTrackEditName(
  274. MP4TrackId trackId,
  275. MP4EditId editId,
  276. const char* name);
  277. MP4EditId AddTrackEdit(
  278. MP4TrackId trackId,
  279. MP4EditId editId = MP4_INVALID_EDIT_ID);
  280. void DeleteTrackEdit(
  281. MP4TrackId trackId,
  282. MP4EditId editId);
  283. u_int32_t GetTrackNumberOfEdits(
  284. MP4TrackId trackId);
  285. MP4Timestamp GetTrackEditStart(
  286. MP4TrackId trackId,
  287. MP4EditId editId);
  288. MP4Duration GetTrackEditTotalDuration(
  289. MP4TrackId trackId,
  290. MP4EditId editId);
  291. MP4Timestamp GetTrackEditMediaStart(
  292. MP4TrackId trackId,
  293. MP4EditId editId);
  294. void SetTrackEditMediaStart(
  295. MP4TrackId trackId,
  296. MP4EditId editId,
  297. MP4Timestamp startTime);
  298. MP4Duration GetTrackEditDuration(
  299. MP4TrackId trackId,
  300. MP4EditId editId);
  301. void SetTrackEditDuration(
  302. MP4TrackId trackId,
  303. MP4EditId editId,
  304. MP4Duration duration);
  305. bool GetTrackEditDwell(
  306. MP4TrackId trackId,
  307. MP4EditId editId);
  308. void SetTrackEditDwell(
  309. MP4TrackId trackId,
  310. MP4EditId editId,
  311. bool dwell);
  312. MP4SampleId GetSampleIdFromEditTime(
  313. MP4TrackId trackId,
  314. MP4Timestamp when,
  315. MP4Timestamp* pStartTime = NULL,
  316. MP4Duration* pDuration = NULL);
  317. /* end of MP4 API */
  318. /* "protected" interface to be used only by friends in library */
  319. u_int64_t GetPosition(FILE* pFile = NULL);
  320. void SetPosition(u_int64_t pos, FILE* pFile = NULL);
  321. u_int64_t GetSize();
  322. u_int32_t ReadBytes(
  323. u_int8_t* pBytes, u_int32_t numBytes, FILE* pFile = NULL);
  324. u_int64_t ReadUInt(u_int8_t size);
  325. u_int8_t ReadUInt8();
  326. u_int16_t ReadUInt16();
  327. u_int32_t ReadUInt24();
  328. u_int32_t ReadUInt32();
  329. u_int64_t ReadUInt64();
  330. float ReadFixed16();
  331. float ReadFixed32();
  332. float ReadFloat();
  333. char* ReadString();
  334. char* ReadCountedString(
  335. u_int8_t charSize = 1, bool allowExpandedCount = false);
  336. u_int64_t ReadBits(u_int8_t numBits);
  337. void FlushReadBits();
  338. u_int32_t ReadMpegLength();
  339. u_int32_t PeekBytes(
  340. u_int8_t* pBytes, u_int32_t numBytes, FILE* pFile = NULL);
  341. void WriteBytes(u_int8_t* pBytes, u_int32_t numBytes, FILE* pFile = NULL);
  342. void WriteUInt(u_int64_t value, u_int8_t size);
  343. void WriteUInt8(u_int8_t value);
  344. void WriteUInt16(u_int16_t value);
  345. void WriteUInt24(u_int32_t value);
  346. void WriteUInt32(u_int32_t value);
  347. void WriteUInt64(u_int64_t value);
  348. void WriteFixed16(float value);
  349. void WriteFixed32(float value);
  350. void WriteFloat(float value);
  351. void WriteString(char* string);
  352. void WriteCountedString(char* string, 
  353. u_int8_t charSize = 1, bool allowExpandedCount = false);
  354. void WriteBits(u_int64_t bits, u_int8_t numBits);
  355. void PadWriteBits(u_int8_t pad = 0);
  356. void FlushWriteBits();
  357. void WriteMpegLength(u_int32_t value, bool compact = false);
  358. void EnableMemoryBuffer(
  359. u_int8_t* pBytes = NULL, u_int64_t numBytes = 0);
  360. void DisableMemoryBuffer(
  361. u_int8_t** ppBytes = NULL, u_int64_t* pNumBytes = NULL);
  362. char GetMode() {
  363. return m_mode;
  364. }
  365. MP4Track* GetTrack(MP4TrackId trackId);
  366. MP4Duration UpdateDuration(MP4Duration duration);
  367. MP4Atom* FindAtom(const char* name);
  368. MP4Atom* AddChildAtom(
  369. const char* parentName, 
  370. const char* childName);
  371. MP4Atom* AddChildAtom(
  372. MP4Atom* pParentAtom, 
  373. const char* childName);
  374. MP4Atom* InsertChildAtom(
  375. const char* parentName, 
  376. const char* childName, 
  377. u_int32_t index);
  378. MP4Atom* InsertChildAtom(
  379. MP4Atom* pParentAtom, 
  380. const char* childName, 
  381. u_int32_t index);
  382. MP4Atom* AddDescendantAtoms(
  383. const char* ancestorName, 
  384. const char* childName);
  385. MP4Atom* AddDescendantAtoms(
  386. MP4Atom* pAncestorAtom,
  387. const char* childName);
  388. protected:
  389. void Open(const char* fmode);
  390. void ReadFromFile();
  391. void GenerateTracks();
  392. void BeginWrite();
  393. void FinishWrite();
  394. void CacheProperties();
  395. void RewriteMdat(FILE* pReadFile, FILE* pWriteFile);
  396. const char* TempFileName();
  397. void Rename(const char* existingFileName, const char* newFileName);
  398. void ProtectWriteOperation(char* where);
  399. void FindIntegerProperty(const char* name, 
  400. MP4Property** ppProperty, u_int32_t* pIndex = NULL);
  401. void FindFloatProperty(const char* name, 
  402. MP4Property** ppProperty, u_int32_t* pIndex = NULL);
  403. void FindStringProperty(const char* name, 
  404. MP4Property** ppProperty, u_int32_t* pIndex = NULL);
  405. void FindBytesProperty(const char* name, 
  406. MP4Property** ppProperty, u_int32_t* pIndex = NULL);
  407. bool FindProperty(const char* name,
  408. MP4Property** ppProperty, u_int32_t* pIndex = NULL);
  409. void AddTrackToIod(MP4TrackId trackId);
  410. void RemoveTrackFromIod(MP4TrackId trackId);
  411. void AddTrackToOd(MP4TrackId trackId);
  412. void RemoveTrackFromOd(MP4TrackId trackId);
  413. void GetTrackReferenceProperties(const char* trefName,
  414. MP4Property** ppCountProperty, MP4Property** ppTrackIdProperty);
  415. void AddTrackReference(const char* trefName, MP4TrackId refTrackId);
  416. u_int32_t FindTrackReference(const char* trefName, MP4TrackId refTrackId);
  417. void RemoveTrackReference(const char* trefName, MP4TrackId refTrackId);
  418. void AddDataReference(MP4TrackId trackId, const char* url);
  419. char* MakeTrackName(MP4TrackId trackId, const char* name);
  420. u_int8_t ConvertTrackTypeToStreamType(const char* trackType);
  421. void CreateIsmaIodFromFile(
  422. MP4TrackId odTrackId,
  423. MP4TrackId sceneTrackId,
  424. MP4TrackId audioTrackId, 
  425. MP4TrackId videoTrackId,
  426. u_int8_t** ppBytes,
  427. u_int64_t* pNumBytes);
  428. MP4Descriptor* CreateESD(
  429. MP4DescriptorProperty* pEsProperty,
  430. u_int32_t esid,
  431. u_int8_t objectType,
  432. u_int8_t streamType,
  433. u_int32_t bufferSize,
  434. u_int32_t bitrate,
  435. u_int8_t* pConfig,
  436. u_int32_t configLength,
  437. char* url);
  438. void CreateIsmaODUpdateCommandFromFileForFile(
  439. MP4TrackId odTrackId,
  440. MP4TrackId audioTrackId, 
  441. MP4TrackId videoTrackId,
  442. u_int8_t** ppBytes,
  443. u_int64_t* pNumBytes);
  444. void CreateIsmaODUpdateCommandFromFileForStream(
  445. MP4TrackId audioTrackId, 
  446. MP4TrackId videoTrackId,
  447. u_int8_t** ppBytes,
  448. u_int64_t* pNumBytes);
  449. void CreateIsmaODUpdateCommandForStream(
  450. MP4DescriptorProperty* pAudioEsdProperty, 
  451. MP4DescriptorProperty* pVideoEsdProperty,
  452. u_int8_t** ppBytes,
  453. u_int64_t* pNumBytes);
  454. void CreateIsmaSceneCommand(
  455. bool hasAudio,
  456. bool hasVideo,
  457. u_int8_t** ppBytes, 
  458. u_int64_t* pNumBytes);
  459. protected:
  460. char* m_fileName;
  461. FILE* m_pFile;
  462. u_int64_t m_orgFileSize;
  463. u_int64_t m_fileSize;
  464. MP4Atom* m_pRootAtom;
  465. MP4Integer32Array m_trakIds;
  466. MP4TrackArray m_pTracks;
  467. MP4TrackId m_odTrackId;
  468. u_int32_t m_verbosity;
  469. char m_mode;
  470. bool m_use64bits;
  471. bool m_useIsma;
  472. // cached properties
  473. MP4IntegerProperty* m_pModificationProperty;
  474. MP4Integer32Property* m_pTimeScaleProperty;
  475. MP4IntegerProperty* m_pDurationProperty;
  476. // read/write in memory
  477. u_int8_t* m_memoryBuffer;
  478. u_int64_t m_memoryBufferPosition;
  479. u_int64_t m_memoryBufferSize;
  480. // bit read/write buffering
  481. u_int8_t m_numReadBits;
  482. u_int8_t m_bufReadBits;
  483. u_int8_t m_numWriteBits;
  484. u_int8_t m_bufWriteBits;
  485. };
  486. #endif /* __MP4_FILE_INCLUDED__ */