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

流媒体/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_PROPERTY_INCLUDED__
  22. #define __MP4_PROPERTY_INCLUDED__
  23. // forward declarations
  24. class MP4Atom;
  25. class MP4Descriptor;
  26. MP4ARRAY_DECL(MP4Descriptor, MP4Descriptor*);
  27. enum MP4PropertyType {
  28. Integer8Property,
  29. Integer16Property,
  30. Integer24Property,
  31. Integer32Property,
  32. Integer64Property,
  33. Float32Property,
  34. StringProperty,
  35. BytesProperty,
  36. TableProperty,
  37. DescriptorProperty,
  38. };
  39. class MP4Property {
  40. public:
  41. MP4Property(const char *name = NULL);
  42. virtual ~MP4Property() { }
  43. MP4Atom* GetParentAtom() {
  44. return m_pParentAtom;
  45. }
  46. virtual void SetParentAtom(MP4Atom* pParentAtom) {
  47. m_pParentAtom = pParentAtom;
  48. }
  49. const char *GetName() {
  50. return m_name;
  51. }
  52. virtual MP4PropertyType GetType() = NULL; 
  53. bool IsReadOnly() {
  54. return m_readOnly;
  55. }
  56. void SetReadOnly(bool value = true) {
  57. m_readOnly = value;
  58. }
  59. bool IsImplicit() {
  60. return m_implicit;
  61. }
  62. void SetImplicit(bool value = true) {
  63. m_implicit = value;
  64. }
  65. virtual u_int32_t GetCount() = NULL;
  66. virtual void SetCount(u_int32_t count) = NULL;
  67. virtual void Generate() { /* default is a no-op */ };
  68. virtual void Read(MP4File* pFile, u_int32_t index = 0) = NULL;
  69. virtual void Write(MP4File* pFile, u_int32_t index = 0) = NULL;
  70. virtual void Dump(FILE* pFile, u_int8_t indent,
  71. bool dumpImplicits, u_int32_t index = 0) = NULL;
  72. virtual bool FindProperty(const char* name,
  73. MP4Property** ppProperty, u_int32_t* pIndex = NULL);
  74. protected:
  75. MP4Atom* m_pParentAtom;
  76. const char* m_name;
  77. bool m_readOnly;
  78. bool m_implicit;
  79. };
  80. MP4ARRAY_DECL(MP4Property, MP4Property*);
  81. class MP4IntegerProperty : public MP4Property {
  82. protected:
  83. MP4IntegerProperty(char* name)
  84. : MP4Property(name) { };
  85. public:
  86. u_int64_t GetValue(u_int32_t index = 0);
  87. void SetValue(u_int64_t value, u_int32_t index = 0);
  88. void InsertValue(u_int64_t value, u_int32_t index = 0);
  89. void DeleteValue(u_int32_t index = 0);
  90. void IncrementValue(int32_t increment = 1, u_int32_t index = 0);
  91. };
  92. #define MP4INTEGER_PROPERTY_DECL2(isize, xsize) 
  93. class MP4Integer##xsize##Property : public MP4IntegerProperty { 
  94. public: 
  95. MP4Integer##xsize##Property(char* name) 
  96. : MP4IntegerProperty(name) { 
  97. SetCount(1); 
  98. m_values[0] = 0; 
  99. MP4PropertyType GetType() { 
  100. return Integer##xsize##Property; 
  101. u_int32_t GetCount() { 
  102. return m_values.Size(); 
  103. void SetCount(u_int32_t count) { 
  104. m_values.Resize(count); 
  105. u_int##isize##_t GetValue(u_int32_t index = 0) { 
  106. return m_values[index]; 
  107. void SetValue(u_int##isize##_t value, u_int32_t index = 0) { 
  108. if (m_readOnly) { 
  109. throw new MP4Error(EACCES, "property is read-only", m_name); 
  110. m_values[index] = value; 
  111. void AddValue(u_int##isize##_t value) { 
  112. m_values.Add(value); 
  113. void InsertValue(u_int##isize##_t value, u_int32_t index) { 
  114. m_values.Insert(value, index); 
  115. void DeleteValue(u_int32_t index) { 
  116. m_values.Delete(index); 
  117. void IncrementValue(int32_t increment = 1, u_int32_t index = 0) { 
  118. m_values[index] += increment; 
  119. void Read(MP4File* pFile, u_int32_t index = 0) { 
  120. if (m_implicit) { 
  121. return; 
  122. m_values[index] = pFile->ReadUInt##xsize(); 
  123. void Write(MP4File* pFile, u_int32_t index = 0) { 
  124. if (m_implicit) { 
  125. return; 
  126. pFile->WriteUInt##xsize(m_values[index]); 
  127. void Dump(FILE* pFile, u_int8_t indent, 
  128. bool dumpImplicits, u_int32_t index = 0); 
  129. protected: 
  130. MP4Integer##isize##Array m_values; 
  131. };
  132. #define MP4INTEGER_PROPERTY_DECL(size) 
  133. MP4INTEGER_PROPERTY_DECL2(size, size)
  134. MP4INTEGER_PROPERTY_DECL(8);
  135. MP4INTEGER_PROPERTY_DECL(16);
  136. MP4INTEGER_PROPERTY_DECL2(32, 24);
  137. MP4INTEGER_PROPERTY_DECL(32);
  138. MP4INTEGER_PROPERTY_DECL(64);
  139. class MP4BitfieldProperty : public MP4Integer64Property {
  140. public:
  141. MP4BitfieldProperty(char* name, u_int8_t numBits)
  142. : MP4Integer64Property(name) {
  143. ASSERT(numBits != 0);
  144. ASSERT(numBits <= 64);
  145. m_numBits = numBits;
  146. }
  147. u_int8_t GetNumBits() {
  148. return m_numBits;
  149. }
  150. void SetNumBits(u_int8_t numBits) {
  151. m_numBits = numBits;
  152. }
  153. void Read(MP4File* pFile, u_int32_t index = 0);
  154. void Write(MP4File* pFile, u_int32_t index = 0);
  155. void Dump(FILE* pFile, u_int8_t indent,
  156.  bool dumpImplicits, u_int32_t index = 0);
  157. protected:
  158. u_int8_t m_numBits;
  159. };
  160. class MP4Float32Property : public MP4Property {
  161. public:
  162. MP4Float32Property(char* name)
  163. : MP4Property(name) {
  164. m_useFixed16Format = false;
  165. m_useFixed32Format = false;
  166. SetCount(1);
  167. m_values[0] = 0.0;
  168. }
  169. MP4PropertyType GetType() {
  170. return Float32Property;
  171. }
  172. u_int32_t GetCount() {
  173. return m_values.Size();
  174. }
  175. void SetCount(u_int32_t count) {
  176. m_values.Resize(count);
  177. }
  178. float GetValue(u_int32_t index = 0) {
  179. return m_values[index];
  180. }
  181. void SetValue(float value, u_int32_t index = 0) {
  182. if (m_readOnly) {
  183. throw new MP4Error(EACCES, "property is read-only", m_name);
  184. }
  185. m_values[index] = value;
  186. }
  187. void AddValue(float value) {
  188. m_values.Add(value);
  189. }
  190. void InsertValue(float value, u_int32_t index) {
  191. m_values.Insert(value, index);
  192. }
  193. bool IsFixed16Format() {
  194. return m_useFixed16Format;
  195. }
  196. void SetFixed16Format(bool useFixed16Format = true) {
  197. m_useFixed16Format = useFixed16Format;
  198. }
  199. bool IsFixed32Format() {
  200. return m_useFixed32Format;
  201. }
  202. void SetFixed32Format(bool useFixed32Format = true) {
  203. m_useFixed32Format = useFixed32Format;
  204. }
  205. void Read(MP4File* pFile, u_int32_t index = 0);
  206. void Write(MP4File* pFile, u_int32_t index = 0);
  207. void Dump(FILE* pFile, u_int8_t indent,
  208.  bool dumpImplicits, u_int32_t index = 0);
  209. protected:
  210. bool m_useFixed16Format;
  211. bool m_useFixed32Format;
  212. MP4Float32Array m_values;
  213. };
  214. class MP4StringProperty : public MP4Property {
  215. public:
  216. MP4StringProperty(char* name, 
  217.   bool useCountedFormat = false, bool useUnicode = false);
  218. ~MP4StringProperty();
  219. MP4PropertyType GetType() {
  220. return StringProperty;
  221. }
  222. u_int32_t GetCount() {
  223. return m_values.Size();
  224. }
  225. void SetCount(u_int32_t count);
  226. const char* GetValue(u_int32_t index = 0) {
  227. return m_values[index];
  228. }
  229. void SetValue(const char* value, u_int32_t index = 0);
  230. void AddValue(char* value) {
  231. u_int32_t count = GetCount();
  232. SetCount(count + 1); 
  233. SetValue(value, count);
  234. }
  235. bool IsCountedFormat() {
  236. return m_useCountedFormat;
  237. }
  238. void SetCountedFormat(bool useCountedFormat) {
  239. m_useCountedFormat = useCountedFormat;
  240. }
  241. bool IsExpandedCountedFormat() {
  242. return m_useExpandedCount;
  243. }
  244. void SetExpandedCountedFormat(bool useExpandedCount) {
  245. m_useExpandedCount = useExpandedCount;
  246. }
  247. bool IsUnicode() {
  248. return m_useUnicode;
  249. }
  250. void SetUnicode(bool useUnicode) {
  251. m_useUnicode = useUnicode;
  252. }
  253. u_int32_t GetFixedLength() {
  254. return m_fixedLength;
  255. }
  256. void SetFixedLength(u_int32_t fixedLength) {
  257. m_fixedLength = fixedLength;
  258. }
  259. void Read(MP4File* pFile, u_int32_t index = 0);
  260. void Write(MP4File* pFile, u_int32_t index = 0);
  261. void Dump(FILE* pFile, u_int8_t indent,
  262.  bool dumpImplicits, u_int32_t index = 0);
  263. protected:
  264. bool m_useCountedFormat;
  265. bool m_useExpandedCount;
  266. bool m_useUnicode;
  267. u_int32_t m_fixedLength;
  268. MP4StringArray m_values;
  269. };
  270. class MP4BytesProperty : public MP4Property {
  271. public:
  272. MP4BytesProperty(char* name, u_int32_t valueSize = 0);
  273. ~MP4BytesProperty();
  274. MP4PropertyType GetType() {
  275. return BytesProperty;
  276. }
  277. u_int32_t GetCount() {
  278. return m_values.Size();
  279. }
  280. void SetCount(u_int32_t count);
  281. void GetValue(u_int8_t** ppValue, u_int32_t* pValueSize, 
  282.   u_int32_t index = 0) {
  283. // N.B. caller must free memory
  284. *ppValue = (u_int8_t*)MP4Malloc(m_valueSizes[index]);
  285. memcpy(*ppValue, m_values[index], m_valueSizes[index]);
  286. *pValueSize = m_valueSizes[index];
  287. }
  288. void CopyValue(u_int8_t* pValue, u_int32_t index = 0) {
  289. // N.B. caller takes responsbility for valid pointer
  290. // and sufficient memory at the destination
  291. memcpy(pValue, m_values[index], m_valueSizes[index]);
  292. }
  293. void SetValue(const u_int8_t* pValue, u_int32_t valueSize, 
  294. u_int32_t index = 0);
  295. void AddValue(u_int8_t* pValue, u_int32_t valueSize) {
  296. u_int32_t count = GetCount();
  297. SetCount(count + 1); 
  298. SetValue(pValue, valueSize, count);
  299. }
  300. u_int32_t GetValueSize(u_int32_t valueSize, u_int32_t index = 0) {
  301. return m_valueSizes[index];
  302. }
  303. void SetValueSize(u_int32_t valueSize, u_int32_t index = 0);
  304. u_int32_t GetFixedSize() {
  305. return m_fixedValueSize;
  306. }
  307. void SetFixedSize(u_int32_t fixedSize);
  308. void Read(MP4File* pFile, u_int32_t index = 0);
  309. void Write(MP4File* pFile, u_int32_t index = 0);
  310. void Dump(FILE* pFile, u_int8_t indent,
  311.  bool dumpImplicits, u_int32_t index = 0);
  312. protected:
  313. u_int32_t m_fixedValueSize;
  314. MP4Integer32Array m_valueSizes;
  315. MP4BytesArray m_values;
  316. };
  317. class MP4TableProperty : public MP4Property {
  318. public:
  319. MP4TableProperty(char* name, MP4Property* pCountProperty);
  320. ~MP4TableProperty();
  321. MP4PropertyType GetType() {
  322. return TableProperty;
  323. }
  324. void SetParentAtom(MP4Atom* pParentAtom) {
  325. m_pParentAtom = pParentAtom;
  326. for (u_int32_t i = 0; i < m_pProperties.Size(); i++) {
  327. m_pProperties[i]->SetParentAtom(pParentAtom);
  328. }
  329. }
  330. void AddProperty(MP4Property* pProperty);
  331. MP4Property* GetProperty(u_int32_t index) {
  332. return m_pProperties[index];
  333. }
  334. u_int32_t GetCount() {
  335. if (m_pCountProperty->GetType() == Integer8Property) {
  336. return ((MP4Integer8Property*)m_pCountProperty)->GetValue();
  337. } else {
  338. return ((MP4Integer32Property*)m_pCountProperty)->GetValue();
  339. }
  340. void SetCount(u_int32_t count) {
  341. if (m_pCountProperty->GetType() == Integer8Property) {
  342. ((MP4Integer8Property*)m_pCountProperty)->SetValue(count);
  343. } else {
  344. ((MP4Integer32Property*)m_pCountProperty)->SetValue(count);
  345. }
  346. void Read(MP4File* pFile, u_int32_t index = 0);
  347. void Write(MP4File* pFile, u_int32_t index = 0);
  348. void Dump(FILE* pFile, u_int8_t indent,
  349.  bool dumpImplicits, u_int32_t index = 0);
  350. bool FindProperty(const char* name,
  351. MP4Property** ppProperty, u_int32_t* pIndex = NULL);
  352. protected:
  353. virtual void ReadEntry(MP4File* pFile, u_int32_t index);
  354. virtual void WriteEntry(MP4File* pFile, u_int32_t index);
  355. bool FindContainedProperty(const char* name,
  356. MP4Property** ppProperty, u_int32_t* pIndex);
  357. protected:
  358. MP4Property* m_pCountProperty;
  359. MP4PropertyArray m_pProperties;
  360. };
  361. class MP4DescriptorProperty : public MP4Property {
  362. public:
  363. MP4DescriptorProperty(char* name = NULL, 
  364.   u_int8_t tagsStart = 0, u_int8_t tagsEnd = 0,
  365.   bool mandatory = false, bool onlyOne = false);
  366. ~MP4DescriptorProperty();
  367. MP4PropertyType GetType() {
  368. return DescriptorProperty;
  369. }
  370. void SetParentAtom(MP4Atom* pParentAtom);
  371. void SetSizeLimit(u_int64_t sizeLimit) {
  372. m_sizeLimit = sizeLimit;
  373. }
  374. u_int32_t GetCount() {
  375. return m_pDescriptors.Size();
  376. }
  377. void SetCount(u_int32_t count) {
  378. m_pDescriptors.Resize(count);
  379. }
  380. void SetTags(u_int8_t tagsStart, u_int8_t tagsEnd = 0) {
  381. m_tagsStart = tagsStart;
  382. m_tagsEnd = tagsEnd ? tagsEnd : tagsStart;
  383. }
  384. MP4Descriptor* AddDescriptor(u_int8_t tag);
  385. void AppendDescriptor(MP4Descriptor* pDescriptor) {
  386. m_pDescriptors.Add(pDescriptor);
  387. }
  388. void DeleteDescriptor(u_int32_t index);
  389. void Generate();
  390. void Read(MP4File* pFile, u_int32_t index = 0);
  391. void Write(MP4File* pFile, u_int32_t index = 0);
  392. void Dump(FILE* pFile, u_int8_t indent,
  393.  bool dumpImplicits, u_int32_t index = 0);
  394. bool FindProperty(const char* name,
  395. MP4Property** ppProperty, u_int32_t* pIndex = NULL);
  396. protected:
  397. virtual MP4Descriptor* CreateDescriptor(u_int8_t tag);
  398. bool FindContainedProperty(const char* name,
  399. MP4Property** ppProperty, u_int32_t* pIndex);
  400. protected:
  401. u_int8_t m_tagsStart;
  402. u_int8_t m_tagsEnd;
  403. u_int64_t m_sizeLimit;
  404. bool m_mandatory;
  405. bool m_onlyOne;
  406. MP4DescriptorArray m_pDescriptors;
  407. };
  408. class MP4QosQualifierProperty : public MP4DescriptorProperty {
  409. public:
  410. MP4QosQualifierProperty(char* name = NULL, 
  411.   u_int8_t tagsStart = 0, u_int8_t tagsEnd = 0,
  412.   bool mandatory = false, bool onlyOne = false) :
  413. MP4DescriptorProperty(name, tagsStart, tagsEnd, mandatory, onlyOne) { }
  414. protected:
  415. MP4Descriptor* CreateDescriptor(u_int8_t tag);
  416. };
  417. #endif /* __MP4_PROPERTY_INCLUDED__ */