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

多媒体编程

开发平台:

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. #pragma once
  22. #include "BaseSplitterFile.h"
  23. class CBaseSplitterFileEx : public CBaseSplitterFile
  24. {
  25. int m_tslen; // transport stream packet length (188 or 192 bytes, auto-detected)
  26. public:
  27. CBaseSplitterFileEx(IAsyncReader* pReader, HRESULT& hr, int cachelen = DEFAULT_CACHELEN);
  28. virtual ~CBaseSplitterFileEx();
  29. using CBaseSplitterFile::Read;
  30. bool NextMpegStartCode(BYTE& b, __int64 len = 65536);
  31. #pragma pack(push, 1)
  32. enum mpeg_t {mpegunk, mpeg1, mpeg2};
  33. struct pshdr
  34. {
  35. mpeg_t type;
  36. UINT64 scr, bitrate;
  37. };
  38. struct pssyshdr
  39. {
  40. DWORD rate_bound;
  41. BYTE video_bound, audio_bound;
  42. bool fixed_rate, csps;
  43. bool sys_video_loc_flag, sys_audio_loc_flag;
  44. };
  45. struct peshdr
  46. {
  47. WORD len;
  48. BYTE type:2, fpts:1, fdts:1;
  49. REFERENCE_TIME pts, dts;
  50. // mpeg1 stuff
  51. UINT64 std_buff_size;
  52. // mpeg2 stuff
  53. BYTE scrambling:2, priority:1, alignment:1, copyright:1, original:1;
  54. BYTE escr:1, esrate:1, dsmtrickmode:1, morecopyright:1, crc:1, extension:1;
  55. BYTE hdrlen;
  56. struct peshdr() {memset(this, 0, sizeof(*this));}
  57. };
  58. class seqhdr
  59. {
  60. public:
  61. WORD width;
  62. WORD height;
  63. BYTE ar:4;
  64. DWORD ifps;
  65. DWORD bitrate;
  66. DWORD vbv;
  67. BYTE constrained:1;
  68. BYTE fiqm:1;
  69. BYTE iqm[64];
  70. BYTE fniqm:1;
  71. BYTE niqm[64];
  72. // ext
  73. BYTE startcodeid:4;
  74. BYTE profile_levelescape:1;
  75. BYTE profile:3;
  76. BYTE level:4;
  77. BYTE progressive:1;
  78. BYTE chroma:2;
  79. BYTE lowdelay:1;
  80. // misc
  81. int arx, ary;
  82. };
  83. class mpahdr
  84. {
  85. public:
  86. WORD sync:11;
  87. WORD version:2;
  88. WORD layer:2;
  89. WORD crc:1;
  90. WORD bitrate:4;
  91. WORD freq:2;
  92. WORD padding:1;
  93. WORD privatebit:1;
  94. WORD channels:2;
  95. WORD modeext:2;
  96. WORD copyright:1;
  97. WORD original:1;
  98. WORD emphasis:2;
  99. int nSamplesPerSec, FrameSize, nBytesPerSec;
  100. REFERENCE_TIME rtDuration;
  101. };
  102. class aachdr
  103. {
  104. public:
  105. WORD sync:12;
  106. WORD version:1;
  107. WORD layer:2;
  108. WORD fcrc:1;
  109. WORD profile:2;
  110. WORD freq:4;
  111. WORD privatebit:1;
  112. WORD channels:3;
  113. WORD original:1;
  114. WORD home:1; // ?
  115. WORD copyright_id_bit:1;
  116. WORD copyright_id_start:1;
  117. WORD aac_frame_length:13;
  118. WORD adts_buffer_fullness:11;
  119. WORD no_raw_data_blocks_in_frame:2;
  120. WORD crc;
  121. int FrameSize, nBytesPerSec;
  122. REFERENCE_TIME rtDuration;
  123. };
  124. class ac3hdr
  125. {
  126. public:
  127. WORD sync;
  128. WORD crc1;
  129. BYTE fscod:2;
  130. BYTE frmsizecod:6;
  131. BYTE bsid:5;
  132. BYTE bsmod:3;
  133. BYTE acmod:3;
  134. BYTE cmixlev:2;
  135. BYTE surmixlev:2;
  136. BYTE dsurmod:2;
  137. BYTE lfeon:1;
  138. // the rest is unimportant for us
  139. };
  140. class dtshdr
  141. {
  142. public:
  143. DWORD sync;
  144. BYTE frametype:1;
  145. BYTE deficitsamplecount:5;
  146.         BYTE fcrc:1;
  147. BYTE nblocks:7;
  148. WORD framebytes;
  149. BYTE amode:6;
  150. BYTE sfreq:4;
  151. BYTE rate:5;
  152. };
  153. class lpcmhdr
  154. {
  155. public:
  156. BYTE emphasis:1;
  157. BYTE mute:1;
  158. BYTE reserved1:1;
  159. BYTE framenum:5;
  160. BYTE quantwordlen:2;
  161. BYTE freq:2; // 48, 96, 44.1, 32
  162. BYTE reserved2:1;
  163. BYTE channels:3; // +1
  164. BYTE drc; // 0x80: off
  165. };
  166. class dvdspuhdr
  167. {
  168. public:
  169. // nothing ;)
  170. };
  171. class svcdspuhdr
  172. {
  173. public:
  174. // nothing ;)
  175. };
  176. class cvdspuhdr
  177. {
  178. public:
  179. // nothing ;)
  180. };
  181. class ps2audhdr
  182. {
  183. public:
  184. // 'SShd' + len (0x18)
  185. DWORD unk1;
  186. DWORD freq;
  187. DWORD channels;
  188. DWORD interleave; // bytes per channel
  189. // padding: FF .. FF
  190. // 'SSbd' + len
  191. // pcm or adpcm data
  192. };
  193. class ps2subhdr
  194. {
  195. public:
  196. // nothing ;)
  197. };
  198. struct trhdr
  199. {
  200. BYTE sync; // 0x47
  201. BYTE error:1;
  202. BYTE payloadstart:1;
  203. BYTE transportpriority:1;
  204. WORD pid:13;
  205. BYTE scrambling:2;
  206. BYTE adapfield:1;
  207. BYTE payload:1;
  208. BYTE counter:4;
  209. // if adapfield set
  210. BYTE length;
  211. BYTE discontinuity:1;
  212. BYTE randomaccess:1;
  213. BYTE priority:1;
  214. BYTE PCR:1;
  215. BYTE OPCR:1;
  216. BYTE splicingpoint:1;
  217. BYTE privatedata:1;
  218. BYTE extension:1;
  219. // TODO: add more fields here when the flags above are set (they aren't very interesting...)
  220. int bytes;
  221. __int64 next;
  222. };
  223. // http://www.technotrend.de/download/av_format_v1.pdf
  224. struct pvahdr
  225. {
  226. WORD sync; // 'VA'
  227. BYTE streamid; // 1 - video, 2 - audio
  228. BYTE counter;
  229. BYTE res1; // 0x55
  230. BYTE res2:3;
  231. BYTE fpts:1;
  232. BYTE postbytes:2;
  233. BYTE prebytes:2;
  234. WORD length;
  235. REFERENCE_TIME pts;
  236. };
  237. struct avchdr
  238. {
  239. BYTE profile, level;
  240. unsigned int width, height;
  241. };
  242. #pragma pack(pop)
  243. bool Read(pshdr& h);
  244. bool Read(pssyshdr& h);
  245. bool Read(peshdr& h, BYTE code);
  246. bool Read(seqhdr& h, int len, CMediaType* pmt = NULL);
  247. bool Read(mpahdr& h, int len, bool fAllowV25, CMediaType* pmt = NULL);
  248. bool Read(aachdr& h, int len, CMediaType* pmt = NULL);
  249. bool Read(ac3hdr& h, int len, CMediaType* pmt = NULL);
  250. bool Read(dtshdr& h, int len, CMediaType* pmt = NULL);
  251. bool Read(lpcmhdr& h, CMediaType* pmt = NULL);
  252. bool Read(dvdspuhdr& h, CMediaType* pmt = NULL);
  253. bool Read(svcdspuhdr& h, CMediaType* pmt = NULL);
  254. bool Read(cvdspuhdr& h, CMediaType* pmt = NULL);
  255. bool Read(ps2audhdr& h, CMediaType* pmt = NULL);
  256. bool Read(ps2subhdr& h, CMediaType* pmt = NULL);
  257. bool Read(trhdr& h, bool fSync = true);
  258. bool Read(pvahdr& h, bool fSync = true);
  259. bool Read(avchdr& h, int len, CMediaType* pmt = NULL);
  260. };