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

多媒体编程

开发平台:

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 <atlbase.h>
  23. #include <atlcoll.h>
  24. #include <afxtempl.h>
  25. #include "..BaseSplitterBaseSplitter.h"
  26. #include "....transformBaseVideoFilterBaseVideoFilter.h"
  27. #pragma pack(push, 1)
  28. namespace RMFF
  29. {
  30. typedef struct {union {char id[4]; UINT32 object_id;}; UINT32 size; UINT16 object_version;} ChunkHdr;
  31. typedef struct {UINT32 version, nHeaders;} FileHdr;
  32. typedef struct 
  33. {
  34. UINT32 maxBitRate, avgBitRate;
  35. UINT32 maxPacketSize, avgPacketSize, nPackets;
  36. UINT32 tDuration, tPreroll;
  37. UINT32 ptrIndex, ptrData;
  38. UINT16 nStreams;
  39. enum flags_t {PN_SAVE_ENABLED=1, PN_PERFECT_PLAY_ENABLED=2, PN_LIVE_BROADCAST=4} flags; 
  40. } Properies;
  41. typedef struct 
  42. {
  43. UINT16 stream;
  44. UINT32 maxBitRate, avgBitRate;
  45. UINT32 maxPacketSize, avgPacketSize;
  46. UINT32 tStart, tPreroll, tDuration;
  47. CStringA name, mime;
  48. CArray<BYTE> typeSpecData;
  49. UINT32 width, height;
  50. bool interlaced, top_field_first;
  51. } MediaProperies;
  52. typedef struct {CStringA title, author, copyright, comment;} ContentDesc;
  53. typedef struct {UINT64 pos; UINT32 nPackets, ptrNext;} DataChunk;
  54. typedef struct 
  55. {
  56. UINT16 len, stream;
  57. UINT32 tStart;
  58. UINT8 reserved;
  59. enum flag_t {PN_RELIABLE_FLAG=1, PN_KEYFRAME_FLAG=2} flags; // UINT8
  60. CArray<BYTE> pData;
  61. } MediaPacketHeader;
  62. typedef struct {UINT32 nIndices; UINT16 stream; UINT32 ptrNext;} IndexChunkHeader;
  63. typedef struct {UINT32 tStart, ptrFilePos, packet;} IndexRecord;
  64. }
  65. struct rvinfo
  66. {
  67. DWORD dwSize, fcc1, fcc2; 
  68. WORD w, h, bpp; 
  69. DWORD unk1, fps, type1, type2;
  70. BYTE morewh[14];
  71. void bswap();
  72. };
  73. struct rainfo
  74. {
  75. DWORD fourcc1;             // '.', 'r', 'a', 0xfd
  76. WORD version1;            // 4 or 5
  77. WORD unknown1;            // 00 000
  78. DWORD fourcc2;             // .ra4 or .ra5
  79. DWORD unknown2;            // ???
  80. WORD version2;            // 4 or 5
  81. DWORD header_size;         // == 0x4e
  82. WORD flavor;              // codec flavor id
  83. DWORD coded_frame_size;    // coded frame size
  84. DWORD unknown3;            // big number
  85. DWORD unknown4;            // bigger number
  86. DWORD unknown5;            // yet another number
  87. WORD sub_packet_h;
  88. WORD frame_size;
  89. WORD sub_packet_size;
  90. WORD unknown6;            // 00 00
  91. void bswap();
  92. };
  93. struct rainfo4 : rainfo
  94. {
  95. WORD sample_rate;
  96. WORD unknown8;            // 0
  97. WORD sample_size;
  98. WORD channels;
  99. void bswap();
  100. };
  101. struct rainfo5 : rainfo
  102. {
  103. BYTE unknown7[6];          // 0, srate, 0
  104. WORD sample_rate;
  105. WORD unknown8;            // 0
  106. WORD sample_size;
  107. WORD channels;
  108. DWORD genr;                // "genr"
  109. DWORD fourcc3;             // fourcc
  110. void bswap();
  111. };
  112. #pragma pack(pop)
  113. class CRMFile : public CBaseSplitterFile
  114. {
  115. using CBaseSplitterFile::Read;
  116. HRESULT Init();
  117. void GetDimensions();
  118. public:
  119. CRMFile(IAsyncReader* pAsyncReader, HRESULT& hr);
  120. template<typename T> HRESULT Read(T& var);
  121. HRESULT Read(RMFF::ChunkHdr& hdr);
  122. HRESULT Read(RMFF::MediaPacketHeader& mph, bool fFull = true);
  123. RMFF::FileHdr m_fh;
  124. RMFF::ContentDesc m_cd;
  125. RMFF::Properies m_p;
  126. CAutoPtrList<RMFF::MediaProperies> m_mps;
  127. CAutoPtrList<RMFF::DataChunk> m_dcs;
  128. CAutoPtrList<RMFF::IndexRecord> m_irs;
  129. typedef struct {CStringA name, data;} subtitle;
  130. CList<subtitle> m_subs;
  131. int GetMasterStream();
  132. };
  133. class CRealMediaSplitterOutputPin : public CBaseSplitterOutputPin
  134. {
  135. private:
  136. typedef struct {CArray<BYTE> data; DWORD offset;} segment;
  137. class CSegments : public CAutoPtrList<segment>, public CCritSec
  138. {
  139. public:
  140. REFERENCE_TIME rtStart; 
  141. bool fDiscontinuity, fSyncPoint, fMerged;
  142. void Clear()
  143. {
  144. CAutoLock cAutoLock(this);
  145. rtStart = 0;
  146. fDiscontinuity = fSyncPoint = fMerged = false;
  147. RemoveAll();
  148. }
  149. } m_segments;
  150. CCritSec m_csQueue;
  151. HRESULT DeliverSegments();
  152. protected:
  153. HRESULT DeliverPacket(CAutoPtr<Packet> p);
  154. public:
  155. CRealMediaSplitterOutputPin(CArray<CMediaType>& mts, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
  156. virtual ~CRealMediaSplitterOutputPin();
  157. HRESULT DeliverEndFlush();
  158. };
  159. [uuid("E21BE468-5C18-43EB-B0CC-DB93A847D769")]
  160. class CRealMediaSplitterFilter : public CBaseSplitterFilter
  161. {
  162. protected:
  163. CAutoPtr<CRMFile> m_pFile;
  164. HRESULT CreateOutputs(IAsyncReader* pAsyncReader);
  165. bool DemuxInit();
  166. void DemuxSeek(REFERENCE_TIME rt);
  167. bool DemuxLoop();
  168. POSITION m_seekpos;
  169. UINT32 m_seekpacket;
  170. UINT64 m_seekfilepos;
  171. public:
  172. CRealMediaSplitterFilter(LPUNKNOWN pUnk, HRESULT* phr);
  173. virtual ~CRealMediaSplitterFilter();
  174. // IKeyFrameInfo
  175. STDMETHODIMP_(HRESULT) GetKeyFrameCount(UINT& nKFs);
  176. STDMETHODIMP_(HRESULT) GetKeyFrames(const GUID* pFormat, REFERENCE_TIME* pKFs, UINT& nKFs);
  177. };
  178. [uuid("765035B3-5944-4A94-806B-20EE3415F26F")]
  179. class CRealMediaSourceFilter : public CRealMediaSplitterFilter
  180. {
  181. public:
  182. CRealMediaSourceFilter(LPUNKNOWN pUnk, HRESULT* phr);
  183. };
  184. ////////////
  185. [uuid("238D0F23-5DC9-45A6-9BE2-666160C324DD")]
  186. class CRealVideoDecoder : public CBaseVideoFilter
  187. {
  188. typedef HRESULT (WINAPI *PRVCustomMessage)(void*, DWORD);
  189. typedef HRESULT (WINAPI *PRVFree)(DWORD);
  190. typedef HRESULT (WINAPI *PRVHiveMessage)(void*, DWORD);
  191. typedef HRESULT (WINAPI *PRVInit)(void*, DWORD* dwCookie);
  192. typedef HRESULT (WINAPI *PRVTransform)(BYTE*, BYTE*, void*, void*, DWORD);
  193. PRVCustomMessage RVCustomMessage;
  194. PRVFree RVFree;
  195. PRVHiveMessage RVHiveMessage;
  196. PRVInit RVInit;
  197. PRVTransform RVTransform;
  198. HMODULE m_hDrvDll;
  199. DWORD m_dwCookie;
  200. HRESULT InitRV(const CMediaType* pmt);
  201. void FreeRV();
  202. REFERENCE_TIME m_tStart;
  203. void Resize(BYTE* pIn, DWORD wi, DWORD hi, BYTE* pOut, DWORD wo, DWORD ho);
  204. void ResizeWidth(BYTE* pIn, DWORD wi, DWORD hi, BYTE* pOut, DWORD wo, DWORD ho);
  205. void ResizeHeight(BYTE* pIn, DWORD wi, DWORD hi, BYTE* pOut, DWORD wo, DWORD ho);
  206. void ResizeRow(BYTE* pIn, DWORD wi, DWORD dpi, BYTE* pOut, DWORD wo, DWORD dpo);
  207. CAutoVectorPtr<BYTE> m_pI420, m_pI420Tmp;
  208. public:
  209. CRealVideoDecoder(LPUNKNOWN lpunk, HRESULT* phr);
  210. virtual ~CRealVideoDecoder();
  211. HRESULT Transform(IMediaSample* pIn);
  212. HRESULT CheckInputType(const CMediaType* mtIn);
  213. HRESULT CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut);
  214. HRESULT StartStreaming();
  215. HRESULT StopStreaming();
  216. HRESULT NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
  217. DWORD m_timestamp;
  218. bool m_fDropFrames;
  219. HRESULT AlterQuality(Quality q);
  220. };
  221. [uuid("941A4793-A705-4312-8DFC-C11CA05F397E")]
  222. class CRealAudioDecoder : public CTransformFilter
  223. {
  224. typedef HRESULT (WINAPI *PCloseCodec)(DWORD);
  225. typedef HRESULT (WINAPI *PDecode)(DWORD,BYTE*,long,BYTE*,long*,long);
  226. typedef HRESULT (WINAPI *PFlush)(DWORD,DWORD,DWORD);
  227. typedef HRESULT (WINAPI *PFreeDecoder)(DWORD);
  228. typedef void* (WINAPI *PGetFlavorProperty)(void*,DWORD,DWORD,int*);
  229. typedef HRESULT (WINAPI *PInitDecoder)(DWORD, void*);
  230. typedef HRESULT (WINAPI *POpenCodec)(void*);
  231. typedef HRESULT (WINAPI *POpenCodec2)(void*, const char*);
  232. typedef HRESULT (WINAPI *PSetFlavor)(DWORD, WORD);
  233. typedef void (WINAPI *PSetDLLAccessPath)(const char*);
  234. typedef void (WINAPI *PSetPwd)(DWORD, const char*);
  235. PCloseCodec RACloseCodec;
  236. PDecode RADecode;
  237. PFlush RAFlush;
  238. PFreeDecoder RAFreeDecoder;
  239. PGetFlavorProperty RAGetFlavorProperty;
  240. PInitDecoder RAInitDecoder;
  241. POpenCodec RAOpenCodec;
  242. POpenCodec2 RAOpenCodec2;
  243. PSetFlavor RASetFlavor;
  244. PSetDLLAccessPath RASetDLLAccessPath;
  245. PSetPwd RASetPwd;
  246. CStringA m_dllpath;
  247. HMODULE m_hDrvDll;
  248. DWORD m_dwCookie;
  249. HRESULT InitRA(const CMediaType* pmt);
  250. void FreeRA();
  251. REFERENCE_TIME m_tStart;
  252. rainfo m_rai;
  253. CAutoVectorPtr<BYTE> m_buff;
  254. int m_bufflen;
  255. REFERENCE_TIME m_rtBuffStart;
  256. bool m_fBuffDiscontinuity;
  257. public:
  258. CRealAudioDecoder(LPUNKNOWN lpunk, HRESULT* phr);
  259. virtual ~CRealAudioDecoder();
  260. HRESULT Receive(IMediaSample* pIn);
  261. HRESULT CheckInputType(const CMediaType* mtIn);
  262. HRESULT CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut);
  263. HRESULT DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties);
  264. HRESULT GetMediaType(int iPosition, CMediaType* pMediaType);
  265. HRESULT StartStreaming();
  266. HRESULT StopStreaming();
  267.     HRESULT EndOfStream();
  268.     HRESULT BeginFlush();
  269.     HRESULT EndFlush();
  270.     HRESULT NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
  271. };