BaseSplitterFileEx.cpp
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:27k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2005 Gabest
  3.  * http://www.gabest.org
  4.  *
  5.  *  This Program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2, or (at your option)
  8.  *  any later version.
  9.  *   
  10.  *  This Program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13.  *  GNU General Public License for more details.
  14.  *   
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with GNU Make; see the file COPYING.  If not, write to
  17.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  18.  *  http://www.gnu.org/copyleft/gpl.html
  19.  *
  20.  */
  21. #include "StdAfx.h"
  22. #include "BaseSplitterFileEx.h"
  23. #include <mmreg.h>
  24. #include "......DSUtilDSUtil.h"
  25. #include <initguid.h>
  26. #include "........includemoreuuids.h"
  27. #include "........includematroskamatroska.h"
  28. //
  29. // CBaseSplitterFileEx
  30. //
  31. CBaseSplitterFileEx::CBaseSplitterFileEx(IAsyncReader* pReader, HRESULT& hr, int cachelen)
  32. : CBaseSplitterFile(pReader, hr, cachelen)
  33. , m_tslen(0)
  34. {
  35. }
  36. CBaseSplitterFileEx::~CBaseSplitterFileEx()
  37. {
  38. }
  39. //
  40. bool CBaseSplitterFileEx::NextMpegStartCode(BYTE& code, __int64 len)
  41. {
  42. BitByteAlign();
  43. DWORD dw = -1;
  44. do
  45. {
  46. if(len-- == 0 || GetPos() >= GetLength()) return(false);
  47. dw = (dw << 8) | (BYTE)BitRead(8);
  48. }
  49. while((dw&0xffffff00) != 0x00000100);
  50. code = (BYTE)(dw&0xff);
  51. return(true);
  52. }
  53. //
  54. #define MARKER if(BitRead(1) != 1) {ASSERT(0); return(false);}
  55. bool CBaseSplitterFileEx::Read(pshdr& h)
  56. {
  57. memset(&h, 0, sizeof(h));
  58. BYTE b = (BYTE)BitRead(8, true);
  59. if((b&0xf1) == 0x21)
  60. {
  61. h.type = mpeg1;
  62. EXECUTE_ASSERT(BitRead(4) == 2);
  63. h.scr = 0;
  64. h.scr |= BitRead(3) << 30; MARKER; // 32..30
  65. h.scr |= BitRead(15) << 15; MARKER; // 29..15
  66. h.scr |= BitRead(15); MARKER; MARKER; // 14..0
  67. h.bitrate = BitRead(22); MARKER;
  68. }
  69. else if((b&0xc4) == 0x44)
  70. {
  71. h.type = mpeg2;
  72. EXECUTE_ASSERT(BitRead(2) == 1);
  73. h.scr = 0;
  74. h.scr |= BitRead(3) << 30; MARKER; // 32..30
  75. h.scr |= BitRead(15) << 15; MARKER; // 29..15
  76. h.scr |= BitRead(15); MARKER; // 14..0
  77. h.scr = h.scr*300 + BitRead(9); MARKER;
  78. h.bitrate = BitRead(22); MARKER; MARKER;
  79. BitRead(5); // reserved
  80. UINT64 stuffing = BitRead(3);
  81. while(stuffing-- > 0) EXECUTE_ASSERT(BitRead(8) == 0xff);
  82. }
  83. else
  84. {
  85. return(false);
  86. }
  87. h.bitrate *= 400;
  88. return(true);
  89. }
  90. bool CBaseSplitterFileEx::Read(pssyshdr& h)
  91. {
  92. memset(&h, 0, sizeof(h));
  93. WORD len = (WORD)BitRead(16); MARKER;
  94. h.rate_bound = (DWORD)BitRead(22); MARKER;
  95. h.audio_bound = (BYTE)BitRead(6);
  96. h.fixed_rate = !!BitRead(1);
  97. h.csps = !!BitRead(1);
  98. h.sys_audio_loc_flag = !!BitRead(1);
  99. h.sys_video_loc_flag = !!BitRead(1); MARKER;
  100. h.video_bound = (BYTE)BitRead(5);
  101. EXECUTE_ASSERT((BitRead(8)&0x7f) == 0x7f); // reserved (should be 0xff, but not in reality)
  102. for(len -= 6; len > 3; len -= 3) // TODO: also store these, somewhere, if needed
  103. {
  104. UINT64 stream_id = BitRead(8);
  105. EXECUTE_ASSERT(BitRead(2) == 3);
  106. UINT64 p_std_buff_size_bound = (BitRead(1)?1024:128)*BitRead(13);
  107. }
  108. return(true);
  109. }
  110. bool CBaseSplitterFileEx::Read(peshdr& h, BYTE code)
  111. {
  112. memset(&h, 0, sizeof(h));
  113. if(!(code >= 0xbd && code < 0xf0))
  114. return(false);
  115. h.len = (WORD)BitRead(16);
  116. if(code == 0xbe || code == 0xbf)
  117. return(true);
  118. // mpeg1 stuffing (ff ff .. , max 16x)
  119. for(int i = 0; i < 16 && BitRead(8, true) == 0xff; i++)
  120. {
  121. BitRead(8); 
  122. if(h.len) h.len--;
  123. }
  124. h.type = (BYTE)BitRead(2, true) == mpeg2 ? mpeg2 : mpeg1;
  125. if(h.type == mpeg1)
  126. {
  127. BYTE b = (BYTE)BitRead(2);
  128. if(b == 1)
  129. {
  130. h.std_buff_size = (BitRead(1)?1024:128)*BitRead(13);
  131. if(h.len) h.len -= 2;
  132. b = (BYTE)BitRead(2);
  133. }
  134. if(b == 0)
  135. {
  136. h.fpts = (BYTE)BitRead(1);
  137. h.fdts = (BYTE)BitRead(1);
  138. }
  139. }
  140. else if(h.type == mpeg2)
  141. {
  142. EXECUTE_ASSERT(BitRead(2) == mpeg2);
  143. h.scrambling = (BYTE)BitRead(2);
  144. h.priority = (BYTE)BitRead(1);
  145. h.alignment = (BYTE)BitRead(1);
  146. h.copyright = (BYTE)BitRead(1);
  147. h.original = (BYTE)BitRead(1);
  148. h.fpts = (BYTE)BitRead(1);
  149. h.fdts = (BYTE)BitRead(1);
  150. h.escr = (BYTE)BitRead(1);
  151. h.esrate = (BYTE)BitRead(1);
  152. h.dsmtrickmode = (BYTE)BitRead(1);
  153. h.morecopyright = (BYTE)BitRead(1);
  154. h.crc = (BYTE)BitRead(1);
  155. h.extension = (BYTE)BitRead(1);
  156. h.hdrlen = (BYTE)BitRead(8);
  157. }
  158. else
  159. {
  160. if(h.len) while(h.len-- > 0) BitRead(8);
  161. return(false);
  162. }
  163. if(h.fpts)
  164. {
  165. if(h.type == mpeg2)
  166. {
  167. BYTE b = (BYTE)BitRead(4);
  168. if(!(h.fdts && b == 3 || !h.fdts && b == 2)) {ASSERT(0); return(false);}
  169. }
  170. h.pts = 0;
  171. h.pts |= BitRead(3) << 30; MARKER; // 32..30
  172. h.pts |= BitRead(15) << 15; MARKER; // 29..15
  173. h.pts |= BitRead(15); MARKER; // 14..0
  174. h.pts = 10000*h.pts/90;
  175. }
  176. if(h.fdts)
  177. {
  178. if((BYTE)BitRead(4) != 1) {ASSERT(0); return(false);}
  179. h.dts = 0;
  180. h.dts |= BitRead(3) << 30; MARKER; // 32..30
  181. h.dts |= BitRead(15) << 15; MARKER; // 29..15
  182. h.dts |= BitRead(15); MARKER; // 14..0
  183. h.dts = 10000*h.dts/90;
  184. }
  185. // skip to the end of header
  186. if(h.type == mpeg1)
  187. {
  188. if(!h.fpts && !h.fdts && BitRead(4) != 0xf) {/*ASSERT(0);*/ return(false);}
  189. if(h.len)
  190. {
  191. h.len--;
  192. if(h.pts) h.len -= 4;
  193. if(h.dts) h.len -= 5;
  194. }
  195. }
  196. if(h.type == mpeg2)
  197. {
  198. if(h.len) h.len -= 3+h.hdrlen;
  199. int left = h.hdrlen;
  200. if(h.fpts) left -= 5;
  201. if(h.fdts) left -= 5;
  202. while(left-- > 0) BitRead(8);
  203. /*
  204. // mpeg2 stuffing (ff ff .. , max 32x)
  205. while(BitRead(8, true) == 0xff) {BitRead(8); if(h.len) h.len--;}
  206. Seek(GetPos()); // put last peeked byte back for Read()
  207. // FIXME: this doesn't seems to be here, 
  208. // infact there can be ff's as part of the data 
  209. // right at the beginning of the packet, which 
  210. // we should not skip...
  211. */
  212. }
  213. return(true);
  214. }
  215. bool CBaseSplitterFileEx::Read(seqhdr& h, int len, CMediaType* pmt)
  216. {
  217. __int64 endpos = GetPos() + len; // - sequence header length
  218. BYTE id = 0;
  219. while(GetPos() < endpos && id != 0xb3)
  220. {
  221. if(!NextMpegStartCode(id, len))
  222. return(false);
  223. }
  224. if(id != 0xb3)
  225. return(false);
  226. __int64 shpos = GetPos() - 4;
  227. h.width = (WORD)BitRead(12);
  228. h.height = (WORD)BitRead(12);
  229. h.ar = BitRead(4);
  230.     static int ifps[16] = {0, 1126125, 1125000, 1080000, 900900, 900000, 540000, 450450, 450000, 0, 0, 0, 0, 0, 0, 0};
  231. h.ifps = ifps[BitRead(4)];
  232. h.bitrate = (DWORD)BitRead(18); MARKER;
  233. h.vbv = (DWORD)BitRead(10);
  234. h.constrained = BitRead(1);
  235. if(h.fiqm = BitRead(1))
  236. for(int i = 0; i < countof(h.iqm); i++)
  237. h.iqm[i] = (BYTE)BitRead(8);
  238. if(h.fniqm = BitRead(1))
  239. for(int i = 0; i < countof(h.niqm); i++)
  240. h.niqm[i] = (BYTE)BitRead(8);
  241. __int64 shlen = GetPos() - shpos;
  242. static float ar[] = 
  243. {
  244. 1.0000f,1.0000f,0.6735f,0.7031f,0.7615f,0.8055f,0.8437f,0.8935f,
  245. 0.9157f,0.9815f,1.0255f,1.0695f,1.0950f,1.1575f,1.2015f,1.0000f
  246. };
  247. h.arx = (int)((float)h.width / ar[h.ar] + 0.5);
  248. h.ary = h.height;
  249. mpeg_t type = mpeg1;
  250. __int64 shextpos = 0, shextlen = 0;
  251. if(NextMpegStartCode(id, 8) && id == 0xb5) // sequence header ext
  252. {
  253. shextpos = GetPos() - 4;
  254. h.startcodeid = BitRead(4);
  255. h.profile_levelescape = BitRead(1); // reserved, should be 0
  256. h.profile = BitRead(3);
  257. h.level = BitRead(4);
  258. h.progressive = BitRead(1);
  259. h.chroma = BitRead(2);
  260. h.width |= (BitRead(2)<<12);
  261. h.height |= (BitRead(2)<<12);
  262. h.bitrate |= (BitRead(12)<<18); MARKER;
  263. h.vbv |= (BitRead(8)<<10);
  264. h.lowdelay = BitRead(1);
  265. h.ifps = (DWORD)(h.ifps * (BitRead(2)+1) / (BitRead(5)+1));
  266. shextlen = GetPos() - shextpos;
  267. struct {DWORD x, y;} ar[] = {{h.width,h.height},{4,3},{16,9},{221,100},{h.width,h.height}};
  268. int i = min(max(h.ar, 1), 5)-1;
  269. h.arx = ar[i].x;
  270. h.ary = ar[i].y;
  271. type = mpeg2;
  272. }
  273. h.ifps = 10 * h.ifps / 27;
  274. h.bitrate = h.bitrate == (1<<30)-1 ? 0 : h.bitrate * 400;
  275. DWORD a = h.arx, b = h.ary;
  276.     while(a) {DWORD tmp = a; a = b % tmp; b = tmp;}
  277. if(b) h.arx /= b, h.ary /= b;
  278. if(!pmt) return(true);
  279. pmt->majortype = MEDIATYPE_Video;
  280. if(type == mpeg1)
  281. {
  282. pmt->subtype = MEDIASUBTYPE_MPEG1Payload;
  283. pmt->formattype = FORMAT_MPEGVideo;
  284. int len = FIELD_OFFSET(MPEG1VIDEOINFO, bSequenceHeader) + shlen + shextlen;
  285. MPEG1VIDEOINFO* vi = (MPEG1VIDEOINFO*)new BYTE[len];
  286. memset(vi, 0, len);
  287. vi->hdr.dwBitRate = h.bitrate;
  288. vi->hdr.AvgTimePerFrame = h.ifps;
  289. vi->hdr.bmiHeader.biSize = sizeof(vi->hdr.bmiHeader);
  290. vi->hdr.bmiHeader.biWidth = h.width;
  291. vi->hdr.bmiHeader.biHeight = h.height;
  292. vi->hdr.bmiHeader.biXPelsPerMeter = h.width * h.ary;
  293. vi->hdr.bmiHeader.biYPelsPerMeter = h.height * h.arx;
  294. vi->cbSequenceHeader = shlen;
  295. Seek(shpos);
  296. Read((BYTE*)&vi->bSequenceHeader[0], shlen);
  297. if(shextpos && shextlen) Seek(shextpos);
  298. Read((BYTE*)&vi->bSequenceHeader[0] + shlen, shextlen);
  299. pmt->SetFormat((BYTE*)vi, len);
  300. delete [] vi;
  301. }
  302. else if(type == mpeg2)
  303. {
  304. pmt->subtype = MEDIASUBTYPE_MPEG2_VIDEO;
  305. pmt->formattype = FORMAT_MPEG2_VIDEO;
  306. int len = FIELD_OFFSET(MPEG2VIDEOINFO, dwSequenceHeader) + shlen + shextlen;
  307. MPEG2VIDEOINFO* vi = (MPEG2VIDEOINFO*)new BYTE[len];
  308. memset(vi, 0, len);
  309. vi->hdr.dwBitRate = h.bitrate;
  310. vi->hdr.AvgTimePerFrame = h.ifps;
  311. vi->hdr.dwPictAspectRatioX = h.arx;
  312. vi->hdr.dwPictAspectRatioY = h.ary;
  313. vi->hdr.bmiHeader.biSize = sizeof(vi->hdr.bmiHeader);
  314. vi->hdr.bmiHeader.biWidth = h.width;
  315. vi->hdr.bmiHeader.biHeight = h.height;
  316. vi->dwProfile = h.profile;
  317. vi->dwLevel = h.level;
  318. vi->cbSequenceHeader = shlen;
  319. Seek(shpos);
  320. Read((BYTE*)&vi->dwSequenceHeader[0], shlen);
  321. if(shextpos && shextlen) Seek(shextpos);
  322. Read((BYTE*)&vi->dwSequenceHeader[0] + shlen, shextlen);
  323. pmt->SetFormat((BYTE*)vi, len);
  324. delete [] vi;
  325. }
  326. else
  327. {
  328. return(false);
  329. }
  330. return(true);
  331. }
  332. bool CBaseSplitterFileEx::Read(mpahdr& h, int len, bool fAllowV25, CMediaType* pmt)
  333. {
  334. memset(&h, 0, sizeof(h));
  335. int syncbits = fAllowV25 ? 11 : 12;
  336. for(; len >= 4 && BitRead(syncbits, true) != (1<<syncbits) - 1; len--)
  337. BitRead(8);
  338. if(len < 4)
  339. return(false);
  340. h.sync = BitRead(11);
  341. h.version = BitRead(2);
  342. h.layer = BitRead(2);
  343. h.crc = BitRead(1);
  344. h.bitrate = BitRead(4);
  345. h.freq = BitRead(2);
  346. h.padding = BitRead(1);
  347. h.privatebit = BitRead(1);
  348. h.channels = BitRead(2);
  349. h.modeext = BitRead(2);
  350. h.copyright = BitRead(1);
  351. h.original = BitRead(1);
  352. h.emphasis = BitRead(2);
  353. if(h.version == 1 || h.layer == 0 || h.freq == 3 || h.bitrate == 15 || h.emphasis == 2)
  354. return(false);
  355. if(h.version == 3 && h.layer == 2)
  356. {
  357. if((h.bitrate == 1 || h.bitrate == 2 || h.bitrate == 3 || h.bitrate == 5) && h.channels != 3
  358. && (h.bitrate >= 11 && h.bitrate <= 14) && h.channels == 3)
  359. return(false);
  360. }
  361. h.layer = 4 - h.layer;
  362. //
  363. static int brtbl[][5] = 
  364. {
  365. {0,0,0,0,0},
  366. {32,32,32,32,8},
  367. {64,48,40,48,16},
  368. {96,56,48,56,24},
  369. {128,64,56,64,32},
  370. {160,80,64,80,40},
  371. {192,96,80,96,48},
  372. {224,112,96,112,56},
  373. {256,128,112,128,64},
  374. {288,160,128,144,80},
  375. {320,192,160,160,96},
  376. {352,224,192,176,112},
  377. {384,256,224,192,128},
  378. {416,320,256,224,144},
  379. {448,384,320,256,160},
  380. {0,0,0,0,0},
  381. };
  382. static int brtblcol[][4] = {{0,3,4,4},{0,0,1,2}};
  383. int bitrate = 1000*brtbl[h.bitrate][brtblcol[h.version&1][h.layer]];
  384. if(bitrate == 0) return(false);
  385. static int freq[][4] = {{11025,0,22050,44100},{12000,0,24000,48000},{8000,0,16000,32000}};
  386. bool l3ext = h.layer == 3 && !(h.version&1);
  387. h.nSamplesPerSec = freq[h.freq][h.version];
  388. h.FrameSize = h.layer == 1
  389. ? (12 * bitrate / h.nSamplesPerSec + h.padding) * 4
  390. : (l3ext ? 72 : 144) * bitrate / h.nSamplesPerSec + h.padding;
  391. h.rtDuration = 10000000i64 * (h.layer == 1 ? 384 : l3ext ? 576 : 1152) / h.nSamplesPerSec;// / (h.channels == 3 ? 1 : 2);
  392. h.nBytesPerSec = bitrate / 8;
  393. if(!pmt) return(true);
  394. /*int*/ len = h.layer == 3 
  395. ? sizeof(WAVEFORMATEX/*MPEGLAYER3WAVEFORMAT*/) // no need to overcomplicate this...
  396. : sizeof(MPEG1WAVEFORMAT);
  397. WAVEFORMATEX* wfe = (WAVEFORMATEX*)new BYTE[len];
  398. memset(wfe, 0, len);
  399. wfe->cbSize = len - sizeof(WAVEFORMATEX);
  400. if(h.layer == 3)
  401. {
  402. wfe->wFormatTag = WAVE_FORMAT_MP3;
  403. /* MPEGLAYER3WAVEFORMAT* f = (MPEGLAYER3WAVEFORMAT*)wfe;
  404. f->wfx.wFormatTag = WAVE_FORMAT_MP3;
  405. f->wID = MPEGLAYER3_ID_UNKNOWN;
  406. f->fdwFlags = h.padding ? MPEGLAYER3_FLAG_PADDING_ON : MPEGLAYER3_FLAG_PADDING_OFF; // _OFF or _ISO ?
  407. */
  408. }
  409. else
  410. {
  411. MPEG1WAVEFORMAT* f = (MPEG1WAVEFORMAT*)wfe;
  412. f->wfx.wFormatTag = WAVE_FORMAT_MPEG;
  413. f->fwHeadMode = 1 << h.channels;
  414. f->fwHeadModeExt = 1 << h.modeext;
  415. f->wHeadEmphasis = h.emphasis+1;
  416. if(h.privatebit) f->fwHeadFlags |= ACM_MPEG_PRIVATEBIT;
  417. if(h.copyright) f->fwHeadFlags |= ACM_MPEG_COPYRIGHT;
  418. if(h.original) f->fwHeadFlags |= ACM_MPEG_ORIGINALHOME;
  419. if(h.crc == 0) f->fwHeadFlags |= ACM_MPEG_PROTECTIONBIT;
  420. if(h.version == 3) f->fwHeadFlags |= ACM_MPEG_ID_MPEG1;
  421. f->fwHeadLayer = 1 << (h.layer-1);
  422. f->dwHeadBitrate = bitrate;
  423. }
  424. wfe->nChannels = h.channels == 3 ? 1 : 2;
  425. wfe->nSamplesPerSec = h.nSamplesPerSec;
  426. wfe->nBlockAlign = h.FrameSize;
  427. wfe->nAvgBytesPerSec = h.nBytesPerSec;
  428. pmt->majortype = MEDIATYPE_Audio;
  429. pmt->subtype = FOURCCMap(wfe->wFormatTag);
  430. pmt->formattype = FORMAT_WaveFormatEx;
  431. pmt->SetFormat((BYTE*)wfe, sizeof(WAVEFORMATEX) + wfe->cbSize);
  432. delete [] wfe;
  433. return(true);
  434. }
  435. bool CBaseSplitterFileEx::Read(aachdr& h, int len, CMediaType* pmt)
  436. {
  437. memset(&h, 0, sizeof(h));
  438. for(; len >= 7 && BitRead(12, true) != 0xfff; len--)
  439. BitRead(8);
  440. if(len < 7)
  441. return(false);
  442. h.sync = BitRead(12);
  443. h.version = BitRead(1);
  444. h.layer = BitRead(2);
  445. h.fcrc = BitRead(1);
  446. h.profile = BitRead(2);
  447. h.freq = BitRead(4);
  448. h.privatebit = BitRead(1);
  449. h.channels = BitRead(3);
  450. h.original = BitRead(1);
  451. h.home = BitRead(1);
  452. h.copyright_id_bit = BitRead(1);
  453. h.copyright_id_start = BitRead(1);
  454. h.aac_frame_length = BitRead(13);
  455. h.adts_buffer_fullness = BitRead(11);
  456. h.no_raw_data_blocks_in_frame = BitRead(2);
  457. if(h.fcrc == 0) h.crc = BitRead(16);
  458. if(h.layer != 0 || h.freq >= 12 || h.aac_frame_length <= (h.fcrc == 0 ? 9 : 7))
  459. return(false);
  460. h.FrameSize = h.aac_frame_length - (h.fcrc == 0 ? 9 : 7);
  461.     static int freq[] = {96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000};
  462. h.nBytesPerSec = h.aac_frame_length * freq[h.freq] / 1024; // ok?
  463. h.rtDuration = 10000000i64 * 1024 / freq[h.freq]; // ok?
  464. if(!pmt) return(true);
  465. WAVEFORMATEX* wfe = (WAVEFORMATEX*)new BYTE[sizeof(WAVEFORMATEX)+5];
  466. memset(wfe, 0, sizeof(WAVEFORMATEX)+5);
  467. wfe->wFormatTag = WAVE_FORMAT_AAC;
  468. wfe->nChannels = h.channels <= 6 ? h.channels : 2;
  469. wfe->nSamplesPerSec = freq[h.freq];
  470. wfe->nBlockAlign = h.aac_frame_length;
  471. wfe->nAvgBytesPerSec = h.nBytesPerSec;
  472. wfe->cbSize = MakeAACInitData((BYTE*)(wfe+1), h.profile, wfe->nSamplesPerSec, wfe->nChannels);
  473. pmt->majortype = MEDIATYPE_Audio;
  474. pmt->subtype = MEDIASUBTYPE_AAC;
  475. pmt->formattype = FORMAT_WaveFormatEx;
  476. pmt->SetFormat((BYTE*)wfe, sizeof(WAVEFORMATEX)+wfe->cbSize);
  477. delete [] wfe;
  478. return(true);
  479. }
  480. bool CBaseSplitterFileEx::Read(ac3hdr& h, int len, CMediaType* pmt)
  481. {
  482. memset(&h, 0, sizeof(h));
  483. for(; len >= 7 && BitRead(16, true) != 0x0b77; len--)
  484. BitRead(8);
  485. if(len < 7)
  486. return(false);
  487. h.sync = (WORD)BitRead(16);
  488. h.crc1 = (WORD)BitRead(16);
  489. h.fscod = BitRead(2);
  490. h.frmsizecod = BitRead(6);
  491. h.bsid = BitRead(5);
  492. h.bsmod = BitRead(3);
  493. h.acmod = BitRead(3);
  494. if((h.acmod & 1) && h.acmod != 1) h.cmixlev = BitRead(2);
  495. if(h.acmod & 4) h.surmixlev = BitRead(2);
  496. if(h.acmod == 2) h.dsurmod = BitRead(2);
  497. h.lfeon = BitRead(1);
  498. if(h.bsid >= 12 || h.fscod == 3 || h.frmsizecod >= 38)
  499. return(false);
  500. if(!pmt) return(true);
  501. WAVEFORMATEX wfe;
  502. memset(&wfe, 0, sizeof(wfe));
  503. wfe.wFormatTag = WAVE_FORMAT_DOLBY_AC3;
  504. static int channels[] = {2, 1, 2, 3, 3, 4, 4, 5};
  505. wfe.nChannels = channels[h.acmod] + h.lfeon;
  506. static int freq[] = {48000, 44100, 32000, 0};
  507. wfe.nSamplesPerSec = freq[h.fscod];
  508. switch(h.bsid)
  509. {
  510. case 9: wfe.nSamplesPerSec >>= 1; break;
  511. case 10: wfe.nSamplesPerSec >>= 2; break;
  512. case 11: wfe.nSamplesPerSec >>= 3; break;
  513. default: break;
  514. }
  515. static int rate[] = {32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 448, 512, 576, 640};
  516. wfe.nAvgBytesPerSec = rate[h.frmsizecod>>1] * 1000 / 8;
  517. wfe.nBlockAlign = (WORD)(1536 * wfe.nAvgBytesPerSec / wfe.nSamplesPerSec);
  518. pmt->majortype = MEDIATYPE_Audio;
  519. pmt->subtype = MEDIASUBTYPE_DOLBY_AC3;
  520. pmt->formattype = FORMAT_WaveFormatEx;
  521. pmt->SetFormat((BYTE*)&wfe, sizeof(wfe));
  522. return(true);
  523. }
  524. bool CBaseSplitterFileEx::Read(dtshdr& h, int len, CMediaType* pmt)
  525. {
  526. memset(&h, 0, sizeof(h));
  527. for(; len >= 10 && BitRead(32, true) != 0x7ffe8001; len--)
  528. BitRead(8);
  529. if(len < 10)
  530. return(false);
  531. h.sync = (DWORD)BitRead(32);
  532. h.frametype = BitRead(1);
  533. h.deficitsamplecount = BitRead(5);
  534. h.fcrc = BitRead(1);
  535. h.nblocks = BitRead(7);
  536. h.framebytes = (WORD)BitRead(14)+1;
  537. h.amode = BitRead(6);
  538. h.sfreq = BitRead(4);
  539. h.rate = BitRead(5);
  540. if(!pmt) return(true);
  541. WAVEFORMATEX wfe;
  542. memset(&wfe, 0, sizeof(wfe));
  543. wfe.wFormatTag = WAVE_FORMAT_DVD_DTS;
  544. static int channels[] = {1, 2, 2, 2, 2, 3, 3, 4, 4, 5, 6, 6, 6, 7, 8, 8};
  545. if(h.amode < countof(channels)) wfe.nChannels = channels[h.amode];
  546. static int freq[] = {0,8000,16000,32000,0,0,11025,22050,44100,0,0,12000,24000,48000,0,0};
  547. wfe.nSamplesPerSec = freq[h.sfreq];
  548. static int rate[] = 
  549. {
  550. 32000,56000,64000,96000,112000,128000,192000,224000,
  551. 256000,320000,384000,448000,512000,576000,640000,754500,
  552. 960000,1024000,1152000,1280000,1344000,1408000,1411200,1472000,
  553. 1509750,1920000,2048000,3072000,3840000,0,0,0
  554. };
  555. wfe.nAvgBytesPerSec = rate[h.rate] * 1000 / 8;
  556. wfe.nBlockAlign = h.framebytes;
  557. pmt->majortype = MEDIATYPE_Audio;
  558. pmt->subtype = MEDIASUBTYPE_DTS;
  559. pmt->formattype = FORMAT_WaveFormatEx;
  560. pmt->SetFormat((BYTE*)&wfe, sizeof(wfe));
  561. return(true);
  562. }
  563. bool CBaseSplitterFileEx::Read(lpcmhdr& h, CMediaType* pmt)
  564. {
  565. memset(&h, 0, sizeof(h));
  566. h.emphasis = BitRead(1);
  567. h.mute = BitRead(1);
  568. h.reserved1 = BitRead(1);
  569. h.framenum = BitRead(5);
  570. h.quantwordlen = BitRead(2);
  571. h.freq = BitRead(2);
  572. h.reserved2 = BitRead(1);
  573. h.channels = BitRead(3);
  574. h.drc = (BYTE)BitRead(8);
  575. if(h.channels > 2 || h.reserved1 || h.reserved2)
  576. return(false);
  577. if(!pmt) return(true);
  578. WAVEFORMATEX wfe;
  579. memset(&wfe, 0, sizeof(wfe));
  580. wfe.wFormatTag = WAVE_FORMAT_PCM;
  581. wfe.nChannels = h.channels+1;
  582. static int freq[] = {48000, 96000, 44100, 32000};
  583. wfe.nSamplesPerSec = freq[h.freq];
  584. wfe.wBitsPerSample = 16;
  585. wfe.nBlockAlign = wfe.nChannels*wfe.wBitsPerSample>>3;
  586. wfe.nAvgBytesPerSec = wfe.nBlockAlign*wfe.nSamplesPerSec;
  587. pmt->majortype = MEDIATYPE_Audio;
  588. pmt->subtype = MEDIASUBTYPE_DVD_LPCM_AUDIO;
  589. pmt->formattype = FORMAT_WaveFormatEx;
  590. pmt->SetFormat((BYTE*)&wfe, sizeof(wfe));
  591. // TODO: what to do with dvd-audio lpcm?
  592. return(true);
  593. }
  594. bool CBaseSplitterFileEx::Read(dvdspuhdr& h, CMediaType* pmt)
  595. {
  596. memset(&h, 0, sizeof(h));
  597. if(!pmt) return(true);
  598. pmt->majortype = MEDIATYPE_Video;
  599. pmt->subtype = MEDIASUBTYPE_DVD_SUBPICTURE;
  600. pmt->formattype = FORMAT_None;
  601. return(true);
  602. }
  603. bool CBaseSplitterFileEx::Read(svcdspuhdr& h, CMediaType* pmt)
  604. {
  605. memset(&h, 0, sizeof(h));
  606. if(!pmt) return(true);
  607. pmt->majortype = MEDIATYPE_Video;
  608. pmt->subtype = MEDIASUBTYPE_SVCD_SUBPICTURE;
  609. pmt->formattype = FORMAT_None;
  610. return(true);
  611. }
  612. bool CBaseSplitterFileEx::Read(cvdspuhdr& h, CMediaType* pmt)
  613. {
  614. memset(&h, 0, sizeof(h));
  615. if(!pmt) return(true);
  616. pmt->majortype = MEDIATYPE_Video;
  617. pmt->subtype = MEDIASUBTYPE_CVD_SUBPICTURE;
  618. pmt->formattype = FORMAT_None;
  619. return(true);
  620. }
  621. bool CBaseSplitterFileEx::Read(ps2audhdr& h, CMediaType* pmt)
  622. {
  623. memset(&h, 0, sizeof(h));
  624. if(BitRead(16, true) != 'SS')
  625. return(false);
  626. __int64 pos = GetPos();
  627. while(BitRead(16, true) == 'SS')
  628. {
  629. DWORD tag = (DWORD)BitRead(32, true);
  630. DWORD size = 0;
  631. if(tag == 'SShd')
  632. {
  633. BitRead(32);
  634. Read((BYTE*)&size, sizeof(size));
  635. ASSERT(size == 0x18);
  636. Seek(GetPos());
  637. Read((BYTE*)&h, sizeof(h));
  638. }
  639. else if(tag == 'SSbd')
  640. {
  641. BitRead(32);
  642. Read((BYTE*)&size, sizeof(size));
  643. break;
  644. }
  645. }
  646. Seek(pos);
  647. if(!pmt) return(true);
  648. WAVEFORMATEXPS2 wfe;
  649. wfe.wFormatTag = 
  650. h.unk1 == 0x01 ? WAVE_FORMAT_PS2_PCM : 
  651. h.unk1 == 0x10 ? WAVE_FORMAT_PS2_ADPCM :
  652. WAVE_FORMAT_UNKNOWN;
  653. wfe.nChannels = (WORD)h.channels;
  654. wfe.nSamplesPerSec = h.freq;
  655. wfe.wBitsPerSample = 16; // always?
  656. wfe.nBlockAlign = wfe.nChannels*wfe.wBitsPerSample>>3;
  657. wfe.nAvgBytesPerSec = wfe.nBlockAlign*wfe.nSamplesPerSec;
  658. wfe.dwInterleave = h.interleave;
  659. pmt->majortype = MEDIATYPE_Audio;
  660. pmt->subtype = FOURCCMap(wfe.wFormatTag);
  661. pmt->formattype = FORMAT_WaveFormatEx;
  662. pmt->SetFormat((BYTE*)&wfe, sizeof(wfe));
  663. return(true);
  664. }
  665. bool CBaseSplitterFileEx::Read(ps2subhdr& h, CMediaType* pmt)
  666. {
  667. memset(&h, 0, sizeof(h));
  668. if(!pmt) return(true);
  669. pmt->majortype = MEDIATYPE_Subtitle;
  670. pmt->subtype = MEDIASUBTYPE_PS2_SUB;
  671. pmt->formattype = FORMAT_None;
  672. return(true);
  673. }
  674. bool CBaseSplitterFileEx::Read(trhdr& h, bool fSync)
  675. {
  676. memset(&h, 0, sizeof(h));
  677. BitByteAlign();
  678. if(m_tslen == 0)
  679. {
  680. __int64 pos = GetPos();
  681. for(int i = 0; i < 192; i++)
  682. {
  683. if(BitRead(8, true) == 0x47)
  684. {
  685. __int64 pos = GetPos();
  686. Seek(pos + 188);
  687. if(BitRead(8, true) == 0x47) {m_tslen = 188; break;}
  688. Seek(pos + 192);
  689. if(BitRead(8, true) == 0x47) {m_tslen = 192; break;}
  690. }
  691. BitRead(8);
  692. }
  693. Seek(pos);
  694. if(m_tslen == 0)
  695. {
  696. return(false);
  697. }
  698. }
  699. if(fSync)
  700. {
  701. for(int i = 0; i < m_tslen; i++)
  702. {
  703. if(BitRead(8, true) == 0x47)
  704. {
  705. if(i == 0) break;
  706. Seek(GetPos()+m_tslen);
  707. if(BitRead(8, true) == 0x47) {Seek(GetPos()-m_tslen); break;}
  708. }
  709. BitRead(8);
  710. if(i == m_tslen-1)
  711. return(false);
  712. }
  713. }
  714. if(BitRead(8, true) != 0x47)
  715. return(false);
  716. h.next = GetPos() + m_tslen;
  717. h.sync = (BYTE)BitRead(8);
  718. h.error = BitRead(1);
  719. h.payloadstart = BitRead(1);
  720. h.transportpriority = BitRead(1);
  721. h.pid = BitRead(13);
  722. h.scrambling = BitRead(2);
  723. h.adapfield = BitRead(1);
  724. h.payload = BitRead(1);
  725. h.counter = BitRead(4);
  726. h.bytes = 184;
  727. if(h.adapfield)
  728. {
  729. h.length = (BYTE)BitRead(8);
  730. h.discontinuity = BitRead(1);
  731. h.randomaccess = BitRead(1);
  732. h.priority = BitRead(1);
  733. h.PCR = BitRead(1);
  734. h.OPCR = BitRead(1);
  735. h.splicingpoint = BitRead(1);
  736. h.privatedata = BitRead(1);
  737. h.extension = BitRead(1);
  738. if(!(0 < h.length && h.length <= 183))
  739. return(false);
  740. for(int i = 1; i < h.length; i++)
  741. BitRead(8);
  742. h.bytes = 183 - h.length;
  743. }
  744. return(true);
  745. }
  746. bool CBaseSplitterFileEx::Read(pvahdr& h, bool fSync)
  747. {
  748. memset(&h, 0, sizeof(h));
  749. BitByteAlign();
  750. if(fSync)
  751. {
  752. for(int i = 0; i < 65536; i++)
  753. {
  754. if((BitRead(64, true)&0xfffffc00ffe00000i64) == 0x4156000055000000i64) 
  755. break;
  756. BitRead(8);
  757. }
  758. }
  759. if((BitRead(64, true)&0xfffffc00ffe00000i64) != 0x4156000055000000i64)
  760. return(false);
  761. h.sync = (WORD)BitRead(16);
  762. h.streamid = (BYTE)BitRead(8);
  763. h.counter = (BYTE)BitRead(8);
  764. h.res1 = (BYTE)BitRead(8);
  765. h.res2 = BitRead(3);
  766. h.fpts = BitRead(1);
  767. h.postbytes = BitRead(2);
  768. h.prebytes = BitRead(2);
  769. h.length = (WORD)BitRead(16);
  770. if(h.length > 6136)
  771. return(false);
  772. __int64 pos = GetPos();
  773. if(h.streamid == 1 && h.fpts)
  774. {
  775. h.pts = 10000*BitRead(32)/90;
  776. }
  777. else if(h.streamid == 2 && (h.fpts || (BitRead(32, true)&0xffffffe0) == 0x000001c0))
  778. {
  779. BYTE b;
  780. if(!NextMpegStartCode(b, 4)) return(false);
  781. peshdr h2;
  782. if(!Read(h2, b)) return(false);
  783. if(h.fpts = h2.fpts) h.pts = h2.pts;
  784. }
  785. BitRead(8*h.prebytes);
  786. h.length -= GetPos() - pos;
  787. return(true);
  788. }
  789. bool CBaseSplitterFileEx::Read(avchdr& h, int len, CMediaType* pmt)
  790. {
  791. __int64 endpos = GetPos() + len; // - sequence header length
  792. __int64 spspos = 0, spslen = 0;
  793. __int64 ppspos = 0, ppslen = 0;
  794. while(GetPos() < endpos+4 && BitRead(32, true) == 0x00000001)
  795. {
  796. __int64 pos = GetPos();
  797. BitRead(32);
  798. BYTE id = BitRead(8);
  799. if(spspos != 0 && spslen == 0) spslen = pos - spspos;
  800. else if(ppspos != 0 && ppslen == 0) ppslen = pos - ppspos;
  801. if((id&0x9f) == 0x07 && (id&0x60) != 0)
  802. {
  803. spspos = pos;
  804. h.profile = (BYTE)BitRead(8);
  805. BitRead(8);
  806. h.level = (BYTE)BitRead(8);
  807. UExpGolombRead(); // seq_parameter_set_id
  808. UExpGolombRead(); // log2_max_frame_num_minus4
  809. UINT64 pic_order_cnt_type = UExpGolombRead();
  810. if(pic_order_cnt_type == 0)
  811. {
  812. UExpGolombRead(); // log2_max_pic_order_cnt_lsb_minus4
  813. }
  814. else if(pic_order_cnt_type == 1)
  815. {
  816. BitRead(1); // delta_pic_order_always_zero_flag
  817. SExpGolombRead(); // offset_for_non_ref_pic
  818. SExpGolombRead(); // offset_for_top_to_bottom_field
  819. UINT64 num_ref_frames_in_pic_order_cnt_cycle = UExpGolombRead();
  820. for(int i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++)
  821. SExpGolombRead(); // offset_for_ref_frame[i]
  822. }
  823. UExpGolombRead(); // num_ref_frames
  824. BitRead(1); // gaps_in_frame_num_value_allowed_flag
  825. UINT64 pic_width_in_mbs_minus1 = UExpGolombRead();
  826. UINT64 pic_height_in_map_units_minus1 = UExpGolombRead();
  827. BYTE frame_mbs_only_flag = (BYTE)BitRead(1);
  828. h.width = (pic_width_in_mbs_minus1 + 1) * 16;
  829. h.height = (2 - frame_mbs_only_flag) * (pic_height_in_map_units_minus1 + 1) * 16;
  830. }
  831. else if((id&0x9f) == 0x08 && (id&0x60) != 0)
  832. {
  833. ppspos = pos;
  834. }
  835. BitByteAlign();
  836. while(GetPos() < endpos+4 && BitRead(32, true) != 0x00000001)
  837. BitRead(8);
  838. }
  839. if(!spspos || !spslen || !ppspos || !ppslen) 
  840. return(false);
  841. if(!pmt) return(true);
  842. {
  843. pmt->majortype = MEDIATYPE_Video;
  844. pmt->subtype = MEDIASUBTYPE_MPEG2_VIDEO;
  845. pmt->formattype = FORMAT_MPEG2_VIDEO;
  846. int len = FIELD_OFFSET(MPEG2VIDEOINFO, dwSequenceHeader) + spslen + ppslen;
  847. MPEG2VIDEOINFO* vi = (MPEG2VIDEOINFO*)new BYTE[len];
  848. memset(vi, 0, len);
  849. // vi->hdr.dwBitRate = ;
  850. // vi->hdr.AvgTimePerFrame = ;
  851. vi->hdr.dwPictAspectRatioX = h.width;
  852. vi->hdr.dwPictAspectRatioY = h.height;
  853. vi->hdr.bmiHeader.biSize = sizeof(vi->hdr.bmiHeader);
  854. vi->hdr.bmiHeader.biWidth = h.width;
  855. vi->hdr.bmiHeader.biHeight = h.height;
  856. vi->hdr.bmiHeader.biCompression = '1cva';
  857. vi->dwProfile = h.profile;
  858. vi->dwFlags = 4; // ?
  859. vi->dwLevel = h.level;
  860. vi->cbSequenceHeader = spslen + ppslen;
  861. Seek(spspos);
  862. Read((BYTE*)&vi->dwSequenceHeader[0], spslen);
  863. Seek(ppspos);
  864. Read((BYTE*)&vi->dwSequenceHeader[0] + spslen, ppslen);
  865. pmt->SetFormat((BYTE*)vi, len);
  866. delete [] vi;
  867. }
  868. return(true);
  869. }