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

多媒体编程

开发平台:

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 <math.h>
  23. #include <atlbase.h>
  24. #include <mmreg.h>
  25. #include "MpaDecFilter.h"
  26. #include "......DSUtilDSUtil.h"
  27. #include <initguid.h>
  28. #include "........includemoreuuids.h"
  29. #include "faad2includeneaacdec.h"
  30. const AMOVIESETUP_MEDIATYPE sudPinTypesIn[] =
  31. {
  32. {&MEDIATYPE_Audio, &MEDIASUBTYPE_MP3},
  33. {&MEDIATYPE_Audio, &MEDIASUBTYPE_MPEG1AudioPayload},
  34. {&MEDIATYPE_Audio, &MEDIASUBTYPE_MPEG1Payload},
  35. {&MEDIATYPE_Audio, &MEDIASUBTYPE_MPEG1Packet},
  36. {&MEDIATYPE_DVD_ENCRYPTED_PACK, &MEDIASUBTYPE_MPEG2_AUDIO},
  37. {&MEDIATYPE_MPEG2_PACK, &MEDIASUBTYPE_MPEG2_AUDIO},
  38. {&MEDIATYPE_MPEG2_PES, &MEDIASUBTYPE_MPEG2_AUDIO},
  39. {&MEDIATYPE_Audio, &MEDIASUBTYPE_MPEG2_AUDIO},
  40. {&MEDIATYPE_DVD_ENCRYPTED_PACK, &MEDIASUBTYPE_DOLBY_AC3},
  41. {&MEDIATYPE_MPEG2_PACK, &MEDIASUBTYPE_DOLBY_AC3},
  42. {&MEDIATYPE_MPEG2_PES, &MEDIASUBTYPE_DOLBY_AC3},
  43. {&MEDIATYPE_Audio, &MEDIASUBTYPE_DOLBY_AC3},
  44. {&MEDIATYPE_Audio, &MEDIASUBTYPE_WAVE_DOLBY_AC3},
  45. {&MEDIATYPE_DVD_ENCRYPTED_PACK, &MEDIASUBTYPE_DTS},
  46. {&MEDIATYPE_MPEG2_PACK, &MEDIASUBTYPE_DTS},
  47. {&MEDIATYPE_MPEG2_PES, &MEDIASUBTYPE_DTS},
  48. {&MEDIATYPE_Audio, &MEDIASUBTYPE_DTS},
  49. {&MEDIATYPE_Audio, &MEDIASUBTYPE_WAVE_DTS},
  50. {&MEDIATYPE_DVD_ENCRYPTED_PACK, &MEDIASUBTYPE_DVD_LPCM_AUDIO},
  51. {&MEDIATYPE_MPEG2_PACK, &MEDIASUBTYPE_DVD_LPCM_AUDIO},
  52. {&MEDIATYPE_MPEG2_PES, &MEDIASUBTYPE_DVD_LPCM_AUDIO},
  53. {&MEDIATYPE_Audio, &MEDIASUBTYPE_DVD_LPCM_AUDIO},
  54. {&MEDIATYPE_DVD_ENCRYPTED_PACK, &MEDIASUBTYPE_AAC},
  55. {&MEDIATYPE_MPEG2_PACK, &MEDIASUBTYPE_AAC},
  56. {&MEDIATYPE_MPEG2_PES, &MEDIASUBTYPE_AAC},
  57. {&MEDIATYPE_Audio, &MEDIASUBTYPE_AAC},
  58. {&MEDIATYPE_DVD_ENCRYPTED_PACK, &MEDIASUBTYPE_MP4A},
  59. {&MEDIATYPE_MPEG2_PACK, &MEDIASUBTYPE_MP4A},
  60. {&MEDIATYPE_MPEG2_PES, &MEDIASUBTYPE_MP4A},
  61. {&MEDIATYPE_Audio, &MEDIASUBTYPE_MP4A},
  62. {&MEDIATYPE_DVD_ENCRYPTED_PACK, &MEDIASUBTYPE_PS2_PCM},
  63. {&MEDIATYPE_MPEG2_PACK, &MEDIASUBTYPE_PS2_PCM},
  64. {&MEDIATYPE_MPEG2_PES, &MEDIASUBTYPE_PS2_PCM},
  65. {&MEDIATYPE_Audio, &MEDIASUBTYPE_PS2_PCM},
  66. {&MEDIATYPE_DVD_ENCRYPTED_PACK, &MEDIASUBTYPE_PS2_ADPCM},
  67. {&MEDIATYPE_MPEG2_PACK, &MEDIASUBTYPE_PS2_ADPCM},
  68. {&MEDIATYPE_MPEG2_PES, &MEDIASUBTYPE_PS2_ADPCM},
  69. {&MEDIATYPE_Audio, &MEDIASUBTYPE_PS2_ADPCM},
  70. };
  71. #ifdef REGISTER_FILTER
  72. const AMOVIESETUP_MEDIATYPE sudPinTypesOut[] =
  73. {
  74. {&MEDIATYPE_Audio, &MEDIASUBTYPE_PCM},
  75. };
  76. const AMOVIESETUP_PIN sudpPins[] =
  77. {
  78.     {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, countof(sudPinTypesIn), sudPinTypesIn},
  79.     {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, countof(sudPinTypesOut), sudPinTypesOut}
  80. };
  81. const AMOVIESETUP_FILTER sudFilter[] =
  82. {
  83. {&__uuidof(CMpaDecFilter), L"MPEG/AC3/DTS/LPCM Audio Decoder", MERIT_DO_NOT_USE/*0x40000001*/, countof(sudpPins), sudpPins},
  84. };
  85. CFactoryTemplate g_Templates[] =
  86. {
  87.     {L"MPEG/AC3/DTS/LPCM Audio Decoder", &__uuidof(CMpaDecFilter), CreateInstance<CMpaDecFilter>, NULL, &sudFilter[0]},
  88. };
  89. int g_cTemplates = countof(g_Templates);
  90. STDAPI DllRegisterServer()
  91. {
  92. return AMovieDllRegisterServer2(TRUE);
  93. }
  94. STDAPI DllUnregisterServer()
  95. {
  96. return AMovieDllRegisterServer2(FALSE);
  97. }
  98. //
  99. extern "C" BOOL WINAPI DllEntryPoint(HINSTANCE, ULONG, LPVOID);
  100. BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
  101. {
  102. return DllEntryPoint((HINSTANCE)hModule, dwReason, 0); // "DllMain" of the dshow baseclasses;
  103. }
  104. #endif
  105. // dshow: left, right, center, LFE, left surround, right surround
  106. // ac3: LFE, left, center, right, left surround, right surround
  107. // dts: center, left, right, left surround, right surround, LFE
  108. // lets see how we can map these things to dshow (oh the joy!)
  109. static struct scmap_t
  110. {
  111. WORD nChannels;
  112. BYTE ch[6];
  113. DWORD dwChannelMask;
  114. }
  115. s_scmap_ac3[2*11] = 
  116. {
  117. {2, {0, 1,-1,-1,-1,-1}, 0}, // A52_CHANNEL
  118. {1, {0,-1,-1,-1,-1,-1}, 0}, // A52_MONO
  119. {2, {0, 1,-1,-1,-1,-1}, 0}, // A52_STEREO
  120. {3, {0, 2, 1,-1,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER}, // A52_3F
  121. {3, {0, 1, 2,-1,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_BACK_CENTER}, // A52_2F1R
  122. {4, {0, 2, 1, 3,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_BACK_CENTER}, // A52_3F1R
  123. {4, {0, 1, 2, 3,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT}, // A52_2F2R
  124. {5, {0, 2, 1, 3, 4,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT}, // A52_3F2R
  125. {1, {0,-1,-1,-1,-1,-1}, 0}, // A52_CHANNEL1
  126. {1, {0,-1,-1,-1,-1,-1}, 0}, // A52_CHANNEL2
  127. {2, {0, 1,-1,-1,-1,-1}, 0}, // A52_DOLBY
  128. {3, {1, 2, 0,-1,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_LOW_FREQUENCY}, // A52_CHANNEL|A52_LFE
  129. {2, {1, 0,-1,-1,-1,-1}, SPEAKER_FRONT_CENTER|SPEAKER_LOW_FREQUENCY}, // A52_MONO|A52_LFE
  130. {3, {1, 2, 0,-1,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_LOW_FREQUENCY}, // A52_STEREO|A52_LFE
  131. {4, {1, 3, 2, 0,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_LOW_FREQUENCY}, // A52_3F|A52_LFE
  132. {4, {1, 2, 0, 3,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_LOW_FREQUENCY|SPEAKER_BACK_CENTER}, // A52_2F1R|A52_LFE
  133. {5, {1, 3, 2, 0, 4,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_LOW_FREQUENCY|SPEAKER_BACK_CENTER}, // A52_3F1R|A52_LFE
  134. {5, {1, 2, 0, 3, 4,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_LOW_FREQUENCY|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT}, // A52_2F2R|A52_LFE
  135. {6, {1, 3, 2, 0, 4, 5}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_LOW_FREQUENCY|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT}, // A52_3F2R|A52_LFE
  136. {2, {1, 0,-1,-1,-1,-1}, SPEAKER_FRONT_CENTER|SPEAKER_LOW_FREQUENCY}, // A52_CHANNEL1|A52_LFE
  137. {2, {1, 0,-1,-1,-1,-1}, SPEAKER_FRONT_CENTER|SPEAKER_LOW_FREQUENCY}, // A52_CHANNEL2|A52_LFE
  138. {3, {1, 2, 0,-1,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_LOW_FREQUENCY}, // A52_DOLBY|A52_LFE
  139. },
  140. s_scmap_dts[2*10] = 
  141. {
  142. {1, {0,-1,-1,-1,-1,-1}, 0}, // DTS_MONO
  143. {2, {0, 1,-1,-1,-1,-1}, 0}, // DTS_CHANNEL
  144. {2, {0, 1,-1,-1,-1,-1}, 0}, // DTS_STEREO
  145. {2, {0, 1,-1,-1,-1,-1}, 0}, // DTS_STEREO_SUMDIFF
  146. {2, {0, 1,-1,-1,-1,-1}, 0}, // DTS_STEREO_TOTAL
  147. {3, {1, 2, 0,-1,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER}, // DTS_3F
  148. {3, {0, 1, 2,-1,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_BACK_CENTER}, // DTS_2F1R
  149. {4, {1, 2, 0, 3,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_BACK_CENTER}, // DTS_3F1R
  150. {4, {0, 1, 2, 3,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT}, // DTS_2F2R
  151. {5, {1, 2, 0, 3, 4,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT}, // DTS_3F2R
  152. {2, {0, 1,-1,-1,-1,-1}, SPEAKER_FRONT_CENTER|SPEAKER_LOW_FREQUENCY}, // DTS_MONO|DTS_LFE
  153. {3, {0, 1, 2,-1,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_LOW_FREQUENCY}, // DTS_CHANNEL|DTS_LFE
  154. {3, {0, 1, 2,-1,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_LOW_FREQUENCY}, // DTS_STEREO|DTS_LFE
  155. {3, {0, 1, 2,-1,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_LOW_FREQUENCY}, // DTS_STEREO_SUMDIFF|DTS_LFE
  156. {3, {0, 1, 2,-1,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_LOW_FREQUENCY}, // DTS_STEREO_TOTAL|DTS_LFE
  157. {4, {1, 2, 0, 3,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_LOW_FREQUENCY}, // DTS_3F|DTS_LFE
  158. {4, {0, 1, 3, 2,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_LOW_FREQUENCY|SPEAKER_BACK_CENTER}, // DTS_2F1R|DTS_LFE
  159. {5, {1, 2, 0, 4, 3,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_LOW_FREQUENCY|SPEAKER_BACK_CENTER}, // DTS_3F1R|DTS_LFE
  160. {5, {0, 1, 4, 2, 3,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_LOW_FREQUENCY|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT}, // DTS_2F2R|DTS_LFE
  161. {6, {1, 2, 0, 5, 3, 4}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_LOW_FREQUENCY|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT}, // DTS_3F2R|DTS_LFE
  162. };
  163. CMpaDecFilter::CMpaDecFilter(LPUNKNOWN lpunk, HRESULT* phr) 
  164. : CTransformFilter(NAME("CMpaDecFilter"), lpunk, __uuidof(this))
  165. , m_iSampleFormat(SF_PCM16)
  166. , m_fNormalize(false)
  167. , m_boost(1)
  168. {
  169. if(phr) *phr = S_OK;
  170. if(!(m_pInput = new CMpaDecInputPin(this, phr, L"In"))) *phr = E_OUTOFMEMORY;
  171. if(FAILED(*phr)) return;
  172. if(!(m_pOutput = new CTransformOutputPin(NAME("CTransformOutputPin"), this, phr, L"Out"))) *phr = E_OUTOFMEMORY;
  173. if(FAILED(*phr))  {delete m_pInput, m_pInput = NULL; return;}
  174. m_iSpeakerConfig[ac3] = A52_STEREO;
  175. m_iSpeakerConfig[dts] = DTS_STEREO;
  176. m_iSpeakerConfig[aac] = AAC_STEREO;
  177. m_fDynamicRangeControl[ac3] = false;
  178. m_fDynamicRangeControl[dts] = false;
  179. m_fDynamicRangeControl[aac] = false;
  180. }
  181. CMpaDecFilter::~CMpaDecFilter()
  182. {
  183. }
  184. STDMETHODIMP CMpaDecFilter::NonDelegatingQueryInterface(REFIID riid, void** ppv)
  185. {
  186. return
  187. QI(IMpaDecFilter)
  188.  __super::NonDelegatingQueryInterface(riid, ppv);
  189. }
  190. HRESULT CMpaDecFilter::EndOfStream()
  191. {
  192. CAutoLock cAutoLock(&m_csReceive);
  193. return __super::EndOfStream();
  194. }
  195. HRESULT CMpaDecFilter::BeginFlush()
  196. {
  197. return __super::BeginFlush();
  198. }
  199. HRESULT CMpaDecFilter::EndFlush()
  200. {
  201. CAutoLock cAutoLock(&m_csReceive);
  202. m_buff.RemoveAll();
  203. m_sample_max = 0.1f;
  204. return __super::EndFlush();
  205. }
  206. HRESULT CMpaDecFilter::NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
  207. {
  208. CAutoLock cAutoLock(&m_csReceive);
  209. m_buff.RemoveAll();
  210. m_sample_max = 0.1f;
  211. m_ps2_state.sync = false;
  212. return __super::NewSegment(tStart, tStop, dRate);
  213. }
  214. HRESULT CMpaDecFilter::Receive(IMediaSample* pIn)
  215. {
  216. CAutoLock cAutoLock(&m_csReceive);
  217. HRESULT hr;
  218.     AM_SAMPLE2_PROPERTIES* const pProps = m_pInput->SampleProps();
  219.     if(pProps->dwStreamId != AM_STREAM_MEDIA)
  220. return m_pOutput->Deliver(pIn);
  221. AM_MEDIA_TYPE* pmt;
  222. if(SUCCEEDED(pIn->GetMediaType(&pmt)) && pmt)
  223. {
  224. CMediaType mt(*pmt);
  225. m_pInput->SetMediaType(&mt);
  226. DeleteMediaType(pmt);
  227. pmt = NULL;
  228. m_sample_max = 0.1f;
  229. m_aac_state.init(mt);
  230. }
  231. BYTE* pDataIn = NULL;
  232. if(FAILED(hr = pIn->GetPointer(&pDataIn))) return hr;
  233. long len = pIn->GetActualDataLength();
  234. ((CDeCSSInputPin*)m_pInput)->StripPacket(pDataIn, len);
  235. REFERENCE_TIME rtStart = _I64_MIN, rtStop = _I64_MIN;
  236. hr = pIn->GetTime(&rtStart, &rtStop);
  237. if(pIn->IsDiscontinuity() == S_OK)
  238. {
  239. m_fDiscontinuity = true;
  240. m_buff.RemoveAll();
  241. m_sample_max = 0.1f;
  242. // ASSERT(SUCCEEDED(hr)); // what to do if not?
  243. if(FAILED(hr)) {TRACE(_T("mpa: disc. w/o timestampn")); return S_OK;} // lets wait then...
  244. m_rtStart = rtStart;
  245. }
  246. if(SUCCEEDED(hr) && abs((int)(m_rtStart - rtStart)) > 1000000) // +-100ms jitter is allowed for now
  247. {
  248. m_buff.RemoveAll();
  249. m_rtStart = rtStart;
  250. }
  251. int tmp = m_buff.GetSize();
  252. m_buff.SetSize(m_buff.GetSize() + len);
  253. memcpy(m_buff.GetData() + tmp, pDataIn, len);
  254. len += tmp;
  255. const GUID& subtype = m_pInput->CurrentMediaType().subtype;
  256. if(subtype == MEDIASUBTYPE_DVD_LPCM_AUDIO)
  257. hr = ProcessLPCM();
  258. else if(subtype == MEDIASUBTYPE_DOLBY_AC3 || subtype == MEDIASUBTYPE_WAVE_DOLBY_AC3)
  259. hr = ProcessAC3();
  260. else if(subtype == MEDIASUBTYPE_DTS || subtype == MEDIASUBTYPE_WAVE_DTS)
  261. hr = ProcessDTS();
  262. else if(subtype == MEDIASUBTYPE_AAC || subtype == MEDIASUBTYPE_MP4A)
  263. hr = ProcessAAC();
  264. else if(subtype == MEDIASUBTYPE_PS2_PCM)
  265. hr = ProcessPS2PCM();
  266. else if(subtype == MEDIASUBTYPE_PS2_ADPCM)
  267. hr = ProcessPS2ADPCM();
  268. else // if(.. the rest ..)
  269. hr = ProcessMPA();
  270. return hr;
  271. }
  272. HRESULT CMpaDecFilter::ProcessLPCM()
  273. {
  274. WAVEFORMATEX* wfein = (WAVEFORMATEX*)m_pInput->CurrentMediaType().Format();
  275. ASSERT(wfein->nChannels == 2);
  276. ASSERT(wfein->wBitsPerSample == 16);
  277. BYTE* pDataIn = m_buff.GetData();
  278. int len = m_buff.GetSize() & ~(wfein->nChannels*wfein->wBitsPerSample/8-1);
  279. CArray<float> pBuff;
  280. pBuff.SetSize(len*8/wfein->wBitsPerSample);
  281. float* pDataOut = pBuff.GetData();
  282. for(int i = 0; i < len; i += 2, pDataIn += 2, pDataOut++)
  283. *pDataOut = (float)(short)((pDataIn[0]<<8)|pDataIn[1]) / 0x8000; // FIXME: care about 20/24 bps too
  284. memmove(m_buff.GetData(), pDataIn, m_buff.GetSize() - len);
  285. m_buff.SetSize(m_buff.GetSize() - len);
  286. return Deliver(pBuff, wfein->nSamplesPerSec, wfein->nChannels);
  287. }
  288. HRESULT CMpaDecFilter::ProcessAC3()
  289. {
  290. BYTE* p = m_buff.GetData();
  291. BYTE* base = p;
  292. BYTE* end = p + m_buff.GetSize();
  293. while(end - p >= 7)
  294. {
  295. int size = 0, flags, sample_rate, bit_rate;
  296. if((size = a52_syncinfo(p, &flags, &sample_rate, &bit_rate)) > 0)
  297. {
  298. // TRACE(_T("ac3: size=%d, flags=%08x, sample_rate=%d, bit_rate=%dn"), size, flags, sample_rate, bit_rate);
  299. bool fEnoughData = p + size <= end;
  300. if(fEnoughData)
  301. {
  302. int iSpeakerConfig = GetSpeakerConfig(ac3);
  303. if(iSpeakerConfig < 0)
  304. {
  305. HRESULT hr;
  306. if(S_OK != (hr = Deliver(p, size, bit_rate, 0x0001)))
  307. return hr;
  308. }
  309. else
  310. {
  311. flags = iSpeakerConfig&(A52_CHANNEL_MASK|A52_LFE);
  312. flags |= A52_ADJUST_LEVEL;
  313. sample_t level = 1, gain = 1, bias = 0;
  314. level *= gain;
  315. if(a52_frame(m_a52_state, p, &flags, &level, bias) == 0)
  316. {
  317. if(GetDynamicRangeControl(ac3))
  318. a52_dynrng(m_a52_state, NULL, NULL);
  319. int scmapidx = min(flags&A52_CHANNEL_MASK, countof(s_scmap_ac3)/2);
  320.                         scmap_t& scmap = s_scmap_ac3[scmapidx + ((flags&A52_LFE)?(countof(s_scmap_ac3)/2):0)];
  321. CArray<float> pBuff;
  322. pBuff.SetSize(6*256*scmap.nChannels);
  323. float* p = pBuff.GetData();
  324. int i = 0;
  325. for(; i < 6 && a52_block(m_a52_state) == 0; i++)
  326. {
  327. sample_t* samples = a52_samples(m_a52_state);
  328. for(int j = 0; j < 256; j++, samples++)
  329. {
  330. for(int ch = 0; ch < scmap.nChannels; ch++)
  331. {
  332. ASSERT(scmap.ch[ch] != -1);
  333. *p++ = (float)(*(samples + 256*scmap.ch[ch]) / level);
  334. }
  335. }
  336. }
  337. if(i == 6)
  338. {
  339. HRESULT hr;
  340. if(S_OK != (hr = Deliver(pBuff, sample_rate, scmap.nChannels, scmap.dwChannelMask)))
  341. return hr;
  342. }
  343. }
  344. }
  345. p += size;
  346. }
  347. memmove(base, p, end - p);
  348. end = base + (end - p);
  349. p = base;
  350. if(!fEnoughData)
  351. break;
  352. }
  353. else
  354. {
  355. p++;
  356. }
  357. }
  358. m_buff.SetSize(end - p);
  359. return S_OK;
  360. }
  361. HRESULT CMpaDecFilter::ProcessDTS()
  362. {
  363. BYTE* p = m_buff.GetData();
  364. BYTE* base = p;
  365. BYTE* end = p + m_buff.GetSize();
  366. while(end - p >= 14)
  367. {
  368. int size = 0, flags, sample_rate, bit_rate, frame_length;
  369. if((size = dts_syncinfo(m_dts_state, p, &flags, &sample_rate, &bit_rate, &frame_length)) > 0)
  370. {
  371. // TRACE(_T("dts: size=%d, flags=%08x, sample_rate=%d, bit_rate=%d, frame_length=%dn"), size, flags, sample_rate, bit_rate, frame_length);
  372. bool fEnoughData = p + size <= end;
  373. if(fEnoughData)
  374. {
  375. int iSpeakerConfig = GetSpeakerConfig(dts);
  376. if(iSpeakerConfig < 0)
  377. {
  378. HRESULT hr;
  379. if(S_OK != (hr = Deliver(p, size, bit_rate, 0x000b)))
  380. return hr;
  381. }
  382. else
  383. {
  384. flags = iSpeakerConfig&(DTS_CHANNEL_MASK|DTS_LFE);
  385. flags |= DTS_ADJUST_LEVEL;
  386. sample_t level = 1, gain = 1, bias = 0;
  387. level *= gain;
  388. if(dts_frame(m_dts_state, p, &flags, &level, bias) == 0)
  389. {
  390. if(GetDynamicRangeControl(dts))
  391. dts_dynrng(m_dts_state, NULL, NULL);
  392. int scmapidx = min(flags&DTS_CHANNEL_MASK, countof(s_scmap_dts)/2);
  393.                         scmap_t& scmap = s_scmap_dts[scmapidx + ((flags&DTS_LFE)?(countof(s_scmap_dts)/2):0)];
  394. int blocks = dts_blocks_num(m_dts_state);
  395. CArray<float> pBuff;
  396. pBuff.SetSize(blocks*256*scmap.nChannels);
  397. float* p = pBuff.GetData();
  398. int i = 0;
  399. for(; i < blocks && dts_block(m_dts_state) == 0; i++)
  400. {
  401. sample_t* samples = dts_samples(m_dts_state);
  402. for(int j = 0; j < 256; j++, samples++)
  403. {
  404. for(int ch = 0; ch < scmap.nChannels; ch++)
  405. {
  406. ASSERT(scmap.ch[ch] != -1);
  407. *p++ = (float)(*(samples + 256*scmap.ch[ch]) / level);
  408. }
  409. }
  410. }
  411. if(i == blocks)
  412. {
  413. HRESULT hr;
  414. if(S_OK != (hr = Deliver(pBuff, sample_rate, scmap.nChannels, scmap.dwChannelMask)))
  415. return hr;
  416. }
  417. }
  418. }
  419. p += size;
  420. }
  421. memmove(base, p, end - p);
  422. end = base + (end - p);
  423. p = base;
  424. if(!fEnoughData)
  425. break;
  426. }
  427. else
  428. {
  429. p++;
  430. }
  431. }
  432. m_buff.SetSize(end - p);
  433. return S_OK;
  434. }
  435. HRESULT CMpaDecFilter::ProcessAAC()
  436. {
  437. int iSpeakerConfig = GetSpeakerConfig(aac);
  438. NeAACDecConfigurationPtr c = NeAACDecGetCurrentConfiguration(m_aac_state.h);
  439. c->downMatrix = iSpeakerConfig;
  440. NeAACDecSetConfiguration(m_aac_state.h, c);
  441. NeAACDecFrameInfo info;
  442. float* src = (float*)NeAACDecDecode(m_aac_state.h, &info, m_buff.GetData(), m_buff.GetSize());
  443. m_buff.SetSize(0);
  444. //if(!src) return E_FAIL;
  445. if(info.error)  m_aac_state.init(m_pInput->CurrentMediaType());
  446. if(!src || info.samples == 0) return S_OK;
  447. // HACK: bug in faad2 with mono sources?
  448. if(info.channels == 2 && info.channel_position[1] == UNKNOWN_CHANNEL)
  449. {
  450. info.channel_position[0] = FRONT_CHANNEL_LEFT;
  451. info.channel_position[1] = FRONT_CHANNEL_RIGHT;
  452. }
  453. CArray<float> pBuff;
  454. pBuff.SetSize(info.samples);
  455. float* dst = pBuff.GetData();
  456. CMap<int,int,int,int> chmask;
  457. chmask[FRONT_CHANNEL_CENTER] = SPEAKER_FRONT_CENTER;
  458. chmask[FRONT_CHANNEL_LEFT] = SPEAKER_FRONT_LEFT;
  459. chmask[FRONT_CHANNEL_RIGHT] = SPEAKER_FRONT_RIGHT;
  460. chmask[SIDE_CHANNEL_LEFT] = SPEAKER_SIDE_LEFT;
  461. chmask[SIDE_CHANNEL_RIGHT] = SPEAKER_SIDE_RIGHT;
  462. chmask[BACK_CHANNEL_LEFT] = SPEAKER_BACK_LEFT;
  463. chmask[BACK_CHANNEL_RIGHT] = SPEAKER_BACK_RIGHT;
  464. chmask[BACK_CHANNEL_CENTER] = SPEAKER_BACK_CENTER;
  465. chmask[LFE_CHANNEL] = SPEAKER_LOW_FREQUENCY;
  466. DWORD dwChannelMask = 0;
  467. for(int i = 0; i < info.channels; i++)
  468. {
  469. if(info.channel_position[i] == UNKNOWN_CHANNEL) {ASSERT(0); return E_FAIL;}
  470. dwChannelMask |= chmask[info.channel_position[i]];
  471. }
  472. int chmap[countof(info.channel_position)];
  473. memset(chmap, 0, sizeof(chmap));
  474. for(int i = 0; i < info.channels; i++)
  475. {
  476. unsigned int ch = 0, mask = chmask[info.channel_position[i]];
  477. for(int j = 0; j < 32; j++)
  478. {
  479. if(dwChannelMask & (1 << j))
  480. {
  481. if((1 << j) == mask) {chmap[i] = ch; break;}
  482. ch++;
  483. }
  484. }
  485. }
  486. if(info.channels <= 2) dwChannelMask = 0;
  487. for(int j = 0; j < info.samples; j += info.channels, dst += info.channels)
  488. for(int i = 0; i < info.channels; i++)
  489. dst[chmap[i]] = *src++;
  490. HRESULT hr;
  491. if(S_OK != (hr = Deliver(pBuff, info.samplerate, info.channels, dwChannelMask)))
  492. return hr;
  493. return S_OK;
  494. }
  495. HRESULT CMpaDecFilter::ProcessPS2PCM()
  496. {
  497. BYTE* p = m_buff.GetData();
  498. BYTE* base = p;
  499. BYTE* end = p + m_buff.GetSize();
  500. WAVEFORMATEXPS2* wfe = (WAVEFORMATEXPS2*)m_pInput->CurrentMediaType().Format();
  501. int size = wfe->dwInterleave*wfe->nChannels;
  502. int samples = wfe->dwInterleave/(wfe->wBitsPerSample>>3);
  503. int channels = wfe->nChannels;
  504. CArray<float> pBuff;
  505. pBuff.SetSize(samples*channels);
  506. float* f = pBuff.GetData();
  507. while(end - p >= size)
  508. {
  509. DWORD* dw = (DWORD*)p;
  510. if(dw[0] == 'dhSS')
  511. {
  512. p += dw[1] + 8;
  513. }
  514. else if(dw[0] == 'dbSS')
  515. {
  516. p += 8;
  517. m_ps2_state.sync = true;
  518. }
  519. else
  520. {
  521. if(m_ps2_state.sync)
  522. {
  523. short* s = (short*)p;
  524. for(int i = 0; i < samples; i++)
  525. for(int j = 0; j < channels; j++)
  526. f[i*channels+j] = (float)s[j*samples+i] / 32768;
  527. }
  528. else
  529. {
  530. for(int i = 0, j = samples*channels; i < j; i++)
  531. f[i] = 0;
  532. }
  533. HRESULT hr;
  534. if(S_OK != (hr = Deliver(pBuff, wfe->nSamplesPerSec, wfe->nChannels)))
  535. return hr;
  536. p += size;
  537. memmove(base, p, end - p);
  538. end = base + (end - p);
  539. p = base;
  540. }
  541. }
  542. m_buff.SetSize(end - p);
  543. return S_OK;
  544. }
  545. static void decodeps2adpcm(ps2_state_t& s, int channel, BYTE* pin, double* pout)
  546. {
  547. int tbl_index = pin[0]>>4;
  548. int shift = pin[0]&0xf;
  549.     int unk = pin[1]; // ?
  550. if(tbl_index >= 10) {ASSERT(0); return;}
  551. // if(unk == 7) {ASSERT(0); return;} // ???
  552. static double s_tbl[] = 
  553. {
  554. 0.0, 0.0, 0.9375, 0.0, 1.796875, -0.8125, 1.53125, -0.859375, 1.90625, -0.9375, 
  555. 0.0, 0.0, -0.9375, 0.0, -1.796875, 0.8125, -1.53125, 0.859375 -1.90625, 0.9375
  556. };
  557. double* tbl = &s_tbl[tbl_index*2];
  558. double& a = s.a[channel];
  559. double& b = s.b[channel];
  560. for(int i = 0; i < 28; i++)
  561. {
  562. short input = (short)(((pin[2+i/2] >> ((i&1) << 2)) & 0xf) << 12) >> shift;
  563. double output = a * tbl[1] + b * tbl[0] + input;
  564. a = b;
  565. b = output;
  566. *pout++ = output / SHRT_MAX;
  567. }
  568. }
  569. HRESULT CMpaDecFilter::ProcessPS2ADPCM()
  570. {
  571. BYTE* p = m_buff.GetData();
  572. BYTE* base = p;
  573. BYTE* end = p + m_buff.GetSize();
  574. WAVEFORMATEXPS2* wfe = (WAVEFORMATEXPS2*)m_pInput->CurrentMediaType().Format();
  575. int size = wfe->dwInterleave*wfe->nChannels;
  576. int samples = wfe->dwInterleave * 14 / 16 * 2;
  577. int channels = wfe->nChannels;
  578. CArray<float> pBuff;
  579. pBuff.SetSize(samples*channels);
  580. float* f = pBuff.GetData();
  581. while(end - p >= size)
  582. {
  583. DWORD* dw = (DWORD*)p;
  584. if(dw[0] == 'dhSS')
  585. {
  586. p += dw[1] + 8;
  587. }
  588. else if(dw[0] == 'dbSS')
  589. {
  590. p += 8;
  591. m_ps2_state.sync = true;
  592. }
  593. else
  594. {
  595. if(m_ps2_state.sync)
  596. {
  597. double* tmp = new double[samples*channels];
  598. for(int channel = 0, j = 0, k = 0; channel < channels; channel++, j += wfe->dwInterleave)
  599. for(int i = 0; i < wfe->dwInterleave; i += 16, k += 28)
  600. decodeps2adpcm(m_ps2_state, channel, p + i + j, tmp + k);
  601. for(int i = 0, k = 0; i < samples; i++)
  602. for(int j = 0; j < channels; j++, k++)
  603. f[k] = (float)tmp[j*samples+i];
  604. delete [] tmp;
  605. }
  606. else
  607. {
  608. for(int i = 0, j = samples*channels; i < j; i++)
  609. f[i] = 0;
  610. }
  611. HRESULT hr;
  612. if(S_OK != (hr = Deliver(pBuff, wfe->nSamplesPerSec, wfe->nChannels)))
  613. return hr;
  614. p += size;
  615. }
  616. }
  617. memmove(base, p, end - p);
  618. end = base + (end - p);
  619. p = base;
  620. m_buff.SetSize(end - p);
  621. return S_OK;
  622. }
  623. static inline float fscale(mad_fixed_t sample)
  624. {
  625. if(sample >= MAD_F_ONE) sample = MAD_F_ONE - 1;
  626. else if(sample < -MAD_F_ONE) sample = -MAD_F_ONE;
  627. return (float)sample / (1 << MAD_F_FRACBITS);
  628. }
  629. HRESULT CMpaDecFilter::ProcessMPA()
  630. {
  631. mad_stream_buffer(&m_stream, m_buff.GetData(), m_buff.GetSize());
  632. while(1)
  633. {
  634. if(mad_frame_decode(&m_frame, &m_stream) == -1)
  635. {
  636. if(m_stream.error == MAD_ERROR_BUFLEN)
  637. {
  638. memmove(m_buff.GetData(), m_stream.this_frame, m_stream.bufend - m_stream.this_frame);
  639. m_buff.SetSize(m_stream.bufend - m_stream.this_frame);
  640. break;
  641. }
  642. if(!MAD_RECOVERABLE(m_stream.error))
  643. {
  644. TRACE(_T("*m_stream.error == %dn"), m_stream.error);
  645. return E_FAIL;
  646. }
  647. // FIXME: the renderer doesn't like this
  648. // m_fDiscontinuity = true;
  649. continue;
  650. }
  651. /*
  652. // TODO: needs to be tested... (has anybody got an external mpeg audio decoder?)
  653. HRESULT hr;
  654. if(S_OK != (hr = Deliver(
  655.    (BYTE*)m_stream.this_frame, 
  656.    m_stream.next_frame - m_stream.this_frame, 
  657.    m_frame.header.bitrate, 
  658.    m_frame.header.layer == 1 ? 0x0004 : 0x0005)))
  659. return hr;
  660. continue;
  661. */
  662. mad_synth_frame(&m_synth, &m_frame);
  663. WAVEFORMATEX* wfein = (WAVEFORMATEX*)m_pInput->CurrentMediaType().Format();
  664. if(wfein->nChannels != m_synth.pcm.channels || wfein->nSamplesPerSec != m_synth.pcm.samplerate)
  665. continue;
  666. const mad_fixed_t* left_ch   = m_synth.pcm.samples[0];
  667. const mad_fixed_t* right_ch  = m_synth.pcm.samples[1];
  668. CArray<float> pBuff;
  669. pBuff.SetSize(m_synth.pcm.length*m_synth.pcm.channels);
  670. float* pDataOut = pBuff.GetData();
  671. for(unsigned short i = 0; i < m_synth.pcm.length; i++)
  672. {
  673. *pDataOut++ = fscale(*left_ch++);
  674. if(m_synth.pcm.channels == 2) *pDataOut++ = fscale(*right_ch++);
  675. }
  676. HRESULT hr;
  677. if(S_OK != (hr = Deliver(pBuff, m_synth.pcm.samplerate, m_synth.pcm.channels)))
  678. return hr;
  679. }
  680. return S_OK;
  681. }
  682. HRESULT CMpaDecFilter::GetDeliveryBuffer(IMediaSample** pSample, BYTE** pData)
  683. {
  684. HRESULT hr;
  685. *pData = NULL;
  686. if(FAILED(hr = m_pOutput->GetDeliveryBuffer(pSample, NULL, NULL, 0))
  687. || FAILED(hr = (*pSample)->GetPointer(pData)))
  688. return hr;
  689. AM_MEDIA_TYPE* pmt = NULL;
  690. if(SUCCEEDED((*pSample)->GetMediaType(&pmt)) && pmt)
  691. {
  692. CMediaType mt = *pmt;
  693. m_pOutput->SetMediaType(&mt);
  694. DeleteMediaType(pmt);
  695. pmt = NULL;
  696. }
  697. return S_OK;
  698. }
  699. HRESULT CMpaDecFilter::Deliver(CArray<float>& pBuff, DWORD nSamplesPerSec, WORD nChannels, DWORD dwChannelMask)
  700. {
  701. HRESULT hr;
  702. SampleFormat sf = GetSampleFormat();
  703. CMediaType mt = CreateMediaType(sf, nSamplesPerSec, nChannels, dwChannelMask);
  704. WAVEFORMATEX* wfe = (WAVEFORMATEX*)mt.Format();
  705. int nSamples = pBuff.GetSize()/wfe->nChannels;
  706. if(FAILED(hr = ReconnectOutput(nSamples, mt)))
  707. return hr;
  708. CComPtr<IMediaSample> pOut;
  709. BYTE* pDataOut = NULL;
  710. if(FAILED(GetDeliveryBuffer(&pOut, &pDataOut)))
  711. return E_FAIL;
  712. REFERENCE_TIME rtDur = 10000000i64*nSamples/wfe->nSamplesPerSec;
  713. REFERENCE_TIME rtStart = m_rtStart, rtStop = m_rtStart + rtDur;
  714. m_rtStart += rtDur;
  715. //TRACE(_T("CMpaDecFilter: %I64d - %I64dn"), rtStart/10000, rtStop/10000);
  716. if(rtStart < 0 /*200000*/ /* < 0, FIXME: 0 makes strange noises */)
  717. return S_OK;
  718. if(hr == S_OK)
  719. {
  720. m_pOutput->SetMediaType(&mt);
  721. pOut->SetMediaType(&mt);
  722. }
  723. pOut->SetTime(&rtStart, &rtStop);
  724. pOut->SetMediaTime(NULL, NULL);
  725. pOut->SetPreroll(FALSE);
  726. pOut->SetDiscontinuity(m_fDiscontinuity); m_fDiscontinuity = false;
  727. pOut->SetSyncPoint(TRUE);
  728. pOut->SetActualDataLength(pBuff.GetSize()*wfe->wBitsPerSample/8);
  729. WAVEFORMATEX* wfeout = (WAVEFORMATEX*)m_pOutput->CurrentMediaType().Format();
  730. ASSERT(wfeout->nChannels == wfe->nChannels);
  731. ASSERT(wfeout->nSamplesPerSec == wfe->nSamplesPerSec);
  732. float* pDataIn = pBuff.GetData();
  733. // TODO: move this into the audio switcher
  734. float sample_mul = 1;
  735. if(m_fNormalize)
  736. {
  737. for(int i = 0, len = pBuff.GetSize(); i < len; i++)
  738. {
  739. float f = *pDataIn++;
  740. if(f < 0) f = -f;
  741. if(m_sample_max < f) m_sample_max = f;
  742. }
  743. sample_mul = 1.0f / m_sample_max;
  744. pDataIn = pBuff.GetData();
  745. }
  746. bool fBoost = m_boost > 1;
  747. double boost = 1+log10(m_boost);
  748. for(int i = 0, len = pBuff.GetSize(); i < len; i++)
  749. {
  750. float f = *pDataIn++;
  751. // TODO: move this into the audio switcher
  752. if(m_fNormalize) 
  753. f *= sample_mul;
  754. if(fBoost)
  755. f *= boost;
  756. if(f < -1) f = -1;
  757. else if(f > 1) f = 1;
  758. #define round(x) ((x) > 0 ? (x) + 0.5 : (x) - 0.5)
  759. switch(sf)
  760. {
  761. default:
  762. case SF_PCM16:
  763. *(short*)pDataOut = (short)round(f * SHRT_MAX);
  764. pDataOut += sizeof(short);
  765. break;
  766. case SF_PCM24:
  767. {DWORD i24 = (DWORD)(int)round(f * ((1<<23)-1));
  768. *pDataOut++ = (BYTE)(i24);
  769. *pDataOut++ = (BYTE)(i24>>8);
  770. *pDataOut++ = (BYTE)(i24>>16);}
  771. break;
  772. case SF_PCM32:
  773. *(int*)pDataOut = (int)round(f * INT_MAX);
  774. pDataOut += sizeof(int);
  775. break;
  776. case SF_FLOAT32:
  777. *(float*)pDataOut = f;
  778. pDataOut += sizeof(float);
  779. break;
  780. }
  781. }
  782. return m_pOutput->Deliver(pOut);
  783. }
  784. HRESULT CMpaDecFilter::Deliver(BYTE* pBuff, int size, int bit_rate, BYTE type)
  785. {
  786. HRESULT hr;
  787. CMediaType mt = CreateMediaTypeSPDIF();
  788. WAVEFORMATEX* wfe = (WAVEFORMATEX*)mt.Format();
  789. int length = 0;
  790. while(length < size+sizeof(WORD)*4) length += 0x800;
  791. int size2 = 1i64 * wfe->nBlockAlign * wfe->nSamplesPerSec * size*8 / bit_rate;
  792. while(length < size2) length += 0x800;
  793. if(FAILED(hr = ReconnectOutput(length / wfe->nBlockAlign, mt)))
  794. return hr;
  795. CComPtr<IMediaSample> pOut;
  796. BYTE* pDataOut = NULL;
  797. if(FAILED(GetDeliveryBuffer(&pOut, &pDataOut)))
  798. return E_FAIL;
  799. REFERENCE_TIME rtDur = 10000000i64 * size*8 / bit_rate;
  800. REFERENCE_TIME rtStart = m_rtStart, rtStop = m_rtStart + rtDur;
  801. m_rtStart += rtDur;
  802. if(rtStart < 0)
  803. return S_OK;
  804. if(hr == S_OK)
  805. {
  806. m_pOutput->SetMediaType(&mt);
  807. pOut->SetMediaType(&mt);
  808. }
  809. pOut->SetTime(&rtStart, &rtStop);
  810. pOut->SetMediaTime(NULL, NULL);
  811. pOut->SetPreroll(FALSE);
  812. pOut->SetDiscontinuity(m_fDiscontinuity); m_fDiscontinuity = false;
  813. pOut->SetSyncPoint(TRUE);
  814. pOut->SetActualDataLength(length);
  815. WORD* pDataOutW = (WORD*)pDataOut;
  816. pDataOutW[0] = 0xf872;
  817. pDataOutW[1] = 0x4e1f;
  818. pDataOutW[2] = type;
  819. pDataOutW[3] = size*8;
  820. _swab((char*)pBuff, (char*)&pDataOutW[4], size);
  821. return m_pOutput->Deliver(pOut);
  822. }
  823. HRESULT CMpaDecFilter::ReconnectOutput(int nSamples, CMediaType& mt)
  824. {
  825. HRESULT hr;
  826. CComQIPtr<IMemInputPin> pPin = m_pOutput->GetConnected();
  827. if(!pPin) return E_NOINTERFACE;
  828. CComPtr<IMemAllocator> pAllocator;
  829. if(FAILED(hr = pPin->GetAllocator(&pAllocator)) || !pAllocator) 
  830. return hr;
  831. ALLOCATOR_PROPERTIES props, actual;
  832. if(FAILED(hr = pAllocator->GetProperties(&props)))
  833. return hr;
  834. WAVEFORMATEX* wfe = (WAVEFORMATEX*)mt.Format();
  835. long cbBuffer = nSamples * wfe->nBlockAlign;
  836. if(mt != m_pOutput->CurrentMediaType() || cbBuffer > props.cbBuffer)
  837. {
  838. if(cbBuffer > props.cbBuffer)
  839. {
  840. props.cBuffers = 4;
  841. props.cbBuffer = cbBuffer*3/2;
  842. if(FAILED(hr = m_pOutput->DeliverBeginFlush())
  843. || FAILED(hr = m_pOutput->DeliverEndFlush())
  844. || FAILED(hr = pAllocator->Decommit())
  845. || FAILED(hr = pAllocator->SetProperties(&props, &actual))
  846. || FAILED(hr = pAllocator->Commit()))
  847. return hr;
  848. if(props.cBuffers > actual.cBuffers || props.cbBuffer > actual.cbBuffer)
  849. {
  850. NotifyEvent(EC_ERRORABORT, hr, 0);
  851. return E_FAIL;
  852. }
  853. }
  854. return S_OK;
  855. }
  856. return S_FALSE;
  857. }
  858. CMediaType CMpaDecFilter::CreateMediaType(SampleFormat sf, DWORD nSamplesPerSec, WORD nChannels, DWORD dwChannelMask)
  859. {
  860. CMediaType mt;
  861. mt.majortype = MEDIATYPE_Audio;
  862. mt.subtype = sf == SF_FLOAT32 ? MEDIASUBTYPE_IEEE_FLOAT : MEDIASUBTYPE_PCM;
  863. mt.formattype = FORMAT_WaveFormatEx;
  864. WAVEFORMATEXTENSIBLE wfex;
  865. memset(&wfex, 0, sizeof(wfex));
  866. WAVEFORMATEX* wfe = &wfex.Format;
  867. wfe->wFormatTag = (WORD)mt.subtype.Data1;
  868. wfe->nChannels = nChannels;
  869. wfe->nSamplesPerSec = nSamplesPerSec;
  870. switch(sf)
  871. {
  872. default:
  873. case SF_PCM16: wfe->wBitsPerSample = 16; break;
  874. case SF_PCM24: wfe->wBitsPerSample = 24; break;
  875. case SF_PCM32: case SF_FLOAT32: wfe->wBitsPerSample = 32; break;
  876. }
  877. wfe->nBlockAlign = wfe->nChannels*wfe->wBitsPerSample/8;
  878. wfe->nAvgBytesPerSec = wfe->nSamplesPerSec*wfe->nBlockAlign;
  879. // FIXME: 24/32 bit only seems to work with WAVE_FORMAT_EXTENSIBLE
  880. if(dwChannelMask == 0 && (sf == SF_PCM24 || sf == SF_PCM32))
  881. dwChannelMask = nChannels == 2 ? (SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT) : SPEAKER_FRONT_CENTER;
  882. if(dwChannelMask)
  883. {
  884. wfex.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
  885. wfex.Format.cbSize = sizeof(wfex) - sizeof(wfex.Format);
  886. wfex.dwChannelMask = dwChannelMask;
  887. wfex.Samples.wValidBitsPerSample = wfex.Format.wBitsPerSample;
  888. wfex.SubFormat = mt.subtype;
  889. }
  890. mt.SetFormat((BYTE*)&wfex, sizeof(wfex.Format) + wfex.Format.cbSize);
  891. return mt;
  892. }
  893. CMediaType CMpaDecFilter::CreateMediaTypeSPDIF()
  894. {
  895. CMediaType mt = CreateMediaType(SF_PCM16, 48000, 2);
  896. ((WAVEFORMATEX*)mt.pbFormat)->wFormatTag = WAVE_FORMAT_DOLBY_AC3_SPDIF;
  897. return mt;
  898. }
  899. HRESULT CMpaDecFilter::CheckInputType(const CMediaType* mtIn)
  900. {
  901. if(mtIn->subtype == MEDIASUBTYPE_DVD_LPCM_AUDIO)
  902. {
  903. WAVEFORMATEX* wfe = (WAVEFORMATEX*)mtIn->Format();
  904. if(wfe->nChannels != 2 || wfe->wBitsPerSample != 16) // TODO: remove this limitation
  905. return VFW_E_TYPE_NOT_ACCEPTED;
  906. }
  907. else if(mtIn->subtype == MEDIASUBTYPE_PS2_ADPCM)
  908. {
  909. WAVEFORMATEXPS2* wfe = (WAVEFORMATEXPS2*)mtIn->Format();
  910. if(wfe->dwInterleave & 0xf) // has to be a multiple of the block size (16 bytes)
  911. return VFW_E_TYPE_NOT_ACCEPTED;
  912. }
  913. for(int i = 0; i < countof(sudPinTypesIn); i++)
  914. {
  915. if(*sudPinTypesIn[i].clsMajorType == mtIn->majortype
  916. && *sudPinTypesIn[i].clsMinorType == mtIn->subtype)
  917. return S_OK;
  918. }
  919. return VFW_E_TYPE_NOT_ACCEPTED;
  920. }
  921. HRESULT CMpaDecFilter::CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut)
  922. {
  923. return SUCCEEDED(CheckInputType(mtIn))
  924. && mtOut->majortype == MEDIATYPE_Audio && mtOut->subtype == MEDIASUBTYPE_PCM
  925. || mtOut->majortype == MEDIATYPE_Audio && mtOut->subtype == MEDIASUBTYPE_IEEE_FLOAT
  926. ? S_OK
  927. : VFW_E_TYPE_NOT_ACCEPTED;
  928. }
  929. HRESULT CMpaDecFilter::DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties)
  930. {
  931. if(m_pInput->IsConnected() == FALSE) return E_UNEXPECTED;
  932. CMediaType& mt = m_pInput->CurrentMediaType();
  933. WAVEFORMATEX* wfe = (WAVEFORMATEX*)mt.Format();
  934. pProperties->cBuffers = 4;
  935. // pProperties->cbBuffer = 1;
  936. pProperties->cbBuffer = 48000*6*(32/8)/10; // 48KHz 6ch 32bps 100ms
  937. pProperties->cbAlign = 1;
  938. pProperties->cbPrefix = 0;
  939. HRESULT hr;
  940. ALLOCATOR_PROPERTIES Actual;
  941.     if(FAILED(hr = pAllocator->SetProperties(pProperties, &Actual))) 
  942. return hr;
  943.     return pProperties->cBuffers > Actual.cBuffers || pProperties->cbBuffer > Actual.cbBuffer
  944. ? E_FAIL
  945. : NOERROR;
  946. }
  947. HRESULT CMpaDecFilter::GetMediaType(int iPosition, CMediaType* pmt)
  948. {
  949.     if(m_pInput->IsConnected() == FALSE) return E_UNEXPECTED;
  950. if(iPosition < 0) return E_INVALIDARG;
  951. if(iPosition > 0) return VFW_S_NO_MORE_ITEMS;
  952. CMediaType mt = m_pInput->CurrentMediaType();
  953. const GUID& subtype = mt.subtype;
  954. WAVEFORMATEX* wfe = (WAVEFORMATEX*)mt.Format();
  955. if(GetSpeakerConfig(ac3) < 0 && (subtype == MEDIASUBTYPE_DOLBY_AC3 || subtype == MEDIASUBTYPE_WAVE_DOLBY_AC3)
  956. || GetSpeakerConfig(dts) < 0 && (subtype == MEDIASUBTYPE_DTS || subtype == MEDIASUBTYPE_WAVE_DTS))
  957. {
  958. *pmt = CreateMediaTypeSPDIF();
  959. }
  960. else
  961. {
  962. *pmt = CreateMediaType(GetSampleFormat(), wfe->nSamplesPerSec, min(2, wfe->nChannels));
  963. }
  964. return S_OK;
  965. }
  966. HRESULT CMpaDecFilter::StartStreaming()
  967. {
  968. HRESULT hr = __super::StartStreaming();
  969. if(FAILED(hr)) return hr;
  970. m_a52_state = a52_init(0);
  971. m_dts_state = dts_init(0);
  972. m_aac_state.init(m_pInput->CurrentMediaType());
  973. mad_stream_init(&m_stream);
  974. mad_frame_init(&m_frame);
  975. mad_synth_init(&m_synth);
  976. mad_stream_options(&m_stream, 0/*options*/);
  977. m_ps2_state.reset();
  978. m_fDiscontinuity = false;
  979. m_sample_max = 0.1f;
  980. return S_OK;
  981. }
  982. HRESULT CMpaDecFilter::StopStreaming()
  983. {
  984. a52_free(m_a52_state);
  985. dts_free(m_dts_state);
  986. mad_synth_finish(&m_synth);
  987. mad_frame_finish(&m_frame);
  988. mad_stream_finish(&m_stream);
  989. return __super::StopStreaming();
  990. }
  991. // IMpaDecFilter
  992. STDMETHODIMP CMpaDecFilter::SetSampleFormat(SampleFormat sf)
  993. {
  994. CAutoLock cAutoLock(&m_csProps);
  995. m_iSampleFormat = sf;
  996. return S_OK;
  997. }
  998. STDMETHODIMP_(SampleFormat) CMpaDecFilter::GetSampleFormat()
  999. {
  1000. CAutoLock cAutoLock(&m_csProps);
  1001. return m_iSampleFormat;
  1002. }
  1003. STDMETHODIMP CMpaDecFilter::SetNormalize(bool fNormalize)
  1004. {
  1005. CAutoLock cAutoLock(&m_csProps);
  1006. if(m_fNormalize != fNormalize) m_sample_max = 0.1f;
  1007. m_fNormalize = fNormalize;
  1008. return S_OK;
  1009. }
  1010. STDMETHODIMP_(bool) CMpaDecFilter::GetNormalize()
  1011. {
  1012. CAutoLock cAutoLock(&m_csProps);
  1013. return m_fNormalize;
  1014. }
  1015. STDMETHODIMP CMpaDecFilter::SetSpeakerConfig(enctype et, int sc)
  1016. {
  1017. CAutoLock cAutoLock(&m_csProps);
  1018. if(et >= 0 && et < etlast) m_iSpeakerConfig[et] = sc;
  1019. return S_OK;
  1020. }
  1021. STDMETHODIMP_(int) CMpaDecFilter::GetSpeakerConfig(enctype et)
  1022. {
  1023. CAutoLock cAutoLock(&m_csProps);
  1024. if(et >= 0 && et < etlast) return m_iSpeakerConfig[et];
  1025. return -1;
  1026. }
  1027. STDMETHODIMP CMpaDecFilter::SetDynamicRangeControl(enctype et, bool fDRC)
  1028. {
  1029. CAutoLock cAutoLock(&m_csProps);
  1030. if(et >= 0 && et < etlast) m_fDynamicRangeControl[et] = fDRC;
  1031. else return E_INVALIDARG;
  1032. return S_OK;
  1033. }
  1034. STDMETHODIMP_(bool) CMpaDecFilter::GetDynamicRangeControl(enctype et)
  1035. {
  1036. CAutoLock cAutoLock(&m_csProps);
  1037. if(et >= 0 && et < etlast) return m_fDynamicRangeControl[et];
  1038. return false;
  1039. }
  1040. STDMETHODIMP CMpaDecFilter::SetBoost(float boost)
  1041. {
  1042. CAutoLock cAutoLock(&m_csProps);
  1043. m_boost = max(boost, 1);
  1044. return S_OK;
  1045. }
  1046. STDMETHODIMP_(float) CMpaDecFilter::GetBoost()
  1047. {
  1048. CAutoLock cAutoLock(&m_csProps);
  1049. return m_boost;
  1050. }
  1051. //
  1052. // CMpaDecInputPin
  1053. //
  1054. CMpaDecInputPin::CMpaDecInputPin(CTransformFilter* pFilter, HRESULT* phr, LPWSTR pName)
  1055. : CDeCSSInputPin(NAME("CMpaDecInputPin"), pFilter, phr, pName)
  1056. {
  1057. }
  1058. //
  1059. // aac_state_t
  1060. //
  1061. aac_state_t::aac_state_t() : h(NULL), freq(0), channels(0) {open();}
  1062. aac_state_t::~aac_state_t() {close();}
  1063. bool aac_state_t::open()
  1064. {
  1065. close();
  1066. if(!(h = NeAACDecOpen())) return false;
  1067. NeAACDecConfigurationPtr c = NeAACDecGetCurrentConfiguration(h);
  1068. c->outputFormat = FAAD_FMT_FLOAT;
  1069. NeAACDecSetConfiguration(h, c);
  1070. return true;
  1071. }
  1072. void aac_state_t::close()
  1073. {
  1074. if(h) NeAACDecClose(h);
  1075. h = NULL;
  1076. }
  1077. bool aac_state_t::init(CMediaType& mt)
  1078. {
  1079. if(mt.subtype != MEDIASUBTYPE_AAC && mt.subtype != MEDIASUBTYPE_MP4A) return(true); // nothing to do
  1080. open();
  1081. WAVEFORMATEX* wfe = (WAVEFORMATEX*)mt.Format();
  1082. return !NeAACDecInit2(h, (BYTE*)(wfe+1), wfe->cbSize, &freq, &channels);
  1083. }