PPageFileInfoDetails.cpp
上传用户:tangyu_668
上传日期:2014-02-27
资源大小:678k
文件大小:7k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2006 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. // PPageFileInfoDetails.cpp : implementation file
  22. //
  23. #include "stdafx.h"
  24. #include "mplayerc.h"
  25. #include "PPageFileInfoDetails.h"
  26. #include <atlbase.h>
  27. #include "....DSUtilDSUtil.h"
  28. #include "d3d9.h"
  29. #include "Vmr9.h"
  30. #include "......includemoreuuids.h"
  31. // CPPageFileInfoDetails dialog
  32. IMPLEMENT_DYNAMIC(CPPageFileInfoDetails, CPropertyPage)
  33. CPPageFileInfoDetails::CPPageFileInfoDetails(CString fn, IFilterGraph* pFG, ISubPicAllocatorPresenter* pCAP)
  34. : CPropertyPage(CPPageFileInfoDetails::IDD, CPPageFileInfoDetails::IDD)
  35. , m_fn(fn)
  36. , m_pFG(pFG)
  37. , m_pCAP(pCAP)
  38. , m_hIcon(NULL)
  39. , m_type(_T("Not known"))
  40. , m_size(_T("Not known"))
  41. , m_time(_T("Not known"))
  42. , m_res(_T("Not known"))
  43. , m_created(_T("Not known"))
  44. {
  45. }
  46. CPPageFileInfoDetails::~CPPageFileInfoDetails()
  47. {
  48. if(m_hIcon) DestroyIcon(m_hIcon);
  49. }
  50. void CPPageFileInfoDetails::DoDataExchange(CDataExchange* pDX)
  51. {
  52. __super::DoDataExchange(pDX);
  53. DDX_Control(pDX, IDC_DEFAULTICON, m_icon);
  54. DDX_Text(pDX, IDC_EDIT1, m_fn);
  55. DDX_Text(pDX, IDC_EDIT4, m_type);
  56. DDX_Text(pDX, IDC_EDIT3, m_size);
  57. DDX_Text(pDX, IDC_EDIT2, m_time);
  58. DDX_Text(pDX, IDC_EDIT5, m_res);
  59. DDX_Text(pDX, IDC_EDIT6, m_created);
  60. DDX_Control(pDX, IDC_EDIT7, m_encoding);
  61. }
  62. BEGIN_MESSAGE_MAP(CPPageFileInfoDetails, CPropertyPage)
  63. END_MESSAGE_MAP()
  64. inline int LNKO(int a, int b)
  65. {
  66. if(a == 0 || b == 0)
  67. return(1);
  68. while(a != b)
  69. {
  70. if(a < b) b -= a;
  71. else if(a > b) a -= b;
  72. }
  73. return(a);
  74. }
  75. // CPPageFileInfoDetails message handlers
  76. static bool GetProperty(IFilterGraph* pFG, LPCOLESTR propName, VARIANT* vt)
  77. {
  78. BeginEnumFilters(pFG, pEF, pBF)
  79. {
  80. if(CComQIPtr<IPropertyBag> pPB = pBF)
  81. if(SUCCEEDED(pPB->Read(propName, vt, NULL)))
  82. return true;
  83. }
  84. EndEnumFilters
  85. return false;
  86. }
  87. static CString FormatDateTime(FILETIME tm)
  88. {
  89. SYSTEMTIME t;
  90. FileTimeToSystemTime(&tm, &t);
  91. TCHAR buff[256];
  92. GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, &t, NULL, buff, 256);
  93. CString ret(buff);
  94. ret += _T(" ");
  95. GetTimeFormat(LOCALE_USER_DEFAULT, 0, &t, NULL, buff, 256);
  96. ret += buff;
  97. return ret;
  98. }
  99. BOOL CPPageFileInfoDetails::OnInitDialog()
  100. {
  101. __super::OnInitDialog();
  102. CString ext = m_fn.Left(m_fn.Find(_T("://"))+1).TrimRight(':');
  103. if(ext.IsEmpty() || !ext.CompareNoCase(_T("file")))
  104. ext = _T(".") + m_fn.Mid(m_fn.ReverseFind('.')+1);
  105. if(m_hIcon = LoadIcon(m_fn, false))
  106. m_icon.SetIcon(m_hIcon);
  107. if(!LoadType(ext, m_type))
  108. m_type = _T("Not known");
  109. CComVariant vt;
  110. if(::GetProperty(m_pFG, L"CurFile.TimeCreated", &vt))
  111. {
  112. if(V_VT(&vt) == VT_UI8)
  113. {
  114. ULARGE_INTEGER  uli;
  115. uli.QuadPart = V_UI8(&vt);
  116. FILETIME ft;
  117. ft.dwLowDateTime = uli.LowPart;
  118. ft.dwHighDateTime = uli.HighPart;
  119. m_created = FormatDateTime(ft);
  120. }
  121. }
  122. WIN32_FIND_DATA wfd;
  123. HANDLE hFind = FindFirstFile(m_fn, &wfd);
  124. if(hFind != INVALID_HANDLE_VALUE)
  125. {
  126. FindClose(hFind);
  127. __int64 size = (__int64(wfd.nFileSizeHigh)<<32)|wfd.nFileSizeLow;
  128. __int64 shortsize = size;
  129. CString measure = _T("B");
  130. if(shortsize > 10240) shortsize /= 1024, measure = _T("KB");
  131. if(shortsize > 10240) shortsize /= 1024, measure = _T("MB");
  132. if(shortsize > 10240) shortsize /= 1024, measure = _T("GB");
  133. m_size.Format(_T("%I64d%s (%I64d bytes)"), shortsize, measure, size);
  134. if(m_created.IsEmpty())
  135. {
  136. m_created = FormatDateTime(wfd.ftCreationTime);
  137. }
  138. }
  139. REFERENCE_TIME rtDur = 0;
  140. CComQIPtr<IMediaSeeking> pMS = m_pFG;
  141. if(pMS && SUCCEEDED(pMS->GetDuration(&rtDur)) && rtDur > 0)
  142. {
  143. m_time.Format(_T("%02d:%02d:%02d"), 
  144. int(rtDur/10000000/60/60),
  145. int((rtDur/10000000/60)%60),
  146. int((rtDur/10000000)%60));
  147. }
  148. CSize wh(0, 0), arxy(0, 0);
  149. long fps = 0;
  150. if(m_pCAP)
  151. {
  152. wh = m_pCAP->GetVideoSize(false);
  153. arxy = m_pCAP->GetVideoSize(true);
  154. }
  155. else
  156. {
  157. if(CComQIPtr<IBasicVideo> pBV = m_pFG)
  158. {
  159. if(SUCCEEDED(pBV->GetVideoSize(&wh.cx, &wh.cy)))
  160. {
  161. if(CComQIPtr<IBasicVideo2> pBV2 = m_pFG)
  162. pBV2->GetPreferredAspectRatio(&arxy.cx, &arxy.cy);
  163. }
  164. else
  165. {
  166. wh.SetSize(0, 0);
  167. }
  168. }
  169. if(wh.cx == 0 && wh.cy == 0)
  170. {
  171. BeginEnumFilters(m_pFG, pEF, pBF)
  172. {
  173. if(CComQIPtr<IBasicVideo> pBV = pBF)
  174. {
  175. pBV->GetVideoSize(&wh.cx, &wh.cy);
  176. if(CComQIPtr<IBasicVideo2> pBV2 = pBF)
  177. pBV2->GetPreferredAspectRatio(&arxy.cx, &arxy.cy);
  178. break;
  179. }
  180. else if(CComQIPtr<IVMRWindowlessControl> pWC = pBF)
  181. {
  182. pWC->GetNativeVideoSize(&wh.cx, &wh.cy, &arxy.cx, &arxy.cy);
  183. break;
  184. }
  185. else if(CComQIPtr<IVMRWindowlessControl9> pWC = pBF)
  186. {
  187. pWC->GetNativeVideoSize(&wh.cx, &wh.cy, &arxy.cx, &arxy.cy);
  188. break;
  189. }
  190. }
  191. EndEnumFilters
  192. }
  193. }
  194. if(wh.cx > 0 && wh.cy > 0)
  195. {
  196. m_res.Format(_T("%d x %d"), wh.cx, wh.cy);
  197. int lnko = 0;
  198. do
  199. {
  200. lnko = LNKO(arxy.cx, arxy.cy);
  201. if(lnko > 1) arxy.cx /= lnko, arxy.cy /= lnko;
  202. }
  203. while(lnko > 1);
  204. if(arxy.cx > 0 && arxy.cy > 0 && arxy.cx*wh.cy != arxy.cy*wh.cx)
  205. {
  206. CString ar;
  207. ar.Format(_T(" (AR %d:%d)"), arxy.cx, arxy.cy);
  208. m_res += ar;
  209. }
  210. }
  211. m_fn.TrimRight('/');
  212. m_fn.Replace('\', '/');
  213. m_fn = m_fn.Mid(m_fn.ReverseFind('/')+1);
  214. UpdateData(FALSE);
  215. InitEncoding();
  216. m_pFG = NULL;
  217. m_pCAP = NULL;
  218. return TRUE;  // return TRUE unless you set the focus to a control
  219. // EXCEPTION: OCX Property Pages should return FALSE
  220. }
  221. void CPPageFileInfoDetails::InitEncoding()
  222. {
  223. CAtlList<CString> sl;
  224. BeginEnumFilters(m_pFG, pEF, pBF)
  225. {
  226. CComPtr<IBaseFilter> pUSBF = GetUpStreamFilter(pBF);
  227. if(GetCLSID(pBF) == CLSID_NetShowSource)
  228. {
  229. continue;
  230. }
  231. else if(GetCLSID(pUSBF) != CLSID_NetShowSource)
  232. {
  233. if(IPin* pPin = GetFirstPin(pBF, PINDIR_INPUT))
  234. {
  235. CMediaType mt;
  236. if(FAILED(pPin->ConnectionMediaType(&mt)) || mt.majortype != MEDIATYPE_Stream)
  237. continue;
  238. }
  239. if(IPin* pPin = GetFirstPin(pBF, PINDIR_OUTPUT))
  240. {
  241. CMediaType mt;
  242. if(SUCCEEDED(pPin->ConnectionMediaType(&mt)) && mt.majortype == MEDIATYPE_Stream)
  243. continue;
  244. }
  245. }
  246. BeginEnumPins(pBF, pEP, pPin)
  247. {
  248. CMediaTypeEx mt;
  249. PIN_DIRECTION dir;
  250. if(FAILED(pPin->QueryDirection(&dir)) || dir != PINDIR_OUTPUT
  251. || FAILED(pPin->ConnectionMediaType(&mt)))
  252. continue;
  253. CString str = mt.ToString();
  254. if(!str.IsEmpty())
  255. {
  256. sl.AddTail(mt.ToString() + CString(L" [" + GetPinName(pPin) + L"]"));
  257. }
  258. }
  259. EndEnumPins
  260. }
  261. EndEnumFilters
  262. CString text = Implode(sl, 'n');
  263. text.Replace(_T("n"), _T("rn"));
  264. m_encoding.SetWindowText(text);
  265. }