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

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 PMC_PREDEFINED_TYPES
  36. #define PMC_PREDEFINED_TYPES
  37. typedef char* pmc_string;
  38. struct buffer {
  39.  UINT32 len;
  40.  INT8* data;
  41. };
  42. #endif/*PMC_PREDEFINED_TYPES*/
  43. // realvideo cooment...
  44. // one more RV comment.....
  45. #ifndef _RMFFTYPES_
  46. #define _RMFFTYPES_
  47. #if !(defined REAL_MEDIA_FILE_SERVER_PORT)
  48. #include "hxtypes.h"
  49. #else
  50. #include "machdep.h"
  51. #include "types.h"
  52. #endif /* !(defined REAL_MEDIA_FILE_SERVER_PORT) */
  53. #include <string.h> // for memcpy's
  54. #include "rule2flg.h" // /For class RuleToFlagMap
  55. #if (!defined(_BEOS))
  56. #define int8 char
  57. #define int16 INT16
  58. #define int32 LONG32
  59. #endif
  60. #define u_int8 UCHAR
  61. #define u_int16 UINT16
  62. #define u_int32 ULONG32
  63. // Event stuff
  64. #define RAE_FILE_VERSION 2
  65. #define RAE_FILE_MAGIC_SIZE 5
  66. #define RAE_FILE_VERSION_SIZE 2     
  67. #define RAE_FILE_HEADER_SIZE (RAE_FILE_MAGIC_SIZE + RAE_FILE_VERSION_SIZE)
  68. #define RAE_EVENT_HEADER_SIZE (sizeof(ULONG32) + sizeof(ULONG32) + sizeof(UINT16))
  69. #define RA_MEDIA_DATA 0x4D444941 // 'MDIA'
  70. #define RA_EVENT_DATA 0x45564E54 //  'EVNT'
  71. #define RM_HEADER_OBJECT 0x2E524D46 // '.RMF' 
  72. #define RMS_HEADER_OBJECT 0x2E524D53 // '.RMS' 
  73. #define RM_PROPERTIES_OBJECT 0x50524F50 // 'PROP' 
  74. #define RM_MEDIA_PROPERTIES_OBJECT 0x4D445052 // 'MDPR' 
  75. #define RM_CONTENT_OBJECT 0x434F4E54 // 'CONT' 
  76. #define RM_DATA_OBJECT 0x44415441 // 'DATA' 
  77. #define RM_INDEX_OBJECT 0x494E4458 // 'INDX'  // 'DATA' 
  78. #define RM_MULTIHEADER_OBJECT 0x4D4C5449 // 'MLTI'
  79. #define RM_FILE_OBJECT_VERSION 0
  80. #define RM_PROPERTIES_OBJECT_VERSION 0
  81. #define RM_MEDIAPROPERTIES_OBJECT_VERSION 0
  82. #define RM_CONTENT_OBJECT_VERSION 0
  83. #define RM_DATA_OBJECT_VERSION 0
  84. #define RM_INDEX_OBJECT_VERSION 0
  85. #define RM_PACKET_OBJECT_VERSION 0
  86. #define RM_INDEXRECORD_OBJECT_VERSION 0
  87. #define HX_SAVE_ENABLED 0x0001
  88. #define HX_PERFECT_PLAY_ENABLED 0x0002
  89. #define HX_LIVE_BROADCAST 0x0004
  90. #define HX_MOBILE_PLAY_ENABLED 0x0008
  91. #if (defined( _WIN32 ) || defined( _WINDOWS )) && defined(_M_IX86)
  92. #pragma pack(1)
  93. // disable warning on: zero-sized array in struct/union
  94. #pragma warning( disable : 4200 )
  95. #endif
  96. #ifdef _MACINTOSH
  97. // modify packing of VideoTypeSpecificData to match 
  98. // hxcodec.h's packing of HX_FORMAT_VIDEO
  99. // cr grobbinsky cf rlovejoy
  100. #pragma options align=mac68k
  101. #endif
  102. #include "hxinline.h"
  103. class RMGenericHeader
  104. {
  105. public:
  106.     UINT8* pack(UINT8* buf, UINT32 &len);
  107.     UINT8* unpack(UINT8* buf, UINT32 len);
  108.     const UINT32 static_size() {return 10;}
  109.     UINT32 object_id;
  110.     UINT32 size;
  111.     UINT16 object_version;
  112. };
  113. typedef RMGenericHeader * RMGenericHeaderPtr;
  114. class RMFileHeader
  115. {
  116. public:
  117.     UINT8* pack(UINT8* buf, UINT32 &len);
  118.     UINT8* unpack(UINT8* buf, UINT32 len);
  119.     const UINT32 static_size() {return 18;}
  120.     UINT32 object_id;
  121.     UINT32 size;
  122.     UINT16 object_version;
  123.     UINT32 file_version;
  124.     UINT32 num_headers;
  125. };
  126. typedef RMFileHeader * RMFileHeaderPtr;
  127. class Properties
  128. {
  129. public:
  130.     UINT8* pack(UINT8* buf, UINT32 &len);
  131.     UINT8* unpack(UINT8* buf, UINT32 len);
  132.     const UINT32 static_size() {return 50;}
  133.     UINT32 object_id;
  134.     UINT32 size;
  135.     UINT16 object_version;
  136.     UINT32 max_bit_rate;
  137.     UINT32 avg_bit_rate;
  138.     UINT32 max_packet_size;
  139.     UINT32 avg_packet_size;
  140.     UINT32 num_interleave_packets;
  141.     UINT32 duration;
  142.     UINT32 preroll;
  143.     UINT32 index_offset;
  144.     UINT32 data_offset;
  145.     UINT16 num_streams;
  146.     UINT16 flags;
  147. };
  148. typedef Properties * PropertiesPtr;
  149. class MediaProperties
  150. {
  151. public:
  152.     UINT8* pack(UINT8* buf, UINT32 &len);
  153.     UINT8* unpack(UINT8* buf, UINT32 len);
  154.     const UINT32 static_size() {return 46;}
  155.     UINT32 object_id;
  156.     UINT32 size;
  157.     UINT16 object_version;
  158.     UINT16 stream_number;
  159.     UINT32 max_bit_rate;
  160.     UINT32 avg_bit_rate;
  161.     UINT32 max_packet_size;
  162.     UINT32 avg_packet_size;
  163.     UINT32 start_time;
  164.     UINT32 preroll;
  165.     UINT32 duration;
  166.     UINT8 stream_name_size;
  167.     UINT8 *stream_name;
  168.     UINT8 mime_type_size;
  169.     UINT8 *mime_type;
  170.     UINT32 type_specific_len;
  171.     UINT8 *type_specific_data;
  172. };
  173. typedef MediaProperties * MediaPropertiesPtr;
  174. //
  175. // Can be used to crack open ra4 type specific
  176. // data. Might also work on a portion of ra5
  177. // data as well, but I would not count on it.
  178. // Should be using classes defined over in
  179. // raform4.pm instead.
  180. //
  181. class AudioTypeSpecificData
  182. {
  183. public:
  184.     UINT8* pack(UINT8* buf, UINT32 &len);
  185.     UINT8* unpack(UINT8* buf, UINT32 len);
  186.     const UINT32 static_size() {return 73;}
  187.     UINT32 theID;
  188.     UINT16 AudioSpecificVersion;
  189.     UINT16 AudioSpecificRevision;
  190.     UINT32 raID;
  191.     UINT32 RaChunkSize;
  192.     UINT16 version;
  193.     UINT16 revision;
  194.     UINT16 headerBytesTotal;
  195.     UINT16 compressionType;
  196.     UINT32 granularity;
  197.     UINT32 bytesTotal;
  198.     UINT32 bytesPerMinute;
  199.     UINT32 bytesPerMinute2;
  200.     UINT16 interleaveFactor;
  201.     UINT16 interleaveBlockSize;
  202.     UINT32 userData;
  203.     UINT32 sampleRate;
  204.     UINT16 sampleSize;
  205.     UINT16 numChannels;
  206.     UINT8 InterleaveCode[5];
  207.     UINT8 CompressionCode[5];
  208.     UINT8 isInterleaved;
  209.     UINT8 copyByte;
  210.     UINT8 streamType;
  211.     UINT8 title_len;
  212.     UINT8 *title;
  213.     UINT8 author_len;
  214.     UINT8 *author;
  215.     UINT8 copyright_len;
  216.     UINT8 *copyright;
  217.     UINT8 app_len;
  218.     UINT8 *app;
  219. };
  220. class VideoTypeSpecificData
  221. {
  222. public:
  223.     VideoTypeSpecificData();
  224.     UINT8* pack(UINT8* buf, UINT32 &len);
  225.     UINT8* unpack(UINT8* buf, UINT32 len);
  226.     const UINT32 static_size() {return 26;}
  227.     UINT32 cbLength;
  228.     UINT32 moftag;
  229.     UINT32 submoftag;
  230.     UINT16 uiWidth;
  231.     UINT16 uiHeight;
  232.     UINT16 uiBitCount;
  233.     UINT16 uiPadWidth;
  234.     UINT16 uiPadHeight;
  235.     UINT32 framesPerSecond;
  236.     UINT32      ulSPOExtra;
  237.     UINT32      ulStreamVersion;
  238. };
  239. class MultiStreamHeader
  240. {
  241. public:
  242.     UINT8* pack(UINT8* buf, UINT32 &len);
  243.     UINT8* unpack(UINT8* buf, UINT32 len);
  244.     const UINT32 static_size() {return 8;}
  245.     UINT32 object_id;
  246.     UINT16 num_rules;
  247.     UINT16 *rule_to_header_map;
  248.     UINT16 num_headers;
  249. };
  250. class NameValueProperty
  251. {
  252. public:
  253.     NameValueProperty();
  254.     UINT8* pack(UINT8* buf, UINT32 &len);
  255.     UINT8* unpack(UINT8* buf, UINT32 len);
  256.     const UINT32 static_size() {return 13;}
  257.     UINT32 size;
  258.     UINT16 object_version;
  259.     UINT8 name_length;
  260.     UINT8 *name;
  261.     UINT32 type;
  262.     UINT16 value_length;
  263.     UINT8 *value_data;
  264. };
  265. //
  266. // Use this for packing/unpacking
  267. // a single 32 bit integer.
  268. //
  269. class Unsigned32BitInteger
  270. {
  271. public:
  272.     UINT8* pack(UINT8* buf, UINT32 &len);
  273.     UINT8* unpack(UINT8* buf, UINT32 len);
  274.     const UINT32 static_size() {return 4;}
  275.     UINT32 value;
  276. };
  277. //
  278. // enum defining valid values for "type" in
  279. // NameValueProperty structure
  280. //
  281. enum
  282. {
  283. PROP_INTEGER,
  284. PROP_BUFFER,
  285. PROP_STRING
  286. };
  287. class LogicalStream
  288. {
  289. public:
  290.     UINT8* pack(UINT8* buf, UINT32 &len);
  291.     UINT8* unpack(UINT8* buf, UINT32 len);
  292.     const UINT32 static_size() {return 12;}
  293.     UINT32 size;
  294.     UINT16 object_version;
  295.     UINT16 num_physical_streams;
  296.     UINT16 *physical_stream_numbers;
  297.     UINT32 *data_offsets;
  298.     UINT16 num_rules;
  299.     UINT16 *rule_to_physical_stream_number_map;
  300.     UINT16 num_properties;
  301.     NameValueProperty *properties;
  302. };
  303. class MetaInformation
  304. {
  305. public:
  306.     UINT8* pack(UINT8* buf, UINT32 &len);
  307.     UINT8* unpack(UINT8* buf, UINT32 len);
  308.     const UINT32 static_size() {return 8;}
  309.     UINT32 size;
  310.     UINT16 object_version;
  311.     UINT16 num_properties;
  312.     NameValueProperty *properties;
  313. };
  314. //
  315. // BUGBUG
  316. // XXX
  317. // PMC can't generate a declaration for this constructor.
  318. // So, the generated .h file will not build until the
  319. // declaration is added by hand.
  320. //
  321. class Content
  322. {
  323. public:
  324.     Content();
  325.     UINT8* pack(UINT8* buf, UINT32 &len);
  326.     UINT8* unpack(UINT8* buf, UINT32 len);
  327.     const UINT32 static_size() {return 18;}
  328.     UINT32 object_id;
  329.     UINT32 size;
  330.     UINT16 object_version;
  331.     UINT16 title_len;
  332.     UINT8 *title;
  333.     UINT16 author_len;
  334.     UINT8 *author;
  335.     UINT16 copyright_len;
  336.     UINT8 *copyright;
  337.     UINT16 comment_len;
  338.     UINT8 *comment;
  339. };
  340. typedef  Content * ContentPtr;
  341. class DataHeader
  342. {
  343. public:
  344.     UINT8* pack(UINT8* buf, UINT32 &len);
  345.     UINT8* unpack(UINT8* buf, UINT32 len);
  346.     const UINT32 static_size() {return 18;}
  347.     UINT32 object_id;
  348.     UINT32 size;
  349.     UINT16 object_version;
  350.     UINT32 num_interleave_packets;
  351.     UINT32 next_data_header;
  352. };
  353. typedef DataHeader * DataHeaderPtr;
  354. class IndexHeader
  355. {
  356. public:
  357.     UINT8* pack(UINT8* buf, UINT32 &len);
  358.     UINT8* unpack(UINT8* buf, UINT32 len);
  359.     const UINT32 static_size() {return 20;}
  360.     UINT32 object_id;
  361.     UINT32 size;
  362.     UINT16 object_version;
  363.     UINT32 num_indices;
  364.     UINT16 stream_number;
  365.     UINT32 next_index_header;
  366. };
  367. typedef IndexHeader * IndexHeaderPtr;
  368. class IndexRecord
  369. {
  370. public:
  371.     UINT8* pack(UINT8* buf, UINT32 &len);
  372.     UINT8* unpack(UINT8* buf, UINT32 len);
  373.     const UINT32 static_size() {return 14;}
  374.     UINT16 object_version;
  375.     UINT32 timestamp;
  376.     UINT32 offset;
  377.     UINT32 num_interleave_packets;
  378. };
  379. typedef IndexRecord * IndexRecordPtr;
  380. //
  381. // The PacketHeader has changed with version 1.
  382. // So, there are a couple of new structures.
  383. // Use PacketHeaderBase to figure out what
  384. // packet version/size you've got, and then
  385. // create the appropriate PacketHeader version
  386. // struct to really unpack the buffer. We could
  387. // also have done this by embedding if (object_version == xx)
  388. // into the PacketHeader struct, but this lets us
  389. // use the static_size() function to get the
  390. // actual packed size of the struct in question.
  391. //
  392. class PacketHeaderBase
  393. {
  394. public:
  395.     UINT8* pack(UINT8* buf, UINT32 &len);
  396.     UINT8* unpack(UINT8* buf, UINT32 len);
  397.     const UINT32 static_size() {return 4;}
  398.     UINT16 object_version;
  399.     UINT16 length;
  400. };
  401. class PacketHeader
  402. {
  403. public:
  404.     UINT8* pack(UINT8* buf, UINT32 &len);
  405.     UINT8* unpack(UINT8* buf, UINT32 len);
  406.     const UINT32 static_size() {return 12;}
  407.     UINT16 object_version;
  408.     UINT16 length;
  409.     UINT16 stream_number;
  410.     UINT32 timestamp;
  411.     UINT16 flags;
  412. };
  413. typedef PacketHeader * PacketHeaderPtr;
  414. class PacketHeader1
  415. {
  416. public:
  417.     UINT8* pack(UINT8* buf, UINT32 &len);
  418.     UINT8* unpack(UINT8* buf, UINT32 len);
  419.     const UINT32 static_size() {return 13;}
  420.     UINT16 object_version;
  421.     UINT16 length;
  422.     UINT16 stream_number;
  423.     UINT32 timestamp;
  424.     UINT16 asm_rule;
  425.     UINT8 asm_flags;
  426. };
  427. class Profile
  428. {
  429. public:
  430.     UINT8* pack(UINT8* buf, UINT32 &len);
  431.     UINT8* unpack(UINT8* buf, UINT32 len);
  432.     const UINT32 static_size() {return 18;}
  433.     UINT32 object_id;
  434.     UINT32 size;
  435.     UINT16 object_version;
  436.     UINT32 Bandwidth;
  437.     UINT32 CpuPower;
  438. };
  439. typedef Profile * ProfilePtr;
  440. //
  441. // RMEventPacketData is placed directly after the packet header
  442. // for an event stream inside of an RM file.
  443. // event_type_and_string_len should be set to the length of the
  444. // string plus 2 bytes for the event type.
  445. // Also note that start_time and stop_time in here are in
  446. // deciseconds NOT milliseconds.
  447. //
  448. class RMEventPacketData
  449. {
  450. public:
  451.     UINT8* pack(UINT8* buf, UINT32 &len);
  452.     UINT8* unpack(UINT8* buf, UINT32 len);
  453.     const UINT32 static_size() {return 14;}
  454.     UINT16 sequence_number;
  455.     UINT32 start_time_deciseconds;
  456.     UINT32 stop_time_deciseconds;
  457.     UINT16 event_type_and_string_len;
  458.     UINT16 event_type_id;
  459.     UINT8 *event_string;
  460. };
  461. //
  462. // An array of RMImageMapRegionData structures
  463. // is included as part of the raw data for each
  464. // image map packet. The interpretation of num_values
  465. // and values is determined by shape.
  466. //
  467. class RMImageMapRegionData
  468. {
  469. public:
  470.     UINT8* pack(UINT8* buf, UINT32 &len);
  471.     UINT8* unpack(UINT8* buf, UINT32 len);
  472.     const UINT32 static_size() {return 22;}
  473.     UINT32 start_time;
  474.     UINT32 end_time;
  475.     UINT16 shape;
  476.     UINT16 num_values;
  477.     UINT16 *values;
  478.     UINT16 action;
  479.     UINT32 seek_time;
  480.     UINT16 url_len;
  481.     UINT8 *url;
  482.     UINT16 status_len;
  483.     UINT8 *status;
  484. };
  485. //
  486. // RMImageMapPacketData, like RMEventPacketData, is placed
  487. // directly after the packet header for an image map stream
  488. // inside of an RM file.
  489. //
  490. class RMImageMapPacketData
  491. {
  492. public:
  493.     UINT8* pack(UINT8* buf, UINT32 &len);
  494.     UINT8* unpack(UINT8* buf, UINT32 len);
  495.     const UINT32 static_size() {return 20;}
  496.     UINT16 sequence_number;
  497.     UINT16 num_regions;
  498.     UINT32 start_time;
  499.     UINT32 end_time;
  500.     UINT16 left;
  501.     UINT16 top;
  502.     UINT16 right;
  503.     UINT16 bottom;
  504.     RMImageMapRegionData *regions;
  505. };
  506. //
  507. // RMBaseImageMapPacketData extracts the basic
  508. // image map data (start, stop, dimensions) without
  509. // actually creating all of the regions on the heap.
  510. //
  511. class RMBaseImageMapPacketData
  512. {
  513. public:
  514.     UINT8* pack(UINT8* buf, UINT32 &len);
  515.     UINT8* unpack(UINT8* buf, UINT32 len);
  516.     const UINT32 static_size() {return 20;}
  517.     UINT16 sequence_number;
  518.     UINT16 num_regions;
  519.     UINT32 start_time;
  520.     UINT32 end_time;
  521.     UINT16 left;
  522.     UINT16 top;
  523.     UINT16 right;
  524.     UINT16 bottom;
  525. };
  526. class StreamPair
  527. {
  528. public:
  529.     UINT8* pack(UINT8* buf, UINT32 &len);
  530.     UINT8* unpack(UINT8* buf, UINT32 len);
  531.     const UINT32 static_size() {return 4;}
  532.     UINT16 stream1_num;
  533.     UINT16 stream2_num;
  534. };
  535. class StreamPairsHeader
  536. {
  537. public:
  538.     UINT8* pack(UINT8* buf, UINT32 &len);
  539.     UINT8* unpack(UINT8* buf, UINT32 len);
  540.     const UINT32 static_size() {return 10;}
  541.     UINT32 size;
  542.     UINT16 object_version;
  543.     UINT16 num_stream_pairs;
  544.     StreamPair *stream_pairs;
  545.     UINT8 stream1_property_name_len;
  546.     UINT8 *stream1_property_name;
  547.     UINT8 stream2_property_name_len;
  548.     UINT8 *stream2_property_name;
  549. };
  550. class PhysicalStreamInfo
  551. {
  552. public:
  553.     UINT8* pack(UINT8* buf, UINT32 &len);
  554.     UINT8* unpack(UINT8* buf, UINT32 len);
  555.     const UINT32 static_size() {return 23;}
  556.     UINT32 size;
  557.     UINT16 object_version;
  558.     UINT16 unPhysicalStreamNumber;
  559.     UINT16 unLogicalStreamNumber;
  560.     UINT32 ulDataOffset;
  561.     UINT32 ulBandwidth;
  562.     UINT8 bInterleavedBackwardsCompatible;
  563.     UINT8 bTaggedBackwardsCompatible;
  564.     UINT8 bIncludeAsMultirate;
  565.     UINT8 bOwnsDataSection;
  566.     UINT8 bIgnoreOnWrite;
  567. };
  568. class PhysicalStreamInfoHeader
  569. {
  570. public:
  571.     UINT8* pack(UINT8* buf, UINT32 &len);
  572.     UINT8* unpack(UINT8* buf, UINT32 len);
  573.     const UINT32 static_size() {return 8;}
  574.     UINT32 size;
  575.     UINT16 object_version;
  576.     UINT16 num_physical_streams;
  577.     PhysicalStreamInfo *physical_streams;
  578. };
  579. void   RMPackUINT32(UINT32 ulValue, UINT8*& rpBuf);
  580. UINT32 RMUnpackUINT32(UINT8*& rpBuf);
  581. void   RMPackUINT16(UINT16 usValue, UINT8*& rpBuf);
  582. UINT16 RMUnpackUINT16(UINT8*& rpBuf);
  583. void   RMPackByteString(UINT8* pStr, UINT8 ucStrSize, UINT8*& rpBuf);
  584. BOOL   RMUnpackByteString(UINT8*& rpStr, UINT8& rucStrSize, UINT8*& rpBuf, UINT8* pBuf, UINT32 ulLen);
  585. void   RMPackUINT16String(UINT8* pStr, UINT16 usStrSize, UINT8*& rpBuf);
  586. BOOL   RMUnpackUINT16String(UINT8*& rpStr, UINT16& rusStrSize, UINT8*& rpBuf, UINT8* pBuf, UINT32 ulLen);
  587. void   RMPackUINT32Buffer(UINT8* pBuffer, UINT32 ulSize, UINT8*& rpBuf);
  588. BOOL   RMUnpackUINT32Buffer(UINT8*& rpBuffer, UINT32& rulSize, UINT8*& rpBuf, UINT8* pBuf, UINT32 ulLen);
  589. #if defined (_DEFINE_INLINE)
  590. HX_INLINE void RMPackUINT32(UINT32 ulValue, UINT8*& rpBuf)
  591. {
  592.     rpBuf[0] = (UINT8) ((ulValue >> 24) & 0x000000FF);
  593.     rpBuf[1] = (UINT8) ((ulValue >> 16) & 0x000000FF);
  594.     rpBuf[2] = (UINT8) ((ulValue >>  8) & 0x000000FF);
  595.     rpBuf[3] = (UINT8) ( ulValue        & 0x000000FF);
  596.     rpBuf   += 4;
  597. }
  598. HX_INLINE UINT32 RMUnpackUINT32(UINT8*& rpBuf)
  599. {
  600.     UINT32 ulRet = (rpBuf[0] << 24) | (rpBuf[1] << 16) | (rpBuf[2] << 8) | rpBuf[3];
  601.     rpBuf       += 4;
  602.     return ulRet;
  603. }
  604. HX_INLINE void RMPackUINT16(UINT16 usValue, UINT8*& rpBuf)
  605. {
  606.     rpBuf[0] = (UINT8) ((usValue >> 8) & 0x00FF);
  607.     rpBuf[1] = (UINT8) ( usValue       & 0x00FF);
  608.     rpBuf   += 2;
  609. }
  610. HX_INLINE UINT16 RMUnpackUINT16(UINT8*& rpBuf)
  611. {
  612.     UINT16 usRet = (rpBuf[0] << 8) | rpBuf[1];
  613.     rpBuf       += 2;
  614.     return usRet;
  615. }
  616. HX_INLINE void RMPackByteString(UINT8* pStr, UINT8 ucStrSize, UINT8*& rpBuf)
  617. {
  618.     *rpBuf++ = ucStrSize;
  619.     memcpy(rpBuf, pStr, ucStrSize);
  620.     rpBuf += ucStrSize;
  621. }
  622. HX_INLINE BOOL RMUnpackByteString(UINT8*& rpStr, UINT8& rucStrSize, UINT8*& rpBuf, UINT8* pBuf, UINT32 ulLen)
  623. {
  624.     rucStrSize = *rpBuf++;
  625.     if (rpBuf-pBuf+rucStrSize > (int)ulLen) return FALSE;
  626.     rpStr =  rpBuf;
  627.     rpBuf += rucStrSize;
  628.     return TRUE;
  629. }
  630. HX_INLINE void RMPackUINT16String(UINT8* pStr, UINT16 usStrSize, UINT8*& rpBuf)
  631. {
  632.     RMPackUINT16(usStrSize, rpBuf);
  633.     memcpy(rpBuf, pStr, usStrSize);
  634.     rpBuf += usStrSize;
  635. }
  636. HX_INLINE BOOL RMUnpackUINT16String(UINT8*& rpStr, UINT16& rusStrSize, UINT8*& rpBuf, UINT8* pBuf, UINT32 ulLen)
  637. {
  638.     rusStrSize = RMUnpackUINT16(rpBuf);
  639.     if (rpBuf-pBuf+rusStrSize > (int)ulLen) return FALSE;
  640.     rpStr =  rpBuf;
  641.     rpBuf += rusStrSize;
  642.     return TRUE;
  643. }
  644. HX_INLINE void RMPackUINT32Buffer(UINT8* pBuffer, UINT32 ulSize, UINT8*& rpBuf)
  645. {
  646.     RMPackUINT32(ulSize, rpBuf);
  647.     memcpy(rpBuf, pBuffer, ulSize);
  648.     rpBuf += ulSize;
  649. }
  650. HX_INLINE BOOL RMUnpackUINT32Buffer(UINT8*& rpBuffer, UINT32& rulSize, UINT8*& rpBuf, UINT8* pBuf, UINT32 ulLen)
  651. {
  652.     rulSize = RMUnpackUINT32(rpBuf);
  653.     if (rpBuf-pBuf+rulSize > (int)ulLen) return FALSE;
  654.     rpBuffer = rpBuf;
  655.     rpBuf   += rulSize;
  656.     return TRUE;
  657. }
  658. HX_INLINE UINT8*
  659. RMGenericHeader::pack(UINT8* buf, UINT32 &len)
  660. {
  661.     UINT8* off = buf;
  662.     RMPackUINT32(object_id, off);
  663.     RMPackUINT32(size, off);
  664.     RMPackUINT16(object_version, off);
  665.     len = off-buf;
  666.     return off;
  667. }
  668. HX_INLINE UINT8*
  669. RMGenericHeader::unpack(UINT8* buf, UINT32 len)
  670. {
  671.     if (!buf || !len)
  672. return 0;
  673.     UINT8* off = buf;
  674.     object_id      = RMUnpackUINT32(off);
  675.     size           = RMUnpackUINT32(off);
  676.     object_version = RMUnpackUINT16(off);
  677.     return off;
  678. }
  679. HX_INLINE UINT8*
  680. RMFileHeader::pack(UINT8* buf, UINT32 &len)
  681. {
  682.     UINT8* off = buf;
  683.     RMPackUINT32(object_id, off);
  684.     RMPackUINT32(size, off);
  685.     RMPackUINT16(object_version, off);
  686.     if ((object_version == 0) || (object_version == 1))
  687.     {
  688.         RMPackUINT32(file_version, off);
  689.         RMPackUINT32(num_headers, off);
  690.     }
  691.     len = off-buf;
  692.     return off;
  693. }
  694. HX_INLINE UINT8*
  695. RMFileHeader::unpack(UINT8* buf, UINT32 len)
  696. {
  697.     if (!buf || !len)
  698. return 0;
  699.     UINT8* off = buf;
  700.     object_id      = RMUnpackUINT32(off);
  701.     size           = RMUnpackUINT32(off);
  702.     object_version = RMUnpackUINT16(off);
  703.     if ((object_version == 0) || (object_version == 1))
  704.     {
  705.         file_version = RMUnpackUINT32(off);
  706.         num_headers  = RMUnpackUINT32(off);
  707.     }
  708.     return off;
  709. }
  710. HX_INLINE UINT8*
  711. Properties::pack(UINT8* buf, UINT32 &len)
  712. {
  713.     UINT8* off = buf;
  714.     RMPackUINT32(object_id, off);
  715.     RMPackUINT32(size, off);
  716.     RMPackUINT16(object_version, off);
  717.     if ((object_version == 0))
  718.     {
  719.         RMPackUINT32(max_bit_rate, off);
  720.         RMPackUINT32(avg_bit_rate, off);
  721.         RMPackUINT32(max_packet_size, off);
  722.         RMPackUINT32(avg_packet_size, off);
  723.         RMPackUINT32(num_interleave_packets, off);
  724.         RMPackUINT32(duration, off);
  725.         RMPackUINT32(preroll, off);
  726.         RMPackUINT32(index_offset, off);
  727.         RMPackUINT32(data_offset, off);
  728.         RMPackUINT16(num_streams, off);
  729.         RMPackUINT16(flags, off);
  730.     }
  731.     len = off-buf;
  732.     return off;
  733. }
  734. HX_INLINE UINT8*
  735. Properties::unpack(UINT8* buf, UINT32 len)
  736. {
  737.     if (!buf || !len)
  738. return 0;
  739.     UINT8* off = buf;
  740.     object_id      = RMUnpackUINT32(off);
  741.     size           = RMUnpackUINT32(off);
  742.     object_version = RMUnpackUINT16(off);
  743.     if ((object_version == 0))
  744.     {
  745.         max_bit_rate           = RMUnpackUINT32(off);
  746.         avg_bit_rate           = RMUnpackUINT32(off);
  747.         max_packet_size        = RMUnpackUINT32(off);
  748.         avg_packet_size        = RMUnpackUINT32(off);
  749.         num_interleave_packets = RMUnpackUINT32(off);
  750.         duration               = RMUnpackUINT32(off);
  751.         preroll                = RMUnpackUINT32(off);
  752.         index_offset           = RMUnpackUINT32(off);
  753.         data_offset            = RMUnpackUINT32(off);
  754.         num_streams            = RMUnpackUINT16(off);
  755.         flags                  = RMUnpackUINT16(off);
  756.     }
  757.     return off;
  758. }
  759. HX_INLINE UINT8*
  760. MediaProperties::pack(UINT8* buf, UINT32 &len)
  761. {
  762.     UINT8* off = buf;
  763.     RMPackUINT32(object_id, off);
  764.     RMPackUINT32(size, off);
  765.     RMPackUINT16(object_version, off);
  766.     if ((object_version == 0))
  767.     {
  768.         RMPackUINT16(stream_number, off);
  769.         RMPackUINT32(max_bit_rate, off);
  770.         RMPackUINT32(avg_bit_rate, off);
  771.         RMPackUINT32(max_packet_size, off);
  772.         RMPackUINT32(avg_packet_size, off);
  773.         RMPackUINT32(start_time, off);
  774.         RMPackUINT32(preroll, off);
  775.         RMPackUINT32(duration, off);
  776.         RMPackByteString(stream_name, stream_name_size, off);
  777.         RMPackByteString(mime_type, mime_type_size, off);
  778.         RMPackUINT32Buffer(type_specific_data, type_specific_len, off);
  779.     }
  780.     len = off-buf;
  781.     return off;
  782. }
  783. HX_INLINE UINT8*
  784. MediaProperties::unpack(UINT8* buf, UINT32 len)
  785. {
  786.     if (!buf || !len)
  787. return 0;
  788.     UINT8* off = buf;
  789.     object_id      = RMUnpackUINT32(off);
  790.     size           = RMUnpackUINT32(off);
  791.     object_version = RMUnpackUINT16(off);
  792.     if ((object_version == 0))
  793.     {
  794.         stream_number   = RMUnpackUINT16(off);
  795.         max_bit_rate    = RMUnpackUINT32(off);
  796.         avg_bit_rate    = RMUnpackUINT32(off);
  797.         max_packet_size = RMUnpackUINT32(off);
  798.         avg_packet_size = RMUnpackUINT32(off);
  799.         start_time      = RMUnpackUINT32(off);
  800.         preroll         = RMUnpackUINT32(off);
  801.         duration        = RMUnpackUINT32(off);
  802.         if (!RMUnpackByteString(stream_name, stream_name_size, off, buf, len)) return 0;
  803.         if (!RMUnpackByteString(mime_type, mime_type_size, off, buf, len)) return 0;
  804.         if (!RMUnpackUINT32Buffer(type_specific_data, type_specific_len, off, buf, len)) return 0;
  805.     }
  806.     return off;
  807. }
  808. HX_INLINE UINT8*
  809. AudioTypeSpecificData::pack(UINT8* buf, UINT32 &len)
  810. {
  811.     UINT8* off = buf;
  812.     RMPackUINT32(theID, off);
  813.     RMPackUINT16(AudioSpecificVersion, off);
  814.     RMPackUINT16(AudioSpecificRevision, off);
  815.     RMPackUINT32(raID, off);
  816.     RMPackUINT32(RaChunkSize, off);
  817.     RMPackUINT16(version, off);
  818.     RMPackUINT16(revision, off);
  819.     RMPackUINT16(headerBytesTotal, off);
  820.     RMPackUINT16(compressionType, off);
  821.     RMPackUINT32(granularity, off);
  822.     RMPackUINT32(bytesTotal, off);
  823.     RMPackUINT32(bytesPerMinute, off);
  824.     RMPackUINT32(bytesPerMinute2, off);
  825.     RMPackUINT16(interleaveFactor, off);
  826.     RMPackUINT16(interleaveBlockSize, off);
  827.     RMPackUINT32(userData, off);
  828.     RMPackUINT32(sampleRate, off);
  829.     RMPackUINT16(sampleSize, off);
  830.     RMPackUINT16(numChannels, off);
  831.     {memcpy(off, InterleaveCode, 5); off += 5; }
  832.     {memcpy(off, CompressionCode, 5); off += 5; }
  833.     *off++ = isInterleaved;
  834.     *off++ = copyByte;
  835.     *off++ = streamType;
  836.     RMPackByteString(title, title_len, off);
  837.     RMPackByteString(author, author_len, off);
  838.     RMPackByteString(copyright, copyright_len, off);
  839.     RMPackByteString(app, app_len, off);
  840.     len = off-buf;
  841.     return off;
  842. }
  843. HX_INLINE UINT8*
  844. AudioTypeSpecificData::unpack(UINT8* buf, UINT32 len)
  845. {
  846.     if (!buf || !len)
  847. return 0;
  848.     UINT8* off = buf;
  849.     theID                 = RMUnpackUINT32(off);
  850.     AudioSpecificVersion  = RMUnpackUINT16(off);
  851.     AudioSpecificRevision = RMUnpackUINT16(off);
  852.     raID                  = RMUnpackUINT32(off);
  853.     RaChunkSize           = RMUnpackUINT32(off);
  854.     version               = RMUnpackUINT16(off);
  855.     revision              = RMUnpackUINT16(off);
  856.     headerBytesTotal      = RMUnpackUINT16(off);
  857.     compressionType       = RMUnpackUINT16(off);
  858.     granularity           = RMUnpackUINT32(off);
  859.     bytesTotal            = RMUnpackUINT32(off);
  860.     bytesPerMinute        = RMUnpackUINT32(off);
  861.     bytesPerMinute2       = RMUnpackUINT32(off);
  862.     interleaveFactor      = RMUnpackUINT16(off);
  863.     interleaveBlockSize   = RMUnpackUINT16(off);
  864.     userData              = RMUnpackUINT32(off);
  865.     sampleRate            = RMUnpackUINT32(off);
  866.     sampleSize            = RMUnpackUINT16(off);
  867.     numChannels           = RMUnpackUINT16(off);
  868.     if (off-buf+5 > (int)len)
  869. return 0;
  870.     {memcpy(InterleaveCode, off, 5); off += 5; }
  871.     if (off-buf+5 > (int)len)
  872. return 0;
  873.     {memcpy(CompressionCode, off, 5); off += 5; }
  874.     isInterleaved = *off++;
  875.     copyByte      = *off++;
  876.     streamType    = *off++;
  877.     if (!RMUnpackByteString(title, title_len, off, buf, len)) return 0;
  878.     if (!RMUnpackByteString(author, author_len, off, buf, len)) return 0;
  879.     if (!RMUnpackByteString(copyright, copyright_len, off, buf, len)) return 0;
  880.     if (!RMUnpackByteString(app, app_len, off, buf, len)) return 0;
  881.     return off;
  882. }
  883. HX_INLINE VideoTypeSpecificData::VideoTypeSpecificData() :
  884.     cbLength(0),
  885.     moftag(0),
  886.     submoftag(0),
  887.     uiWidth(0),
  888.     uiHeight(0),
  889.     uiBitCount(0),
  890.     uiPadWidth(0),
  891.     uiPadHeight(0),
  892.     framesPerSecond(0),
  893.     ulSPOExtra(0),
  894.     ulStreamVersion(0)
  895. {
  896. }
  897. HX_INLINE UINT8*
  898. VideoTypeSpecificData::pack(UINT8* buf, UINT32 &len)
  899. {
  900.     UINT8* off = buf;
  901.     RMPackUINT32(cbLength, off);
  902.     RMPackUINT32(moftag, off);
  903.     RMPackUINT32(submoftag, off);
  904.     RMPackUINT16(uiWidth, off);
  905.     RMPackUINT16(uiHeight, off);
  906.     RMPackUINT16(uiBitCount, off);
  907.     RMPackUINT16(uiPadWidth, off);
  908.     RMPackUINT16(uiPadHeight, off);
  909.     RMPackUINT32(framesPerSecond, off);
  910.     UINT32 ulBytesPacked = off - buf;
  911.     UINT32 ulBytesLeft   = (len >= ulBytesPacked ? len - ulBytesPacked : 0);
  912.     if (ulBytesLeft >= 8)
  913.     {
  914.         RMPackUINT32(ulSPOExtra, off);
  915.         RMPackUINT32(ulStreamVersion, off);
  916.     }
  917.     len = off-buf;
  918.     return off;
  919. }
  920. HX_INLINE UINT8*
  921. VideoTypeSpecificData::unpack(UINT8* buf, UINT32 len)
  922. {
  923.     if (!buf || !len)
  924. return 0;
  925.     UINT8* off = buf;
  926.     cbLength        = RMUnpackUINT32(off);
  927.     moftag          = RMUnpackUINT32(off);
  928.     submoftag       = RMUnpackUINT32(off);
  929.     uiWidth         = RMUnpackUINT16(off);
  930.     uiHeight        = RMUnpackUINT16(off);
  931.     uiBitCount      = RMUnpackUINT16(off);
  932.     uiPadWidth      = RMUnpackUINT16(off);
  933.     uiPadHeight     = RMUnpackUINT16(off);
  934.     framesPerSecond = RMUnpackUINT32(off);
  935.     UINT32 ulBytesParsed = off - buf;
  936.     UINT32 ulBytesLeft   = (len >= ulBytesParsed ? len - ulBytesParsed : 0);
  937.     if (ulBytesLeft >= 8)
  938.     {
  939.         ulSPOExtra      = RMUnpackUINT32(off);
  940.         ulStreamVersion = RMUnpackUINT32(off);
  941.     }
  942.     return off;
  943. }
  944. HX_INLINE UINT8*
  945. MultiStreamHeader::pack(UINT8* buf, UINT32 &len)
  946. {
  947.     UINT8* off = buf;
  948.     RMPackUINT32(object_id, off);
  949.     RMPackUINT16(num_rules, off);
  950.     for (int i = 0;  i < num_rules; i++)
  951.         RMPackUINT16(rule_to_header_map[i], off);
  952.     RMPackUINT16(num_headers, off);
  953.     len = off-buf;
  954.     return off;
  955. }
  956. HX_INLINE UINT8*
  957. MultiStreamHeader::unpack(UINT8* buf, UINT32 len)
  958. {
  959.     if (!buf || !len)
  960. return 0;
  961.     UINT8* off = buf;
  962.     object_id = RMUnpackUINT32(off);
  963.     num_rules = RMUnpackUINT16(off);
  964.     rule_to_header_map = new UINT16[num_rules];
  965.     if (!rule_to_header_map) return 0;
  966.     for (int i = 0;  i < num_rules; i++)
  967.         rule_to_header_map[i] = RMUnpackUINT16(off);
  968.     num_headers = RMUnpackUINT16(off);
  969.     return off;
  970. }
  971. HX_INLINE NameValueProperty::NameValueProperty()
  972. {
  973.     size           = 0;
  974.     object_version = 0;
  975.     name_length    = 0;
  976.     name           = NULL;
  977.     value_length   = 0;
  978.     value_data     = NULL;
  979. }
  980. HX_INLINE UINT8*
  981. NameValueProperty::pack(UINT8* buf, UINT32 &len)
  982. {
  983.     UINT8* off = buf;
  984.     RMPackUINT32(size, off);
  985.     RMPackUINT16(object_version, off);
  986.     if ((object_version == 0))
  987.     {
  988.         RMPackByteString(name, name_length, off);
  989.         RMPackUINT32(type, off);
  990.         RMPackUINT16String(value_data, value_length, off);
  991.     }
  992.     len = off-buf;
  993.     return off;
  994. }
  995. HX_INLINE UINT8*
  996. NameValueProperty::unpack(UINT8* buf, UINT32 len)
  997. {
  998.     if (!buf || !len)
  999. return 0;
  1000.     UINT8* off = buf;
  1001.     size = RMUnpackUINT32(off);
  1002.     object_version = RMUnpackUINT16(off);
  1003.     if ((object_version == 0))
  1004.     {
  1005.         if (!RMUnpackByteString(name, name_length, off, buf, len)) return 0;
  1006.         type = RMUnpackUINT32(off);
  1007.         if (!RMUnpackUINT16String(value_data, value_length, off, buf, len)) return 0;
  1008.     }
  1009.     return off;
  1010. }
  1011. HX_INLINE UINT8*
  1012. Unsigned32BitInteger::pack(UINT8* buf, UINT32 &len)
  1013. {
  1014.     UINT8* off = buf;
  1015.     RMPackUINT32(value, off);
  1016.     len = off-buf;
  1017.     return off;
  1018. }
  1019. HX_INLINE UINT8*
  1020. Unsigned32BitInteger::unpack(UINT8* buf, UINT32 len)
  1021. {
  1022.     if (!buf || !len)
  1023. return 0;
  1024.     UINT8* off = buf;
  1025.     value = RMUnpackUINT32(off);
  1026.     return off;
  1027. }
  1028. HX_INLINE UINT8*
  1029. LogicalStream::pack(UINT8* buf, UINT32 &len)
  1030. {
  1031.     UINT8* off = buf;
  1032.     RMPackUINT32(size, off);
  1033.     RMPackUINT16(object_version, off);
  1034.     if ((object_version == 0))
  1035.     {
  1036.         RMPackUINT16(num_physical_streams, off);
  1037.         int i = 0;
  1038.         for (i = 0;  i < num_physical_streams; i++)
  1039.             RMPackUINT16(physical_stream_numbers[i], off);
  1040.         for (i = 0;  i < num_physical_streams; i++)
  1041.             RMPackUINT32(data_offsets[i], off);
  1042.         RMPackUINT16(num_rules, off);
  1043.         for (i = 0;  i < num_rules; i++)
  1044.             RMPackUINT16(rule_to_physical_stream_number_map[i], off);
  1045.         RMPackUINT16(num_properties, off);
  1046.         for (i = 0;  i < num_properties; i++)
  1047.             off = properties[i].pack(off, len);
  1048.     }
  1049.     len = off-buf;
  1050.     return off;
  1051. }
  1052. HX_INLINE UINT8*
  1053. LogicalStream::unpack(UINT8* buf, UINT32 len)
  1054. {
  1055.     if (!buf || !len)
  1056.         return 0;
  1057.     UINT8* off = buf;
  1058.     size = RMUnpackUINT32(off);
  1059.     object_version = RMUnpackUINT16(off);
  1060.     if ((object_version == 0))
  1061.     {
  1062.         num_physical_streams = RMUnpackUINT16(off);
  1063.         physical_stream_numbers = new UINT16[num_physical_streams];
  1064.         if (!physical_stream_numbers) return 0;
  1065.         int i = 0;
  1066.         for (i = 0;  i < num_physical_streams; i++)
  1067.             physical_stream_numbers[i] = RMUnpackUINT16(off);
  1068.         data_offsets = new UINT32[num_physical_streams];
  1069.         if (!data_offsets) return 0;
  1070.         for (i = 0;  i < num_physical_streams; i++)
  1071.             data_offsets[i] = RMUnpackUINT32(off);
  1072.         num_rules = RMUnpackUINT16(off);
  1073.         rule_to_physical_stream_number_map = new UINT16[num_rules];
  1074.         if (!rule_to_physical_stream_number_map) return 0;
  1075.         for (i = 0;  i < num_rules; i++)
  1076.             rule_to_physical_stream_number_map[i] = RMUnpackUINT16(off);
  1077.         num_properties = RMUnpackUINT16(off);
  1078.         properties = new NameValueProperty[num_properties];
  1079.         if (!properties) return 0;
  1080.         for (i = 0;  i < num_properties && off; i++)
  1081.             off = properties[i].unpack(off, len);
  1082.     }
  1083.     return off;
  1084. }
  1085. HX_INLINE UINT8*
  1086. MetaInformation::pack(UINT8* buf, UINT32 &len)
  1087. {
  1088.     UINT8* off = buf;
  1089.     RMPackUINT32(size, off);
  1090.     RMPackUINT16(object_version, off);
  1091.     if ((object_version == 0))
  1092.     {
  1093.         RMPackUINT16(num_properties, off);
  1094.         for (int i = 0;  i < num_properties; i++)
  1095.             off = properties[i].pack(off, len);
  1096.     }
  1097.     len = off-buf;
  1098.     return off;
  1099. }
  1100. HX_INLINE UINT8*
  1101. MetaInformation::unpack(UINT8* buf, UINT32 len)
  1102. {
  1103.     if (!buf || !len)
  1104. return 0;
  1105.     UINT8* off = buf;
  1106.     size           = RMUnpackUINT32(off);
  1107.     object_version = RMUnpackUINT16(off);
  1108.     if (object_version == 0)
  1109.     {
  1110.         num_properties = RMUnpackUINT16(off);
  1111.         properties = new NameValueProperty[num_properties];
  1112.         if (!properties) return 0;
  1113.         for (int i = 0;  i < num_properties; i++)
  1114.             off = properties[i].unpack(off, len);
  1115.     }
  1116.     return off;
  1117. }
  1118. HX_INLINE UINT8*
  1119. Content::pack(UINT8* buf, UINT32 &len)
  1120. {
  1121.     UINT8* off = buf;
  1122.     RMPackUINT32(object_id, off);
  1123.     RMPackUINT32(size, off);
  1124.     RMPackUINT16(object_version, off);
  1125.     if (object_version == 0)
  1126.     {
  1127.         RMPackUINT16String(title, title_len, off);
  1128.         RMPackUINT16String(author, author_len, off);
  1129.         RMPackUINT16String(copyright, copyright_len, off);
  1130.         RMPackUINT16String(comment, comment_len, off);
  1131.     }
  1132.     len = off-buf;
  1133.     return off;
  1134. }
  1135. HX_INLINE UINT8*
  1136. Content::unpack(UINT8* buf, UINT32 len)
  1137. {
  1138.     if (!buf || !len)
  1139. return 0;
  1140.     UINT8* off = buf;
  1141.     object_id      = RMUnpackUINT32(off);
  1142.     size           = RMUnpackUINT32(off);
  1143.     object_version = RMUnpackUINT16(off);
  1144.     if (object_version == 0)
  1145.     {
  1146.         if (!RMUnpackUINT16String(title, title_len, off, buf, len)) return 0;
  1147.         if (!RMUnpackUINT16String(author, author_len, off, buf, len)) return 0;
  1148.         if (!RMUnpackUINT16String(copyright, copyright_len, off, buf, len)) return 0;
  1149.         if (!RMUnpackUINT16String(comment, comment_len, off, buf, len)) return 0;
  1150.     }
  1151.     return off;
  1152. }
  1153. //
  1154. // BUGBUG
  1155. // XXX
  1156. // PMC can't generate a declaration for this constructor.
  1157. // So, the generated .h file will not build until the
  1158. // declaration is added by hand.
  1159. //
  1160. HX_INLINE
  1161. Content::Content()
  1162. {
  1163. object_id = 0;
  1164. size = 0;
  1165. object_version = 0;
  1166. title_len = 0;
  1167. title = NULL;
  1168. author_len = 0;
  1169. author = NULL;
  1170. copyright_len = 0;
  1171. copyright = NULL;
  1172. comment_len = 0;
  1173. comment = NULL;
  1174. }
  1175. HX_INLINE UINT8*
  1176. DataHeader::pack(UINT8* buf, UINT32 &len)
  1177. {
  1178.     UINT8* off = buf;
  1179.     RMPackUINT32(object_id, off);
  1180.     RMPackUINT32(size, off);
  1181.     RMPackUINT16(object_version, off);
  1182.     if (object_version == 0)
  1183.     {
  1184.         RMPackUINT32(num_interleave_packets, off);
  1185.         RMPackUINT32(next_data_header, off);
  1186.     }
  1187.     len = off-buf;
  1188.     return off;
  1189. }
  1190. HX_INLINE UINT8*
  1191. DataHeader::unpack(UINT8* buf, UINT32 len)
  1192. {
  1193.     if (!buf || !len)
  1194. return 0;
  1195.     UINT8* off = buf;
  1196.     object_id      = RMUnpackUINT32(off);
  1197.     size           = RMUnpackUINT32(off);
  1198.     object_version = RMUnpackUINT16(off);
  1199.     if (object_version == 0)
  1200.     {
  1201.         num_interleave_packets = RMUnpackUINT32(off);
  1202.         next_data_header       = RMUnpackUINT32(off);
  1203.     }
  1204.     return off;
  1205. }
  1206. HX_INLINE UINT8*
  1207. IndexHeader::pack(UINT8* buf, UINT32 &len)
  1208. {
  1209.     UINT8* off = buf;
  1210.     RMPackUINT32(object_id, off);
  1211.     RMPackUINT32(size, off);
  1212.     RMPackUINT16(object_version, off);
  1213.     if (object_version == 0)
  1214.     {
  1215.         RMPackUINT32(num_indices, off);
  1216.         RMPackUINT16(stream_number, off);
  1217.         RMPackUINT32(next_index_header, off);
  1218.     }
  1219.     len = off-buf;
  1220.     return off;
  1221. }
  1222. HX_INLINE UINT8*
  1223. IndexHeader::unpack(UINT8* buf, UINT32 len)
  1224. {
  1225.     if (!buf || !len)
  1226. return 0;
  1227.     UINT8* off = buf;
  1228.     object_id      = RMUnpackUINT32(off);
  1229.     size           = RMUnpackUINT32(off);
  1230.     object_version = RMUnpackUINT16(off);
  1231.     if (object_version == 0)
  1232.     {
  1233.         num_indices       = RMUnpackUINT32(off);
  1234.         stream_number     = RMUnpackUINT16(off);
  1235.         next_index_header = RMUnpackUINT32(off);
  1236.     }
  1237.     return off;
  1238. }
  1239. HX_INLINE UINT8*
  1240. IndexRecord::pack(UINT8* buf, UINT32 &len)
  1241. {
  1242.     UINT8* off = buf;
  1243.     RMPackUINT16(object_version, off);
  1244.     if (object_version == 0)
  1245.     {
  1246.         RMPackUINT32(timestamp, off);
  1247.         RMPackUINT32(offset, off);
  1248.         RMPackUINT32(num_interleave_packets, off);
  1249.     }
  1250.     len = off-buf;
  1251.     return off;
  1252. }
  1253. HX_INLINE UINT8*
  1254. IndexRecord::unpack(UINT8* buf, UINT32 len)
  1255. {
  1256.     if (!buf || !len)
  1257. return 0;
  1258.     UINT8* off = buf;
  1259.     object_version = RMUnpackUINT16(off);
  1260.     if (object_version == 0)
  1261.     {
  1262.         timestamp              = RMUnpackUINT32(off);
  1263.         offset                 = RMUnpackUINT32(off);
  1264.         num_interleave_packets = RMUnpackUINT32(off);
  1265.     }
  1266.     return off;
  1267. }
  1268. HX_INLINE UINT8*
  1269. PacketHeaderBase::pack(UINT8* buf, UINT32 &len)
  1270. {
  1271.     UINT8* off = buf;
  1272.     RMPackUINT16(object_version, off);
  1273.     RMPackUINT16(length, off);
  1274.     len = off-buf;
  1275.     return off;
  1276. }
  1277. HX_INLINE UINT8*
  1278. PacketHeaderBase::unpack(UINT8* buf, UINT32 len)
  1279. {
  1280.     if (!buf || !len)
  1281. return 0;
  1282.     UINT8* off = buf;
  1283.     object_version = RMUnpackUINT16(off);
  1284.     length         = RMUnpackUINT16(off);
  1285.     return off;
  1286. }
  1287. HX_INLINE UINT8*
  1288. PacketHeader::pack(UINT8* buf, UINT32 &len)
  1289. {
  1290.     UINT8* off = buf;
  1291.     RMPackUINT16(object_version, off);
  1292.     if (object_version == 0)
  1293.     {
  1294.         RMPackUINT16(length, off);
  1295.         RMPackUINT16(stream_number, off);
  1296.         RMPackUINT32(timestamp, off);
  1297.         RMPackUINT16(flags, off);
  1298.     }
  1299.     len = off-buf;
  1300.     return off;
  1301. }
  1302. HX_INLINE UINT8*
  1303. PacketHeader::unpack(UINT8* buf, UINT32 len)
  1304. {
  1305.     if (!buf || !len)
  1306. return 0;
  1307.     UINT8* off = buf;
  1308.     object_version = RMUnpackUINT16(off);
  1309.     if (object_version == 0)
  1310.     {
  1311.         length        = RMUnpackUINT16(off);
  1312.         stream_number = RMUnpackUINT16(off);
  1313.         timestamp     = RMUnpackUINT32(off);
  1314.         flags         = RMUnpackUINT16(off);
  1315.     }
  1316.     return off;
  1317. }
  1318. HX_INLINE UINT8*
  1319. PacketHeader1::pack(UINT8* buf, UINT32 &len)
  1320. {
  1321.     UINT8* off = buf;
  1322.     RMPackUINT16(object_version, off);
  1323.     if (object_version == 1)
  1324.     {
  1325.         RMPackUINT16(length, off);
  1326.         RMPackUINT16(stream_number, off);
  1327.         RMPackUINT32(timestamp, off);
  1328.         RMPackUINT16(asm_rule, off);
  1329.         *off++ = asm_flags;
  1330.     }
  1331.     len = off-buf;
  1332.     return off;
  1333. }
  1334. HX_INLINE UINT8*
  1335. PacketHeader1::unpack(UINT8* buf, UINT32 len)
  1336. {
  1337.     if (!buf || !len)
  1338. return 0;
  1339.     UINT8* off = buf;
  1340.     object_version = RMUnpackUINT16(off);
  1341.     if (object_version == 1)
  1342.     {
  1343.         length        = RMUnpackUINT16(off);
  1344.         stream_number = RMUnpackUINT16(off);
  1345.         timestamp     = RMUnpackUINT32(off);
  1346.         asm_rule      = RMUnpackUINT16(off);
  1347.         asm_flags     = *off++;
  1348.     }
  1349.     return off;
  1350. }
  1351. HX_INLINE UINT8*
  1352. Profile::pack(UINT8* buf, UINT32 &len)
  1353. {
  1354.     UINT8* off = buf;
  1355.     RMPackUINT32(object_id, off);
  1356.     RMPackUINT32(size, off);
  1357.     RMPackUINT16(object_version, off);
  1358.     if (object_version == 0)
  1359.     {
  1360.         RMPackUINT32(Bandwidth, off);
  1361.         RMPackUINT32(CpuPower, off);
  1362.     }
  1363.     len = off-buf;
  1364.     return off;
  1365. }
  1366. HX_INLINE UINT8*
  1367. Profile::unpack(UINT8* buf, UINT32 len)
  1368. {
  1369.     if (!buf || !len)
  1370. return 0;
  1371.     UINT8* off = buf;
  1372.     object_id      = RMUnpackUINT32(off);
  1373.     size           = RMUnpackUINT32(off);
  1374.     object_version = RMUnpackUINT16(off);
  1375.     if (object_version == 0)
  1376.     {
  1377.         Bandwidth = RMUnpackUINT32(off);
  1378.         CpuPower  = RMUnpackUINT32(off);
  1379.     }
  1380.     return off;
  1381. }
  1382. HX_INLINE UINT8*
  1383. RMEventPacketData::pack(UINT8* buf, UINT32 &len)
  1384. {
  1385.     UINT8* off = buf;
  1386.     RMPackUINT16(sequence_number, off);
  1387.     RMPackUINT32(start_time_deciseconds, off);
  1388.     RMPackUINT32(stop_time_deciseconds, off);
  1389.     RMPackUINT16(event_type_and_string_len, off);
  1390.     RMPackUINT16(event_type_id, off);
  1391.     memcpy(off, event_string, event_type_and_string_len - 2);
  1392.     off += event_type_and_string_len - 2;
  1393.     len = off-buf;
  1394.     return off;
  1395. }
  1396. HX_INLINE UINT8*
  1397. RMEventPacketData::unpack(UINT8* buf, UINT32 len)
  1398. {
  1399.     if (!buf || !len)
  1400. return 0;
  1401.     UINT8* off = buf;
  1402.     sequence_number           = RMUnpackUINT16(off);
  1403.     start_time_deciseconds    = RMUnpackUINT32(off);
  1404.     stop_time_deciseconds     = RMUnpackUINT32(off);
  1405.     event_type_and_string_len = RMUnpackUINT16(off);
  1406.     event_type_id             = RMUnpackUINT16(off);
  1407.     if (off-buf+(event_type_and_string_len - 2) > (int)len)
  1408. return 0;
  1409.     event_string = (UINT8*) off;
  1410.     off += event_type_and_string_len - 2;
  1411.     return off;
  1412. }
  1413. HX_INLINE UINT8*
  1414. RMImageMapRegionData::pack(UINT8* buf, UINT32 &len)
  1415. {
  1416.     UINT8* off = buf;
  1417.     RMPackUINT32(start_time, off);
  1418.     RMPackUINT32(end_time, off);
  1419.     RMPackUINT16(shape, off);
  1420.     RMPackUINT16(num_values, off);
  1421.     for (int i = 0;  i < num_values; i++)
  1422.         RMPackUINT16(values[i], off);
  1423.     RMPackUINT16(action, off);
  1424.     RMPackUINT32(seek_time, off);
  1425.     RMPackUINT16String(url, url_len, off);
  1426.     RMPackUINT16String(status, status_len, off);
  1427.     len = off-buf;
  1428.     return off;
  1429. }
  1430. HX_INLINE UINT8*
  1431. RMImageMapRegionData::unpack(UINT8* buf, UINT32 len)
  1432. {
  1433.     if (!buf || !len)
  1434. return 0;
  1435.     UINT8* off = buf;
  1436.     start_time = RMUnpackUINT32(off);
  1437.     end_time   = RMUnpackUINT32(off);
  1438.     shape      = RMUnpackUINT16(off);
  1439.     num_values = RMUnpackUINT16(off);
  1440.     values     = new UINT16[num_values];
  1441.     if (!values) return 0;
  1442.     for (int i = 0;  i < num_values; i++)
  1443.         values[i] = RMUnpackUINT16(off);
  1444.     action    = RMUnpackUINT16(off);
  1445.     seek_time = RMUnpackUINT32(off);
  1446.     if (!RMUnpackUINT16String(url, url_len, off, buf, len)) return 0;
  1447.     if (!RMUnpackUINT16String(status, status_len, off, buf, len)) return 0;
  1448.     return off;
  1449. }
  1450. HX_INLINE UINT8*
  1451. RMImageMapPacketData::pack(UINT8* buf, UINT32 &len)
  1452. {
  1453.     UINT8* off = buf;
  1454.     RMPackUINT16(sequence_number, off);
  1455.     RMPackUINT16(num_regions, off);
  1456.     RMPackUINT32(start_time, off);
  1457.     RMPackUINT32(end_time, off);
  1458.     RMPackUINT16(left, off);
  1459.     RMPackUINT16(top, off);
  1460.     RMPackUINT16(right, off);
  1461.     RMPackUINT16(bottom, off);
  1462.     for (int i = 0;  i < num_regions; i++)
  1463.         off = regions[i].pack(off, len);
  1464.     len = off-buf;
  1465.     return off;
  1466. }
  1467. HX_INLINE UINT8*
  1468. RMImageMapPacketData::unpack(UINT8* buf, UINT32 len)
  1469. {
  1470.     if (!buf || !len)
  1471. return 0;
  1472.     UINT8* off = buf;
  1473.     sequence_number = RMUnpackUINT16(off);
  1474.     num_regions     = RMUnpackUINT16(off);
  1475.     start_time      = RMUnpackUINT32(off);
  1476.     end_time        = RMUnpackUINT32(off);
  1477.     left            = RMUnpackUINT16(off);
  1478.     top             = RMUnpackUINT16(off);
  1479.     right           = RMUnpackUINT16(off);
  1480.     bottom          = RMUnpackUINT16(off);
  1481.     regions = new RMImageMapRegionData[num_regions];
  1482.     if (!regions) return 0;
  1483.     for (int i = 0;  i < num_regions; i++)
  1484.         off = regions[i].unpack(off, len);
  1485.     return off;
  1486. }
  1487. HX_INLINE UINT8*
  1488. RMBaseImageMapPacketData::pack(UINT8* buf, UINT32 &len)
  1489. {
  1490.     UINT8* off = buf;
  1491.     RMPackUINT16(sequence_number, off);
  1492.     RMPackUINT16(num_regions, off);
  1493.     RMPackUINT32(start_time, off);
  1494.     RMPackUINT32(end_time, off);
  1495.     RMPackUINT16(left, off);
  1496.     RMPackUINT16(top, off);
  1497.     RMPackUINT16(right, off);
  1498.     RMPackUINT16(bottom, off);
  1499.     len = off-buf;
  1500.     return off;
  1501. }
  1502. HX_INLINE UINT8*
  1503. RMBaseImageMapPacketData::unpack(UINT8* buf, UINT32 len)
  1504. {
  1505.     if (!buf || !len)
  1506. return 0;
  1507.     UINT8* off = buf;
  1508.     sequence_number = RMUnpackUINT16(off);
  1509.     num_regions     = RMUnpackUINT16(off);
  1510.     start_time      = RMUnpackUINT32(off);
  1511.     end_time        = RMUnpackUINT32(off);
  1512.     left            = RMUnpackUINT16(off);
  1513.     top             = RMUnpackUINT16(off);
  1514.     right           = RMUnpackUINT16(off);
  1515.     bottom          = RMUnpackUINT16(off);
  1516.     return off;
  1517. }
  1518. HX_INLINE UINT8*
  1519. StreamPair::pack(UINT8* buf, UINT32 &len)
  1520. {
  1521.     UINT8* off = buf;
  1522.     RMPackUINT16(stream1_num, off);
  1523.     RMPackUINT16(stream2_num, off);
  1524.     len = off-buf;
  1525.     return off;
  1526. }
  1527. HX_INLINE UINT8*
  1528. StreamPair::unpack(UINT8* buf, UINT32 len)
  1529. {
  1530.     if (!buf || !len)
  1531. return 0;
  1532.     UINT8* off = buf;
  1533.     stream1_num = RMUnpackUINT16(off);
  1534.     stream2_num = RMUnpackUINT16(off);
  1535.     return off;
  1536. }
  1537. HX_INLINE UINT8*
  1538. StreamPairsHeader::pack(UINT8* buf, UINT32 &len)
  1539. {
  1540.     UINT8* off = buf;
  1541.     RMPackUINT32(size, off);
  1542.     RMPackUINT16(object_version, off);
  1543.     RMPackUINT16(num_stream_pairs, off);
  1544.     for (int i = 0;  i < num_stream_pairs; i++)
  1545.         off = stream_pairs[i].pack(off, len);
  1546.     RMPackByteString(stream1_property_name, stream1_property_name_len, off);
  1547.     RMPackByteString(stream2_property_name, stream2_property_name_len, off);
  1548.     len = off-buf;
  1549.     return off;
  1550. }
  1551. HX_INLINE UINT8*
  1552. StreamPairsHeader::unpack(UINT8* buf, UINT32 len)
  1553. {
  1554.     if (!buf || !len)
  1555. return 0;
  1556.     UINT8* off = buf;
  1557.     size             = RMUnpackUINT32(off);
  1558.     object_version   = RMUnpackUINT16(off);
  1559.     num_stream_pairs = RMUnpackUINT16(off);
  1560.     stream_pairs = new StreamPair[num_stream_pairs];
  1561.     if (!stream_pairs) return 0;
  1562.     for (int i = 0;  i < num_stream_pairs; i++)
  1563.         off = stream_pairs[i].unpack(off, len);
  1564.     if (!RMUnpackByteString(stream1_property_name, stream1_property_name_len, off, buf, len)) return 0;
  1565.     if (!RMUnpackByteString(stream2_property_name, stream2_property_name_len, off, buf, len)) return 0;
  1566.     return off;
  1567. }
  1568. HX_INLINE UINT8*
  1569. PhysicalStreamInfo::pack(UINT8* buf, UINT32 &len)
  1570. {
  1571.     UINT8* off = buf;
  1572.     RMPackUINT32(size, off);
  1573.     RMPackUINT16(object_version, off);
  1574.     RMPackUINT16(unPhysicalStreamNumber, off);
  1575.     RMPackUINT16(unLogicalStreamNumber, off);
  1576.     RMPackUINT32(ulDataOffset, off);
  1577.     RMPackUINT32(ulBandwidth, off);
  1578.     *off++ = bInterleavedBackwardsCompatible;
  1579.     *off++ = bTaggedBackwardsCompatible;
  1580.     *off++ = bIncludeAsMultirate;
  1581.     *off++ = bOwnsDataSection;
  1582.     *off++ = bIgnoreOnWrite;
  1583.     len = off-buf;
  1584.     return off;
  1585. }
  1586. HX_INLINE UINT8*
  1587. PhysicalStreamInfo::unpack(UINT8* buf, UINT32 len)
  1588. {
  1589.     if (!buf || !len)
  1590. return 0;
  1591.     UINT8* off = buf;
  1592.     size                   = RMUnpackUINT32(off);
  1593.     object_version         = RMUnpackUINT16(off);
  1594.     unPhysicalStreamNumber = RMUnpackUINT16(off);
  1595.     unLogicalStreamNumber  = RMUnpackUINT16(off);
  1596.     ulDataOffset           = RMUnpackUINT32(off);
  1597.     ulBandwidth            = RMUnpackUINT32(off);
  1598.     bInterleavedBackwardsCompatible = *off++;
  1599.     bTaggedBackwardsCompatible      = *off++;
  1600.     bIncludeAsMultirate             = *off++;
  1601.     bOwnsDataSection                = *off++;
  1602.     bIgnoreOnWrite                  = *off++;
  1603.     return off;
  1604. }
  1605. HX_INLINE UINT8*
  1606. PhysicalStreamInfoHeader::pack(UINT8* buf, UINT32 &len)
  1607. {
  1608.     UINT8* off = buf;
  1609.     RMPackUINT32(size, off);
  1610.     RMPackUINT16(object_version, off);
  1611.     RMPackUINT16(num_physical_streams, off);
  1612.     for (int i = 0;  i < num_physical_streams; i++)
  1613.         off = physical_streams[i].pack(off, len);
  1614.     len = off-buf;
  1615.     return off;
  1616. }
  1617. HX_INLINE UINT8*
  1618. PhysicalStreamInfoHeader::unpack(UINT8* buf, UINT32 len)
  1619. {
  1620.     if (!buf || !len)
  1621. return 0;
  1622.     UINT8* off = buf;
  1623.     size                 = RMUnpackUINT32(off);
  1624.     object_version       = RMUnpackUINT16(off);
  1625.     num_physical_streams = RMUnpackUINT16(off);
  1626.     physical_streams = new PhysicalStreamInfo[num_physical_streams];
  1627.     if (!physical_streams) return 0;
  1628.     for (int i = 0;  i < num_physical_streams; i++)
  1629.         off = physical_streams[i].unpack(off, len);
  1630.     return off;
  1631. }
  1632. HX_INLINE u_int32
  1633. get_rm_object_id(Byte* buffer, int buffer_len)
  1634. {
  1635.     RMGenericHeader gen_header;
  1636.     if (gen_header.unpack(buffer, buffer_len) == 0)
  1637.     {
  1638. return 0;
  1639.     }
  1640.     return gen_header.object_id;
  1641. }
  1642. #endif //_DEFINE_INLINE
  1643. #if (defined( _WIN32 ) || defined( _WINDOWS )) && defined(_M_IX86)
  1644. #pragma pack()
  1645. // Restore warnings
  1646. #pragma warning( default : 4200 )
  1647. #endif
  1648. #ifdef _MACINTOSH
  1649. #pragma options align=reset
  1650. #endif
  1651. #endif