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

多媒体编程

开发平台:

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. #include "stdafx.h"
  22. #include <atlbase.h>
  23. #include "MediaFormats.h"
  24. //
  25. // CMediaFormatCategory
  26. //
  27. CMediaFormatCategory::CMediaFormatCategory()
  28. : m_fAudioOnly(false)
  29. {
  30. }
  31. CMediaFormatCategory::CMediaFormatCategory(
  32. CString label, CAtlList<CString>& exts, bool fAudioOnly,
  33. CString specreqnote, engine_t engine)
  34. {
  35. m_label = label;
  36. m_exts.AddTailList(&exts);
  37. m_backupexts.AddTailList(&m_exts);
  38. m_specreqnote = specreqnote;
  39. m_fAudioOnly = fAudioOnly;
  40. m_engine = engine;
  41. }
  42. CMediaFormatCategory::CMediaFormatCategory(
  43. CString label, CString exts, bool fAudioOnly,
  44. CString specreqnote, engine_t engine)
  45. {
  46. m_label = label;
  47. ExplodeMin(exts, m_exts, ' ');
  48. POSITION pos = m_exts.GetHeadPosition();
  49. while(pos) m_exts.GetNext(pos).TrimLeft('.');
  50. m_backupexts.AddTailList(&m_exts);
  51. m_specreqnote = specreqnote;
  52. m_fAudioOnly = fAudioOnly;
  53. m_engine = engine;
  54. }
  55. CMediaFormatCategory::~CMediaFormatCategory()
  56. {
  57. }
  58. void CMediaFormatCategory::UpdateData(bool fSave)
  59. {
  60. if(fSave)
  61. {
  62. AfxGetApp()->WriteProfileString(_T("FileFormats"), m_label, GetExts(true));
  63. }
  64. else
  65. {
  66. SetExts(AfxGetApp()->GetProfileString(_T("FileFormats"), m_label, GetExts(true)));
  67. }
  68. }
  69. CMediaFormatCategory::CMediaFormatCategory(const CMediaFormatCategory& mfc)
  70. {
  71. *this = mfc;
  72. }
  73. CMediaFormatCategory& CMediaFormatCategory::operator = (const CMediaFormatCategory& mfc)
  74. {
  75. m_label = mfc.m_label;
  76. m_specreqnote = mfc.m_specreqnote;
  77. m_exts.RemoveAll();
  78. m_exts.AddTailList(&mfc.m_exts);
  79. m_backupexts.RemoveAll();
  80. m_backupexts.AddTailList(&mfc.m_backupexts);
  81. m_fAudioOnly = mfc.m_fAudioOnly;
  82. m_engine = mfc.m_engine;
  83. return *this;
  84. }
  85. void CMediaFormatCategory::RestoreDefaultExts()
  86. {
  87. m_exts.RemoveAll();
  88. m_exts.AddTailList(&m_backupexts);
  89. }
  90. void CMediaFormatCategory::SetExts(CAtlList<CString>& exts)
  91. {
  92. m_exts.RemoveAll();
  93. m_exts.AddTailList(&exts);
  94. }
  95. void CMediaFormatCategory::SetExts(CString exts)
  96. {
  97. m_exts.RemoveAll();
  98. ExplodeMin(exts, m_exts, ' ');
  99. POSITION pos = m_exts.GetHeadPosition();
  100. while(pos)
  101. {
  102. POSITION cur = pos;
  103. CString& ext = m_exts.GetNext(pos);
  104. if(ext[0] == '\') {m_engine = (engine_t)_tcstol(ext.TrimLeft('\'), NULL, 10); m_exts.RemoveAt(cur);}
  105. else ext.TrimLeft('.');
  106. }
  107. }
  108. CString CMediaFormatCategory::GetFilter()
  109. {
  110. CString filter;
  111. POSITION pos = m_exts.GetHeadPosition();
  112. while(pos) filter += _T("*.") + m_exts.GetNext(pos) + _T(";");
  113. filter.TrimRight(_T(";")); // cheap...
  114. return(filter);
  115. }
  116. CString CMediaFormatCategory::GetExts(bool fAppendEngine)
  117. {
  118. CString exts = Implode(m_exts, ' ');
  119. if(fAppendEngine) exts += CString(_T(" \")) + (TCHAR)(0x30 + (int)m_engine);
  120. return(exts);
  121. }
  122. CString CMediaFormatCategory::GetExtsWithPeriod(bool fAppendEngine)
  123. {
  124. CString exts;
  125. POSITION pos = m_exts.GetHeadPosition();
  126. while(pos) exts += _T(".") + m_exts.GetNext(pos) + _T(" ");
  127. exts.TrimRight(_T(" ")); // cheap...
  128. if(fAppendEngine) exts += CString(_T(" \")) + (TCHAR)(0x30 + (int)m_engine);
  129. return(exts);
  130. }
  131. CString CMediaFormatCategory::GetBackupExtsWithPeriod(bool fAppendEngine)
  132. {
  133. CString exts;
  134. POSITION pos = m_backupexts.GetHeadPosition();
  135. while(pos) exts += _T(".") + m_backupexts.GetNext(pos) + _T(" ");
  136. exts.TrimRight(_T(" ")); // cheap...
  137. if(fAppendEngine) exts += CString(_T(" \")) + (TCHAR)(0x30 + (int)m_engine);
  138. return(exts);
  139. }
  140. //
  141. //  CMediaFormats
  142. //
  143. CMediaFormats::CMediaFormats()
  144. {
  145. }
  146. CMediaFormats::~CMediaFormats()
  147. {
  148. }
  149. void CMediaFormats::UpdateData(bool fSave)
  150. {
  151. if(fSave)
  152. {
  153. AfxGetApp()->WriteProfileString(_T("FileFormats"), NULL, NULL);
  154. AfxGetApp()->WriteProfileInt(_T("FileFormats"), _T("RtspHandler"), m_iRtspHandler);
  155. AfxGetApp()->WriteProfileInt(_T("FileFormats"), _T("RtspFileExtFirst"), m_fRtspFileExtFirst);
  156. }
  157. else
  158. {
  159. RemoveAll();
  160. #define ADDFMT(f) Add(CMediaFormatCategory##f)
  161. ADDFMT((_T("Windows Media file"), _T("wmv wmp wm asf")));
  162. ADDFMT((_T("Windows Media Audio file"), _T("wma"), true));
  163. ADDFMT((_T("Video file"), _T("avi")));
  164. ADDFMT((_T("Audio file"), _T("wav"), true));
  165. ADDFMT((_T("MPEG Media file "), _T("mpg mpeg mpe m1v m2v mpv2 mp2v dat ts tp tpr pva pss")));
  166. ADDFMT((_T("MPEG Audio file"), _T("mpa mp2 m1a m2a"), true));
  167. ADDFMT((_T("DVD file"), _T("vob ifo")));
  168. ADDFMT((_T("DVD Audio file"), _T("ac3 dts"), true));
  169. ADDFMT((_T("MP3 Format Sound"), _T("mp3"), true));
  170. ADDFMT((_T("MIDI file"), _T("mid midi rmi"), true));
  171. ADDFMT((_T("Indeo Video file"), _T("ivf")));
  172. ADDFMT((_T("AIFF Format Sound"), _T("aif aifc aiff"), true));
  173. ADDFMT((_T("AU Format Sound"), _T("au snd"), true));
  174. ADDFMT((_T("Ogg Media file"), _T("ogm")));
  175. ADDFMT((_T("Ogg Vorbis Audio file"), _T("ogg"), true));
  176. ADDFMT((_T("CD Audio Track"), _T("cda"), true, _T("Windows 2000/XP or better")));
  177. ADDFMT((_T("FLIC file"), _T("fli flc flic")));
  178. ADDFMT((_T("DVD2AVI Project file"), _T("d2v")));
  179. ADDFMT((_T("MPEG4 file "), _T("mp4 m4v m4p m4b 3gp 3gpp 3g2 3gp2")));
  180. ADDFMT((_T("MPEG4 Audio file "), _T("m4a aac"), true));
  181. ADDFMT((_T("Matroska Media file"), _T("mkv")));
  182. ADDFMT((_T("Matroska Audio file"), _T("mka"), true));
  183. ADDFMT((_T("Smacker/Bink Media file"), _T("smk bik"), false, _T("smackw32/binkw32.dll in dll path")));
  184. ADDFMT((_T("ratdvd file"), _T("ratdvd"), false, _T("ratdvd media file")));
  185. ADDFMT((_T("RoQ Media file"), _T("roq"), false));
  186. ADDFMT((_T("Real Media file "), _T("rm ram rmvb rpm"), false, _T("RealOne or codec pack")));
  187. ADDFMT((_T("Real Audio file "), _T("ra"), true, _T("RealOne or codec pack")));
  188. ADDFMT((_T("Real Script file"), _T("rt rp smi smil"), false, _T("RealOne or codec pack"), RealMedia));
  189. ADDFMT((_T("Dirac Video file"), _T("drc"), false));
  190. ADDFMT((_T("DirectShow Media file"), _T("dsm dsv dsa dss")));
  191. ADDFMT((_T("Musepack file"), _T("mpc"), true));
  192. ADDFMT((_T("Flash Video file "), _T("flv")));
  193. ADDFMT((_T("Shockwave Flash file"), _T("swf"), false, _T("ShockWave ActiveX control"), ShockWave));
  194. ADDFMT((_T("Quicktime file "), _T("mov qt amr"), false, _T("QuickTime Player or codec pack"), QuickTime));
  195. ADDFMT((_T("Image file"), _T("jpeg jpg bmp gif pic png dib tiff tif")));
  196. ADDFMT((_T("Playlist file"), _T("asx m3u pls wvx wax wmx mpcpl")));
  197. ADDFMT((_T("Other "), _T("divx vp6")));
  198. #undef ADDFMT
  199. m_iRtspHandler = (engine_t)AfxGetApp()->GetProfileInt(_T("FileFormats"), _T("RtspHandler"), (int)RealMedia);
  200. m_fRtspFileExtFirst = !!AfxGetApp()->GetProfileInt(_T("FileFormats"), _T("RtspFileExtFirst"), 1);
  201. }
  202. for(int i = 0; i < GetCount(); i++)
  203. GetAt(i).UpdateData(fSave);
  204. }
  205. engine_t CMediaFormats::GetRtspHandler(bool& fRtspFileExtFirst)
  206. {
  207. fRtspFileExtFirst = m_fRtspFileExtFirst;
  208. return m_iRtspHandler;
  209. }
  210. void CMediaFormats::SetRtspHandler(engine_t e, bool fRtspFileExtFirst)
  211. {
  212. m_iRtspHandler = e;
  213. m_fRtspFileExtFirst = fRtspFileExtFirst;
  214. }
  215. bool CMediaFormats::IsUsingEngine(CString path, engine_t e)
  216. {
  217. return(GetEngine(path) == e);
  218. }
  219. engine_t CMediaFormats::GetEngine(CString path)
  220. {
  221. path.Trim().MakeLower();
  222. if(!m_fRtspFileExtFirst && path.Find(_T("rtsp://")) == 0)
  223. return m_iRtspHandler;
  224. CString ext = CPath(path).GetExtension();
  225. ext.MakeLower();
  226. if(!ext.IsEmpty())
  227. {
  228. if(path.Find(_T("rtsp://")) == 0)
  229. {
  230. if(ext == _T(".ram") || ext == _T(".rm") || ext == _T(".ra"))
  231. return RealMedia;
  232. if(ext == _T(".qt") || ext == _T(".mov"))
  233. return QuickTime;
  234. }
  235. for(int i = 0; i < GetCount(); i++)
  236. {
  237. CMediaFormatCategory& mfc = GetAt(i);
  238. if(mfc.FindExt(ext))
  239. return mfc.GetEngineType();
  240. }
  241. }
  242. if(m_fRtspFileExtFirst && path.Find(_T("rtsp://")) == 0)
  243. return m_iRtspHandler;
  244. return DirectShow;
  245. }
  246. bool CMediaFormats::FindExt(CString ext, bool fAudioOnly)
  247. {
  248. ext.TrimLeft(_T("."));
  249. if(!ext.IsEmpty())
  250. {
  251. for(int i = 0; i < GetCount(); i++)
  252. {
  253. CMediaFormatCategory& mfc = GetAt(i);
  254. if((!fAudioOnly || mfc.IsAudioOnly()) && mfc.FindExt(ext)) 
  255. return(true);
  256. }
  257. }
  258. return(false);
  259. }
  260. void CMediaFormats::GetFilter(CString& filter, CAtlArray<CString>& mask)
  261. {
  262. filter += _T("Media files (all types)|__dummy|");
  263. mask.Add(_T(""));
  264. for(int i = 0; i < GetCount(); i++) 
  265. mask[0] += GetAt(i).GetFilter() + _T(";");
  266. mask[0].TrimRight(_T(";"));
  267. for(int i = 0; i < GetCount(); i++)
  268. {
  269. CMediaFormatCategory& mfc = GetAt(i);
  270. filter += mfc.GetLabel() + _T("|__dummy|");
  271. mask.Add(mfc.GetFilter());
  272. }
  273. filter += _T("All files (*.*)|__dummy|");
  274. mask.Add(_T("*.*"));
  275. filter += _T("|");
  276. }
  277. void CMediaFormats::GetAudioFilter(CString& filter, CAtlArray<CString>& mask)
  278. {
  279. filter += _T("Audio files (all types)|__dummy|");
  280. mask.Add(_T(""));
  281. for(int i = 0; i < GetCount(); i++)
  282. {
  283. CMediaFormatCategory& mfc = GetAt(i);
  284. if(!mfc.IsAudioOnly() || mfc.GetEngineType() != DirectShow) continue;
  285. mask[0] += GetAt(i).GetFilter() + _T(";");
  286. }
  287. mask[0].TrimRight(_T(";"));
  288. for(int i = 0; i < GetCount(); i++)
  289. {
  290. CMediaFormatCategory& mfc = GetAt(i);
  291. if(!mfc.IsAudioOnly() || mfc.GetEngineType() != DirectShow) continue;
  292. filter += mfc.GetLabel() + _T("|__dummy|");
  293. mask.Add(mfc.GetFilter());
  294. }
  295. filter += _T("All files (*.*)|__dummy|");
  296. mask.Add(_T("*.*"));
  297. filter += _T("|");
  298. }