asf.h
上传用户:chn_coc
上传日期:2007-12-20
资源大小:563k
文件大小:6k
源码类别:

P2P编程

开发平台:

Windows_Unix

  1. // ------------------------------------------------
  2. // File : asf.h
  3. // Date: 10-apr-2003
  4. // Author: giles
  5. //
  6. // (c) 2002-3 peercast.org
  7. // ------------------------------------------------
  8. // This program is free software; you can redistribute it and/or modify
  9. // it under the terms of the GNU General Public License as published by
  10. // the Free Software Foundation; either version 2 of the License, or
  11. // (at your option) any later version.
  12. // This program is distributed in the hope that it will be useful,
  13. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. // GNU General Public License for more details.
  16. // ------------------------------------------------
  17. #ifndef _ASF_H
  18. #define _ASF_H
  19. #include "stream.h"
  20. // -----------------------------------
  21. class MSID
  22. {
  23. public:
  24. void read(Stream &in)
  25. {
  26. data1 = in.readLong();
  27. data2 = in.readShort();
  28. data3 = in.readShort();
  29. in.read(data4,8);
  30. }
  31. void write(Stream &out)
  32. {
  33. out.writeLong(data1);
  34. out.writeShort(data2);
  35. out.writeShort(data3);
  36. out.write(data4,8);
  37. }
  38. void toString(String &s)
  39. {
  40. sprintf(s.data,"%X-%X-%X-%02X%02X%02X%02X%02X%02X%02X%02X",
  41. data1,data2,data3,
  42. data4[0],data4[1],data4[2],data4[3],
  43. data4[4],data4[5],data4[6],data4[7]);
  44. }
  45.     int operator==(const MSID& msid) const{return !memcmp(this, &msid, sizeof(MSID));}
  46. unsigned int data1;
  47. unsigned short data2,data3;
  48. unsigned char data4[8];
  49. };
  50. // -----------------------------------
  51. const MSID headObjID=
  52. {0x75B22630, 0x668E, 0x11CF, 0xA6,0xD9,0x00,0xAA,0x00,0x62,0xCE,0x6C};
  53. const MSID dataObjID=
  54. {0x75B22636, 0x668E, 0x11CF, 0xA6,0xD9,0x00,0xAA,0x00,0x62,0xCE,0x6C};
  55. const MSID filePropObjID=
  56. {0x8CABDCA1, 0xA947, 0x11CF, 0x8E,0xE4,0x00,0xC0,0x0C,0x20,0x53,0x65};
  57. const MSID streamPropObjID=
  58. {0xB7DC0791, 0xA9B7, 0x11CF, 0x8E,0xE6,0x00,0xC0,0x0C,0x20,0x53,0x65};
  59. const MSID audioStreamObjID=
  60. {0xF8699E40, 0x5B4D, 0x11CF, 0xA8,0xFD,0x00,0x80,0x5F,0x5C,0x44,0x2B};
  61. const MSID videoStreamObjID=
  62. {0xBC19EFC0, 0x5B4D, 0x11CF, 0xA8,0xFD,0x00,0x80,0x5F,0x5C,0x44,0x2B};
  63. const MSID streamBitrateObjID=
  64. {0x7BF875CE, 0x468D, 0x11D1, 0x8D,0x82,0x00,0x60,0x97,0xC9,0xA2,0xB2};
  65. // -----------------------------------
  66. class ASFObject
  67. {
  68. public:
  69. enum TYPE
  70. {
  71. T_UNKNOWN,
  72. T_HEAD_OBJECT,
  73. T_DATA_OBJECT,
  74. T_FILE_PROP,
  75. T_STREAM_PROP,
  76. T_STREAM_BITRATE
  77. };
  78. int getTotalLen()
  79. {
  80. return 24+dataLen;
  81. }
  82. unsigned int readHead(Stream &in)
  83. {
  84. id.read(in);
  85. lenLo = in.readLong();
  86. lenHi = in.readLong();
  87. type = T_UNKNOWN;
  88. if (id == headObjID)
  89. type = T_HEAD_OBJECT;
  90. else if (id == dataObjID)
  91. type = T_DATA_OBJECT;
  92. else if (id == filePropObjID)
  93. type = T_FILE_PROP;
  94. else if (id == streamPropObjID)
  95. type = T_STREAM_PROP;
  96. else if (id == streamBitrateObjID)
  97. type = T_STREAM_BITRATE;
  98. String str;
  99. id.toString(str);
  100. LOG_DEBUG("ASF: %s (%s)= %d : %dn",str.data,getTypeName(),lenLo,lenHi);
  101. dataLen = 0;
  102. return lenLo-24;
  103. }
  104. void readData(Stream &in,int len)
  105. {
  106. dataLen = len;
  107. if ((dataLen > sizeof(data)) || (lenHi)) 
  108. throw StreamException("ASF object too big");
  109. in.read(data,dataLen);
  110. }
  111. void write(Stream &out)
  112. {
  113. id.write(out);
  114. out.writeLong(lenLo);
  115. out.writeLong(lenHi);
  116. if (dataLen)
  117. out.write(data,dataLen);
  118. }
  119. const char *getTypeName()
  120. {
  121. switch(type)
  122. {
  123. case T_HEAD_OBJECT:
  124. return "ASF_Header_Object";
  125. case T_DATA_OBJECT:
  126. return "ASF_Data_Object";
  127. case T_FILE_PROP:
  128. return "ASF_File_Properties_Object";
  129. case T_STREAM_PROP:
  130. return "ASF_Stream_Properties_Object";
  131. case T_STREAM_BITRATE:
  132. return "ASF_Stream_Bitrate_Properties_Object";
  133. default:
  134. return "Unknown_Object";
  135. }
  136. }
  137. char data[8192];
  138. MSID id;
  139. unsigned int lenLo,lenHi,dataLen;
  140. TYPE type;
  141. };
  142. // -----------------------------------
  143. class ASFStream
  144. {
  145. public:
  146. enum TYPE
  147. {
  148. T_UNKNOWN,
  149. T_AUDIO,
  150. T_VIDEO
  151. };
  152. void read(Stream &in)
  153. {
  154. MSID sid;
  155. sid.read(in);
  156. if (sid == videoStreamObjID)
  157. type = T_VIDEO;
  158. else if (sid == audioStreamObjID)
  159. type = T_AUDIO;
  160. else 
  161. type = T_UNKNOWN;
  162. in.skip(32);
  163. id = in.readShort()&0x7f;
  164. }
  165. const char *getTypeName()
  166. {
  167. switch(type)
  168. {
  169. case T_VIDEO:
  170. return "Video";
  171. case T_AUDIO:
  172. return "Audio";
  173. }
  174. return "Unknown";
  175. }
  176. void reset()
  177. {
  178. id = 0;
  179. bitrate = 0;
  180. type = T_UNKNOWN;
  181. }
  182. unsigned int id;
  183. int bitrate;
  184. TYPE type;
  185. };
  186. // -----------------------------------
  187. class ASFInfo
  188. {
  189. public:
  190. enum
  191. {
  192. MAX_STREAMS = 128
  193. };
  194. ASFInfo()
  195. {
  196. numPackets = 0;
  197. packetSize = 0;
  198. flags = 0;
  199. bitrate=0;
  200. for(int i=0; i<MAX_STREAMS; i++)
  201. streams[i].reset();
  202. }
  203. unsigned int packetSize,numPackets,flags,bitrate;
  204. ASFStream streams[MAX_STREAMS];
  205. };
  206. // -----------------------------------
  207. class ASFChunk
  208. {
  209. public:
  210. void read(Stream &in)
  211. {
  212. type = in.readShort();
  213. len = in.readShort();
  214. seq = in.readLong();
  215. v1 = in.readShort();
  216. v2 = in.readShort();
  217. dataLen = len-8;
  218. if (dataLen > sizeof(data)) 
  219. throw StreamException("ASF chunk too big");
  220. in.read(data,dataLen);
  221. }
  222. void write(Stream &out)
  223. {
  224. out.writeShort(type);
  225. out.writeShort(len);
  226. out.writeLong(seq);
  227. out.writeShort(v1);
  228. out.writeShort(v2);
  229. out.write(data,dataLen);
  230. }
  231. unsigned int seq,dataLen;
  232. unsigned short type,len,v1,v2;
  233. unsigned char data[8192];
  234. };
  235. #endif