qtatoms.h
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:48k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #ifndef _QTATOMS_H_
  36. #define _QTATOMS_H_
  37. /****************************************************************************
  38.  *  Defines
  39.  */
  40. #ifdef QTCONFIG_SPEED_OVER_SIZE
  41. #define QTATOMS_INLINE inline
  42. #else // QTCONFIG_SPEED_OVER_SIZE
  43. #define QTATOMS_INLINE /**/
  44. #endif // QTCONFIG_SPEED_OVER_SIZE
  45. /****************************************************************************
  46.  *  Includes
  47.  */
  48. #include "qtbatom.h"
  49. #include "mempager.h"
  50. #define QT_BAD_SAMPLE_SIZE 0xFFFFFFFF
  51. // /26245-013R6.doc says the unity matrix in the track header is:
  52. // { 0x00010000,0,0,0,0x00010000,0,tx,ty,0x40000000 }, so (tx,ty) is here:
  53. #define TKHD_MATRIX_TX_LOCATION (sizeof(UINT32) * 6)
  54. #define TKHD_MATRIX_TY_LOCATION (sizeof(UINT32) * 7)
  55. #if defined(_SYMBIAN) && !defined(__WINS__)
  56. #  define PACKING __attribute__ ((packed))
  57. #else
  58. #  define PACKING
  59. #endif
  60. /****************************************************************************
  61.  *  Atom Type definitions
  62.  */
  63. typedef enum
  64. {
  65.     QT_HXROOT = 0,     // RN data type
  66.     QT_mdat = QT_ENCODE_TYPE('m', 'd', 'a', 't'),
  67.     QT_moov = QT_ENCODE_TYPE('m', 'o', 'o', 'v'),
  68.     QT_mvhd = QT_ENCODE_TYPE('m', 'v', 'h', 'd'),
  69.     QT_trak = QT_ENCODE_TYPE('t', 'r', 'a', 'k'),
  70.     QT_tkhd = QT_ENCODE_TYPE('t', 'k', 'h', 'd'),
  71.     QT_mdia = QT_ENCODE_TYPE('m', 'd', 'i', 'a'),
  72.     QT_mdhd = QT_ENCODE_TYPE('m', 'd', 'h', 'd'),
  73.     QT_hdlr = QT_ENCODE_TYPE('h', 'd', 'l', 'r'),
  74.     QT_minf = QT_ENCODE_TYPE('m', 'i', 'n', 'f'),
  75.     QT_vmhd = QT_ENCODE_TYPE('v', 'm', 'h', 'd'),
  76.     QT_dinf = QT_ENCODE_TYPE('d', 'i', 'n', 'f'),
  77.     QT_dref = QT_ENCODE_TYPE('d', 'r', 'e', 'f'),
  78.     QT_stbl = QT_ENCODE_TYPE('s', 't', 'b', 'l'),
  79.     QT_stts = QT_ENCODE_TYPE('s', 't', 't', 's'),
  80.     QT_ctts = QT_ENCODE_TYPE('c', 't', 't', 's'),
  81.     QT_stss = QT_ENCODE_TYPE('s', 't', 's', 's'),
  82.     QT_stsd = QT_ENCODE_TYPE('s', 't', 's', 'd'),
  83.     QT_stsz = QT_ENCODE_TYPE('s', 't', 's', 'z'),
  84.     QT_stsc = QT_ENCODE_TYPE('s', 't', 's', 'c'),
  85.     QT_stco = QT_ENCODE_TYPE('s', 't', 'c', 'o'),
  86.     QT_smhd = QT_ENCODE_TYPE('s', 'm', 'h', 'd'),
  87.     QT_hint = QT_ENCODE_TYPE('h', 'i', 'n', 't'),
  88.     QT_mhlr = QT_ENCODE_TYPE('m', 'h', 'l', 'r'),
  89.     QT_alis = QT_ENCODE_TYPE('a', 'l', 'i', 's'),
  90.     QT_rsrc = QT_ENCODE_TYPE('r', 's', 'r', 'c'),
  91.     QT_name = QT_ENCODE_TYPE('n', 'a', 'm', 'e'),
  92.     QT_hinf = QT_ENCODE_TYPE('h', 'i', 'n', 'f'),
  93.     QT_hnti = QT_ENCODE_TYPE('h', 'n', 't', 'i'),
  94.     QT_sdp  = QT_ENCODE_TYPE('s', 'd', 'p', ' '),
  95.     QT_trpy = QT_ENCODE_TYPE('t', 'r', 'p', 'y'),
  96.     QT_nump = QT_ENCODE_TYPE('n', 'u', 'm', 'p'),
  97.     QT_tpyl = QT_ENCODE_TYPE('t', 'p', 'y', 'l'),
  98.     QT_payt = QT_ENCODE_TYPE('p', 'a', 'y', 't'),
  99.     QT_udta = QT_ENCODE_TYPE('u', 'd', 't', 'a'),
  100.     QT_edts = QT_ENCODE_TYPE('e', 'd', 't', 's'),
  101.     QT_elst = QT_ENCODE_TYPE('e', 'l', 's', 't'),
  102.     QT_tref = QT_ENCODE_TYPE('t', 'r', 'e', 'f'),
  103.     QT_tims = QT_ENCODE_TYPE('t', 'i', 'm', 's'),
  104.     QT_tsro = QT_ENCODE_TYPE('t', 's', 'r', 'o'),
  105.     QT_snro = QT_ENCODE_TYPE('s', 'n', 'r', 'o'),
  106.     QT_rtp  = QT_ENCODE_TYPE('r', 't', 'p', ' '),
  107.     QT_rtpo = QT_ENCODE_TYPE('r', 't', 'p', 'o'),
  108.     QT_iods = QT_ENCODE_TYPE('i', 'o', 'd', 's'),
  109.     QT_vide = QT_ENCODE_TYPE('v', 'i', 'd', 'e'),
  110.     QT_soun = QT_ENCODE_TYPE('s', 'o', 'u', 'n'),
  111.     QT_mp4v = QT_ENCODE_TYPE('m', 'p', '4', 'v'),
  112.     QT_mp4a = QT_ENCODE_TYPE('m', 'p', '4', 'a'),
  113.     QT_ftyp = QT_ENCODE_TYPE('f', 't', 'y', 'p'),
  114.     QT_isom = QT_ENCODE_TYPE('i', 's', 'o', 'm'),
  115.     QT_3gp4 = QT_ENCODE_TYPE('3', 'g', 'p', '4'),
  116.     QT_3gp5 = QT_ENCODE_TYPE('3', 'g', 'p', '5'),
  117.     QT_mp41 = QT_ENCODE_TYPE('m', 'p', '4', '1'),
  118.     QT_mp42 = QT_ENCODE_TYPE('m', 'p', '4', '2'),
  119.     QT_mmp4 = QT_ENCODE_TYPE('m', 'm', 'p', '4'),
  120.     QT_m4a  = QT_ENCODE_TYPE('M', '4', 'A', ' '),
  121.     QT_samr = QT_ENCODE_TYPE('s', 'a', 'm', 'r'),
  122.     QT_s263 = QT_ENCODE_TYPE('s', '2', '6', '3'),
  123.     QT_sawb = QT_ENCODE_TYPE('s', 'a', 'w', 'b'),
  124.     QT_alac = QT_ENCODE_TYPE('a', 'l', 'a', 'c')
  125.     // /-->> 3GPP Timed Text box types:
  126.     , QT_text = QT_ENCODE_TYPE('t', 'e', 'x', 't')
  127.     , QT_tx3g = QT_ENCODE_TYPE('t', 'x', '3', 'g')
  128.     , QT_ftab = QT_ENCODE_TYPE('f', 't', 'a', 'b')
  129.     , QT_styl = QT_ENCODE_TYPE('s', 't', 'y', 'l')
  130.     , QT_hlit = QT_ENCODE_TYPE('h', 'l', 'i', 't')
  131.     , QT_hclr = QT_ENCODE_TYPE('h', 'c', 'l', 'r')
  132.     , QT_krok = QT_ENCODE_TYPE('k', 'r', 'o', 'k')
  133.     , QT_href = QT_ENCODE_TYPE('h', 'r', 'e', 'f')
  134.     , QT_tbox = QT_ENCODE_TYPE('t', 'b', 'o', 'x')
  135.     , QT_blnk = QT_ENCODE_TYPE('b', 'l', 'n', 'k')
  136.     // /<<-- end 3GPP Timed Text box types.
  137. } QTKnownAtomType;
  138. /****************************************************************************
  139.  *  Atom factory
  140.  */
  141. extern CQTAtom* CreateQTAtom (QTAtomType AtomType,
  142.  ULONG32 ulOffset,
  143.  ULONG32 ulSize,
  144.  CQTAtom *pParent,
  145.  ULONG32 ulAtomID    = 0,
  146.  UINT16 uChildCount  = 0);
  147. /****************************************************************************
  148.  *  Atom Classes
  149.  */
  150. /****************************************************************************
  151.  *  Root Atom Class - RN Data Type
  152.  */
  153. class CQTRootAtom : public CQTAtom
  154. {
  155. public:
  156.     /*
  157.      * Required Virtual Methods
  158.      */
  159.     virtual BOOL IsLeafType(void)    { return FALSE; }
  160.     virtual QTAtomType GetType(void)     { return QT_HXROOT; }
  161. };
  162. /****************************************************************************
  163.  *  moov Atom Class
  164.  */
  165. class CQT_moov_Atom : public CQTAtom
  166. {
  167. public:
  168.     /*
  169.      * Constructor/Destructor
  170.      */
  171.     CQT_moov_Atom(ULONG32 ulOffset,
  172.   ULONG32 ulSize, 
  173.   CQTAtom *pParent) : CQTAtom(ulOffset,
  174.       ulSize,
  175.       pParent) {;}
  176.     /*
  177.      * Required Virtual Methods
  178.      */
  179.     virtual BOOL IsLeafType(void)    { return FALSE; }
  180.     virtual QTAtomType GetType(void)     { return QT_moov; }
  181. };
  182. /****************************************************************************
  183.  *  mvhd Atom Class
  184.  */
  185. class CQT_mvhd_Atom : public CQTAtom
  186. {
  187. public:
  188.     /*
  189.      * Leaf Data Format
  190.      */
  191.     struct Data
  192.     {
  193. UINT8 pVersion[1]; 
  194. UINT8 pFlags[3];
  195. UINT8 pCreatTime[4]; 
  196. UINT8 pModifTime[4]; 
  197. UINT8 pTimeScale[4];
  198. UINT8 pDuration[4];
  199. UINT8 pPrefRate[4];
  200. UINT8 pPrefVolume[2];
  201. UINT8 pReserved[10];
  202. UINT8 pMatrix[36];
  203. UINT8 pPrevTime[4];
  204. UINT8 pPrevDuration[4];
  205. UINT8 pPosterTime[4];
  206. UINT8 pSelectionTime[4];
  207. UINT8 pSelectionDuration[4];
  208. UINT8 pCurrentTime[4];
  209. UINT8 pNextTrackID[4];
  210.     } PACKING;
  211.     /*
  212.      * Constructor/Destructor
  213.      */
  214.     CQT_mvhd_Atom(ULONG32 ulOffset,
  215.   ULONG32 ulSize, 
  216.   CQTAtom *pParent) : CQTAtom(ulOffset,
  217.       ulSize,
  218.       pParent) {;}
  219.     /*
  220.      * Required Virtual Methods
  221.      */
  222.     virtual BOOL IsLeafType(void)    { return TRUE; }
  223.     virtual QTAtomType GetType(void)     { return QT_mvhd; }
  224.     /*
  225.      * Data Access Methods
  226.      */
  227.     ULONG32 Get_TimeScale(void)
  228.     {
  229. HX_ASSERT(m_pData);
  230. return GetUL32(((Data*) m_pData)->pTimeScale);
  231.     }
  232.     ULONG32 Get_Duration(void)
  233.     {
  234. HX_ASSERT(m_pData);
  235. return GetUL32(((Data*) m_pData)->pDuration);
  236.     }
  237. };
  238. /****************************************************************************
  239.  *  udta Atom Class
  240.  */
  241. #define QT_UDTA_TERMINATOR_LENGTH   4
  242. class CQT_udta_Atom : public CQTAtom
  243. {
  244. public:
  245.     /*
  246.      * Constructor/Destructor
  247.      */
  248.     CQT_udta_Atom(ULONG32 ulOffset,
  249.   ULONG32 ulSize, 
  250.   CQTAtom *pParent) : CQTAtom(ulOffset,
  251.       ulSize,
  252.       pParent) {;}
  253.     /*
  254.      * Required Virtual Methods
  255.      */
  256.     virtual BOOL IsLeafType(void)    { return FALSE; }
  257.     virtual QTAtomType GetType(void)     { return QT_udta; }
  258. };
  259. /****************************************************************************
  260.  *  name Atom Class
  261.  */
  262. class CQT_name_Atom : public CQTAtom
  263. {
  264. public:
  265.     /*
  266.      * Leaf Data Format
  267.      */
  268.     struct Data
  269.     {
  270. UINT8 pName[1];
  271.     } PACKING;
  272.     /*
  273.      * Constructor/Destructor
  274.      */
  275.     CQT_name_Atom(ULONG32 ulOffset,
  276.   ULONG32 ulSize, 
  277.   CQTAtom *pParent) : CQTAtom(ulOffset,
  278.       ulSize,
  279.       pParent) {;}
  280.     /*
  281.      * Required Virtual Methods
  282.      */
  283.     virtual BOOL IsLeafType(void)    { return TRUE; }
  284.     virtual QTAtomType GetType(void)     { return QT_name; }
  285. };
  286. /****************************************************************************
  287.  *  hinf Atom Class
  288.  */
  289. class CQT_hinf_Atom : public CQTAtom
  290. {
  291. public:
  292.     /*
  293.      * Constructor/Destructor
  294.      */
  295.     CQT_hinf_Atom(ULONG32 ulOffset,
  296.   ULONG32 ulSize, 
  297.   CQTAtom *pParent) : CQTAtom(ulOffset,
  298.       ulSize,
  299.       pParent) {;}
  300.     /*
  301.      * Required Virtual Methods
  302.      */
  303.     virtual BOOL IsLeafType(void)    { return FALSE; }
  304.     virtual QTAtomType GetType(void)     { return QT_hinf; }
  305. };
  306. /****************************************************************************
  307.  *  trpy Atom Class
  308.  */
  309. class CQT_trpy_Atom : public CQTAtom
  310. {
  311. public:
  312.     /*
  313.      * Leaf Data Format
  314.      */
  315.     struct Data
  316.     {
  317. UINT8 pBytesToSendHi[4];    // not including Net. headers
  318. UINT8 pBytesToSendLo[4];    // not including Net. headers
  319.     } PACKING;
  320.     /*
  321.      * Constructor/Destructor
  322.      */
  323.     CQT_trpy_Atom(ULONG32 ulOffset,
  324.   ULONG32 ulSize, 
  325.   CQTAtom *pParent) : CQTAtom(ulOffset,
  326.       ulSize,
  327.       pParent) {;}
  328.     /*
  329.      * Required Virtual Methods
  330.      */
  331.     virtual BOOL IsLeafType(void)    { return TRUE; }
  332.     virtual QTAtomType GetType(void)     { return QT_trpy; }
  333.     /*
  334.      * Data Access Methods
  335.      */
  336.     ULONG32 Get_BytesToSend(void)
  337.     {
  338. HX_ASSERT(m_pData);
  339. return GetUL32(((Data*) m_pData)->pBytesToSendLo);
  340.     }
  341. };
  342. /****************************************************************************
  343.  *  nump Atom Class
  344.  */
  345. class CQT_nump_Atom : public CQTAtom
  346. {
  347. public:
  348.     /*
  349.      * Leaf Data Format
  350.      */
  351.     struct Data
  352.     {
  353. UINT8 pPacketsToSendHi[4];
  354. UINT8 pPacketsToSendLo[4];
  355.     } PACKING;
  356.     /*
  357.      * Constructor/Destructor
  358.      */
  359.     CQT_nump_Atom(ULONG32 ulOffset,
  360.   ULONG32 ulSize, 
  361.   CQTAtom *pParent) : CQTAtom(ulOffset,
  362.       ulSize,
  363.       pParent) {;}
  364.     /*
  365.      * Required Virtual Methods
  366.      */
  367.     virtual BOOL IsLeafType(void)    { return TRUE; }
  368.     virtual QTAtomType GetType(void)     { return QT_nump; }
  369.     /*
  370.      * Data Access Methods
  371.      */
  372.     ULONG32 Get_PacketsToSend(void)
  373.     {
  374. HX_ASSERT(m_pData);
  375. return GetUL32(((Data*) m_pData)->pPacketsToSendLo);
  376.     }
  377. };
  378. /****************************************************************************
  379.  *  tpyl Atom Class
  380.  */
  381. class CQT_tpyl_Atom : public CQTAtom
  382. {
  383. public:
  384.     /*
  385.      * Leaf Data Format
  386.      */
  387.     struct Data
  388.     {
  389. UINT8 pBytesToSendHi[4];    // not including RTP or Net. headers
  390. UINT8 pBytesToSendLo[4];    // not including RTP or Net. headers
  391.     } PACKING;
  392.     /*
  393.      * Constructor/Destructor
  394.      */
  395.     CQT_tpyl_Atom(ULONG32 ulOffset,
  396.   ULONG32 ulSize, 
  397.   CQTAtom *pParent) : CQTAtom(ulOffset,
  398.       ulSize,
  399.       pParent) {;}
  400.     /*
  401.      * Required Virtual Methods
  402.      */
  403.     virtual BOOL IsLeafType(void)    { return TRUE; }
  404.     virtual QTAtomType GetType(void)     { return QT_tpyl; }
  405.     /*
  406.      * Data Access Methods
  407.      */
  408.     ULONG32 Get_BytesToSend(void)
  409.     {
  410. HX_ASSERT(m_pData);
  411. return GetUL32(((Data*) m_pData)->pBytesToSendLo);
  412.     }
  413. };
  414. /****************************************************************************
  415.  *  payt Atom Class
  416.  */
  417. class CQT_payt_Atom : public CQTAtom
  418. {
  419. public:
  420.     /*
  421.      * Leaf Data Format
  422.      */
  423.     struct Data
  424.     {
  425. UINT8 pPayloadType[4];    
  426. UINT8 pPayloadString[1];    // Pascal String
  427.     } PACKING;
  428.     /*
  429.      * Constructor/Destructor
  430.      */
  431.     CQT_payt_Atom(ULONG32 ulOffset,
  432.   ULONG32 ulSize, 
  433.   CQTAtom *pParent) : CQTAtom(ulOffset,
  434.       ulSize,
  435.       pParent) {;}
  436.     /*
  437.      * Required Virtual Methods
  438.      */
  439.     virtual BOOL IsLeafType(void)    { return TRUE; }
  440.     virtual QTAtomType GetType(void)     { return QT_payt; }
  441.     /*
  442.      * Data Access Methods
  443.      */
  444.     ULONG32 Get_PayloadType(void)
  445.     {
  446. HX_ASSERT(m_pData);
  447. return GetUL32(((Data*) m_pData)->pPayloadType);
  448.     }
  449.     UINT8* Get_PayloadString(void)
  450.     {
  451. HX_ASSERT(m_pData);
  452. return (((Data*) m_pData)->pPayloadString);
  453.     }
  454. };
  455. /****************************************************************************
  456.  *  hnti Atom Class
  457.  */
  458. class CQT_hnti_Atom : public CQTAtom
  459. {
  460. public:
  461.     /*
  462.      * Constructor/Destructor
  463.      */
  464.     CQT_hnti_Atom(ULONG32 ulOffset,
  465.   ULONG32 ulSize, 
  466.   CQTAtom *pParent) : CQTAtom(ulOffset,
  467.       ulSize,
  468.       pParent) {;}
  469.     /*
  470.      * Required Virtual Methods
  471.      */
  472.     virtual BOOL IsLeafType(void)    { return FALSE; }
  473.     virtual QTAtomType GetType(void)     { return QT_hnti; }
  474. };
  475. /****************************************************************************
  476.  *  sdp Atom Class
  477.  */
  478. class CQT_sdp_Atom : public CQTAtom
  479. {
  480. public:
  481.     /*
  482.      * Leaf Data Format
  483.      */
  484.     struct Data
  485.     {
  486. UINT8 pDesc[1];
  487.     } PACKING;
  488.     /*
  489.      * Constructor/Destructor
  490.      */
  491.     CQT_sdp_Atom(ULONG32 ulOffset,
  492.   ULONG32 ulSize, 
  493.   CQTAtom *pParent) : CQTAtom(ulOffset,
  494.       ulSize,
  495.       pParent) {;}
  496.     /*
  497.      * Required Virtual Methods
  498.      */
  499.     virtual BOOL IsLeafType(void)    { return TRUE; }
  500.     virtual QTAtomType GetType(void)     { return QT_sdp; }
  501. };
  502. /****************************************************************************
  503.  *  rtp Atom Class
  504.  */
  505. class CQT_rtp_Atom : public CQTAtom
  506. {
  507. public:
  508.     /*
  509.      * Leaf Data Format
  510.      */
  511.     struct Data
  512.     {
  513. UINT8 pSubType[4];
  514. UINT8 pData[1];
  515.     } PACKING;
  516.     /*
  517.      * Constructor/Destructor
  518.      */
  519.     CQT_rtp_Atom(ULONG32 ulOffset,
  520.  ULONG32 ulSize, 
  521.  CQTAtom *pParent) : CQTAtom(ulOffset,
  522.      ulSize,
  523.      pParent) {;}
  524.     /*
  525.      * Data Access Methods
  526.      */
  527.     ULONG32 Get_SubType(void)
  528.     {
  529. HX_ASSERT(m_pData);
  530. return GetUL32(((Data*) m_pData)->pSubType);
  531.     }
  532.     UINT8* Get_Data(void)
  533.     {
  534. HX_ASSERT(m_pData);
  535. return ((Data*) m_pData)->pData;
  536.     }
  537.     /*
  538.      * Required Virtual Methods
  539.      */
  540.     virtual BOOL IsLeafType(void)    { return TRUE; }
  541.     virtual QTAtomType GetType(void)     { return QT_rtp; }
  542. };
  543. /****************************************************************************
  544.  *  trak Atom Class
  545.  */
  546. class CQT_trak_Atom : public CQTAtom
  547. {
  548. public:
  549.     /*
  550.      * Constructor/Destructor
  551.      */
  552.     CQT_trak_Atom(ULONG32 ulOffset,
  553.   ULONG32 ulSize, 
  554.   CQTAtom *pParent) : CQTAtom(ulOffset,
  555.       ulSize,
  556.       pParent) {;}
  557.     /*
  558.      * Required Virtual Methods
  559.      */
  560.     virtual BOOL IsLeafType(void)    { return FALSE; }
  561.     virtual QTAtomType GetType(void)     { return QT_trak; }
  562. };
  563. /****************************************************************************
  564.  *  tkhd Atom Class
  565.  */
  566. class CQT_tkhd_Atom : public CQTAtom
  567. {
  568. public:
  569.     /*
  570.      * Leaf Data Format
  571.      */
  572.     struct Data
  573.     {
  574. UINT8 pVersion[1]; 
  575. UINT8 pFlags[3];
  576. UINT8 pCreatTime[4]; 
  577. UINT8 pModifTime[4]; 
  578. UINT8 pTrackID[4];
  579. UINT8 pReserved1[4];
  580. UINT8 pDuration[4];
  581. UINT8 pReserved2[8];
  582. UINT8 pLayer[2];
  583. UINT8 pAltGroup[2];
  584. UINT8 pVolume[2];
  585. UINT8 pReserved3[2];
  586. UINT8 Matrix[36];
  587. UINT8 pTrackWidth[4];
  588. UINT8 pTrackHeight[4];
  589.     } PACKING;
  590.     /*
  591.      * Constructor/Destructor
  592.      */
  593.     CQT_tkhd_Atom(ULONG32 ulOffset,
  594.   ULONG32 ulSize, 
  595.   CQTAtom *pParent) : CQTAtom(ulOffset,
  596.       ulSize,
  597.       pParent) {;}
  598.     /*
  599.      * Required Virtual Methods
  600.      */
  601.     virtual BOOL IsLeafType(void)    { return TRUE; }
  602.     virtual QTAtomType GetType(void)     { return QT_tkhd; }
  603.     /*
  604.      * Data Access Methods
  605.      */
  606.     ULONG32 Get_TrackID(void)
  607.     {
  608. HX_ASSERT(m_pData);
  609. return GetUL32(((Data*) m_pData)->pTrackID);
  610.     }
  611.     ULONG32 Get_Duration(void)
  612.     {
  613. HX_ASSERT(m_pData);
  614. return GetUL32(((Data*) m_pData)->pDuration);
  615.     }
  616.     double Get_TrackWidth(void)
  617.     {
  618. HX_ASSERT(m_pData);
  619. return GetFixed32(((Data*) m_pData)->pTrackWidth);
  620.     }
  621.     double Get_TrackHeight(void)
  622.     {
  623. HX_ASSERT(m_pData);
  624. return GetFixed32(((Data*) m_pData)->pTrackHeight);
  625.     }
  626.     double Get_TrackMatrixTx(void)
  627.     {
  628. HX_ASSERT(m_pData);
  629. return GetFixed32((UINT8*)(((Data*) m_pData)->Matrix) +
  630. TKHD_MATRIX_TX_LOCATION);
  631.     }
  632.     double Get_TrackMatrixTy(void)
  633.     {
  634. HX_ASSERT(m_pData);
  635. return GetFixed32((UINT8*)(((Data*) m_pData)->Matrix) +
  636. TKHD_MATRIX_TY_LOCATION);
  637.     }
  638. };
  639. /****************************************************************************
  640.  *  mdia Atom Class
  641.  */
  642. class CQT_mdia_Atom : public CQTAtom
  643. {
  644. public:
  645.     /*
  646.      * Constructor/Destructor
  647.      */
  648.     CQT_mdia_Atom(ULONG32 ulOffset,
  649.   ULONG32 ulSize, 
  650.   CQTAtom *pParent) : CQTAtom(ulOffset,
  651.       ulSize,
  652.       pParent) {;}
  653.     /*
  654.      * Required Virtual Methods
  655.      */
  656.     virtual BOOL IsLeafType(void)    { return FALSE; }
  657.     virtual QTAtomType GetType(void)     { return QT_mdia; }
  658. };
  659. /****************************************************************************
  660.  *  mdhd Atom Class
  661.  */
  662. class CQT_mdhd_Atom : public CQTAtom
  663. {
  664. public:
  665.     /*
  666.      * Leaf Data Format
  667.      */
  668.     struct Data
  669.     {
  670. UINT8 pVersion[1]; 
  671. UINT8 pFlags[3];
  672. UINT8 pCreatTime[4]; 
  673. UINT8 pModifTime[4]; 
  674. UINT8 pTimeScale[4];
  675. UINT8 pDuration[4];
  676. UINT8 pLangCode[2];
  677. UINT8 pQuality[2];
  678.     } PACKING;
  679.     /*
  680.      * Constructor/Destructor
  681.      */
  682.     CQT_mdhd_Atom(ULONG32 ulOffset,
  683.   ULONG32 ulSize, 
  684.   CQTAtom *pParent) : CQTAtom(ulOffset,
  685.       ulSize,
  686.       pParent) {;}
  687.     /*
  688.      * Required Virtual Methods
  689.      */
  690.     virtual BOOL IsLeafType(void)    { return TRUE; }
  691.     virtual QTAtomType GetType(void)     { return QT_mdhd; }
  692.     /*
  693.      * Data Access Methods
  694.      */
  695.     ULONG32 Get_TimeScale(void)
  696.     {
  697. HX_ASSERT(m_pData);
  698. return GetUL32(((Data*) m_pData)->pTimeScale);
  699.     }
  700. };
  701. /****************************************************************************
  702.  *  hdlr Atom Class
  703.  */
  704. class CQT_hdlr_Atom : public CQTAtom
  705. {
  706. public:
  707.     /*
  708.      * Leaf Data Format
  709.      */
  710.     struct Data
  711.     {
  712. UINT8 pVersion[1]; 
  713. UINT8 pFlags[3];
  714. UINT8 pCompType[4]; 
  715. UINT8 pCompSubtype[4]; 
  716. UINT8 pCompManufacturer[4];
  717. UINT8 pCompFlags[4];
  718. UINT8 pCompFlagsMask[4];
  719. UINT8 pName[1];     // Pascal String
  720.     } PACKING;
  721.     /*
  722.      * Constructor/Destructor
  723.      */
  724.     CQT_hdlr_Atom(ULONG32 ulOffset,
  725.   ULONG32 ulSize, 
  726.   CQTAtom *pParent) : CQTAtom(ulOffset,
  727.       ulSize,
  728.       pParent) {;}
  729.     /*
  730.      * Required Virtual Methods
  731.      */
  732.     virtual BOOL IsLeafType(void)    { return TRUE; }
  733.     virtual QTAtomType GetType(void)     { return QT_hdlr; }
  734.     /*
  735.      * Data Access Methods
  736.      */
  737.     ULONG32 Get_CompType(void)
  738.     {
  739. HX_ASSERT(m_pData);
  740. return GetUL32(((Data*) m_pData)->pCompType);
  741.     }
  742.     ULONG32 Get_CompSubtype(void)
  743.     {
  744. HX_ASSERT(m_pData);
  745. return GetUL32(((Data*) m_pData)->pCompSubtype);
  746.     }
  747. };
  748. /****************************************************************************
  749.  *  minf Atom Class
  750.  */
  751. class CQT_minf_Atom : public CQTAtom
  752. {
  753. public:
  754.     /*
  755.      * Constructor/Destructor
  756.      */
  757.     CQT_minf_Atom(ULONG32 ulOffset,
  758.   ULONG32 ulSize, 
  759.   CQTAtom *pParent) : CQTAtom(ulOffset,
  760.       ulSize,
  761.       pParent) {;}
  762.     /*
  763.      * Required Virtual Methods
  764.      */
  765.     virtual BOOL IsLeafType(void)    { return FALSE; }
  766.     virtual QTAtomType GetType(void)     { return QT_minf; }
  767. };
  768. /****************************************************************************
  769.  *  dinf Atom Class
  770.  */
  771. class CQT_dinf_Atom : public CQTAtom
  772. {
  773. public:
  774.     /*
  775.      * Constructor/Destructor
  776.      */
  777.     CQT_dinf_Atom(ULONG32 ulOffset,
  778.   ULONG32 ulSize, 
  779.   CQTAtom *pParent) : CQTAtom(ulOffset,
  780.       ulSize,
  781.       pParent) {;}
  782.     /*
  783.      * Required Virtual Methods
  784.      */
  785.     virtual BOOL IsLeafType(void)    { return FALSE; }
  786.     virtual QTAtomType GetType(void)     { return QT_dinf; }
  787. };
  788. /****************************************************************************
  789.  *  dref Atom Class
  790.  */
  791. #define QT_SELFREF_FLAG 0x00000001
  792. #define QT_ALIS_END     -1 /* Last Marker */
  793. #define QT_ALIS_ABSPATH     2 /* Absolute path name marker */
  794. #define QT_ALIS_MAXCOUNT    10 /* Maximum number of Markers */
  795. class CQT_dref_Atom : public CQTAtom
  796. {
  797. public:
  798.     /*
  799.      * Leaf Data Format
  800.      */
  801.     struct ItemEntry
  802.     {
  803. UINT8 pType[2];   // type of information
  804. UINT8 pSize[2];   // size of variable data
  805. UINT8 pData[1];   // actual data
  806.     } varInfo;
  807.     
  808.     struct DataRef
  809.     {
  810. UINT8 pReserved1[130];
  811. UINT8 pNLvlFrom[2]; // # of levels from fromFile/toFile until
  812. UINT8 pNLvlTo[2]; // a common ancestor directory is found
  813. UINT8 pReserved2[16];
  814. UINT8 pArray[1]; // variable length info
  815.     } PACKING;
  816.     struct ArrayEntry
  817.     {
  818. UINT8 pSize[4];
  819. UINT8 pType[4];
  820. UINT8 pVersion[1];
  821. UINT8 pFlags[3];
  822. UINT8 pDataRef[1];
  823.     } PACKING;
  824.     struct Data
  825.     {
  826. UINT8 pVersion[1]; 
  827. UINT8 pFlags[3]; 
  828. UINT8 pNumEntries[4]; 
  829. UINT8 pArray[1];
  830.     } PACKING;
  831.     /*
  832.      * Constructor/Destructor
  833.      */
  834.     CQT_dref_Atom(ULONG32 ulOffset,
  835.   ULONG32 ulSize, 
  836.   CQTAtom *pParent) : CQTAtom(ulOffset,
  837.       ulSize,
  838.       pParent) {;}
  839.     /*
  840.      * Required Virtual Methods
  841.      */
  842.     virtual BOOL IsLeafType(void)    { return TRUE; }
  843.     virtual QTAtomType GetType(void)     { return QT_dref; }
  844.     /*
  845.      * Data Access Methods
  846.      */
  847.     ULONG32 Get_NumEntries(void)
  848.     {
  849. HX_ASSERT(m_pData);
  850. return GetUL32(((Data*) m_pData)->pNumEntries);
  851.     }
  852.     CQT_dref_Atom::ArrayEntry* GetRefEntry(ULONG32 ulArrayIdx)
  853.     {
  854. HX_ASSERT(m_pData);
  855. HX_ASSERT(ulArrayIdx < Get_NumEntries());
  856. return (ArrayEntry*) FindArrayEntry(((Data*) m_pData)->pArray,
  857.     ulArrayIdx);
  858.     }
  859.     ULONG32 Get_RefType(ULONG32 ulArrayIdx)
  860.     {
  861. HX_ASSERT(m_pData);
  862. HX_ASSERT(ulArrayIdx < Get_NumEntries());
  863. return GetUL32(((ArrayEntry*) FindArrayEntry(
  864. ((Data*) m_pData)->pArray,
  865. ulArrayIdx))->pType);
  866.     }
  867.     ULONG32 Get_RefFlags(ULONG32 ulArrayIdx)
  868.     {
  869. HX_ASSERT(m_pData);
  870. HX_ASSERT(ulArrayIdx < Get_NumEntries());
  871. return GetFlags(((ArrayEntry*) FindArrayEntry(
  872. ((Data*) m_pData)->pArray,
  873. ulArrayIdx))->pFlags);
  874.     }
  875.     ULONG32 Get_RefType(CQT_dref_Atom::ArrayEntry* pRefEntry)
  876.     {
  877. HX_ASSERT(pRefEntry);
  878. return GetUL32(pRefEntry->pType);
  879.     }
  880.     ULONG32 Get_RefFlags(CQT_dref_Atom::ArrayEntry* pRefEntry)
  881.     {
  882. HX_ASSERT(pRefEntry);
  883. return GetFlags(pRefEntry->pFlags);
  884.     }
  885.     CQT_dref_Atom::DataRef* Get_RefData
  886.     (
  887. CQT_dref_Atom::ArrayEntry* pRefEntry
  888.     )
  889.     {
  890. HX_ASSERT(pRefEntry);
  891. return (CQT_dref_Atom::DataRef*) pRefEntry->pDataRef;
  892.     }
  893.     ULONG32 Get_RefDataLen(CQT_dref_Atom::ArrayEntry* pRefEntry)
  894.     {
  895. HX_ASSERT(pRefEntry);
  896. return (GetUL32(pRefEntry->pSize) - sizeof(ArrayEntry) + 1);
  897.     }
  898. };
  899. /****************************************************************************
  900.  *  stbl Atom Class
  901.  */
  902. class CQT_stbl_Atom : public CQTAtom
  903. {
  904. public:
  905.     /*
  906.      * Constructor/Destructor
  907.      */
  908.     CQT_stbl_Atom(ULONG32 ulOffset,
  909.   ULONG32 ulSize, 
  910.   CQTAtom *pParent) : CQTAtom(ulOffset,
  911.       ulSize,
  912.       pParent) {;}
  913.     /*
  914.      * Required Virtual Methods
  915.      */
  916.     virtual BOOL IsLeafType(void)    { return FALSE; }
  917.     virtual QTAtomType GetType(void)     { return QT_stbl; }
  918. };
  919. /****************************************************************************
  920.  *  stsd Atom Class
  921.  */
  922. class CQT_stsd_Atom : public CQTAtom
  923. {
  924. public:
  925.     /*
  926.      * Leaf Data Format
  927.      */
  928.     struct TaggedEntry
  929.     {
  930. UINT8 pSize[4];
  931. UINT8 pTag[4];
  932. UINT8 pData[1];
  933.     } PACKING;
  934.     class ArrayEntry
  935.     {
  936.     public:
  937. UINT8 pSize[4];
  938. UINT8 pDataFormat[4];
  939. UINT8 pReserved[6];
  940. UINT8 pDataRefIdx[2];
  941.     } PACKING;
  942.     class HintArrayEntry : public ArrayEntry
  943.     {
  944.     public:
  945. UINT8 pHintTrakVersion[2];
  946. UINT8 pLastCompHintTrakVersion[2];
  947. UINT8 pMaxPacketSize[4];
  948. UINT8 pTaggedArray[1];
  949.     } PACKING;
  950.     class AudioArrayEntry : public ArrayEntry // just a space holder in MP4
  951.     {
  952.     public:
  953. UINT8 pVersion[2];
  954. UINT8 pRevLevel[2];
  955. UINT8 pVendor[4];
  956. UINT8 pNumChannels[2];
  957. UINT8 pSampleSize[2];
  958. UINT8 pCompressionID[2];
  959. UINT8 pPacketSize[2];
  960. UINT8 pSampleRate[4];
  961.     } PACKING;
  962.     class VideoArrayEntry : public ArrayEntry
  963.     {
  964.     public:
  965. UINT8 pVersion[2];
  966. UINT8 pRevision[2];
  967. UINT8 pVendor[4];
  968. UINT8 pTemporalQuality[4];
  969. UINT8 pSpatialQuality[4];
  970. UINT8 pWidth[2];
  971. UINT8 pHeight[2];
  972. UINT8 pHRes[4];
  973. UINT8 pVRes[4];
  974. UINT8 pDataSize[4];
  975. UINT8 pFrameCount[2];
  976. UINT8 pName[32];
  977. UINT8 pDepth[2];
  978. UINT8 pClutID[2];
  979.     } PACKING;
  980.     class AudioMP4ArrayEntry : public AudioArrayEntry
  981.     {
  982.     public:
  983. UINT8 pSize[4];
  984. UINT8 pType[4];
  985. UINT8 pVersion[1];
  986. UINT8 pFlags[3];
  987. UINT8 pESDescriptor[1];
  988.     } PACKING;
  989.     class VideoMP4ArrayEntry : public VideoArrayEntry
  990.     {
  991.     public:
  992. UINT8 pSize[4];
  993. UINT8 pType[4];
  994. UINT8 pVersion[1];
  995. UINT8 pFlags[3];
  996. UINT8 pESDescriptor[1];
  997.     } PACKING;
  998.     class AudioSAMRArrayEntry : public AudioArrayEntry
  999.     {
  1000.     public:
  1001. UINT8 pDecoderSpecificInfo[1];
  1002.     } PACKING;
  1003.     class AudioSAWBArrayEntry : public AudioArrayEntry
  1004.     {
  1005.     public:
  1006. UINT8 pDecoderSpecificInfo[1];
  1007.     } PACKING;
  1008.     class VideoS263ArrayEntry : public VideoArrayEntry
  1009.     {
  1010.     public:
  1011. UINT8 pDecoderSpecificInfo[1];
  1012.     } PACKING;
  1013.     class AudioALACArrayEntry : public AudioArrayEntry
  1014.     {
  1015.     public:
  1016. UINT8 pDecoderSpecificInfo[1];
  1017.     } PACKING;
  1018.     ////////////////////////////////
  1019.     // /  3GPP Timed Text structs: 
  1020.     ///
  1021.     class BoxRecord
  1022.     {
  1023.     public:
  1024. INT16 top;
  1025. INT16 left;
  1026. INT16 bottom;
  1027. INT16 right;
  1028.     } PACKING;
  1029.     class StyleRecord
  1030.     {
  1031.     public:
  1032. UINT16 startChar;
  1033. UINT16 endChar;
  1034. UINT16 fontID;
  1035. UINT8  faceStyleFlags;
  1036. UINT8  fontSize;
  1037. UINT8  textColorRGBA[4];
  1038.     } PACKING;
  1039.     class FontRecord
  1040.     {
  1041.     public:
  1042. UINT16 fontID;
  1043. UINT8  fontNameLength;
  1044. UINT8* pFont; // /There are [fontNameLength] bytes in the string;
  1045.     } PACKING;
  1046.     class FontTableBox // / 慺tab