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

多媒体编程

开发平台:

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 "......decssVobFile.h"
  23. #include "vtsreader.h"
  24. #include "......DSUtilDSUtil.h"
  25. #ifdef REGISTER_FILTER
  26. const AMOVIESETUP_MEDIATYPE sudPinTypesOut[] =
  27. {
  28. {&MEDIATYPE_Stream, &MEDIASUBTYPE_MPEG2_PROGRAM},
  29. };
  30. const AMOVIESETUP_PIN sudOpPin[] =
  31. {
  32. {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, countof(sudPinTypesOut), sudPinTypesOut}
  33. };
  34. const AMOVIESETUP_FILTER sudFilter[] =
  35. {
  36. {&__uuidof(CVTSReader), L"VTS Reader", MERIT_UNLIKELY, countof(sudOpPin), sudOpPin}
  37. };
  38. CFactoryTemplate g_Templates[] =
  39. {
  40. {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CVTSReader>, NULL, &sudFilter[0]}
  41. };
  42. int g_cTemplates = countof(g_Templates);
  43. STDAPI DllRegisterServer()
  44. {
  45. if(GetVersion()&0x80000000) 
  46. return E_NOTIMPL;
  47. SetRegKeyValue(
  48. _T("Media Type\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{773EAEDE-D5EE-4fce-9C8F-C4F53D0A2F73}"), 
  49. _T("0"), _T("0,12,,445644564944454F2D565453")); // "DVDVIDEO-VTS"
  50. SetRegKeyValue(
  51. _T("Media Type\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{773EAEDE-D5EE-4fce-9C8F-C4F53D0A2F73}"), 
  52. _T("Source Filter"), _T("{773EAEDE-D5EE-4fce-9C8F-C4F53D0A2F73}"));
  53. return AMovieDllRegisterServer2(TRUE);
  54. }
  55. STDAPI DllUnregisterServer()
  56. {
  57. DeleteRegKey(_T("Media Type\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{773EAEDE-D5EE-4fce-9C8F-C4F53D0A2F73}"));
  58. return AMovieDllRegisterServer2(FALSE);
  59. }
  60. extern "C" BOOL WINAPI DllEntryPoint(HINSTANCE, ULONG, LPVOID);
  61. BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
  62. {
  63.     return DllEntryPoint((HINSTANCE)hModule, dwReason, 0); // "DllMain" of the dshow baseclasses;
  64. }
  65. #endif
  66. //
  67. // CVTSReader
  68. //
  69. CVTSReader::CVTSReader(IUnknown* pUnk, HRESULT* phr)
  70. : CAsyncReader(NAME("CVTSReader"), pUnk, &m_stream, phr, __uuidof(this))
  71. {
  72. if(phr) *phr = S_OK;
  73. if(GetVersion()&0x80000000)
  74. {
  75. if(phr) *phr = E_NOTIMPL;
  76. return;
  77. }
  78. }
  79. CVTSReader::~CVTSReader()
  80. {
  81. }
  82. STDMETHODIMP CVTSReader::NonDelegatingQueryInterface(REFIID riid, void** ppv)
  83. {
  84.     CheckPointer(ppv, E_POINTER);
  85. return 
  86. QI(IFileSourceFilter)
  87. __super::NonDelegatingQueryInterface(riid, ppv);
  88. }
  89. // IFileSourceFilter
  90. STDMETHODIMP CVTSReader::Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt) 
  91. {
  92. if(!m_stream.Load(pszFileName))
  93. return E_FAIL;
  94. m_fn = pszFileName;
  95. CMediaType mt;
  96. mt.majortype = MEDIATYPE_Stream;
  97. mt.subtype = MEDIASUBTYPE_MPEG2_PROGRAM;
  98. m_mt = mt;
  99. return S_OK;
  100. }
  101. STDMETHODIMP CVTSReader::GetCurFile(LPOLESTR* ppszFileName, AM_MEDIA_TYPE* pmt)
  102. {
  103. if(!ppszFileName) return E_POINTER;
  104. if(!(*ppszFileName = (LPOLESTR)CoTaskMemAlloc((m_fn.GetLength()+1)*sizeof(WCHAR))))
  105. return E_OUTOFMEMORY;
  106. wcscpy(*ppszFileName, m_fn);
  107. return S_OK;
  108. }
  109. // CVTSStream
  110. CVTSStream::CVTSStream() : m_off(0)
  111. {
  112. m_vob.Attach(new CVobFile());
  113. }
  114. CVTSStream::~CVTSStream()
  115. {
  116. }
  117. bool CVTSStream::Load(const WCHAR* fnw)
  118. {
  119. CList<CString> sl;
  120. return(m_vob && m_vob->Open(CString(fnw), sl) /*&& m_vob->IsDVD()*/);
  121. }
  122. HRESULT CVTSStream::SetPointer(LONGLONG llPos)
  123. {
  124. m_off = (int)(llPos&2047);
  125. int lba = (int)(llPos/2048);
  126. return lba == m_vob->Seek(lba) ? S_OK : S_FALSE;
  127. }
  128. HRESULT CVTSStream::Read(PBYTE pbBuffer, DWORD dwBytesToRead, BOOL bAlign, LPDWORD pdwBytesRead)
  129. {
  130. CAutoLock lck(&m_csLock);
  131. DWORD len = dwBytesToRead;
  132. BYTE* ptr = pbBuffer;
  133. while(len > 0)
  134. {
  135. BYTE buff[2048];
  136. if(!m_vob->Read(buff))
  137. break;
  138. int size = min(2048 - m_off, min(len, 2048));
  139. memcpy(ptr, &buff[m_off], size);
  140. m_off = (m_off + size)&2047;
  141. if(m_off > 0)
  142. m_vob->Seek(m_vob->GetPosition()-1);
  143. ptr += size;
  144. len -= size;
  145. }
  146. if(pdwBytesRead)
  147. *pdwBytesRead = ptr - pbBuffer;
  148. return S_OK;
  149. }
  150. LONGLONG CVTSStream::Size(LONGLONG* pSizeAvailable)
  151. {
  152. LONGLONG len = 2048i64*m_vob->GetLength();
  153. if(pSizeAvailable) *pSizeAvailable = len;
  154. return(len);
  155. }
  156. DWORD CVTSStream::Alignment()
  157. {
  158.     return 1;
  159. }
  160. void CVTSStream::Lock()
  161. {
  162.     m_csLock.Lock();
  163. }
  164. void CVTSStream::Unlock()
  165. {
  166.     m_csLock.Unlock();
  167. }