descriptors.cpp
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:18k
源码类别:

流媒体/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. #include "mp4common.h"
  22. MP4IODescriptor::MP4IODescriptor()
  23. : MP4Descriptor(MP4FileIODescrTag)
  24. {
  25. /* N.B. other member functions depend on the property indicies */
  26. AddProperty( /* 0 */
  27. new MP4BitfieldProperty("objectDescriptorId", 10));
  28. AddProperty( /* 1 */
  29. new MP4BitfieldProperty("URLFlag", 1));
  30. AddProperty( /* 2 */
  31. new MP4BitfieldProperty("includeInlineProfileLevelFlag", 1));
  32. AddProperty( /* 3 */
  33. new MP4BitfieldProperty("reserved", 4));
  34. AddProperty( /* 4 */
  35. new MP4StringProperty("URL", Counted));
  36. AddProperty( /* 5 */
  37. new MP4Integer8Property("ODProfileLevelId"));
  38. AddProperty( /* 6 */
  39. new MP4Integer8Property("sceneProfileLevelId"));
  40. AddProperty( /* 7 */
  41. new MP4Integer8Property("audioProfileLevelId"));
  42. AddProperty( /* 8 */
  43. new MP4Integer8Property("visualProfileLevelId"));
  44. AddProperty( /* 9 */
  45. new MP4Integer8Property("graphicsProfileLevelId"));
  46. AddProperty( /* 10 */ 
  47. new MP4DescriptorProperty("esIds", 
  48. MP4ESIDIncDescrTag, 0, Required, Many));
  49. AddProperty( /* 11 */ 
  50. new MP4DescriptorProperty("ociDescr", 
  51. MP4OCIDescrTagsStart, MP4OCIDescrTagsEnd, Optional, Many));
  52. AddProperty( /* 12 */
  53. new MP4DescriptorProperty("ipmpDescrPtr",
  54. MP4IPMPPtrDescrTag, 0, Optional, Many));
  55. AddProperty( /* 13 */
  56. new MP4DescriptorProperty("extDescr",
  57. MP4ExtDescrTagsStart, MP4ExtDescrTagsEnd, Optional, Many));
  58. SetReadMutate(2);
  59. }
  60. void MP4IODescriptor::Generate()
  61. {
  62. ((MP4BitfieldProperty*)m_pProperties[0])->SetValue(1);
  63. ((MP4BitfieldProperty*)m_pProperties[3])->SetValue(0xF);
  64. for (u_int32_t i = 5; i <= 9; i++) {
  65. ((MP4Integer8Property*)m_pProperties[i])->SetValue(0xFF);
  66. }
  67. }
  68. void MP4IODescriptor::Mutate()
  69. {
  70. bool urlFlag = ((MP4BitfieldProperty*)m_pProperties[1])->GetValue();
  71. m_pProperties[4]->SetImplicit(!urlFlag);
  72. for (u_int32_t i = 5; i <= 12; i++) {
  73. m_pProperties[i]->SetImplicit(urlFlag);
  74. }
  75. }
  76. MP4ODescriptor::MP4ODescriptor()
  77. : MP4Descriptor(MP4FileODescrTag)
  78. {
  79. /* N.B. other member functions depend on the property indicies */
  80. AddProperty( /* 0 */
  81. new MP4BitfieldProperty("objectDescriptorId", 10));
  82. AddProperty( /* 1 */
  83. new MP4BitfieldProperty("URLFlag", 1));
  84. AddProperty( /* 2 */
  85. new MP4BitfieldProperty("reserved", 5));
  86. AddProperty( /* 3 */
  87. new MP4StringProperty("URL", Counted));
  88. AddProperty( /* 4 */ 
  89. new MP4DescriptorProperty("esIds", 
  90. MP4ESIDRefDescrTag, 0, Required, Many));
  91. AddProperty( /* 5 */ 
  92. new MP4DescriptorProperty("ociDescr", 
  93. MP4OCIDescrTagsStart, MP4OCIDescrTagsEnd, Optional, Many));
  94. AddProperty( /* 6 */
  95. new MP4DescriptorProperty("ipmpDescrPtr",
  96. MP4IPMPPtrDescrTag, 0, Optional, Many));
  97. AddProperty( /* 7 */
  98. new MP4DescriptorProperty("extDescr",
  99. MP4ExtDescrTagsStart, MP4ExtDescrTagsEnd, Optional, Many));
  100. SetReadMutate(2);
  101. }
  102. void MP4ODescriptor::Generate()
  103. {
  104. ((MP4BitfieldProperty*)m_pProperties[2])->SetValue(0x1F);
  105. }
  106. void MP4ODescriptor::Mutate()
  107. {
  108. bool urlFlag = ((MP4BitfieldProperty*)m_pProperties[1])->GetValue();
  109. m_pProperties[3]->SetImplicit(!urlFlag);
  110. for (u_int32_t i = 4; i <= 6; i++) {
  111. m_pProperties[i]->SetImplicit(urlFlag);
  112. }
  113. }
  114. MP4ESIDIncDescriptor::MP4ESIDIncDescriptor()
  115. : MP4Descriptor(MP4ESIDIncDescrTag)
  116. {
  117. AddProperty( /* 0 */
  118. new MP4Integer32Property("id"));
  119. }
  120. MP4ESIDRefDescriptor::MP4ESIDRefDescriptor()
  121. : MP4Descriptor(MP4ESIDRefDescrTag)
  122. {
  123. AddProperty( /* 0 */
  124. new MP4Integer16Property("refIndex"));
  125. }
  126. MP4ESDescriptor::MP4ESDescriptor()
  127. : MP4Descriptor(MP4ESDescrTag)
  128. {
  129. /* N.B. other class functions depend on the property indicies */
  130. AddProperty( /* 0 */
  131. new MP4Integer16Property("ESID"));
  132. AddProperty( /* 1 */
  133. new MP4BitfieldProperty("streamDependenceFlag", 1));
  134. AddProperty( /* 2 */
  135. new MP4BitfieldProperty("URLFlag", 1));
  136. AddProperty( /* 3 */
  137. new MP4BitfieldProperty("OCRstreamFlag", 1));
  138. AddProperty( /* 4 */
  139. new MP4BitfieldProperty("streamPriority", 5));
  140. AddProperty( /* 5 */
  141. new MP4Integer16Property("dependsOnESID"));
  142. AddProperty( /* 6 */
  143. new MP4StringProperty("URL", Counted));
  144. AddProperty( /* 7 */
  145. new MP4Integer16Property("OCRESID"));
  146. AddProperty( /* 8 */
  147. new MP4DescriptorProperty("decConfigDescr",
  148. MP4DecConfigDescrTag, 0, Required, OnlyOne));
  149. AddProperty( /* 9 */
  150. new MP4DescriptorProperty("slConfigDescr",
  151. MP4SLConfigDescrTag, 0, Required, OnlyOne));
  152. AddProperty( /* 10 */
  153. new MP4DescriptorProperty("ipiPtr",
  154. MP4IPIPtrDescrTag, 0, Optional, OnlyOne));
  155. AddProperty( /* 11 */
  156. new MP4DescriptorProperty("ipIds",
  157. MP4ContentIdDescrTag, MP4SupplContentIdDescrTag, Optional, Many));
  158. AddProperty( /* 12 */
  159. new MP4DescriptorProperty("ipmpDescrPtr",
  160. MP4IPMPPtrDescrTag, 0, Optional, Many));
  161. AddProperty( /* 13 */
  162. new MP4DescriptorProperty("langDescr",
  163. MP4LanguageDescrTag, 0, Optional, Many));
  164. AddProperty( /* 14 */
  165. new MP4DescriptorProperty("qosDescr",
  166. MP4QosDescrTag, 0, Optional, OnlyOne));
  167. AddProperty( /* 15 */
  168. new MP4DescriptorProperty("regDescr",
  169. MP4RegistrationDescrTag, 0, Optional, OnlyOne));
  170. AddProperty( /* 16 */
  171. new MP4DescriptorProperty("extDescr",
  172. MP4ExtDescrTagsStart, MP4ExtDescrTagsEnd, Optional, Many));
  173. SetReadMutate(5);
  174. }
  175. void MP4ESDescriptor::Mutate()
  176. {
  177. bool streamDependFlag = 
  178. ((MP4BitfieldProperty*)m_pProperties[1])->GetValue();
  179. m_pProperties[5]->SetImplicit(!streamDependFlag);
  180. bool urlFlag = 
  181. ((MP4BitfieldProperty*)m_pProperties[2])->GetValue();
  182. m_pProperties[6]->SetImplicit(!urlFlag);
  183. bool ocrFlag = 
  184. ((MP4BitfieldProperty*)m_pProperties[3])->GetValue();
  185. m_pProperties[7]->SetImplicit(!ocrFlag);
  186. }
  187. MP4DecConfigDescriptor::MP4DecConfigDescriptor()
  188. : MP4Descriptor(MP4DecConfigDescrTag)
  189. {
  190. AddProperty( /* 0 */
  191. new MP4Integer8Property("objectTypeId"));
  192. AddProperty( /* 1 */
  193. new MP4BitfieldProperty("streamType", 6));
  194. AddProperty( /* 2 */
  195. new MP4BitfieldProperty("upStream", 1));
  196. AddProperty( /* 3 */
  197. new MP4BitfieldProperty("reserved", 1));
  198. AddProperty( /* 4 */
  199. new MP4BitfieldProperty("bufferSizeDB", 24));
  200. AddProperty( /* 5 */
  201. new MP4Integer32Property("maxBitrate"));
  202. AddProperty( /* 6 */
  203. new MP4Integer32Property("avgBitrate"));
  204. AddProperty( /* 7 */
  205. new MP4DescriptorProperty("decSpecificInfo",
  206. MP4DecSpecificDescrTag, 0, Optional, OnlyOne));
  207. AddProperty( /* 8 */
  208. new MP4DescriptorProperty("profileLevelIndicationIndexDescr",
  209. MP4ExtProfileLevelDescrTag, 0, Optional, Many));
  210. }
  211. void MP4DecConfigDescriptor::Generate()
  212. {
  213. ((MP4BitfieldProperty*)m_pProperties[3])->SetValue(1);
  214. }
  215. MP4DecSpecificDescriptor::MP4DecSpecificDescriptor()
  216. : MP4Descriptor(MP4DecSpecificDescrTag)
  217. {
  218. AddProperty( /* 0 */
  219. new MP4BytesProperty("info"));
  220. }
  221. void MP4DecSpecificDescriptor::Read(MP4File* pFile)
  222. {
  223. ReadHeader(pFile);
  224. /* byte properties need to know how long they are before reading */
  225. ((MP4BytesProperty*)m_pProperties[0])->SetValueSize(m_size);
  226. ReadProperties(pFile);
  227. }
  228. MP4SLConfigDescriptor::MP4SLConfigDescriptor()
  229. : MP4Descriptor(MP4SLConfigDescrTag)
  230. {
  231. AddProperty( /* 0 */
  232. new MP4Integer8Property("predefined"));
  233. AddProperty( /* 1 */
  234. new MP4BitfieldProperty("useAccessUnitStartFlag", 1));
  235. AddProperty( /* 2 */
  236. new MP4BitfieldProperty("useAccessUnitEndFlag", 1));
  237. AddProperty( /* 3 */
  238. new MP4BitfieldProperty("useRandomAccessPointFlag", 1));
  239. AddProperty( /* 4 */
  240. new MP4BitfieldProperty("hasRandomAccessUnitsOnlyFlag", 1));
  241. AddProperty( /* 5 */
  242. new MP4BitfieldProperty("usePaddingFlag", 1));
  243. AddProperty( /* 6 */
  244. new MP4BitfieldProperty("useTimeStampsFlag", 1));
  245. AddProperty( /* 7 */
  246. new MP4BitfieldProperty("useIdleFlag", 1));
  247. AddProperty( /* 8 */
  248. new MP4BitfieldProperty("durationFlag", 1));
  249. AddProperty( /* 9 */
  250. new MP4Integer32Property("timeStampResolution"));
  251. AddProperty( /* 10 */
  252. new MP4Integer32Property("OCRResolution"));
  253. AddProperty( /* 11 */
  254. new MP4Integer8Property("timeStampLength"));
  255. AddProperty( /* 12 */
  256. new MP4Integer8Property("OCRLength"));
  257. AddProperty( /* 13 */
  258. new MP4Integer8Property("AULength"));
  259. AddProperty( /* 14 */
  260. new MP4Integer8Property("instantBitrateLength"));
  261. AddProperty( /* 15 */
  262. new MP4BitfieldProperty("degradationPriortyLength", 4));
  263. AddProperty( /* 16 */
  264. new MP4BitfieldProperty("AUSeqNumLength", 5));
  265. AddProperty( /* 17 */
  266. new MP4BitfieldProperty("packetSeqNumLength", 5));
  267. AddProperty( /* 18 */
  268. new MP4BitfieldProperty("reserved", 2));
  269. // if durationFlag 
  270. AddProperty( /* 19 */
  271. new MP4Integer32Property("timeScale"));
  272. AddProperty( /* 20 */
  273. new MP4Integer16Property("accessUnitDuration"));
  274. AddProperty( /* 21 */
  275. new MP4Integer16Property("compositionUnitDuration"));
  276. // if !useTimeStampsFlag
  277. AddProperty( /* 22 */
  278. new MP4BitfieldProperty("startDecodingTimeStamp", 64));
  279. AddProperty( /* 23 */
  280. new MP4BitfieldProperty("startCompositionTimeStamp", 64));
  281. }
  282. void MP4SLConfigDescriptor::Generate()
  283. {
  284. // by default all tracks in an mp4 file 
  285. // use predefined SLConfig descriptor == 2
  286. ((MP4Integer8Property*)m_pProperties[0])->SetValue(2);
  287. // which implies UseTimestampsFlag = 1
  288. ((MP4BitfieldProperty*)m_pProperties[6])->SetValue(1);
  289. // reserved = 3
  290. ((MP4BitfieldProperty*)m_pProperties[18])->SetValue(3);
  291. }
  292. void MP4SLConfigDescriptor::Read(MP4File* pFile)
  293. {
  294. ReadHeader(pFile);
  295. // read the first property, 'predefined'
  296. ReadProperties(pFile, 0, 1);
  297. // if predefined == 0
  298. if (((MP4Integer8Property*)m_pProperties[0])->GetValue() == 0) {
  299. /* read the next 18 properties */
  300. ReadProperties(pFile, 1, 18);
  301. }
  302. // now mutate 
  303. Mutate();
  304. // and read the remaining properties
  305. ReadProperties(pFile, 19);
  306. }
  307. void MP4SLConfigDescriptor::Mutate()
  308. {
  309. u_int32_t i;
  310. u_int8_t predefined = 
  311. ((MP4Integer8Property*)m_pProperties[0])->GetValue();
  312. if (predefined) {
  313. // properties 1-18 are implicit
  314. for (i = 1; i < m_pProperties.Size(); i++) {
  315. m_pProperties[i]->SetImplicit(true);
  316. }
  317. if (predefined == 1) {
  318. // UseTimestampsFlag = 0
  319. ((MP4BitfieldProperty*)m_pProperties[6])->SetValue(0);
  320. // TimestampResolution = 1000
  321. ((MP4Integer32Property*)m_pProperties[9])->SetValue(1000);
  322. // TimeStampLength = 32
  323. ((MP4Integer8Property*)m_pProperties[11])->SetValue(32);
  324. } else if (predefined == 2) {
  325. // UseTimestampsFlag = 1
  326. ((MP4BitfieldProperty*)m_pProperties[6])->SetValue(1);
  327. }
  328. }
  329. bool durationFlag = 
  330. ((MP4BitfieldProperty*)m_pProperties[8])->GetValue();
  331. for (i = 19; i <= 21; i++) {
  332. m_pProperties[i]->SetImplicit(!durationFlag);
  333. }
  334. bool useTimeStampsFlag = 
  335. ((MP4BitfieldProperty*)m_pProperties[6])->GetValue();
  336. for (i = 22; i <= 23; i++) {
  337. m_pProperties[i]->SetImplicit(useTimeStampsFlag);
  338. u_int8_t timeStampLength = MIN(64,
  339. ((MP4Integer8Property*)m_pProperties[11])->GetValue());
  340. ((MP4BitfieldProperty*)m_pProperties[i])->SetNumBits(timeStampLength);
  341. // handle a nonsensical situation gracefully
  342. if (timeStampLength == 0) {
  343. m_pProperties[i]->SetImplicit(true);
  344. }
  345. }
  346. }
  347. MP4IPIPtrDescriptor::MP4IPIPtrDescriptor()
  348. : MP4Descriptor(MP4IPIPtrDescrTag)
  349. {
  350. AddProperty( /* 0 */
  351. new MP4Integer16Property("IPIESId"));
  352. }
  353. MP4ContentIdDescriptor::MP4ContentIdDescriptor()
  354. : MP4Descriptor(MP4ContentIdDescrTag)
  355. {
  356. AddProperty( /* 0 */
  357. new MP4BitfieldProperty("compatibility", 2));
  358. AddProperty( /* 1 */
  359. new MP4BitfieldProperty("contentTypeFlag", 1));
  360. AddProperty( /* 2 */
  361. new MP4BitfieldProperty("contentIdFlag", 1));
  362. AddProperty( /* 3 */
  363. new MP4BitfieldProperty("protectedContent", 1));
  364. AddProperty( /* 4 */
  365. new MP4BitfieldProperty("reserved", 3));
  366. AddProperty( /* 5 */
  367. new MP4Integer8Property("contentType"));
  368. AddProperty( /* 6 */
  369. new MP4Integer8Property("contentIdType"));
  370. AddProperty( /* 7 */
  371. new MP4BytesProperty("contentId"));
  372. }
  373. void MP4ContentIdDescriptor::Read(MP4File* pFile)
  374. {
  375. ReadHeader(pFile);
  376. /* read the first property, 'compatiblity' */
  377. ReadProperties(pFile, 0, 1);
  378. /* if compatiblity != 0 */
  379. if (((MP4Integer8Property*)m_pProperties[0])->GetValue() != 0) {
  380. /* we don't understand it */
  381. VERBOSE_READ(pFile->GetVerbosity(),
  382. printf("incompatible content id descriptorn"));
  383. return;
  384. }
  385. /* read the next four properties */
  386. ReadProperties(pFile, 1, 4);
  387. /* which allows us to reconfigure ourselves */
  388. Mutate();
  389. /* read the remaining properties */
  390. ReadProperties(pFile, 5);
  391. }
  392. void MP4ContentIdDescriptor::Mutate()
  393. {
  394. bool contentTypeFlag = ((MP4BitfieldProperty*)m_pProperties[1])->GetValue();
  395. m_pProperties[5]->SetImplicit(!contentTypeFlag);
  396. bool contentIdFlag = ((MP4BitfieldProperty*)m_pProperties[2])->GetValue();
  397. m_pProperties[6]->SetImplicit(!contentIdFlag);
  398. m_pProperties[7]->SetImplicit(!contentIdFlag);
  399. }
  400. MP4SupplContentIdDescriptor::MP4SupplContentIdDescriptor()
  401. : MP4Descriptor(MP4SupplContentIdDescrTag)
  402. {
  403. AddProperty( /* 0 */
  404. new MP4BytesProperty("languageCode", 3));
  405. AddProperty( /* 1 */
  406. new MP4StringProperty("title", Counted));
  407. AddProperty( /* 2 */
  408. new MP4StringProperty("value", Counted));
  409. }
  410. MP4IPMPPtrDescriptor::MP4IPMPPtrDescriptor()
  411. : MP4Descriptor(MP4IPMPPtrDescrTag)
  412. {
  413. AddProperty( /* 0 */
  414. new MP4Integer8Property("IPMPDescriptorId"));
  415. }
  416. MP4IPMPDescriptor::MP4IPMPDescriptor()
  417. : MP4Descriptor(MP4IPMPDescrTag)
  418. {
  419. AddProperty( /* 0 */
  420. new MP4Integer8Property("IPMPDescriptorId"));
  421. AddProperty( /* 1 */
  422. new MP4Integer16Property("IPMPSType"));
  423. AddProperty( /* 2 */
  424. new MP4BytesProperty("IPMPData"));
  425. /* note: if IPMPSType == 0, IPMPData is an URL */
  426. }
  427. void MP4IPMPDescriptor::Read(MP4File* pFile)
  428. {
  429. ReadHeader(pFile);
  430. /* byte properties need to know how long they are before reading */
  431. ((MP4BytesProperty*)m_pProperties[2])->SetValueSize(m_size - 3);
  432. ReadProperties(pFile);
  433. }
  434. MP4RegistrationDescriptor::MP4RegistrationDescriptor()
  435. : MP4Descriptor(MP4RegistrationDescrTag)
  436. {
  437. AddProperty( /* 0 */
  438. new MP4Integer32Property("formatIdentifier"));
  439. AddProperty( /* 1 */
  440. new MP4BytesProperty("additionalIdentificationInfo"));
  441. }
  442. void MP4RegistrationDescriptor::Read(MP4File* pFile)
  443. {
  444. ReadHeader(pFile);
  445. /* byte properties need to know how long they are before reading */
  446. ((MP4BytesProperty*)m_pProperties[1])->SetValueSize(m_size - 4);
  447. ReadProperties(pFile);
  448. }
  449. MP4ExtProfileLevelDescriptor::MP4ExtProfileLevelDescriptor()
  450. : MP4Descriptor(MP4ExtProfileLevelDescrTag)
  451. {
  452. AddProperty( /* 0 */
  453. new MP4Integer8Property("profileLevelIndicationIndex"));
  454. AddProperty( /* 1 */
  455. new MP4Integer8Property("ODProfileLevelIndication"));
  456. AddProperty( /* 2 */
  457. new MP4Integer8Property("sceneProfileLevelIndication"));
  458. AddProperty( /* 3 */
  459. new MP4Integer8Property("audioProfileLevelIndication"));
  460. AddProperty( /* 4 */
  461. new MP4Integer8Property("visualProfileLevelIndication"));
  462. AddProperty( /* 5 */
  463. new MP4Integer8Property("graphicsProfileLevelIndication"));
  464. AddProperty( /* 6 */
  465. new MP4Integer8Property("MPEGJProfileLevelIndication"));
  466. }
  467. MP4ExtensionDescriptor::MP4ExtensionDescriptor()
  468. : MP4Descriptor()
  469. {
  470. AddProperty( /* 0 */
  471. new MP4BytesProperty("data"));
  472. }
  473. void MP4ExtensionDescriptor::Read(MP4File* pFile)
  474. {
  475. ReadHeader(pFile);
  476. /* byte properties need to know how long they are before reading */
  477. ((MP4BytesProperty*)m_pProperties[0])->SetValueSize(m_size);
  478. ReadProperties(pFile);
  479. }
  480. MP4Descriptor* MP4DescriptorProperty::CreateDescriptor(u_int8_t tag) 
  481. {
  482. MP4Descriptor* pDescriptor = NULL;
  483. switch (tag) {
  484. case MP4ESDescrTag:
  485. pDescriptor = new MP4ESDescriptor();
  486. break;
  487. case MP4DecConfigDescrTag:
  488. pDescriptor = new MP4DecConfigDescriptor();
  489. break;
  490. case MP4DecSpecificDescrTag:
  491. pDescriptor = new MP4DecSpecificDescriptor();
  492. break;
  493. case MP4SLConfigDescrTag:
  494. pDescriptor = new MP4SLConfigDescriptor();
  495. break;
  496. case MP4ContentIdDescrTag:
  497. pDescriptor = new MP4ContentIdDescriptor();
  498. break;
  499. case MP4SupplContentIdDescrTag:
  500. pDescriptor = new MP4SupplContentIdDescriptor();
  501. break;
  502. case MP4IPIPtrDescrTag:
  503. pDescriptor = new MP4IPIPtrDescriptor();
  504. break;
  505. case MP4IPMPPtrDescrTag:
  506. pDescriptor = new MP4IPMPPtrDescriptor();
  507. break;
  508. case MP4IPMPDescrTag:
  509. pDescriptor = new MP4IPMPDescriptor();
  510. break;
  511. case MP4QosDescrTag:
  512. pDescriptor = new MP4QosDescriptor();
  513. break;
  514. case MP4RegistrationDescrTag:
  515. pDescriptor = new MP4RegistrationDescriptor();
  516. break;
  517. case MP4ESIDIncDescrTag:
  518. pDescriptor = new MP4ESIDIncDescriptor();
  519. break;
  520. case MP4ESIDRefDescrTag:
  521. pDescriptor = new MP4ESIDRefDescriptor();
  522. break;
  523. case MP4IODescrTag:
  524. case MP4FileIODescrTag:
  525. pDescriptor = new MP4IODescriptor();
  526. pDescriptor->SetTag(tag);
  527. break;
  528. case MP4ODescrTag:
  529. case MP4FileODescrTag:
  530. pDescriptor = new MP4ODescriptor();
  531. pDescriptor->SetTag(tag);
  532. break;
  533. case MP4ExtProfileLevelDescrTag:
  534. pDescriptor = new MP4ExtProfileLevelDescriptor();
  535. break;
  536. }
  537. if (pDescriptor == NULL) {
  538. if (tag >= MP4OCIDescrTagsStart && tag <= MP4OCIDescrTagsEnd) {
  539. pDescriptor = CreateOCIDescriptor(tag);
  540. }
  541. if (tag >= MP4ExtDescrTagsStart && tag <= MP4ExtDescrTagsEnd) {
  542. pDescriptor = new MP4ExtensionDescriptor();
  543. pDescriptor->SetTag(tag);
  544. }
  545. }
  546. return pDescriptor;
  547. }