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

流媒体/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_INCLUDED__
  22. #define __MP4_INCLUDED__
  23. /* include system and project specific headers */
  24. #include "mpeg4ip.h"
  25. #include <math.h> /* to define float HUGE_VAL and/or NAN */
  26. #ifndef NAN
  27. #define NAN HUGE_VAL
  28. #endif
  29. #ifdef __cplusplus
  30. /* exploit C++ ability of default values for function parameters */
  31. #define DEFAULT(x) =x
  32. #else
  33. #define DEFAULT(x)
  34. #endif
  35. /* MP4 API types */
  36. typedef void* MP4FileHandle;
  37. typedef u_int32_t MP4TrackId;
  38. typedef u_int32_t MP4SampleId;
  39. typedef u_int64_t MP4Timestamp;
  40. typedef u_int64_t MP4Duration;
  41. typedef u_int32_t MP4EditId;
  42. /* Invalid values for API types */
  43. #define MP4_INVALID_FILE_HANDLE ((MP4FileHandle)NULL)
  44. #define MP4_INVALID_TRACK_ID ((MP4TrackId)0)
  45. #define MP4_INVALID_SAMPLE_ID ((MP4SampleId)0)
  46. #define MP4_INVALID_TIMESTAMP ((MP4Timestamp)-1)
  47. #define MP4_INVALID_DURATION ((MP4Duration)-1)
  48. #define MP4_INVALID_EDIT_ID ((MP4EditId)0)
  49. /* Macros to test for API type validity */
  50. #define MP4_IS_VALID_FILE_HANDLE(x) ((x) != MP4_INVALID_FILE_HANDLE) 
  51. #define MP4_IS_VALID_TRACK_ID(x) ((x) != MP4_INVALID_TRACK_ID) 
  52. #define MP4_IS_VALID_SAMPLE_ID(x) ((x) != MP4_INVALID_SAMPLE_ID) 
  53. #define MP4_IS_VALID_TIMESTAMP(x) ((x) != MP4_INVALID_TIMESTAMP) 
  54. #define MP4_IS_VALID_DURATION(x) ((x) != MP4_INVALID_DURATION) 
  55. #define MP4_IS_VALID_EDIT_ID(x) ((x) != MP4_INVALID_EDIT_ID) 
  56. /* MP4 verbosity levels - e.g. MP4SetVerbosity() */
  57. #define MP4_DETAILS_ALL 0xFFFFFFFF
  58. #define MP4_DETAILS_ERROR 0x00000001
  59. #define MP4_DETAILS_WARNING 0x00000002
  60. #define MP4_DETAILS_READ 0x00000004
  61. #define MP4_DETAILS_WRITE 0x00000008
  62. #define MP4_DETAILS_FIND 0x00000010
  63. #define MP4_DETAILS_TABLE 0x00000020
  64. #define MP4_DETAILS_SAMPLE 0x00000040
  65. #define MP4_DETAILS_HINT 0x00000080
  66. #define MP4_DETAILS_ISMA 0x00000100
  67. #define MP4_DETAILS_EDIT 0x00000200
  68. #define MP4_DETAILS_READ_ALL
  69. (MP4_DETAILS_READ | MP4_DETAILS_TABLE | MP4_DETAILS_SAMPLE)
  70. #define MP4_DETAILS_WRITE_ALL
  71. (MP4_DETAILS_WRITE | MP4_DETAILS_TABLE | MP4_DETAILS_SAMPLE)
  72. /*
  73.  * MP4 Known track type names - e.g. MP4GetNumberOfTracks(type) 
  74.  *
  75.  * Note this first group of track types should be created 
  76.  * via the MP4Add<Type>Track() functions, and not MP4AddTrack(type)
  77.  */
  78. #define MP4_OD_TRACK_TYPE "odsm"
  79. #define MP4_SCENE_TRACK_TYPE "sdsm"
  80. #define MP4_AUDIO_TRACK_TYPE "soun"
  81. #define MP4_VIDEO_TRACK_TYPE "vide"
  82. #define MP4_HINT_TRACK_TYPE "hint"
  83. /*
  84.  * This second set of track types should be created 
  85.  * via MP4AddSystemsTrack(type)
  86.  */
  87. #define MP4_CLOCK_TRACK_TYPE "crsm"
  88. #define MP4_MPEG7_TRACK_TYPE "m7sm"
  89. #define MP4_OCI_TRACK_TYPE "ocsm"
  90. #define MP4_IPMP_TRACK_TYPE "ipsm"
  91. #define MP4_MPEGJ_TRACK_TYPE "mjsm"
  92. #define MP4_IS_VIDEO_TRACK_TYPE(type) 
  93. (!strcasecmp(type, MP4_VIDEO_TRACK_TYPE))
  94. #define MP4_IS_AUDIO_TRACK_TYPE(type) 
  95. (!strcasecmp(type, MP4_AUDIO_TRACK_TYPE))
  96. #define MP4_IS_OD_TRACK_TYPE(type) 
  97. (!strcasecmp(type, MP4_OD_TRACK_TYPE))
  98. #define MP4_IS_SCENE_TRACK_TYPE(type) 
  99. (!strcasecmp(type, MP4_SCENE_TRACK_TYPE))
  100. #define MP4_IS_HINT_TRACK_TYPE(type) 
  101. (!strcasecmp(type, MP4_HINT_TRACK_TYPE))
  102. #define MP4_IS_SYSTEMS_TRACK_TYPE(type) 
  103. (!strcasecmp(type, MP4_CLOCK_TRACK_TYPE) 
  104. || !strcasecmp(type, MP4_MPEG7_TRACK_TYPE) 
  105. || !strcasecmp(type, MP4_OCI_TRACK_TYPE) 
  106. || !strcasecmp(type, MP4_IPMP_TRACK_TYPE) 
  107. || !strcasecmp(type, MP4_MPEGJ_TRACK_TYPE))
  108. /* MP4 Audio track types - see MP4AddAudioTrack()*/
  109. #define MP4_INVALID_AUDIO_TYPE 0x00
  110. #define MP4_MPEG1_AUDIO_TYPE 0x6B
  111. #define MP4_MPEG2_AUDIO_TYPE 0x69
  112. #define MP4_MP3_AUDIO_TYPE MP4_MPEG2_AUDIO_TYPE
  113. #define MP4_MPEG2_AAC_MAIN_AUDIO_TYPE 0x66
  114. #define MP4_MPEG2_AAC_LC_AUDIO_TYPE 0x67
  115. #define MP4_MPEG2_AAC_SSR_AUDIO_TYPE 0x68
  116. #define MP4_MPEG2_AAC_AUDIO_TYPE MP4_MPEG2_AAC_MAIN_AUDIO_TYPE
  117. #define MP4_MPEG4_AUDIO_TYPE 0x40
  118. #define MP4_PRIVATE_AUDIO_TYPE 0xC0
  119. #define MP4_PCM16_AUDIO_TYPE 0xE0 /* a private definition */
  120. #define MP4_VORBIS_AUDIO_TYPE 0xE1 /* a private definition */
  121. #define MP4_AC3_AUDIO_TYPE 0xE2 /* a private definition */
  122. /* MP4 MPEG-4 Audio types from 14496-3 Table 1.5.1 */
  123. #define MP4_MPEG4_INVALID_AUDIO_TYPE 0
  124. #define MP4_MPEG4_AAC_MAIN_AUDIO_TYPE 1
  125. #define MP4_MPEG4_AAC_LC_AUDIO_TYPE 2
  126. #define MP4_MPEG4_AAC_SSR_AUDIO_TYPE 3
  127. #define MP4_MPEG4_AAC_LTP_AUDIO_TYPE 4
  128. #define MP4_MPEG4_AAC_SCALABLE_AUDIO_TYPE 6
  129. #define MP4_MPEG4_CELP_AUDIO_TYPE 8
  130. #define MP4_MPEG4_HVXC_AUDIO_TYPE 9
  131. #define MP4_MPEG4_TTSI_AUDIO_TYPE 12
  132. #define MP4_MPEG4_MAIN_SYNTHETIC_AUDIO_TYPE 13
  133. #define MP4_MPEG4_WAVETABLE_AUDIO_TYPE 14
  134. #define MP4_MPEG4_MIDI_AUDIO_TYPE 15
  135. #define MP4_MPEG4_ALGORITHMIC_FX_AUDIO_TYPE 16
  136. /* MP4 Audio type utilities following common usage */
  137. #define MP4_IS_MP3_AUDIO_TYPE(type) 
  138. ((type) == MP4_MPEG1_AUDIO_TYPE || (type) == MP4_MPEG2_AUDIO_TYPE) 
  139. #define MP4_IS_MPEG2_AAC_AUDIO_TYPE(type) 
  140. (((type) >= MP4_MPEG2_AAC_MAIN_AUDIO_TYPE 
  141. && (type) <= MP4_MPEG2_AAC_SSR_AUDIO_TYPE))
  142. #define MP4_IS_MPEG4_AAC_AUDIO_TYPE(mpeg4Type) 
  143. (((mpeg4Type) >= MP4_MPEG4_AAC_MAIN_AUDIO_TYPE 
  144. && (mpeg4Type) <= MP4_MPEG4_AAC_LTP_AUDIO_TYPE) 
  145.   || (mpeg4Type) == MP4_MPEG4_AAC_SCALABLE_AUDIO_TYPE)
  146. #define MP4_IS_AAC_AUDIO_TYPE(type) 
  147. (MP4_IS_MPEG2_AAC_AUDIO_TYPE(type) 
  148. || (type) == MP4_MPEG4_AUDIO_TYPE)
  149. /* MP4 Video track types - see MP4AddVideoTrack() */
  150. #define MP4_INVALID_VIDEO_TYPE 0x00
  151. #define MP4_MPEG1_VIDEO_TYPE 0x6A
  152. #define MP4_MPEG2_SIMPLE_VIDEO_TYPE 0x60
  153. #define MP4_MPEG2_MAIN_VIDEO_TYPE 0x61
  154. #define MP4_MPEG2_SNR_VIDEO_TYPE 0x62
  155. #define MP4_MPEG2_SPATIAL_VIDEO_TYPE 0x63
  156. #define MP4_MPEG2_HIGH_VIDEO_TYPE 0x64
  157. #define MP4_MPEG2_442_VIDEO_TYPE 0x65
  158. #define MP4_MPEG2_VIDEO_TYPE MP4_MPEG2_MAIN_VIDEO_TYPE
  159. #define MP4_MPEG4_VIDEO_TYPE 0x20
  160. #define MP4_JPEG_VIDEO_TYPE 0x6C
  161. #define MP4_PRIVATE_VIDEO_TYPE 0xD0
  162. #define MP4_YUV12_VIDEO_TYPE 0xF0 /* a private definition */
  163. #define MP4_H26L_VIDEO_TYPE 0xF1 /* a private definition */
  164. #define MP4_H263_VIDEO_TYPE 0xF2 /* a private definition */
  165. /* MP4 Video type utilities */
  166. #define MP4_IS_MPEG1_VIDEO_TYPE(type) 
  167. ((type) == MP4_MPEG1_VIDEO_TYPE)
  168. #define MP4_IS_MPEG2_VIDEO_TYPE(type) 
  169. (((type) >= MP4_MPEG2_SIMPLE_VIDEO_TYPE 
  170. && (type) <= MP4_MPEG2_442_VIDEO_TYPE) 
  171.   || MP4_IS_MPEG1_VIDEO_TYPE(type))
  172. #define MP4_IS_MPEG4_VIDEO_TYPE(type) 
  173. ((type) == MP4_MPEG4_VIDEO_TYPE)
  174. /* MP4 API declarations */
  175. #ifdef __cplusplus
  176. extern "C" {
  177. #endif
  178. /* file operations */
  179. MP4FileHandle MP4Create(
  180. const char* fileName, 
  181. u_int32_t verbosity DEFAULT(0),
  182. bool use64bits DEFAULT(0),
  183. bool useExtensibleFormat DEFAULT(0));
  184. MP4FileHandle MP4Modify(
  185. const char* fileName, 
  186. u_int32_t verbosity DEFAULT(0),
  187. bool useExtensibleFormat DEFAULT(0));
  188. MP4FileHandle MP4Read(
  189. const char* fileName, 
  190. u_int32_t verbosity DEFAULT(0));
  191. bool MP4Close(
  192. MP4FileHandle hFile);
  193. bool MP4Optimize(
  194. const char* existingFileName, 
  195. const char* newFileName DEFAULT(NULL), 
  196. u_int32_t verbosity DEFAULT(0));
  197. bool MP4Dump(
  198. MP4FileHandle hFile, 
  199. FILE* pDumpFile DEFAULT(NULL), 
  200. bool dumpImplicits DEFAULT(0));
  201. char* MP4Info(
  202. MP4FileHandle hFile, 
  203. MP4TrackId trackId DEFAULT(MP4_INVALID_TRACK_ID));
  204. char* MP4FileInfo(
  205. const char* fileName,
  206. MP4TrackId trackId DEFAULT(MP4_INVALID_TRACK_ID));
  207. /* file properties */
  208. /* specific file properties */
  209. u_int32_t MP4GetVerbosity(MP4FileHandle hFile);
  210. bool MP4SetVerbosity(MP4FileHandle hFile, u_int32_t verbosity);
  211. MP4Duration MP4GetDuration(MP4FileHandle hFile);
  212. u_int32_t MP4GetTimeScale(MP4FileHandle hFile);
  213. bool MP4SetTimeScale(MP4FileHandle hFile, u_int32_t value);
  214. u_int8_t MP4GetODProfileLevel(MP4FileHandle hFile);
  215. bool MP4SetODProfileLevel(MP4FileHandle hFile, u_int8_t value);
  216. u_int8_t MP4GetSceneProfileLevel(MP4FileHandle hFile);
  217. bool MP4SetSceneProfileLevel(MP4FileHandle hFile, u_int8_t value);
  218. u_int8_t MP4GetVideoProfileLevel(MP4FileHandle hFile);
  219. bool MP4SetVideoProfileLevel(MP4FileHandle hFile, u_int8_t value);
  220. u_int8_t MP4GetAudioProfileLevel(MP4FileHandle hFile);
  221. bool MP4SetAudioProfileLevel(MP4FileHandle hFile, u_int8_t value);
  222. u_int8_t MP4GetGraphicsProfileLevel(MP4FileHandle hFile);
  223. bool MP4SetGraphicsProfileLevel(MP4FileHandle hFile, u_int8_t value);
  224. /* generic file properties */
  225. u_int64_t MP4GetIntegerProperty(
  226. MP4FileHandle hFile, 
  227. const char* propName);
  228. float MP4GetFloatProperty(
  229. MP4FileHandle hFile, 
  230. const char* propName);
  231. const char* MP4GetStringProperty(
  232. MP4FileHandle hFile, 
  233. const char* propName);
  234. void MP4GetBytesProperty(
  235. MP4FileHandle hFile, 
  236. const char* propName,
  237. u_int8_t** ppValue, 
  238. u_int32_t* pValueSize);
  239. bool MP4SetIntegerProperty(
  240. MP4FileHandle hFile, 
  241. const char* propName, 
  242. int64_t value);
  243. bool MP4SetFloatProperty(
  244. MP4FileHandle hFile, 
  245. const char* propName, 
  246. float value);
  247. bool MP4SetStringProperty(
  248. MP4FileHandle hFile, const char* propName, const char* value);
  249. bool MP4SetBytesProperty(
  250. MP4FileHandle hFile, const char* propName, 
  251. const u_int8_t* pValue, u_int32_t valueSize);
  252. /* track operations */
  253. MP4TrackId MP4AddTrack(
  254. MP4FileHandle hFile, 
  255. const char* type);
  256. MP4TrackId MP4AddSystemsTrack(
  257. MP4FileHandle hFile, 
  258. const char* type);
  259. MP4TrackId MP4AddODTrack(
  260. MP4FileHandle hFile);
  261. MP4TrackId MP4AddSceneTrack(
  262. MP4FileHandle hFile);
  263. MP4TrackId MP4AddAudioTrack(
  264. MP4FileHandle hFile, 
  265. u_int32_t timeScale, 
  266. MP4Duration sampleDuration,
  267. u_int8_t audioType DEFAULT(MP4_MPEG4_AUDIO_TYPE));
  268. MP4TrackId MP4AddVideoTrack(
  269. MP4FileHandle hFile, 
  270. u_int32_t timeScale, 
  271. MP4Duration sampleDuration,
  272. u_int16_t width, 
  273. u_int16_t height,
  274. u_int8_t videoType DEFAULT(MP4_MPEG4_VIDEO_TYPE));
  275. MP4TrackId MP4AddHintTrack(
  276. MP4FileHandle hFile, 
  277. MP4TrackId refTrackId);
  278. MP4TrackId MP4CloneTrack(
  279. MP4FileHandle srcFile, 
  280. MP4TrackId srcTrackId,
  281. MP4FileHandle dstFile DEFAULT(MP4_INVALID_FILE_HANDLE));
  282. MP4TrackId MP4CopyTrack(
  283. MP4FileHandle srcFile, 
  284. MP4TrackId srcTrackId,
  285. MP4FileHandle dstFile DEFAULT(MP4_INVALID_FILE_HANDLE), 
  286. bool applyEdits DEFAULT(false));
  287. bool MP4DeleteTrack(
  288. MP4FileHandle hFile, 
  289. MP4TrackId trackId);
  290. u_int32_t MP4GetNumberOfTracks(
  291. MP4FileHandle hFile, 
  292. const char* type DEFAULT(NULL),
  293. u_int8_t subType DEFAULT(0));
  294. MP4TrackId MP4FindTrackId(
  295. MP4FileHandle hFile, 
  296. u_int16_t index, 
  297. const char* type DEFAULT(NULL),
  298. u_int8_t subType DEFAULT(0));
  299. u_int16_t MP4FindTrackIndex(
  300. MP4FileHandle hFile, 
  301. MP4TrackId trackId);
  302. /* track properties */
  303. /* specific track properties */
  304. const char* MP4GetTrackType(
  305. MP4FileHandle hFile, 
  306. MP4TrackId trackId);
  307. MP4Duration MP4GetTrackDuration(
  308. MP4FileHandle hFile, 
  309. MP4TrackId trackId);
  310. u_int32_t MP4GetTrackTimeScale(
  311. MP4FileHandle hFile, 
  312. MP4TrackId trackId);
  313. bool MP4SetTrackTimeScale(
  314. MP4FileHandle hFile, 
  315. MP4TrackId trackId, 
  316. u_int32_t value);
  317. u_int8_t MP4GetTrackAudioType(
  318. MP4FileHandle hFile, 
  319. MP4TrackId trackId);
  320. u_int8_t MP4GetTrackAudioMpeg4Type(
  321. MP4FileHandle hFile, 
  322. MP4TrackId trackId);
  323. u_int8_t MP4GetTrackVideoType(
  324. MP4FileHandle hFile, 
  325. MP4TrackId trackId);
  326. /* returns MP4_INVALID_DURATION if track samples do not have a fixed duration */
  327. MP4Duration MP4GetTrackFixedSampleDuration(
  328. MP4FileHandle hFile, 
  329. MP4TrackId trackId);
  330. u_int32_t MP4GetTrackBitRate(
  331. MP4FileHandle hFile, 
  332. MP4TrackId trackId);
  333. void MP4GetTrackESConfiguration(
  334. MP4FileHandle hFile, 
  335. MP4TrackId trackId, 
  336. u_int8_t** ppConfig, 
  337. u_int32_t* pConfigSize);
  338. bool MP4SetTrackESConfiguration(
  339. MP4FileHandle hFile, 
  340. MP4TrackId trackId, 
  341. const u_int8_t* pConfig, 
  342. u_int32_t configSize);
  343. MP4SampleId MP4GetTrackNumberOfSamples(
  344. MP4FileHandle hFile, 
  345. MP4TrackId trackId);
  346. u_int16_t MP4GetTrackVideoWidth(
  347. MP4FileHandle hFile, 
  348. MP4TrackId trackId);
  349. u_int16_t MP4GetTrackVideoHeight(
  350. MP4FileHandle hFile, 
  351. MP4TrackId trackId);
  352. float MP4GetTrackVideoFrameRate(
  353. MP4FileHandle hFile, 
  354. MP4TrackId trackId);
  355. /* generic track properties */
  356. u_int64_t MP4GetTrackIntegerProperty(
  357. MP4FileHandle hFile, 
  358. MP4TrackId trackId, 
  359. const char* propName);
  360. float MP4GetTrackFloatProperty(
  361. MP4FileHandle hFile, 
  362. MP4TrackId trackId, 
  363. const char* propName);
  364. const char* MP4GetTrackStringProperty(
  365. MP4FileHandle hFile, 
  366. MP4TrackId trackId, 
  367. const char* propName);
  368. void MP4GetTrackBytesProperty(
  369. MP4FileHandle hFile, 
  370. MP4TrackId trackId, 
  371. const char* propName,
  372. u_int8_t** ppValue, 
  373. u_int32_t* pValueSize);
  374. bool MP4SetTrackIntegerProperty(
  375. MP4FileHandle hFile, 
  376. MP4TrackId trackId, 
  377. const char* propName, 
  378. int64_t value);
  379. bool MP4SetTrackFloatProperty(
  380. MP4FileHandle hFile, 
  381. MP4TrackId trackId, 
  382. const char* propName, 
  383. float value);
  384. bool MP4SetTrackStringProperty(
  385. MP4FileHandle hFile, 
  386. MP4TrackId trackId, 
  387. const char* propName, 
  388. const char* value);
  389. bool MP4SetTrackBytesProperty(
  390. MP4FileHandle hFile, 
  391. MP4TrackId trackId, 
  392. const char* propName, 
  393. const u_int8_t* pValue, 
  394. u_int32_t valueSize);
  395. /* sample operations */
  396. bool MP4ReadSample(
  397. /* input parameters */
  398. MP4FileHandle hFile,
  399. MP4TrackId trackId, 
  400. MP4SampleId sampleId,
  401. /* input/output parameters */
  402. u_int8_t** ppBytes, 
  403. u_int32_t* pNumBytes, 
  404. /* output parameters */
  405. MP4Timestamp* pStartTime DEFAULT(NULL), 
  406. MP4Duration* pDuration DEFAULT(NULL),
  407. MP4Duration* pRenderingOffset DEFAULT(NULL), 
  408. bool* pIsSyncSample DEFAULT(NULL));
  409. /* uses (unedited) time to specify sample instead of sample id */
  410. bool MP4ReadSampleFromTime(
  411. /* input parameters */
  412. MP4FileHandle hFile,
  413. MP4TrackId trackId, 
  414. MP4Timestamp when,
  415. /* input/output parameters */
  416. u_int8_t** ppBytes, 
  417. u_int32_t* pNumBytes, 
  418. /* output parameters */
  419. MP4Timestamp* pStartTime DEFAULT(NULL), 
  420. MP4Duration* pDuration DEFAULT(NULL),
  421. MP4Duration* pRenderingOffset DEFAULT(NULL), 
  422. bool* pIsSyncSample DEFAULT(NULL));
  423. bool MP4WriteSample(
  424. MP4FileHandle hFile,
  425. MP4TrackId trackId,
  426. u_int8_t* pBytes, 
  427. u_int32_t numBytes,
  428. MP4Duration duration DEFAULT(MP4_INVALID_DURATION),
  429. MP4Duration renderingOffset DEFAULT(0), 
  430. bool isSyncSample DEFAULT(true));
  431. bool MP4CopySample(
  432. MP4FileHandle srcFile,
  433. MP4TrackId srcTrackId, 
  434. MP4SampleId srcSampleId,
  435. MP4FileHandle dstFile DEFAULT(MP4_INVALID_FILE_HANDLE),
  436. MP4TrackId dstTrackId DEFAULT(MP4_INVALID_TRACK_ID),
  437. MP4Duration dstSampleDuration DEFAULT(MP4_INVALID_DURATION));
  438. /* Note this function is not yet implemented */
  439. bool MP4ReferenceSample(
  440. MP4FileHandle srcFile,
  441. MP4TrackId srcTrackId, 
  442. MP4SampleId srcSampleId,
  443. MP4FileHandle dstFile,
  444. MP4TrackId dstTrackId,
  445. MP4Duration dstSampleDuration DEFAULT(MP4_INVALID_DURATION));
  446. u_int32_t MP4GetSampleSize(
  447. MP4FileHandle hFile,
  448. MP4TrackId trackId, 
  449. MP4SampleId sampleId);
  450. u_int32_t MP4GetTrackMaxSampleSize(
  451. MP4FileHandle hFile,
  452. MP4TrackId trackId); 
  453. MP4SampleId MP4GetSampleIdFromTime(
  454. MP4FileHandle hFile,
  455. MP4TrackId trackId, 
  456. MP4Timestamp when, 
  457. bool wantSyncSample DEFAULT(false));
  458. MP4Timestamp MP4GetSampleTime(
  459. MP4FileHandle hFile,
  460. MP4TrackId trackId, 
  461. MP4SampleId sampleId);
  462. MP4Duration MP4GetSampleDuration(
  463. MP4FileHandle hFile,
  464. MP4TrackId trackId, 
  465. MP4SampleId sampleId);
  466. MP4Duration MP4GetSampleRenderingOffset(
  467. MP4FileHandle hFile,
  468. MP4TrackId trackId, 
  469. MP4SampleId sampleId);
  470. bool MP4SetSampleRenderingOffset(
  471. MP4FileHandle hFile,
  472. MP4TrackId trackId, 
  473. MP4SampleId sampleId,
  474. MP4Duration renderingOffset);
  475. int8_t MP4GetSampleSync(
  476. MP4FileHandle hFile,
  477. MP4TrackId trackId, 
  478. MP4SampleId sampleId);
  479. /* rtp hint track operations */
  480. bool MP4GetHintTrackRtpPayload(
  481. MP4FileHandle hFile,
  482. MP4TrackId hintTrackId,
  483. char** ppPayloadName DEFAULT(NULL),
  484. u_int8_t* pPayloadNumber DEFAULT(NULL),
  485. u_int16_t* pMaxPayloadSize DEFAULT(NULL));
  486. bool MP4SetHintTrackRtpPayload(
  487. MP4FileHandle hFile,
  488. MP4TrackId hintTrackId,
  489. const char* pPayloadName,
  490. u_int8_t* pPayloadNumber,
  491. u_int16_t maxPayloadSize DEFAULT(0));
  492. const char* MP4GetSessionSdp(
  493. MP4FileHandle hFile);
  494. bool MP4SetSessionSdp(
  495. MP4FileHandle hFile,
  496. const char* sdpString);
  497. bool MP4AppendSessionSdp(
  498. MP4FileHandle hFile,
  499. const char* sdpString);
  500. const char* MP4GetHintTrackSdp(
  501. MP4FileHandle hFile,
  502. MP4TrackId hintTrackId);
  503. bool MP4SetHintTrackSdp(
  504. MP4FileHandle hFile,
  505. MP4TrackId hintTrackId,
  506. const char* sdpString);
  507. bool MP4AppendHintTrackSdp(
  508. MP4FileHandle hFile,
  509. MP4TrackId hintTrackId,
  510. const char* sdpString);
  511. MP4TrackId MP4GetHintTrackReferenceTrackId(
  512. MP4FileHandle hFile,
  513. MP4TrackId hintTrackId);
  514. bool MP4ReadRtpHint(
  515. MP4FileHandle hFile,
  516. MP4TrackId hintTrackId,
  517. MP4SampleId hintSampleId,
  518. u_int16_t* pNumPackets DEFAULT(NULL));
  519. u_int16_t MP4GetRtpHintNumberOfPackets(
  520. MP4FileHandle hFile,
  521. MP4TrackId hintTrackId);
  522. int8_t MP4GetRtpPacketBFrame(
  523. MP4FileHandle hFile,
  524. MP4TrackId hintTrackId,
  525. u_int16_t packetIndex);
  526. int32_t MP4GetRtpPacketTransmitOffset(
  527. MP4FileHandle hFile,
  528. MP4TrackId hintTrackId,
  529. u_int16_t packetIndex);
  530. bool MP4ReadRtpPacket(
  531. MP4FileHandle hFile,
  532. MP4TrackId hintTrackId,
  533. u_int16_t packetIndex,
  534. u_int8_t** ppBytes, 
  535. u_int32_t* pNumBytes,
  536. u_int32_t ssrc DEFAULT(0),
  537. bool includeHeader DEFAULT(true),
  538. bool includePayload DEFAULT(true));
  539. MP4Timestamp MP4GetRtpTimestampStart(
  540. MP4FileHandle hFile,
  541. MP4TrackId hintTrackId);
  542. bool MP4SetRtpTimestampStart(
  543. MP4FileHandle hFile,
  544. MP4TrackId hintTrackId,
  545. MP4Timestamp rtpStart);
  546. bool MP4AddRtpHint(
  547. MP4FileHandle hFile,
  548. MP4TrackId hintTrackId);
  549. bool MP4AddRtpVideoHint(
  550. MP4FileHandle hFile,
  551. MP4TrackId hintTrackId,
  552. bool isBframe DEFAULT(false), 
  553. u_int32_t timestampOffset DEFAULT(0));
  554. bool MP4AddRtpPacket(
  555. MP4FileHandle hFile,
  556. MP4TrackId hintTrackId,
  557. bool setMbit DEFAULT(false),
  558. int32_t transmitOffset DEFAULT(0));
  559. bool MP4AddRtpImmediateData(
  560. MP4FileHandle hFile,
  561. MP4TrackId hintTrackId,
  562. const u_int8_t* pBytes,
  563. u_int32_t numBytes);
  564. bool MP4AddRtpSampleData(
  565. MP4FileHandle hFile,
  566. MP4TrackId hintTrackId,
  567. MP4SampleId sampleId,
  568. u_int32_t dataOffset,
  569. u_int32_t dataLength);
  570. bool MP4AddRtpESConfigurationPacket(
  571. MP4FileHandle hFile,
  572. MP4TrackId hintTrackId);
  573. bool MP4WriteRtpHint(
  574. MP4FileHandle hFile,
  575. MP4TrackId hintTrackId,
  576. MP4Duration duration,
  577. bool isSyncSample DEFAULT(true));
  578. /* ISMA specific utilities */
  579. bool MP4MakeIsmaCompliant(const char* fileName, 
  580. u_int32_t verbosity DEFAULT(0),
  581. bool addIsmaComplianceSdp DEFAULT(true));
  582. char* MP4MakeIsmaSdpIod(
  583. u_int8_t videoProfile,
  584. u_int32_t videoBitrate,
  585. u_int8_t* videoConfig,
  586. u_int32_t videoConfigLength,
  587. u_int8_t audioProfile,
  588. u_int32_t audioBitrate,
  589. u_int8_t* audioConfig,
  590. u_int32_t audioConfigLength,
  591. u_int32_t verbosity DEFAULT(0));
  592. /* edit list */
  593. /* NOTE this section of functionality 
  594.  * has not yet been fully tested 
  595.  */
  596. MP4EditId MP4AddTrackEdit(
  597. MP4FileHandle hFile,
  598. MP4TrackId trackId,
  599. MP4EditId editId DEFAULT(MP4_INVALID_EDIT_ID),
  600. MP4Timestamp startTime DEFAULT(0),
  601. MP4Duration duration DEFAULT(0),
  602. bool dwell DEFAULT(false));
  603. bool MP4DeleteTrackEdit(
  604. MP4FileHandle hFile,
  605. MP4TrackId trackId,
  606. MP4EditId editId);
  607. u_int32_t MP4GetTrackNumberOfEdits(
  608. MP4FileHandle hFile,
  609. MP4TrackId trackId);
  610. MP4Timestamp MP4GetTrackEditStart(
  611. MP4FileHandle hFile,
  612. MP4TrackId trackId,
  613. MP4EditId editId);
  614. MP4Duration MP4GetTrackEditTotalDuration(
  615. MP4FileHandle hFile,
  616. MP4TrackId trackId,
  617. MP4EditId editId DEFAULT(MP4_INVALID_EDIT_ID));
  618. MP4Timestamp MP4GetTrackEditMediaStart(
  619. MP4FileHandle hFile,
  620. MP4TrackId trackId,
  621. MP4EditId editId);
  622. bool MP4SetTrackEditMediaStart(
  623. MP4FileHandle hFile,
  624. MP4TrackId trackId,
  625. MP4EditId editId,
  626. MP4Timestamp startTime);
  627. MP4Duration MP4GetTrackEditDuration(
  628. MP4FileHandle hFile,
  629. MP4TrackId trackId,
  630. MP4EditId editId);
  631. bool MP4SetTrackEditDuration(
  632. MP4FileHandle hFile,
  633. MP4TrackId trackId,
  634. MP4EditId editId,
  635. MP4Duration duration);
  636. int8_t MP4GetTrackEditDwell(
  637. MP4FileHandle hFile,
  638. MP4TrackId trackId,
  639. MP4EditId editId);
  640. bool MP4SetTrackEditDwell(
  641. MP4FileHandle hFile,
  642. MP4TrackId trackId,
  643. MP4EditId editId,
  644. bool dwell);
  645. bool MP4ReadSampleFromEditTime(
  646. /* input parameters */
  647. MP4FileHandle hFile,
  648. MP4TrackId trackId, 
  649. MP4Timestamp when, 
  650. /* input/output parameters */
  651. u_int8_t** ppBytes, 
  652. u_int32_t* pNumBytes, 
  653. /* output parameters */
  654. MP4Timestamp* pStartTime DEFAULT(NULL), 
  655. MP4Duration* pDuration DEFAULT(NULL),
  656. MP4Duration* pRenderingOffset DEFAULT(NULL), 
  657. bool* pIsSyncSample DEFAULT(NULL));
  658. MP4SampleId MP4GetSampleIdFromEditTime(
  659. MP4FileHandle hFile,
  660. MP4TrackId trackId, 
  661. MP4Timestamp when, 
  662. MP4Timestamp* pStartTime DEFAULT(NULL), 
  663. MP4Duration* pDuration DEFAULT(NULL));
  664. /* time conversion utilties */
  665. /* predefined values for timeScale parameter below */
  666. #define MP4_SECONDS_TIME_SCALE 1
  667. #define MP4_MILLISECONDS_TIME_SCALE 1000
  668. #define MP4_MICROSECONDS_TIME_SCALE 1000000
  669. #define MP4_NANOSECONDS_TIME_SCALE  1000000000
  670. #define MP4_SECS_TIME_SCALE  MP4_SECONDS_TIME_SCALE
  671. #define MP4_MSECS_TIME_SCALE MP4_MILLISECONDS_TIME_SCALE
  672. #define MP4_USECS_TIME_SCALE MP4_MICROSECONDS_TIME_SCALE
  673. #define MP4_NSECS_TIME_SCALE MP4_NANOSECONDS_TIME_SCALE
  674. u_int64_t MP4ConvertFromMovieDuration(
  675. MP4FileHandle hFile,
  676. MP4Duration duration,
  677. u_int32_t timeScale);
  678. u_int64_t MP4ConvertFromTrackTimestamp(
  679. MP4FileHandle hFile,
  680. MP4TrackId trackId, 
  681. MP4Timestamp timeStamp,
  682. u_int32_t timeScale);
  683. MP4Timestamp MP4ConvertToTrackTimestamp(
  684. MP4FileHandle hFile,
  685. MP4TrackId trackId, 
  686. u_int64_t timeStamp,
  687. u_int32_t timeScale);
  688. u_int64_t MP4ConvertFromTrackDuration(
  689. MP4FileHandle hFile,
  690. MP4TrackId trackId, 
  691. MP4Duration duration,
  692. u_int32_t timeScale);
  693. MP4Duration MP4ConvertToTrackDuration(
  694. MP4FileHandle hFile,
  695. MP4TrackId trackId, 
  696. u_int64_t duration,
  697. u_int32_t timeScale);
  698. char* MP4BinaryToBase16(
  699. const u_int8_t* pData, 
  700. u_int32_t dataSize);
  701. char* MP4BinaryToBase64(
  702. const u_int8_t* pData, 
  703. u_int32_t dataSize);
  704. #ifdef __cplusplus
  705. }
  706. #endif
  707. /* undefined our utlity macro to avoid conflicts */
  708. #undef DEFAULT
  709. #endif /* __MP4_INCLUDED__ */