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

多媒体编程

开发平台:

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. // 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. BOOL CPPageFileInfoDetails::OnInitDialog()
  77. {
  78. __super::OnInitDialog();
  79. CString ext = m_fn.Left(m_fn.Find(_T("://"))+1).TrimRight(':');
  80. if(ext.IsEmpty() || !ext.CompareNoCase(_T("file")))
  81. ext = _T(".") + m_fn.Mid(m_fn.ReverseFind('.')+1);
  82. if(m_hIcon = LoadIcon(m_fn, false))
  83. m_icon.SetIcon(m_hIcon);
  84. if(!LoadType(ext, m_type))
  85. m_type = _T("Not known");
  86. WIN32_FIND_DATA wfd;
  87. HANDLE hFind = FindFirstFile(m_fn, &wfd);
  88. if(hFind != INVALID_HANDLE_VALUE)
  89. {
  90. FindClose(hFind);
  91. __int64 size = (__int64(wfd.nFileSizeHigh)<<32)|wfd.nFileSizeLow;
  92. __int64 shortsize = size;
  93. CString measure = _T("B");
  94. if(shortsize > 10240) shortsize /= 1024, measure = _T("KB");
  95. if(shortsize > 10240) shortsize /= 1024, measure = _T("MB");
  96. if(shortsize > 10240) shortsize /= 1024, measure = _T("GB");
  97. m_size.Format(_T("%I64d%s (%I64d bytes)"), shortsize, measure, size);
  98. SYSTEMTIME t;
  99. FileTimeToSystemTime(&wfd.ftCreationTime, &t);
  100. TCHAR buff[256];
  101. GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, &t, NULL, buff, 256);
  102. m_created = buff;
  103. m_created += _T(" ");
  104. GetTimeFormat(LOCALE_USER_DEFAULT, 0, &t, NULL, buff, 256);
  105. m_created += buff;
  106. }
  107. REFERENCE_TIME rtDur = 0;
  108. CComQIPtr<IMediaSeeking> pMS = m_pFG;
  109. if(pMS && SUCCEEDED(pMS->GetDuration(&rtDur)) && rtDur > 0)
  110. {
  111. m_time.Format(_T("%02d:%02d:%02d"), 
  112. int(rtDur/10000000/60/60),
  113. int((rtDur/10000000/60)%60),
  114. int((rtDur/10000000)%60));
  115. }
  116. CSize wh(0, 0), arxy(0, 0);
  117. long fps = 0;
  118. if(m_pCAP)
  119. {
  120. wh = m_pCAP->GetVideoSize(false);
  121. arxy = m_pCAP->GetVideoSize(true);
  122. }
  123. else
  124. {
  125. if(CComQIPtr<IBasicVideo> pBV = m_pFG)
  126. {
  127. if(SUCCEEDED(pBV->GetVideoSize(&wh.cx, &wh.cy)))
  128. {
  129. if(CComQIPtr<IBasicVideo2> pBV2 = m_pFG)
  130. pBV2->GetPreferredAspectRatio(&arxy.cx, &arxy.cy);
  131. }
  132. else
  133. {
  134. wh.SetSize(0, 0);
  135. }
  136. }
  137. if(wh.cx == 0 && wh.cy == 0)
  138. {
  139. BeginEnumFilters(m_pFG, pEF, pBF)
  140. {
  141. if(CComQIPtr<IBasicVideo> pBV = pBF)
  142. {
  143. pBV->GetVideoSize(&wh.cx, &wh.cy);
  144. if(CComQIPtr<IBasicVideo2> pBV2 = pBF)
  145. pBV2->GetPreferredAspectRatio(&arxy.cx, &arxy.cy);
  146. break;
  147. }
  148. else if(CComQIPtr<IVMRWindowlessControl> pWC = pBF)
  149. {
  150. pWC->GetNativeVideoSize(&wh.cx, &wh.cy, &arxy.cx, &arxy.cy);
  151. break;
  152. }
  153. else if(CComQIPtr<IVMRWindowlessControl9> pWC = pBF)
  154. {
  155. pWC->GetNativeVideoSize(&wh.cx, &wh.cy, &arxy.cx, &arxy.cy);
  156. break;
  157. }
  158. }
  159. EndEnumFilters
  160. }
  161. }
  162. if(wh.cx > 0 && wh.cy > 0)
  163. {
  164. m_res.Format(_T("%d x %d"), wh.cx, wh.cy);
  165. int lnko = 0;
  166. do
  167. {
  168. lnko = LNKO(arxy.cx, arxy.cy);
  169. if(lnko > 1) arxy.cx /= lnko, arxy.cy /= lnko;
  170. }
  171. while(lnko > 1);
  172. if(arxy.cx > 0 && arxy.cy > 0 && arxy.cx*wh.cy != arxy.cy*wh.cx)
  173. {
  174. CString ar;
  175. ar.Format(_T(" (AR %d:%d)"), arxy.cx, arxy.cy);
  176. m_res += ar;
  177. }
  178. }
  179. m_fn.TrimRight('/');
  180. m_fn.Replace('\', '/');
  181. m_fn = m_fn.Mid(m_fn.ReverseFind('/')+1);
  182. UpdateData(FALSE);
  183. InitEncoding();
  184. m_pFG = NULL;
  185. m_pCAP = NULL;
  186. return TRUE;  // return TRUE unless you set the focus to a control
  187. // EXCEPTION: OCX Property Pages should return FALSE
  188. }
  189. void CPPageFileInfoDetails::InitEncoding()
  190. {
  191. CList<CString> sl;
  192. BeginEnumFilters(m_pFG, pEF, pBF)
  193. {
  194. CComPtr<IBaseFilter> pUSBF = GetUpStreamFilter(pBF);
  195. if(GetCLSID(pBF) == CLSID_NetShowSource)
  196. {
  197. continue;
  198. }
  199. else if(GetCLSID(pUSBF) != CLSID_NetShowSource)
  200. {
  201. if(IPin* pPin = GetFirstPin(pBF, PINDIR_INPUT))
  202. {
  203. CMediaType mt;
  204. if(FAILED(pPin->ConnectionMediaType(&mt)) || mt.majortype != MEDIATYPE_Stream)
  205. continue;
  206. }
  207. if(IPin* pPin = GetFirstPin(pBF, PINDIR_OUTPUT))
  208. {
  209. CMediaType mt;
  210. if(SUCCEEDED(pPin->ConnectionMediaType(&mt)) && mt.majortype == MEDIATYPE_Stream)
  211. continue;
  212. }
  213. }
  214. BeginEnumPins(pBF, pEP, pPin)
  215. {
  216. CMediaTypeEx mt;
  217. PIN_DIRECTION dir;
  218. if(FAILED(pPin->QueryDirection(&dir)) || dir != PINDIR_OUTPUT
  219. || FAILED(pPin->ConnectionMediaType(&mt)))
  220. continue;
  221. CString str = mt.ToString();
  222. if(!str.IsEmpty())
  223. {
  224. sl.AddTail(mt.ToString() + CString(L" [" + GetPinName(pPin) + L"]"));
  225. }
  226. }
  227. EndEnumPins
  228. }
  229. EndEnumFilters
  230. CString text = Implode(sl, 'n');
  231. text.Replace(_T("n"), _T("rn"));
  232. m_encoding.SetWindowText(text);
  233. }