qtatoms.h
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:48k
源码类别:

Symbian

开发平台:

C/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.     // /-->> 3GPP Timed Text box types:
  125.     , QT_text = QT_ENCODE_TYPE('t', 'e', 'x', 't')
  126.     , QT_tx3g = QT_ENCODE_TYPE('t', 'x', '3', 'g')
  127.     , QT_ftab = QT_ENCODE_TYPE('f', 't', 'a', 'b')
  128.     , QT_styl = QT_ENCODE_TYPE('s', 't', 'y', 'l')
  129.     , QT_hlit = QT_ENCODE_TYPE('h', 'l', 'i', 't')
  130.     , QT_hclr = QT_ENCODE_TYPE('h', 'c', 'l', 'r')
  131.     , QT_krok = QT_ENCODE_TYPE('k', 'r', 'o', 'k')
  132.     , QT_href = QT_ENCODE_TYPE('h', 'r', 'e', 'f')
  133.     , QT_tbox = QT_ENCODE_TYPE('t', 'b', 'o', 'x')
  134.     , QT_blnk = QT_ENCODE_TYPE('b', 'l', 'n', 'k')
  135.     // /<<-- end 3GPP Timed Text box types.
  136. } QTKnownAtomType;
  137. /****************************************************************************
  138.  *  Atom factory
  139.  */
  140. extern CQTAtom* CreateQTAtom (QTAtomType AtomType,
  141.  ULONG32 ulOffset,
  142.  ULONG32 ulSize,
  143.  CQTAtom *pParent,
  144.  ULONG32 ulAtomID    = 0,
  145.  UINT16 uChildCount  = 0);
  146. /****************************************************************************
  147.  *  Atom Classes
  148.  */
  149. /****************************************************************************
  150.  *  Root Atom Class - RN Data Type
  151.  */
  152. class CQTRootAtom : public CQTAtom
  153. {
  154. public:
  155.     /*
  156.      * Required Virtual Methods
  157.      */
  158.     virtual BOOL IsLeafType(void)    { return FALSE; }
  159.     virtual QTAtomType GetType(void)     { return QT_HXROOT; }
  160. };
  161. /****************************************************************************
  162.  *  moov Atom Class
  163.  */
  164. class CQT_moov_Atom : public CQTAtom
  165. {
  166. public:
  167.     /*
  168.      * Constructor/Destructor
  169.      */
  170.     CQT_moov_Atom(ULONG32 ulOffset,
  171.   ULONG32 ulSize, 
  172.   CQTAtom *pParent) : CQTAtom(ulOffset,
  173.       ulSize,
  174.       pParent) {;}
  175.     /*
  176.      * Required Virtual Methods
  177.      */
  178.     virtual BOOL IsLeafType(void)    { return FALSE; }
  179.     virtual QTAtomType GetType(void)     { return QT_moov; }
  180. };
  181. /****************************************************************************
  182.  *  mvhd Atom Class
  183.  */
  184. class CQT_mvhd_Atom : public CQTAtom
  185. {
  186. public:
  187.     /*
  188.      * Leaf Data Format
  189.      */
  190.     struct Data
  191.     {
  192. UINT8 pVersion[1]; 
  193. UINT8 pFlags[3];
  194. UINT8 pCreatTime[4]; 
  195. UINT8 pModifTime[4]; 
  196. UINT8 pTimeScale[4];
  197. UINT8 pDuration[4];
  198. UINT8 pPrefRate[4];
  199. UINT8 pPrefVolume[2];
  200. UINT8 pReserved[10];
  201. UINT8 pMatrix[36];
  202. UINT8 pPrevTime[4];
  203. UINT8 pPrevDuration[4];
  204. UINT8 pPosterTime[4];
  205. UINT8 pSelectionTime[4];
  206. UINT8 pSelectionDuration[4];
  207. UINT8 pCurrentTime[4];
  208. UINT8 pNextTrackID[4];
  209.     } PACKING;
  210.     /*
  211.      * Constructor/Destructor
  212.      */
  213.     CQT_mvhd_Atom(ULONG32 ulOffset,
  214.   ULONG32 ulSize, 
  215.   CQTAtom *pParent) : CQTAtom(ulOffset,
  216.       ulSize,
  217.       pParent) {;}
  218.     /*
  219.      * Required Virtual Methods
  220.      */
  221.     virtual BOOL IsLeafType(void)    { return TRUE; }
  222.     virtual QTAtomType GetType(void)     { return QT_mvhd; }
  223.     /*
  224.      * Data Access Methods
  225.      */
  226.     ULONG32 Get_TimeScale(void)
  227.     {
  228. HX_ASSERT(m_pData);
  229. return GetUL32(((Data*) m_pData)->pTimeScale);
  230.     }
  231.     ULONG32 Get_Duration(void)
  232.     {
  233. HX_ASSERT(m_pData);
  234. return GetUL32(((Data*) m_pData)->pDuration);
  235.     }
  236. };
  237. /****************************************************************************
  238.  *  udta Atom Class
  239.  */
  240. #define QT_UDTA_TERMINATOR_LENGTH   4
  241. class CQT_udta_Atom : public CQTAtom
  242. {
  243. public:
  244.     /*
  245.      * Constructor/Destructor
  246.      */
  247.     CQT_udta_Atom(ULONG32 ulOffset,
  248.   ULONG32 ulSize, 
  249.   CQTAtom *pParent) : CQTAtom(ulOffset,
  250.       ulSize,
  251.       pParent) {;}
  252.     /*
  253.      * Required Virtual Methods
  254.      */
  255.     virtual BOOL IsLeafType(void)    { return FALSE; }
  256.     virtual QTAtomType GetType(void)     { return QT_udta; }
  257. };
  258. /****************************************************************************
  259.  *  name Atom Class
  260.  */
  261. class CQT_name_Atom : public CQTAtom
  262. {
  263. public:
  264.     /*
  265.      * Leaf Data Format
  266.      */
  267.     struct Data
  268.     {
  269. UINT8 pName[1];
  270.     } PACKING;
  271.     /*
  272.      * Constructor/Destructor
  273.      */
  274.     CQT_name_Atom(ULONG32 ulOffset,
  275.   ULONG32 ulSize, 
  276.   CQTAtom *pParent) : CQTAtom(ulOffset,
  277.       ulSize,
  278.       pParent) {;}
  279.     /*
  280.      * Required Virtual Methods
  281.      */
  282.     virtual BOOL IsLeafType(void)    { return TRUE; }
  283.     virtual QTAtomType GetType(void)     { return QT_name; }
  284. };
  285. /****************************************************************************
  286.  *  hinf Atom Class
  287.  */
  288. class CQT_hinf_Atom : public CQTAtom
  289. {
  290. public:
  291.     /*
  292.      * Constructor/Destructor
  293.      */
  294.     CQT_hinf_Atom(ULONG32 ulOffset,
  295.   ULONG32 ulSize, 
  296.   CQTAtom *pParent) : CQTAtom(ulOffset,
  297.       ulSize,
  298.       pParent) {;}
  299.     /*
  300.      * Required Virtual Methods
  301.      */
  302.     virtual BOOL IsLeafType(void)    { return FALSE; }
  303.     virtual QTAtomType GetType(void)     { return QT_hinf; }
  304. };
  305. /****************************************************************************
  306.  *  trpy Atom Class
  307.  */
  308. class CQT_trpy_Atom : public CQTAtom
  309. {
  310. public:
  311.     /*
  312.      * Leaf Data Format
  313.      */
  314.     struct Data
  315.     {
  316. UINT8 pBytesToSendHi[4];    // not including Net. headers
  317. UINT8 pBytesToSendLo[4];    // not including Net. headers
  318.     } PACKING;
  319.     /*
  320.      * Constructor/Destructor
  321.      */
  322.     CQT_trpy_Atom(ULONG32 ulOffset,
  323.   ULONG32 ulSize, 
  324.   CQTAtom *pParent) : CQTAtom(ulOffset,
  325.       ulSize,
  326.       pParent) {;}
  327.     /*
  328.      * Required Virtual Methods
  329.      */
  330.     virtual BOOL IsLeafType(void)    { return TRUE; }
  331.     virtual QTAtomType GetType(void)     { return QT_trpy; }
  332.     /*
  333.      * Data Access Methods
  334.      */
  335.     ULONG32 Get_BytesToSend(void)
  336.     {
  337. HX_ASSERT(m_pData);
  338. return GetUL32(((Data*) m_pData)->pBytesToSendLo);
  339.     }
  340. };
  341. /****************************************************************************
  342.  *  nump Atom Class
  343.  */
  344. class CQT_nump_Atom : public CQTAtom
  345. {
  346. public:
  347.     /*
  348.      * Leaf Data Format
  349.      */
  350.     struct Data
  351.     {
  352. UINT8 pPacketsToSendHi[4];
  353. UINT8 pPacketsToSendLo[4];
  354.     } PACKING;
  355.     /*
  356.      * Constructor/Destructor
  357.      */
  358.     CQT_nump_Atom(ULONG32 ulOffset,
  359.   ULONG32 ulSize, 
  360.   CQTAtom *pParent) : CQTAtom(ulOffset,
  361.       ulSize,
  362.       pParent) {;}
  363.     /*
  364.      * Required Virtual Methods
  365.      */
  366.     virtual BOOL IsLeafType(void)    { return TRUE; }
  367.     virtual QTAtomType GetType(void)     { return QT_nump; }
  368.     /*
  369.      * Data Access Methods
  370.      */
  371.     ULONG32 Get_PacketsToSend(void)
  372.     {
  373. HX_ASSERT(m_pData);
  374. return GetUL32(((Data*) m_pData)->pPacketsToSendLo);
  375.     }
  376. };
  377. /****************************************************************************
  378.  *  tpyl Atom Class
  379.  */
  380. class CQT_tpyl_Atom : public CQTAtom
  381. {
  382. public:
  383.     /*
  384.      * Leaf Data Format
  385.      */
  386.     struct Data
  387.     {
  388. UINT8 pBytesToSendHi[4];    // not including RTP or Net. headers
  389. UINT8 pBytesToSendLo[4];    // not including RTP or Net. headers
  390.     } PACKING;
  391.     /*
  392.      * Constructor/Destructor
  393.      */
  394.     CQT_tpyl_Atom(ULONG32 ulOffset,
  395.   ULONG32 ulSize, 
  396.   CQTAtom *pParent) : CQTAtom(ulOffset,
  397.       ulSize,
  398.       pParent) {;}
  399.     /*
  400.      * Required Virtual Methods
  401.      */
  402.     virtual BOOL IsLeafType(void)    { return TRUE; }
  403.     virtual QTAtomType GetType(void)     { return QT_tpyl; }
  404.     /*
  405.      * Data Access Methods
  406.      */
  407.     ULONG32 Get_BytesToSend(void)
  408.     {
  409. HX_ASSERT(m_pData);
  410. return GetUL32(((Data*) m_pData)->pBytesToSendLo);
  411.     }
  412. };
  413. /****************************************************************************
  414.  *  payt Atom Class
  415.  */
  416. class CQT_payt_Atom : public CQTAtom
  417. {
  418. public:
  419.     /*
  420.      * Leaf Data Format
  421.      */
  422.     struct Data
  423.     {
  424. UINT8 pPayloadType[4];    
  425. UINT8 pPayloadString[1];    // Pascal String
  426.     } PACKING;
  427.     /*
  428.      * Constructor/Destructor
  429.      */
  430.     CQT_payt_Atom(ULONG32 ulOffset,
  431.   ULONG32 ulSize, 
  432.   CQTAtom *pParent) : CQTAtom(ulOffset,
  433.       ulSize,
  434.       pParent) {;}
  435.     /*
  436.      * Required Virtual Methods
  437.      */
  438.     virtual BOOL IsLeafType(void)    { return TRUE; }
  439.     virtual QTAtomType GetType(void)     { return QT_payt; }
  440.     /*
  441.      * Data Access Methods
  442.      */
  443.     ULONG32 Get_PayloadType(void)
  444.     {
  445. HX_ASSERT(m_pData);
  446. return GetUL32(((Data*) m_pData)->pPayloadType);
  447.     }
  448.     UINT8* Get_PayloadString(void)
  449.     {
  450. HX_ASSERT(m_pData);
  451. return (((Data*) m_pData)->pPayloadString);
  452.     }
  453. };
  454. /****************************************************************************
  455.  *  hnti Atom Class
  456.  */
  457. class CQT_hnti_Atom : public CQTAtom
  458. {
  459. public:
  460.     /*
  461.      * Constructor/Destructor
  462.      */
  463.     CQT_hnti_Atom(ULONG32 ulOffset,
  464.   ULONG32 ulSize, 
  465.   CQTAtom *pParent) : CQTAtom(ulOffset,
  466.       ulSize,
  467.       pParent) {;}
  468.     /*
  469.      * Required Virtual Methods
  470.      */
  471.     virtual BOOL IsLeafType(void)    { return FALSE; }
  472.     virtual QTAtomType GetType(void)     { return QT_hnti; }
  473. };
  474. /****************************************************************************
  475.  *  sdp Atom Class
  476.  */
  477. class CQT_sdp_Atom : public CQTAtom
  478. {
  479. public:
  480.     /*
  481.      * Leaf Data Format
  482.      */
  483.     struct Data
  484.     {
  485. UINT8 pDesc[1];
  486.     } PACKING;
  487.     /*
  488.      * Constructor/Destructor
  489.      */
  490.     CQT_sdp_Atom(ULONG32 ulOffset,
  491.   ULONG32 ulSize, 
  492.   CQTAtom *pParent) : CQTAtom(ulOffset,
  493.       ulSize,
  494.       pParent) {;}
  495.     /*
  496.      * Required Virtual Methods
  497.      */
  498.     virtual BOOL IsLeafType(void)    { return TRUE; }
  499.     virtual QTAtomType GetType(void)     { return QT_sdp; }
  500. };
  501. /****************************************************************************
  502.  *  rtp Atom Class
  503.  */
  504. class CQT_rtp_Atom : public CQTAtom
  505. {
  506. public:
  507.     /*
  508.      * Leaf Data Format
  509.      */
  510.     struct Data
  511.     {
  512. UINT8 pSubType[4];
  513. UINT8 pData[1];
  514.     } PACKING;
  515.     /*
  516.      * Constructor/Destructor
  517.      */
  518.     CQT_rtp_Atom(ULONG32 ulOffset,
  519.  ULONG32 ulSize, 
  520.  CQTAtom *pParent) : CQTAtom(ulOffset,
  521.      ulSize,
  522.      pParent) {;}
  523.     /*
  524.      * Data Access Methods
  525.      */
  526.     ULONG32 Get_SubType(void)
  527.     {
  528. HX_ASSERT(m_pData);
  529. return GetUL32(((Data*) m_pData)->pSubType);
  530.     }
  531.     UINT8* Get_Data(void)
  532.     {
  533. HX_ASSERT(m_pData);
  534. return ((Data*) m_pData)->pData;
  535.     }
  536.     /*
  537.      * Required Virtual Methods
  538.      */
  539.     virtual BOOL IsLeafType(void)    { return TRUE; }
  540.     virtual QTAtomType GetType(void)     { return QT_rtp; }
  541. };
  542. /****************************************************************************
  543.  *  trak Atom Class
  544.  */
  545. class CQT_trak_Atom : public CQTAtom
  546. {
  547. public:
  548.     /*
  549.      * Constructor/Destructor
  550.      */
  551.     CQT_trak_Atom(ULONG32 ulOffset,
  552.   ULONG32 ulSize, 
  553.   CQTAtom *pParent) : CQTAtom(ulOffset,
  554.       ulSize,
  555.       pParent) {;}
  556.     /*
  557.      * Required Virtual Methods
  558.      */
  559.     virtual BOOL IsLeafType(void)    { return FALSE; }
  560.     virtual QTAtomType GetType(void)     { return QT_trak; }
  561. };
  562. /****************************************************************************
  563.  *  tkhd Atom Class
  564.  */
  565. class CQT_tkhd_Atom : public CQTAtom
  566. {
  567. public:
  568.     /*
  569.      * Leaf Data Format
  570.      */
  571.     struct Data
  572.     {
  573. UINT8 pVersion[1]; 
  574. UINT8 pFlags[3];
  575. UINT8 pCreatTime[4]; 
  576. UINT8 pModifTime[4]; 
  577. UINT8 pTrackID[4];
  578. UINT8 pReserved1[4];
  579. UINT8 pDuration[4];
  580. UINT8 pReserved2[8];
  581. UINT8 pLayer[2];
  582. UINT8 pAltGroup[2];
  583. UINT8 pVolume[2];
  584. UINT8 pReserved3[2];
  585. UINT8 Matrix[36];
  586. UINT8 pTrackWidth[4];
  587. UINT8 pTrackHeight[4];
  588.     } PACKING;
  589.     /*
  590.      * Constructor/Destructor
  591.      */
  592.     CQT_tkhd_Atom(ULONG32 ulOffset,
  593.   ULONG32 ulSize, 
  594.   CQTAtom *pParent) : CQTAtom(ulOffset,
  595.       ulSize,
  596.       pParent) {;}
  597.     /*
  598.      * Required Virtual Methods
  599.      */
  600.     virtual BOOL IsLeafType(void)    { return TRUE; }
  601.     virtual QTAtomType GetType(void)     { return QT_tkhd; }
  602.     /*
  603.      * Data Access Methods
  604.      */
  605.     ULONG32 Get_TrackID(void)
  606.     {
  607. HX_ASSERT(m_pData);
  608. return GetUL32(((Data*) m_pData)->pTrackID);
  609.     }
  610.     ULONG32 Get_Duration(void)
  611.     {
  612. HX_ASSERT(m_pData);
  613. return GetUL32(((Data*) m_pData)->pDuration);
  614.     }
  615.     double Get_TrackWidth(void)
  616.     {
  617. HX_ASSERT(m_pData);
  618. return GetFixed32(((Data*) m_pData)->pTrackWidth);
  619.     }
  620.     double Get_TrackHeight(void)
  621.     {
  622. HX_ASSERT(m_pData);
  623. return GetFixed32(((Data*) m_pData)->pTrackHeight);
  624.     }
  625.     double Get_TrackMatrixTx(void)
  626.     {
  627. HX_ASSERT(m_pData);
  628. return GetFixed32((UINT8*)(((Data*) m_pData)->Matrix) +
  629. TKHD_MATRIX_TX_LOCATION);
  630.     }
  631.     double Get_TrackMatrixTy(void)
  632.     {
  633. HX_ASSERT(m_pData);
  634. return GetFixed32((UINT8*)(((Data*) m_pData)->Matrix) +
  635. TKHD_MATRIX_TY_LOCATION);
  636.     }
  637. };
  638. /****************************************************************************
  639.  *  mdia Atom Class
  640.  */
  641. class CQT_mdia_Atom : public CQTAtom
  642. {
  643. public:
  644.     /*
  645.      * Constructor/Destructor
  646.      */
  647.     CQT_mdia_Atom(ULONG32 ulOffset,
  648.   ULONG32 ulSize, 
  649.   CQTAtom *pParent) : CQTAtom(ulOffset,
  650.       ulSize,
  651.       pParent) {;}
  652.     /*
  653.      * Required Virtual Methods
  654.      */
  655.     virtual BOOL IsLeafType(void)    { return FALSE; }
  656.     virtual QTAtomType GetType(void)     { return QT_mdia; }
  657. };
  658. /****************************************************************************
  659.  *  mdhd Atom Class
  660.  */
  661. class CQT_mdhd_Atom : public CQTAtom
  662. {
  663. public:
  664.     /*
  665.      * Leaf Data Format
  666.      */
  667.     struct Data
  668.     {
  669. UINT8 pVersion[1]; 
  670. UINT8 pFlags[3];
  671. UINT8 pCreatTime[4]; 
  672. UINT8 pModifTime[4]; 
  673. UINT8 pTimeScale[4];
  674. UINT8 pDuration[4];
  675. UINT8 pLangCode[2];
  676. UINT8 pQuality[2];
  677.     } PACKING;
  678.     /*
  679.      * Constructor/Destructor
  680.      */
  681.     CQT_mdhd_Atom(ULONG32 ulOffset,
  682.   ULONG32 ulSize, 
  683.   CQTAtom *pParent) : CQTAtom(ulOffset,
  684.       ulSize,
  685.       pParent) {;}
  686.     /*
  687.      * Required Virtual Methods
  688.      */
  689.     virtual BOOL IsLeafType(void)    { return TRUE; }
  690.     virtual QTAtomType GetType(void)     { return QT_mdhd; }
  691.     /*
  692.      * Data Access Methods
  693.      */
  694.     ULONG32 Get_TimeScale(void)
  695.     {
  696. HX_ASSERT(m_pData);
  697. return GetUL32(((Data*) m_pData)->pTimeScale);
  698.     }
  699. };
  700. /****************************************************************************
  701.  *  hdlr Atom Class
  702.  */
  703. class CQT_hdlr_Atom : public CQTAtom
  704. {
  705. public:
  706.     /*
  707.      * Leaf Data Format
  708.      */
  709.     struct Data
  710.     {
  711. UINT8 pVersion[1]; 
  712. UINT8 pFlags[3];
  713. UINT8 pCompType[4]; 
  714. UINT8 pCompSubtype[4]; 
  715. UINT8 pCompManufacturer[4];
  716. UINT8 pCompFlags[4];
  717. UINT8 pCompFlagsMask[4];
  718. UINT8 pName[1];     // Pascal String
  719.     } PACKING;
  720.     /*
  721.      * Constructor/Destructor
  722.      */
  723.     CQT_hdlr_Atom(ULONG32 ulOffset,
  724.   ULONG32 ulSize, 
  725.   CQTAtom *pParent) : CQTAtom(ulOffset,
  726.       ulSize,
  727.       pParent) {;}
  728.     /*
  729.      * Required Virtual Methods
  730.      */
  731.     virtual BOOL IsLeafType(void)    { return TRUE; }
  732.     virtual QTAtomType GetType(void)     { return QT_hdlr; }
  733.     /*
  734.      * Data Access Methods
  735.      */
  736.     ULONG32 Get_CompType(void)
  737.     {
  738. HX_ASSERT(m_pData);
  739. return GetUL32(((Data*) m_pData)->pCompType);
  740.     }
  741.     ULONG32 Get_CompSubtype(void)
  742.     {
  743. HX_ASSERT(m_pData);
  744. return GetUL32(((Data*) m_pData)->pCompSubtype);
  745.     }
  746. };
  747. /****************************************************************************
  748.  *  minf Atom Class
  749.  */
  750. class CQT_minf_Atom : public CQTAtom
  751. {
  752. public:
  753.     /*
  754.      * Constructor/Destructor
  755.      */
  756.     CQT_minf_Atom(ULONG32 ulOffset,
  757.   ULONG32 ulSize, 
  758.   CQTAtom *pParent) : CQTAtom(ulOffset,
  759.       ulSize,
  760.       pParent) {;}
  761.     /*
  762.      * Required Virtual Methods
  763.      */
  764.     virtual BOOL IsLeafType(void)    { return FALSE; }
  765.     virtual QTAtomType GetType(void)     { return QT_minf; }
  766. };
  767. /****************************************************************************
  768.  *  dinf Atom Class
  769.  */
  770. class CQT_dinf_Atom : public CQTAtom
  771. {
  772. public:
  773.     /*
  774.      * Constructor/Destructor
  775.      */
  776.     CQT_dinf_Atom(ULONG32 ulOffset,
  777.   ULONG32 ulSize, 
  778.   CQTAtom *pParent) : CQTAtom(ulOffset,
  779.       ulSize,
  780.       pParent) {;}
  781.     /*
  782.      * Required Virtual Methods
  783.      */
  784.     virtual BOOL IsLeafType(void)    { return FALSE; }
  785.     virtual QTAtomType GetType(void)     { return QT_dinf; }
  786. };
  787. /****************************************************************************
  788.  *  dref Atom Class
  789.  */
  790. #define QT_SELFREF_FLAG 0x00000001
  791. #define QT_ALIS_END     -1 /* Last Marker */
  792. #define QT_ALIS_ABSPATH     2 /* Absolute path name marker */
  793. #define QT_ALIS_MAXCOUNT    10 /* Maximum number of Markers */
  794. class CQT_dref_Atom : public CQTAtom
  795. {
  796. public:
  797.     /*
  798.      * Leaf Data Format
  799.      */
  800.     struct ItemEntry
  801.     {
  802. UINT8 pType[2];   // type of information
  803. UINT8 pSize[2];   // size of variable data
  804. UINT8 pData[1];   // actual data
  805.     } varInfo;
  806.     
  807.     struct DataRef
  808.     {
  809. UINT8 pReserved1[130];
  810. UINT8 pNLvlFrom[2]; // # of levels from fromFile/toFile until
  811. UINT8 pNLvlTo[2]; // a common ancestor directory is found
  812. UINT8 pReserved2[16];
  813. UINT8 pArray[1]; // variable length info
  814.     } PACKING;
  815.     struct ArrayEntry
  816.     {
  817. UINT8 pSize[4];
  818. UINT8 pType[4];
  819. UINT8 pVersion[1];
  820. UINT8 pFlags[3];
  821. UINT8 pDataRef[1];
  822.     } PACKING;
  823.     struct Data
  824.     {
  825. UINT8 pVersion[1]; 
  826. UINT8 pFlags[3]; 
  827. UINT8 pNumEntries[4]; 
  828. UINT8 pArray[1];
  829.     } PACKING;
  830.     /*
  831.      * Constructor/Destructor
  832.      */
  833.     CQT_dref_Atom(ULONG32 ulOffset,
  834.   ULONG32 ulSize, 
  835.   CQTAtom *pParent) : CQTAtom(ulOffset,
  836.       ulSize,
  837.       pParent) {;}
  838.     /*
  839.      * Required Virtual Methods
  840.      */
  841.     virtual BOOL IsLeafType(void)    { return TRUE; }
  842.     virtual QTAtomType GetType(void)     { return QT_dref; }
  843.     /*
  844.      * Data Access Methods
  845.      */
  846.     ULONG32 Get_NumEntries(void)
  847.     {
  848. HX_ASSERT(m_pData);
  849. return GetUL32(((Data*) m_pData)->pNumEntries);
  850.     }
  851.     CQT_dref_Atom::ArrayEntry* GetRefEntry(ULONG32 ulArrayIdx)
  852.     {
  853. HX_ASSERT(m_pData);
  854. HX_ASSERT(ulArrayIdx < Get_NumEntries());
  855. return (ArrayEntry*) FindArrayEntry(((Data*) m_pData)->pArray,
  856.     ulArrayIdx);
  857.     }
  858.     ULONG32 Get_RefType(ULONG32 ulArrayIdx)
  859.     {
  860. HX_ASSERT(m_pData);
  861. HX_ASSERT(ulArrayIdx < Get_NumEntries());
  862. return GetUL32(((ArrayEntry*) FindArrayEntry(
  863. ((Data*) m_pData)->pArray,
  864. ulArrayIdx))->pType);
  865.     }
  866.     ULONG32 Get_RefFlags(ULONG32 ulArrayIdx)
  867.     {
  868. HX_ASSERT(m_pData);
  869. HX_ASSERT(ulArrayIdx < Get_NumEntries());
  870. return GetFlags(((ArrayEntry*) FindArrayEntry(
  871. ((Data*) m_pData)->pArray,
  872. ulArrayIdx))->pFlags);
  873.     }
  874.     ULONG32 Get_RefType(CQT_dref_Atom::ArrayEntry* pRefEntry)
  875.     {
  876. HX_ASSERT(pRefEntry);
  877. return GetUL32(pRefEntry->pType);
  878.     }
  879.     ULONG32 Get_RefFlags(CQT_dref_Atom::ArrayEntry* pRefEntry)
  880.     {
  881. HX_ASSERT(pRefEntry);
  882. return GetFlags(pRefEntry->pFlags);
  883.     }
  884.     CQT_dref_Atom::DataRef* Get_RefData
  885.     (
  886. CQT_dref_Atom::ArrayEntry* pRefEntry
  887.     )
  888.     {
  889. HX_ASSERT(pRefEntry);
  890. return (CQT_dref_Atom::DataRef*) pRefEntry->pDataRef;
  891.     }
  892.     ULONG32 Get_RefDataLen(CQT_dref_Atom::ArrayEntry* pRefEntry)
  893.     {
  894. HX_ASSERT(pRefEntry);
  895. return (GetUL32(pRefEntry->pSize) - sizeof(ArrayEntry) + 1);
  896.     }
  897. };
  898. /****************************************************************************
  899.  *  stbl Atom Class
  900.  */
  901. class CQT_stbl_Atom : public CQTAtom
  902. {
  903. public:
  904.     /*
  905.      * Constructor/Destructor
  906.      */
  907.     CQT_stbl_Atom(ULONG32 ulOffset,
  908.   ULONG32 ulSize, 
  909.   CQTAtom *pParent) : CQTAtom(ulOffset,
  910.       ulSize,
  911.       pParent) {;}
  912.     /*
  913.      * Required Virtual Methods
  914.      */
  915.     virtual BOOL IsLeafType(void)    { return FALSE; }
  916.     virtual QTAtomType GetType(void)     { return QT_stbl; }
  917. };
  918. /****************************************************************************
  919.  *  stsd Atom Class
  920.  */
  921. class CQT_stsd_Atom : public CQTAtom
  922. {
  923. public:
  924.     /*
  925.      * Leaf Data Format
  926.      */
  927.     struct TaggedEntry
  928.     {
  929. UINT8 pSize[4];
  930. UINT8 pTag[4];
  931. UINT8 pData[1];
  932.     } PACKING;
  933.     class ArrayEntry
  934.     {
  935.     public:
  936. UINT8 pSize[4];
  937. UINT8 pDataFormat[4];
  938. UINT8 pReserved[6];
  939. UINT8 pDataRefIdx[2];
  940.     } PACKING;
  941.     class HintArrayEntry : public ArrayEntry
  942.     {
  943.     public:
  944. UINT8 pHintTrakVersion[2];
  945. UINT8 pLastCompHintTrakVersion[2];
  946. UINT8 pMaxPacketSize[4];
  947. UINT8 pTaggedArray[1];
  948.     } PACKING;
  949.     class AudioArrayEntry : public ArrayEntry // just a space holder in MP4
  950.     {
  951.     public:
  952. UINT8 pVersion[2];
  953. UINT8 pRevLevel[2];
  954. UINT8 pVendor[4];
  955. UINT8 pNumChannels[2];
  956. UINT8 pSampleSize[2];
  957. UINT8 pCompressionID[2];
  958. UINT8 pPacketSize[2];
  959. UINT8 pSampleRate[4];
  960.     } PACKING;
  961.     class VideoArrayEntry : public ArrayEntry
  962.     {
  963.     public:
  964. UINT8 pVersion[2];
  965. UINT8 pRevision[2];
  966. UINT8 pVendor[4];
  967. UINT8 pTemporalQuality[4];
  968. UINT8 pSpatialQuality[4];
  969. UINT8 pWidth[2];
  970. UINT8 pHeight[2];
  971. UINT8 pHRes[4];
  972. UINT8 pVRes[4];
  973. UINT8 pDataSize[4];
  974. UINT8 pFrameCount[2];
  975. UINT8 pName[32];
  976. UINT8 pDepth[2];
  977. UINT8 pClutID[2];
  978.     } PACKING;
  979.     class AudioMP4ArrayEntry : public AudioArrayEntry
  980.     {
  981.     public:
  982. UINT8 pSize[4];
  983. UINT8 pType[4];
  984. UINT8 pVersion[1];
  985. UINT8 pFlags[3];
  986. UINT8 pESDescriptor[1];
  987.     } PACKING;
  988.     class VideoMP4ArrayEntry : public VideoArrayEntry
  989.     {
  990.     public:
  991. UINT8 pSize[4];
  992. UINT8 pType[4];
  993. UINT8 pVersion[1];
  994. UINT8 pFlags[3];
  995. UINT8 pESDescriptor[1];
  996.     } PACKING;
  997.     class AudioSAMRArrayEntry : public AudioArrayEntry
  998.     {
  999.     public:
  1000. UINT8 pDecoderSpecificInfo[1];
  1001.     } PACKING;
  1002.     class AudioSAWBArrayEntry : public AudioArrayEntry
  1003.     {
  1004.     public:
  1005. UINT8 pDecoderSpecificInfo[1];
  1006.     } PACKING;
  1007.     class VideoS263ArrayEntry : public VideoArrayEntry
  1008.     {
  1009.     public:
  1010. UINT8 pDecoderSpecificInfo[1];
  1011.     } PACKING;
  1012.     ////////////////////////////////
  1013.     // /  3GPP Timed Text structs: 
  1014.     ///
  1015.     class BoxRecord
  1016.     {
  1017.     public:
  1018. INT16 top;
  1019. INT16 left;
  1020. INT16 bottom;
  1021. INT16 right;
  1022.     } PACKING;
  1023.     class StyleRecord
  1024.     {
  1025.     public:
  1026. UINT16 startChar;
  1027. UINT16 endChar;
  1028. UINT16 fontID;
  1029. UINT8  faceStyleFlags;
  1030. UINT8  fontSize;
  1031. UINT8  textColorRGBA[4];
  1032.     } PACKING;
  1033.     class FontRecord
  1034.     {
  1035.     public:
  1036. UINT16 fontID;
  1037. UINT8  fontNameLength;
  1038. UINT8* pFont; // /There are [fontNameLength] bytes in the string;
  1039.     } PACKING;
  1040.     class FontTableBox // / 慺tab