asf.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:29k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*****************************************************************************
  2.  *
  3.  * This program is free software ; you can redistribute it and/or modify
  4.  * it under the terms of the GNU General Public License as published by
  5.  * the Free Software Foundation; either version 2 of the License, or
  6.  * (at your option) any later version.
  7.  *
  8.  * This program is distributed in the hope that it will be useful,
  9.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11.  * GNU General Public License for more details.
  12.  *
  13.  * You should have received a copy of the GNU General Public License
  14.  * along with this program; if not, write to the Free Software
  15.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  16.  *
  17.  * The Core Pocket Media Player
  18.  * Copyright (c) 2004-2005 Gabor Kovacs
  19.  *
  20.  ****************************************************************************/
  21. #include "../common/common.h"
  22. #include "asf.h"
  23. //#define DUMPASF
  24. typedef struct asfstreamstate
  25. {
  26. int Offset;
  27. int Size;
  28. tick_t RefTime;
  29. format_ref* Ref;
  30. format_ref** Tail;
  31. } asfstreamstate;
  32. typedef struct asfstream
  33. {
  34. format_stream Stream;
  35. int TimeOffset; // milliseconds
  36.     int DS_Span; // descrambling
  37.     int DS_PacketSize;
  38.     int DS_ChunkSize;
  39. asfstreamstate State;
  40. asfstreamstate Backup;
  41. } asfstream;
  42. typedef struct asfstate
  43. {
  44. bool_t Key;
  45. bool_t Multiple;
  46. bool_t Compressed;
  47. filepos_t End;
  48. int ValueLength;
  49. int Padding;
  50. asfstream* Stream;
  51. int PayloadCount;
  52. filepos_t PayloadEnd;
  53. int PayloadOffset;
  54. int PayloadTime;
  55. int CompressedTime;
  56. int CompressedDelta;
  57. } asfstate;
  58. typedef struct asfguid
  59. {
  60. guid ASFHeader;
  61. guid FileHeader;
  62. guid StreamHeader;
  63. guid AudioStream;
  64. guid VideoStream;
  65. guid CommentHeader;
  66. guid CodecCommentHeader;
  67. guid DataHeader;
  68. guid Index;
  69. guid HeadExt;
  70. guid Head2;
  71. guid NoErrorCorrection;
  72. guid AudioSpread;
  73. guid ExtendedComment;
  74. guid MarkerObject;
  75. guid StreamBitrate;
  76. guid StreamHeaderExt;
  77. } asfguid;
  78. typedef struct asf
  79. {
  80. format_base Format;
  81. filepos_t DataPos;
  82. int PacketMinSize;
  83. int PacketMaxSize;
  84. int64_t PacketCount;
  85. int64_t PlayTime;
  86. int PreRoll;
  87. int Flags;
  88. int ClientId;
  89. bool_t AdjustTime;
  90. bool_t AdjustTime0;
  91. array Bitrate;
  92. tick_t StreamingTime;
  93. format_ref* HTTPRef;
  94. format_reader HTTPReader;
  95. int HTTPChunkLeft;
  96. int HTTPChunkFilter;
  97. asfstate State;
  98. asfstate Backup;
  99. asfguid GUID;
  100. } asf;
  101. static const asfguid ASFGUID =
  102. {
  103.     { 0x75B22630, 0x668E, 0x11CF, { 0xA6, 0xD9, 0x00, 0xAA, 0x00, 0x62, 0xCE, 0x6C }},
  104.     { 0x8CABDCA1, 0xA947, 0x11CF, { 0x8E, 0xE4, 0x00, 0xC0, 0x0C, 0x20, 0x53, 0x65 }},
  105.     { 0xB7DC0791, 0xA9B7, 0x11CF, { 0x8E, 0xE6, 0x00, 0xC0, 0x0C, 0x20, 0x53, 0x65 }},
  106.     { 0xF8699E40, 0x5B4D, 0x11CF, { 0xA8, 0xFD, 0x00, 0x80, 0x5F, 0x5C, 0x44, 0x2B }},
  107.     { 0xBC19EFC0, 0x5B4D, 0x11CF, { 0xA8, 0xFD, 0x00, 0x80, 0x5F, 0x5C, 0x44, 0x2B }},
  108.     { 0x75B22633, 0x668E, 0x11CF, { 0xA6, 0xD9, 0x00, 0xAA, 0x00, 0x62, 0xCE, 0x6C }},
  109. { 0x86D15240, 0x311D, 0x11D0, { 0xA3, 0xA4, 0x00, 0xA0, 0xC9, 0x03, 0x48, 0xF6 }},
  110. { 0x75B22636, 0x668E, 0x11CF, { 0xA6, 0xD9, 0x00, 0xAA, 0x00, 0x62, 0xCE, 0x6C }},
  111. { 0x33000890, 0xE5B1, 0x11CF, { 0x89, 0xF4, 0x00, 0xA0, 0xC9, 0x03, 0x49, 0xCB }},
  112.     { 0x5FBF03B5, 0xA92E, 0x11CF, { 0x8E, 0xE3, 0x00, 0xC0, 0x0C, 0x20, 0x53, 0x65 }},
  113.     { 0xABD3D211, 0xA9BA, 0x11CF, { 0x8E, 0xE6, 0x00, 0xC0, 0x0C, 0x20, 0x53, 0x65 }},
  114. { 0x20FB5700, 0x5B55, 0x11CF, { 0xA8, 0xFD, 0x00, 0x80, 0x5F, 0x5C, 0x44, 0x2B }},
  115. { 0xBFC3CD50, 0x618F, 0x11CF, { 0x8B, 0xB2, 0x00, 0xAA, 0x00, 0xB4, 0xE2, 0x20 }},
  116. { 0xD2D0A440, 0xE307, 0x11D2, { 0x97, 0xF0, 0x00, 0xA0, 0xC9, 0x5E, 0xA8, 0x50 }},
  117. { 0xF487CD01, 0xA951, 0x11CF, { 0x8E, 0xE6, 0x00, 0xC0, 0x0C, 0x20, 0x53, 0x65 }},
  118. { 0x7BF875CE, 0x468D, 0x11D1, { 0x8D, 0x82, 0x00, 0x60, 0x97, 0xC9, 0xA2, 0xB2 }},
  119. { 0x14E6A5CB, 0xC672, 0x4332, { 0x83, 0x99, 0xA9, 0x69, 0x52, 0x06, 0x5B, 0x5A }}
  120. };
  121. static void ReadGUID(format_reader* p,guid* g)
  122. {
  123.     g->v1 = p->ReadLE32(p);
  124.     g->v2 = (uint16_t) p->ReadLE16(p);
  125.     g->v3 = (uint16_t) p->ReadLE16(p);
  126.     p->Read(p,g->v4,8);
  127. }
  128. static void ReadStr(format_reader* p, int Len, tchar_t *Buf, size_t BufLen)
  129. {
  130. uint16_t ch[2];
  131. ch[1] = 0;
  132.     for (;Len>0;Len-=2) 
  133. {
  134.         ch[0] = (uint16_t) p->ReadLE16(p);
  135. #ifndef UNICODE
  136.         WcsToTcs(Buf,BufLen,ch);
  137. BufLen -= tcslen(Buf);
  138. Buf += tcslen(Buf);
  139. #else
  140.         if (BufLen > 1)
  141. {
  142. *Buf++ = ch[0];
  143. --BufLen;
  144. }
  145. #endif
  146.     }
  147.     if (BufLen>0)
  148. *Buf = 0;
  149. }
  150. static void ReleaseStream(asf* p,asfstream* s)
  151. {
  152. Format_ReleaseRef(&p->Format,s->State.Ref);
  153. s->State.Ref = NULL;
  154. s->State.Tail = &s->State.Ref;
  155. s->State.Offset = 0;
  156. s->State.Size = 0;
  157. }
  158. static void AfterSeek(asf* p)
  159. {
  160. p->State.PayloadCount = 0;
  161. p->State.PayloadEnd = -1;
  162. p->State.End = -1;
  163. p->State.Stream = NULL;
  164. }
  165. static void BackupPacketState(asf* p, int Save)
  166. {
  167. int No;
  168. // ugly...
  169. if (Save)
  170. {
  171. p->Backup = p->State;
  172. AfterSeek(p);
  173. }
  174. else
  175. {
  176. AfterSeek(p);
  177. p->State = p->Backup;
  178. }
  179. for (No=0;No<p->Format.StreamCount;++No)
  180. {
  181. asfstream* s = (asfstream*) p->Format.Streams[No];
  182. if (Save)
  183. {
  184. s->Backup = s->State;
  185. s->State.Ref = NULL; // don't release fragref
  186. ReleaseStream(p,s);
  187. }
  188. else
  189. {
  190. ReleaseStream(p,s);
  191. s->State = s->Backup;
  192. }
  193. }
  194. }
  195. static void ReadStreamHeader(asf* p, format_reader* Reader)
  196. {
  197. int StreamId,i;
  198. int TimeOffset;
  199. int* BitRate;
  200. int FormatSize;
  201. int ErrorSize;
  202. guid Id,StreamType;
  203. asfstream* s;
  204. ReadGUID(Reader,&StreamType); // stream type
  205. ReadGUID(Reader,&Id); // error correction type
  206. TimeOffset = (int)(Reader->ReadLE64(Reader)/10000) - p->PreRoll;
  207. FormatSize = Reader->ReadLE32(Reader); // type-specific data length
  208. ErrorSize = Reader->ReadLE32(Reader); // error correction length
  209. StreamId = Reader->ReadLE16(Reader) & 0x7F; // flags
  210. Reader->Skip(Reader,4);
  211. for (i=0;i<p->Format.StreamCount;++i)
  212. if (p->Format.Streams[i]->Id == StreamId)
  213. return;
  214. s = (asfstream*) Format_AddStream(&p->Format,sizeof(asfstream));
  215. if (!s)
  216. return;
  217. ReleaseStream(p,s);
  218. s->Stream.Id = StreamId;
  219. s->TimeOffset = TimeOffset;
  220. s->DS_Span = 0;
  221. if (memcmp(&StreamType, &p->GUID.AudioStream, sizeof(guid))==0)
  222. {
  223. Format_WaveFormat(Reader,&s->Stream,FormatSize);
  224. if (memcmp(&Id,&p->GUID.AudioSpread,sizeof(guid))==0)
  225. {
  226. int SilentLength;
  227. s->DS_Span = Reader->Read8(Reader);
  228. s->DS_PacketSize = Reader->ReadLE16(Reader);
  229. s->DS_ChunkSize = Reader->ReadLE16(Reader);
  230. SilentLength = Reader->ReadLE16(Reader);
  231. Reader->Skip(Reader,SilentLength);
  232. }
  233. if (s->DS_Span > 1) 
  234. if (!s->DS_ChunkSize || (s->DS_PacketSize/s->DS_ChunkSize <= 1))
  235. s->DS_Span = 0;
  236. }
  237. else
  238. if (memcmp(&StreamType, &p->GUID.VideoStream, sizeof(guid))==0)
  239. {
  240. int BitmapInfoSize;
  241. PacketFormatClear(&s->Stream.Format);
  242. s->Stream.Format.Type = PACKET_VIDEO;
  243. Reader->Skip(Reader,4+4+1); 
  244. BitmapInfoSize = Reader->ReadLE16(Reader);
  245. if (BitmapInfoSize > 40 || FormatSize<=40+4+4+1+2)
  246. FormatSize = BitmapInfoSize;
  247. else
  248. FormatSize -= 4+4+1+2;
  249. Reader->Skip(Reader,4); 
  250. s->Stream.Format.Format.Video.Width = Reader->ReadLE32(Reader);
  251. s->Stream.Format.Format.Video.Height = Reader->ReadLE32(Reader);
  252. Reader->ReadLE16(Reader); // planes
  253. s->Stream.Format.Format.Video.Pixel.BitCount = Reader->ReadLE16(Reader);
  254. s->Stream.Format.Format.Video.Pixel.FourCC = Reader->ReadLE32(Reader);
  255. s->Stream.Format.Format.Video.Aspect = ASPECT_ONE; //todo
  256. Reader->Skip(Reader,20); //SizeImage,XPelsPerMeter,YPelsPerMeter,ClrUsed,ClrImportant
  257. FormatSize -= 40;
  258. if (FormatSize > 0 && PacketFormatExtra(&s->Stream.Format,FormatSize))
  259. Reader->Read(Reader,s->Stream.Format.Extra,s->Stream.Format.ExtraLength);
  260. PacketFormatDefault(&s->Stream.Format);
  261. }
  262. if (!s->Stream.Format.ByteRate)
  263. for (BitRate=ARRAYBEGIN(p->Bitrate,int);BitRate!=ARRAYEND(p->Bitrate,int);BitRate+=2)
  264. if (BitRate[0] == s->Stream.Id)
  265. {
  266. s->Stream.Format.ByteRate = BitRate[1]/8;
  267. break;
  268. }
  269. Format_PrepairStream(&p->Format,&s->Stream);
  270. }
  271. static int ReadHeaderExt(asf* p,format_reader* Reader,int Size)
  272. {
  273. guid Id;
  274. filepos_t EndPos;
  275. filepos_t End = Reader->FilePos+Size;
  276.     while (Reader->FilePos<End)
  277. {
  278. if (Reader->Eof(Reader))
  279. return ERR_INVALID_DATA;
  280.         ReadGUID(Reader,&Id);
  281.         EndPos = (filepos_t)Reader->ReadLE64(Reader) - 24;
  282.         if (EndPos < 0)
  283. return ERR_INVALID_DATA;
  284. EndPos += Reader->FilePos;
  285. DEBUG_MSG6(DEBUG_FORMAT,T("ASFExt %08x %08x-%04x-%04x-%08x%08x"),Reader->FilePos,Id.v1,Id.v2,Id.v3,*(int32_t*)&Id.v4[0],*(int32_t*)&Id.v4[4]);
  286.         if (memcmp(&Id, &p->GUID.StreamHeaderExt, sizeof(guid))==0) 
  287. {
  288. int i,n,PayloadCount,NameCount;
  289. // skip extended information
  290. // we are only interested in StreamHeader at the end...
  291. Reader->Skip(Reader,8); // start time
  292. Reader->Skip(Reader,8); // end time
  293. Reader->Skip(Reader,4+4+4); // data bitrate, buffer size, initial buffer fullness
  294. Reader->Skip(Reader,4+4+4); // alternate data bitrate, buffer size, initial buffer fullness
  295. Reader->Skip(Reader,4+4); // maximum object size, flags
  296. Reader->Skip(Reader,2); // stream id
  297. Reader->Skip(Reader,2+8); // language id, avg time per frame
  298. NameCount = Reader->ReadLE16(Reader);
  299. PayloadCount = Reader->ReadLE16(Reader);
  300. for (i=0;i<NameCount;++i)
  301. {
  302. Reader->Skip(Reader,2); // lang id
  303. n = Reader->ReadLE16(Reader);
  304. Reader->Skip(Reader,n*2);
  305. }
  306. for (i=0;i<PayloadCount;++i)
  307. {
  308. Reader->Skip(Reader,16+2); // guid, data size
  309. n = Reader->ReadLE32(Reader);
  310. Reader->Skip(Reader,n);
  311. }
  312. if (EndPos>Reader->FilePos+16+8)
  313. {
  314.         ReadGUID(Reader,&Id);
  315. Reader->ReadLE64(Reader);
  316. if (memcmp(&Id, &p->GUID.StreamHeader, sizeof(guid))==0)
  317. ReadStreamHeader(p,Reader);
  318. }
  319. }
  320.         Reader->Seek(Reader,EndPos,SEEK_SET);
  321. }
  322. return ERR_NONE;
  323. }
  324. static int ReadHeader(asf* p,format_reader* Reader)
  325. {
  326. int i,Count;
  327. tchar_t Buf[256];
  328. guid Id;
  329. filepos_t EndPos;
  330. ReadGUID(Reader,&Id);
  331. if (memcmp(&Id, &p->GUID.ASFHeader, sizeof(guid))!=0)
  332. return ERR_INVALID_DATA;
  333. ArrayDrop(&p->Bitrate);
  334. Reader->Skip(Reader,8+4+1+1);
  335.     for (;;)
  336. {
  337. if (Reader->Eof(Reader))
  338. return ERR_INVALID_DATA;
  339.         ReadGUID(Reader,&Id);
  340.         EndPos = (filepos_t)Reader->ReadLE64(Reader) - 24;
  341. if (!memcmp(&Id, &p->GUID.DataHeader, sizeof(guid))) // allow invalid EndPos for this chunk
  342. {
  343. Reader->Skip(Reader,sizeof(guid)+8+2); // file id, total data packets, reserved
  344.             break;
  345.         } 
  346.         if (EndPos < 0)
  347. return ERR_INVALID_DATA;
  348. EndPos += Reader->FilePos;
  349. DEBUG_MSG6(DEBUG_FORMAT,T("ASF %08x %08x-%04x-%04x-%08x%08x"),Reader->FilePos,Id.v1,Id.v2,Id.v3,*(int32_t*)&Id.v4[0],*(int32_t*)&Id.v4[4]);
  350.         if (memcmp(&Id, &p->GUID.FileHeader, sizeof(guid))==0) 
  351. {
  352. int BitRate;
  353. Reader->Skip(Reader,sizeof(guid)+8+8);
  354. p->PacketCount = Reader->ReadLE64(Reader);
  355. p->PlayTime = Reader->ReadLE64(Reader);
  356. Reader->Skip(Reader,8); // send_time (sometimes not even valid)
  357. p->AdjustTime = 0;
  358. p->PreRoll = Reader->ReadLE32(Reader);
  359. Reader->Skip(Reader,4); // ignore
  360. p->Flags = Reader->ReadLE32(Reader);
  361. p->PacketMinSize = Reader->ReadLE32(Reader); // min packet size
  362. p->PacketMaxSize = Reader->ReadLE32(Reader); // max packet size
  363. BitRate = Reader->ReadLE32(Reader); // max bitrate
  364. if (BitRate > 0)
  365. p->Format.SumByteRate = BitRate/8;
  366. if (!(p->Flags & 1)) // not broadcast
  367. p->Format.Duration = (tick_t)(((p->PlayTime - (int64_t)p->PreRoll * 10000) * TICKSPERSEC) / 10000000);
  368. else
  369. {
  370. p->AdjustTime = 1;
  371. p->Format.Duration = -1;
  372. if (p->PacketMinSize <= 0)
  373. p->PacketMinSize = 0;
  374. if (p->PacketMaxSize <= 0)
  375. p->PacketMaxSize = 4*1024*1024;
  376. }
  377. p->AdjustTime0 = p->AdjustTime;
  378.         }
  379. else if (memcmp(&Id, &p->GUID.StreamHeader, sizeof(guid))==0)
  380. {
  381. ReadStreamHeader(p,Reader);
  382. }
  383. else if (!memcmp(&Id, &p->GUID.MarkerObject, sizeof(guid)) && p->Format.Comment.Node)
  384. {
  385. int Len;
  386. Reader->Skip(Reader,sizeof(guid)); // reserved
  387. Count = Reader->ReadLE32(Reader);
  388. Reader->Skip(Reader,2);   // reserved
  389. Len = Reader->ReadLE16(Reader);
  390. ReadStr(Reader,Len,Buf,TSIZEOF(Buf)); // marker name
  391. for (i=0;i<Count;++i)
  392. {
  393. int64_t Time;
  394. filepos_t EndPos;
  395. Reader->Skip(Reader,8); // position
  396. Time = Reader->ReadLE64(Reader);
  397. EndPos = Reader->ReadLE16(Reader);
  398. EndPos += Reader->FilePos;
  399. Reader->Skip(Reader,8); // send time, flags
  400. stprintf_s(Buf,TSIZEOF(Buf),T("CHAPTER%02dNAME="),i+1);
  401. Len = Reader->ReadLE32(Reader);
  402. ReadStr(Reader,Len*sizeof(uint16_t),Buf+tcslen(Buf),TSIZEOF(Buf)-tcslen(Buf));
  403. p->Format.Comment.Node->Set(p->Format.Comment.Node,p->Format.Comment.No,Buf,sizeof(Buf));
  404. BuildChapter(Buf,TSIZEOF(Buf),i+1,Time,10000);
  405. p->Format.Comment.Node->Set(p->Format.Comment.Node,p->Format.Comment.No,Buf,sizeof(Buf));
  406. Reader->Seek(Reader,EndPos,SEEK_SET);
  407. }
  408. }
  409. else if (!memcmp(&Id, &p->GUID.ExtendedComment, sizeof(guid)) && p->Format.Comment.Node)
  410. {
  411. int Type,Len;
  412. Count = Reader->ReadLE16(Reader);
  413. for (i=0;i<Count;++i)
  414. {
  415. Len = Reader->ReadLE16(Reader);
  416. ReadStr(Reader,Len,Buf,TSIZEOF(Buf));
  417. Type = Reader->ReadLE16(Reader);
  418. Len = Reader->ReadLE16(Reader);
  419. if (Type == 0)
  420. {
  421. tcsupr(Buf);
  422. tcscat_s(Buf,TSIZEOF(Buf),T("="));
  423. ReadStr(Reader,Len,Buf+tcslen(Buf),TSIZEOF(Buf)-tcslen(Buf));
  424. p->Format.Comment.Node->Set(p->Format.Comment.Node,p->Format.Comment.No,Buf,sizeof(Buf));
  425. }
  426. else
  427. Reader->Skip(Reader,Len);
  428. }
  429. }
  430. else if (!memcmp(&Id, &p->GUID.HeadExt, sizeof(guid)))
  431. {
  432.         ReadGUID(Reader,&Id);
  433. if (!memcmp(&Id, &p->GUID.Head2, sizeof(guid)))
  434. {
  435. int Result;
  436. Reader->Skip(Reader,2);
  437. Result = ReadHeaderExt(p,Reader,Reader->ReadLE32(Reader));
  438. if (Result != ERR_NONE)
  439. return Result;
  440. }
  441. }
  442. else if (!memcmp(&Id, &p->GUID.StreamBitrate, sizeof(guid)))
  443. {
  444. int Len = Reader->ReadLE16(Reader);
  445. ArrayAppend(&p->Bitrate,NULL,Len*2*sizeof(int),32);
  446. for (i=0;i<Len;++i)
  447. {
  448. int No,Id,BitRate;
  449. ARRAYBEGIN(p->Bitrate,int)[i*2] = Id = Reader->ReadLE16(Reader);
  450. ARRAYBEGIN(p->Bitrate,int)[i*2+1] = BitRate = Reader->ReadLE32(Reader);
  451. for (No=0;No<p->Format.StreamCount;++No)
  452. {
  453. format_stream* Stream = p->Format.Streams[No];
  454. if (Stream->Id == Id && !Stream->Format.ByteRate)
  455. Stream->Format.ByteRate = BitRate/8;
  456. }
  457. }
  458. }
  459. else if (!memcmp(&Id, &p->GUID.CommentHeader, sizeof(guid)) && p->Format.Comment.Node) 
  460. {
  461. static const tchar_t* const Comment[5] = { T("TITLE="), T("AUTHOR="), T("COPYRIGHT="), T("COMMENT="), T("RATING=") };
  462.             int Len[5];
  463. for (i=0;i<5;++i) 
  464. Len[i] = Reader->ReadLE16(Reader);
  465. for (i=0;i<5;++i)
  466. if (Len[i])
  467. {
  468. tcscpy_s(Buf,TSIZEOF(Buf),Comment[i]);
  469. ReadStr(Reader,Len[i],Buf+tcslen(Buf),TSIZEOF(Buf)-tcslen(Buf));
  470. if (tcslen(Buf) != tcslen(Comment[i]))
  471. p->Format.Comment.Node->Set(p->Format.Comment.Node,p->Format.Comment.No,Buf,sizeof(Buf));
  472. }
  473. }
  474.         Reader->Seek(Reader,EndPos,SEEK_SET);
  475.     }
  476. return ERR_NONE;
  477. }
  478. static int Init(asf* p)
  479. {
  480. format_reader* Reader = p->Format.Reader;
  481. int Result;
  482. Result = ReadHeader(p,Reader);
  483. if (Result != ERR_NONE)
  484. return Result;
  485.  
  486. AfterSeek(p);
  487. p->StreamingTime = -1;
  488. p->Format.TimeStamps = 1;
  489. p->Format.HeaderLoaded = 1;
  490. p->Format.SeekByPacket_DataStart = Reader->FilePos;
  491. if (p->PacketMaxSize == p->PacketMinSize)
  492. p->Format.SeekByPacket_BlockAlign = p->PacketMaxSize;
  493. return Result;
  494. }
  495. static void Done(asf* p)
  496. {
  497. ArrayClear(&p->Bitrate);
  498. }
  499. static int NOINLINE ReadValue(asf* p, format_reader* Reader,int Bits,int Default)
  500. {
  501. switch (Bits & 3)
  502. {
  503. default:
  504. case 0: return Default;
  505. case 1: return Reader->Read8(Reader);
  506. case 2: return Reader->ReadLE16(Reader);
  507. case 3: return Reader->ReadLE32(Reader);
  508. }
  509. }
  510. static bool_t ReadPacketHead(asf* p, format_reader* Reader,filepos_t End)
  511. {
  512. filepos_t pos;
  513. int len,time,padding;
  514. int i;
  515. pos = Reader->FilePos;
  516. if (p->PacketMinSize>0 && p->PacketMaxSize==p->PacketMinSize)
  517. {
  518. p->State.End = pos + p->PacketMinSize;
  519. p->State.Padding = 0;
  520. }
  521. i = Reader->Read8(Reader);
  522. if (i<0)
  523. return 0;
  524. if (i & 0x80)
  525. {
  526. // no real error correction supported
  527. if (i != 0x82 && i != 0x90)
  528. return 1;
  529. Reader->Skip(Reader,i & 15);
  530. i = Reader->Read8(Reader);
  531. }
  532. p->State.Multiple = i & 1;
  533.     p->State.ValueLength = Reader->Read8(Reader);
  534. len = ReadValue(p,Reader,i>>5,p->PacketMaxSize);
  535. if (len<8 || len>p->PacketMaxSize)
  536. return 1;
  537.     ReadValue(p,Reader,i>>1,0); // sequence
  538. padding = ReadValue(p,Reader,i>>3,0);
  539. if (padding<0 || padding>=p->PacketMaxSize) 
  540. return 1;
  541.     time = Reader->ReadLE32(Reader); // send time (milliseconds)
  542. if (p->StreamingTime >= 0)
  543. {
  544. if (!p->AdjustTime)
  545. {
  546. // orb server uses global time as timestamp, have to adjust it (but there is duration)
  547. p->Format.GlobalOffset = p->StreamingTime - Scale(time,TICKSPERSEC,1000);
  548. p->Format.TimeStamps = 0;
  549. }
  550. p->StreamingTime = -1;
  551. }
  552.     Reader->Skip(Reader,2); // duration (milliseconds)
  553.     if (p->State.Multiple)
  554. {
  555. i = Reader->Read8(Reader);
  556. p->State.PayloadCount = i&63;
  557. p->State.ValueLength |= i<<8;
  558.     } 
  559. else 
  560. p->State.PayloadCount = 1;
  561. pos += len - padding;
  562. if (pos <= Reader->FilePos)
  563. {
  564. p->State.PayloadCount = 0;
  565. return 1;
  566. }
  567. assert(pos-Reader->FilePos<0x10000000);
  568.     if (len < p->PacketMinSize)
  569.         padding += p->PacketMinSize - len;
  570. p->State.End = pos;
  571.     p->State.Padding = padding;
  572. if (p->HTTPRef) // adjust padding to remaining http packet length
  573. {
  574. p->State.Padding = Reader->ReadLen + p->HTTPChunkLeft - Reader->ReadPos - (pos - Reader->FilePos);
  575. if (p->State.Padding < 0)
  576. {
  577. p->State.End += p->State.Padding;
  578. p->State.Padding = 0;
  579. }
  580. }
  581. // DEBUG_MSG3(-1,T("asf %08x %d count:%d"),p->State.End,p->State.Padding,p->State.PayloadCount);
  582. return 1;
  583. }
  584. static bool_t ReadPayload(asf* p,format_reader* Reader)
  585. {
  586. int n,v = Reader->Read8(Reader); // stream number + keyframe bit
  587. if (v<0)
  588. {
  589. p->State.PayloadCount = 0;
  590. return 0;
  591. }
  592. p->State.Stream = NULL;
  593. p->State.Key = v>>7;
  594. v &= 0x7F;
  595. for (n=0;n<p->Format.StreamCount;++n)
  596. if (p->Format.Streams[n]->Id == v)
  597. {
  598. p->State.Stream = (asfstream*) p->Format.Streams[n];
  599. break;
  600. }
  601. ReadValue(p,Reader,p->State.ValueLength>>4,0); // sequence
  602. v = ReadValue(p,Reader,p->State.ValueLength>>2,0);
  603. n = ReadValue(p,Reader,p->State.ValueLength,0); // replicated data length
  604. p->State.Compressed = n==1;
  605. if (p->State.Compressed)
  606. {
  607. p->State.CompressedTime = p->State.PayloadTime = v;
  608. p->State.CompressedDelta = Reader->Read8(Reader);
  609. p->State.PayloadOffset = 0;
  610. }
  611. else 
  612. {
  613. p->State.PayloadOffset = v;
  614. if (n>1)
  615. {
  616. if (n<8)
  617. {
  618. p->State.PayloadCount = 0;
  619. return 1;
  620. }
  621. if (p->State.Stream)
  622. {
  623. p->State.Stream->State.Size = Reader->ReadLE32(Reader);
  624. p->State.PayloadTime = Reader->ReadLE32(Reader);
  625. n -= 8;
  626. }
  627. Reader->Skip(Reader,n);
  628. }
  629. }
  630. if (p->AdjustTime)
  631. {
  632. p->AdjustTime = 0;
  633. for (n=0;n<p->Format.StreamCount;++n)
  634. ((asfstream*)p->Format.Streams[n])->TimeOffset = -p->State.PayloadTime;
  635. }
  636. if (p->State.Multiple)
  637. {
  638. p->State.PayloadEnd = ReadValue(p,Reader,p->State.ValueLength>>14,0);
  639. p->State.PayloadEnd += Reader->FilePos;
  640. if (p->State.PayloadEnd > p->State.End)
  641. {
  642. p->State.PayloadCount = 0;
  643. p->State.PayloadEnd = -1;
  644. return 1;
  645. }
  646. }
  647. else
  648. p->State.PayloadEnd = p->State.End;
  649. if (!p->State.Stream)
  650. {
  651. Reader->Skip(Reader,p->State.PayloadEnd - Reader->FilePos);
  652. p->State.PayloadEnd = -1;
  653. --p->State.PayloadCount;
  654. }
  655. return 1;
  656. }
  657. static int ReadPacket(asf* p, format_reader* Reader, format_packet* Packet)
  658. {
  659. filepos_t End = Reader->FilePos+BLOCKSIZE;
  660. for (;;)
  661. {
  662. if (p->State.PayloadCount<=0)
  663. {
  664. if (Reader->FilePos >= End)
  665. break;
  666. if (p->State.End >= 0)
  667. {
  668. Reader->Skip(Reader,p->State.End+p->State.Padding-Reader->FilePos);
  669. p->State.End = -1;
  670. }
  671. if (!ReadPacketHead(p,Reader,End))
  672. break;
  673. }
  674. else 
  675. if (p->State.PayloadEnd<0)
  676. {
  677. if (!ReadPayload(p,Reader))
  678. break;
  679. }
  680. else
  681. {
  682. int Size = p->State.PayloadEnd - Reader->FilePos;
  683. if (Size<=0)
  684. {
  685. p->State.PayloadEnd = -1;
  686. --p->State.PayloadCount;
  687. }
  688. else
  689. {
  690. asfstream* s = p->State.Stream;
  691. if (p->State.Compressed)
  692. {
  693. s->State.Size = Reader->Read8(Reader);
  694. if (s->State.Size > Size)
  695. {
  696. Reader->Skip(Reader,Size);
  697. continue;
  698. }
  699. Size = s->State.Size;
  700. p->State.PayloadTime = p->State.CompressedTime;
  701. p->State.CompressedTime += p->State.CompressedDelta;
  702. }
  703. if (s->State.Offset != p->State.PayloadOffset) // gap in offset
  704. {
  705. ReleaseStream(p,s);
  706. if (p->State.PayloadOffset)
  707. {
  708. Reader->Skip(Reader,Size);
  709. continue;
  710. }
  711. }
  712. if (s->State.Offset==0) // start of a new packet
  713. {
  714. s->State.RefTime = Scale(p->State.PayloadTime + s->TimeOffset,TICKSPERSEC,1000);
  715. if (s->State.RefTime < 0)
  716. s->State.RefTime = 0;
  717. }
  718. *s->State.Tail = Reader->ReadAsRef(Reader,Size);
  719. while (*s->State.Tail)
  720. s->State.Tail = &(*s->State.Tail)->Next;
  721. s->State.Offset += Size;
  722. if (s->State.Offset >= s->State.Size) 
  723. {
  724. Packet->Key = p->State.Key;
  725. Packet->Data = s->State.Ref;
  726. Packet->RefTime = s->State.RefTime;
  727. Packet->Stream = &s->Stream;
  728. if (s->DS_Span > 1) 
  729. {
  730. format_ref* New = NULL;
  731. format_ref** Ptr = &New;
  732. int Left = s->State.Size;
  733. int Row = 0;
  734. int Col = 0;
  735. while (Left>0) 
  736. {
  737. int Idx = Row+Col*s->DS_Span;
  738. *Ptr = Format_DupRef(&p->Format,Packet->Data,Idx * s->DS_ChunkSize, s->DS_ChunkSize );
  739. while (*Ptr)
  740. Ptr = &(*Ptr)->Next;
  741. Left -= s->DS_ChunkSize;
  742. Col++;
  743. if (Col == s->DS_Span)
  744. {
  745. Col = 0;
  746. Row++;
  747. }
  748. }
  749. Format_ReleaseRef(&p->Format,Packet->Data);
  750. Packet->Data = New;
  751. }
  752. s->State.Size = 0;
  753. s->State.Offset = 0;
  754. s->State.Ref = NULL;
  755. s->State.Tail = &s->State.Ref;
  756. return ERR_NONE;
  757. }
  758. }
  759. }
  760. }
  761. return ERR_DATA_NOT_FOUND;
  762. }
  763. static int Seek(asf* p,tick_t Time,filepos_t FilePos,bool_t PrevKey)
  764. {
  765. return Format_SeekByPacket(&p->Format,Time,FilePos,PrevKey);
  766. }
  767. #ifdef DUMPASF
  768. static FILE* Dump = NULL;
  769. #endif
  770. static bool_t GetHTTPBuffer(format_reader* HTTPReader)
  771. {
  772. int n,Ofs = 0;
  773. asf* p = ((asf*)((char*)(HTTPReader)-(int)&(((asf*)0)->HTTPReader)));
  774. format_reader* Reader = p->Format.Reader;
  775. for (n=0;n<16;++n) // maximum chunk tries
  776. {
  777. if (p->HTTPRef)
  778. {
  779. Format_ReleaseRef(&p->Format,p->HTTPRef);
  780. p->HTTPRef = NULL;
  781. HTTPReader->ReadBuffer = NULL;
  782. Ofs = HTTPReader->ReadPos - HTTPReader->ReadLen;
  783. HTTPReader->ReadLen = 0;
  784. }
  785. if (p->HTTPChunkLeft > 0)
  786. {
  787. p->HTTPRef = Reader->ReadAsRef(Reader,-p->HTTPChunkLeft);
  788. if (!p->HTTPRef)
  789. {
  790. HTTPReader->NoMoreInput = Reader->Eof(Reader);
  791. break;
  792. }
  793. else
  794. {
  795. HTTPReader->ReadBuffer = p->HTTPRef->Buffer;
  796. HTTPReader->ReadPos = p->HTTPRef->Begin + Ofs;
  797. HTTPReader->ReadLen = p->HTTPRef->Begin + p->HTTPRef->Length;
  798. p->HTTPChunkLeft -= p->HTTPRef->Length;
  799. #ifdef DUMPASF
  800. if (Dump)
  801. fwrite(HTTPReader->ReadBuffer->Block.Ptr+HTTPReader->ReadPos,1,HTTPReader->ReadLen-HTTPReader->ReadPos,Dump);
  802. #endif
  803. break;
  804. }
  805. }
  806. else
  807. {
  808. int Type,Len;
  809. Type = Reader->ReadLE16(Reader);
  810. Len = Reader->ReadLE16(Reader)-8;
  811. Reader->Skip(Reader,8);
  812. if ((Type & ASF_CHUNK_MASK) != p->HTTPChunkFilter)
  813. {
  814. if (Type == ASF_CHUNK_END && Len<0)
  815. Len += 8;
  816. HTTPReader->NoMoreInput = Reader->Eof(Reader);
  817. if (HTTPReader->NoMoreInput)
  818. break;
  819. if (Len >= 0)
  820. {
  821. #if 0 //def DUMPASF
  822. if (Dump)
  823. {
  824. void* i = malloc(Len);
  825. Reader->Read(Reader,i,Len);
  826. fwrite(i,1,Len,Dump);
  827. free(i);
  828. }
  829. else
  830. #endif
  831. Reader->Skip(Reader,Len);
  832. }
  833. }
  834. else
  835. p->HTTPChunkLeft = Len;
  836. }
  837. }
  838. return HTTPReader->ReadBuffer != NULL;
  839. }
  840. static void AfterSeekHTTP(asf* p)
  841. {
  842. AfterSeek(p);
  843. Format_ReleaseRef(&p->Format,p->HTTPRef);
  844. p->HTTPRef = NULL;
  845. p->HTTPChunkLeft = 0;
  846. p->HTTPReader.NoMoreInput = 0;
  847. p->HTTPReader.FilePos = 0;
  848. p->HTTPReader.ReadPos = 0;
  849. p->HTTPReader.ReadLen = 0;
  850. p->HTTPReader.ReadBuffer = NULL;
  851. }
  852. static int SetPragma(asf* p,tick_t Time)
  853. {
  854. int i;
  855. tchar_t Pragma[512];
  856. if (p->Format.StreamCount &&
  857. p->Format.Reader[0].Input->Get(p->Format.Reader[0].Input,STREAM_PRAGMA_GET,Pragma,sizeof(Pragma)) == ERR_NONE &&
  858. tcslen(Pragma)>0)
  859. {
  860. bool_t First=1;
  861. int Count=0;
  862. p->StreamingTime = Time;
  863. for (i=0;i<p->Format.StreamCount;++i)
  864. if (p->Format.Streams[i]->Pin.Node)
  865. ++Count;
  866. stprintf_s(Pragma,TSIZEOF(Pragma),
  867. T("Pragma: no-cache,rate=1.000000,stream-time=%d,stream-offset=4294967295:4294967295,")
  868. T("request-context=2,max-duration=0,")
  869. T("xPlayStrm=1,")
  870. T("xClientGUID={3300AD50-2C39-46c0-AE0A-132C%08X},")
  871. T("stream-switch-count=%d,")
  872. T("stream-switch-entry=")
  873. ,Scale(Time,1000,TICKSPERSEC),p->ClientId,Count);
  874. for (i=0;i<p->Format.StreamCount;++i)
  875. if (p->Format.Streams[i]->Pin.Node)
  876. {
  877. if (!First) tcscat_s(Pragma,TSIZEOF(Pragma),T(" ")); else First=0;
  878. stcatprintf_s(Pragma,TSIZEOF(Pragma),T("ffff:%d:0"),p->Format.Streams[i]->Id);
  879. }
  880. tcscat_s(Pragma,TSIZEOF(Pragma),T("n"));
  881. if (p->Format.Reader[0].Input->Set(p->Format.Reader[0].Input,STREAM_PRAGMA_SEND,Pragma,sizeof(Pragma)) == ERR_NONE)
  882. {
  883. int Result = Format_SeekForce(&p->Format,0,SEEK_SET); //reopen (because of seeking)
  884. if (Result == ERR_NONE)
  885. p->AdjustTime = p->AdjustTime0;
  886. return Result;
  887. }
  888. }
  889. return ERR_NOT_SUPPORTED;
  890. }
  891. static int InitHTTP(asf* p)
  892. {
  893. int Result;
  894. p->StreamingTime = 0;
  895. p->HTTPRef = NULL;
  896. memcpy(&p->HTTPReader,p->Format.Reader,sizeof(p->HTTPReader));
  897. p->HTTPReader.BufferAvailable = 0;
  898. p->HTTPReader.BufferFirst = NULL;
  899. p->HTTPReader.BufferLast = NULL;
  900. p->HTTPReader.Input = NULL;
  901. p->HTTPReader.InputBuffer = NULL;
  902. p->HTTPReader.GetReadBuffer = GetHTTPBuffer;
  903. AfterSeekHTTP(p);
  904. p->HTTPChunkFilter = ASF_CHUNK_HEADER;
  905. Result = ReadHeader(p,&p->HTTPReader);
  906. if (Result != ERR_NONE)
  907. return Result;
  908.  
  909. AfterSeekHTTP(p);
  910. p->HTTPChunkFilter = ASF_CHUNK_DATA;
  911. p->PacketMinSize = 0; // it's possible packets are not padded to MinSize
  912. p->ClientId = (rand() << 16) | rand();
  913. p->Format.HeaderLoaded = 1;
  914. p->Format.ReadSize = 4096;
  915. if (!GetHTTPBuffer(&p->HTTPReader) && p->HTTPReader.Eof(&p->HTTPReader))
  916. Result = SetPragma(p,0); // try reopen http stream with proper pragma
  917. #ifdef DUMPASF
  918. Dump = fopen("\dumpasf.asf","wb+");
  919. #endif
  920. return Result;
  921. }
  922. static void DoneHTTP(asf* p)
  923. {
  924. #ifdef DUMPASF
  925. if (Dump)
  926. {
  927. fclose(Dump);
  928. Dump = NULL;
  929. }
  930. #endif
  931. Format_ReleaseRef(&p->Format,p->HTTPRef);
  932. Done(p);
  933. }
  934. static int SetHTTP(asf* p,int No,const void* Data,int Size)
  935. {
  936. int Result = FormatBaseSet(&p->Format,No,Data,Size);
  937. if (No==FORMAT_UPDATEMASK && Size==sizeof(tick_t))
  938. SetPragma(p,*(tick_t*)Data);
  939. return Result;
  940. }
  941. static int SeekHTTP(asf* p,tick_t Time,filepos_t FilePos,bool_t PrevKey)
  942. {
  943. if (Time < 0)
  944. return ERR_NOT_SUPPORTED;
  945. return SetPragma(p,Time);
  946. }
  947. static int ReadPacketHTTP(asf* p, format_reader* Reader, format_packet* Packet)
  948. {
  949. return ReadPacket(p,&p->HTTPReader,Packet);
  950. }
  951. static int Create(asf* p)
  952. {
  953. p->GUID = ASFGUID;
  954. p->Format.Init = (fmtfunc)Init;
  955. p->Format.Done = (fmtvoid)Done;
  956. p->Format.Seek = (fmtseek)Seek;
  957. p->Format.ReadPacket = (fmtreadpacket)ReadPacket;
  958. p->Format.ReleaseStream = (fmtstream)ReleaseStream;
  959. p->Format.AfterSeek = (fmtvoid)AfterSeek;
  960. p->Format.BackupPacketState = (fmtbackup)BackupPacketState;
  961. return ERR_NONE;
  962. }
  963. static int CreateHTTP(asf* p)
  964. {
  965. p->GUID = ASFGUID;
  966. p->Format.Init = (fmtfunc)InitHTTP;
  967. p->Format.Done = (fmtvoid)DoneHTTP;
  968. p->Format.Seek = (fmtseek)SeekHTTP;
  969. p->Format.ReadPacket = (fmtreadpacket)ReadPacketHTTP;
  970. p->Format.AfterSeek = (fmtvoid)AfterSeekHTTP;
  971. p->Format.Format.Set = (nodeset)SetHTTP;
  972. return ERR_NONE;
  973. }
  974. static const nodedef ASF = 
  975. {
  976. sizeof(asf),
  977. ASF_ID,
  978. FORMATBASE_CLASS,
  979. PRI_DEFAULT-1, // prefer WMVF and WMAF (just for the reader name)
  980. (nodecreate)Create,
  981. };
  982. static const nodedef ASFHTTP = 
  983. {
  984. 0, // parent size
  985. ASF_HTTP_ID,
  986. ASF_ID,
  987. PRI_DEFAULT,
  988. (nodecreate)CreateHTTP,
  989. NULL,
  990. };
  991. void ASF_Init()
  992. {
  993. NodeRegisterClass(&ASF);
  994. NodeRegisterClass(&ASFHTTP);
  995. }
  996. void ASF_Done()
  997. {
  998. NodeUnRegisterClass(ASF_ID);
  999. NodeUnRegisterClass(ASF_HTTP_ID);
  1000. }