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

Symbian

开发平台:

Visual C++

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