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

多媒体编程

开发平台:

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 <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, CList<CString>& exts, bool fAudioOnly,
  33. CString specreqnote, engine_t engine)
  34. {
  35. m_label = label;
  36. m_exts.AddTail(&exts);
  37. m_backupexts.AddTail(&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.AddTail(&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(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.AddTail((CList<CString>*)&mfc.m_exts);
  79. m_backupexts.RemoveAll();
  80. m_backupexts.AddTail((CList<CString>*)&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.AddTail(&m_backupexts);
  89. }
  90. void CMediaFormatCategory::SetExts(CList<CString>& exts)
  91. {
  92. m_exts.RemoveAll();
  93. m_exts.AddTail(&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("Shockwave Flash file"), _T("swf"), false, _T("ShockWave ActiveX control"), ShockWave));
  192. ADDFMT((_T("Quicktime file "), _T("mov qt amr"), false, _T("QuickTime Player or codec pack"), QuickTime));
  193. ADDFMT((_T("Image file"), _T("jpeg jpg bmp gif pic png dib tiff tif")));
  194. ADDFMT((_T("Playlist file"), _T("asx m3u pls wvx wax wmx mpcpl")));
  195. ADDFMT((_T("Other "), _T("divx vp6")));
  196. #undef ADDFMT
  197. m_iRtspHandler = (engine_t)AfxGetApp()->GetProfileInt(_T("FileFormats"), _T("RtspHandler"), (int)RealMedia);
  198. m_fRtspFileExtFirst = !!AfxGetApp()->GetProfileInt(_T("FileFormats"), _T("RtspFileExtFirst"), 1);
  199. }
  200. for(int i = 0; i < GetCount(); i++)
  201. GetAt(i).UpdateData(fSave);
  202. }
  203. engine_t CMediaFormats::GetRtspHandler(bool& fRtspFileExtFirst)
  204. {
  205. fRtspFileExtFirst = m_fRtspFileExtFirst;
  206. return m_iRtspHandler;
  207. }
  208. void CMediaFormats::SetRtspHandler(engine_t e, bool fRtspFileExtFirst)
  209. {
  210. m_iRtspHandler = e;
  211. m_fRtspFileExtFirst = fRtspFileExtFirst;
  212. }
  213. bool CMediaFormats::IsUsingEngine(CString path, engine_t e)
  214. {
  215. return(GetEngine(path) == e);
  216. }
  217. engine_t CMediaFormats::GetEngine(CString path)
  218. {
  219. path.Trim().MakeLower();
  220. if(!m_fRtspFileExtFirst && path.Find(_T("rtsp://")) == 0)
  221. return m_iRtspHandler;
  222. CString ext = CPath(path).GetExtension();
  223. ext.MakeLower();
  224. if(!ext.IsEmpty())
  225. {
  226. if(path.Find(_T("rtsp://")) == 0)
  227. {
  228. if(ext == _T(".ram") || ext == _T(".rm") || ext == _T(".ra"))
  229. return RealMedia;
  230. if(ext == _T(".qt") || ext == _T(".mov"))
  231. return QuickTime;
  232. }
  233. for(int i = 0; i < GetCount(); i++)
  234. {
  235. CMediaFormatCategory& mfc = GetAt(i);
  236. if(mfc.FindExt(ext))
  237. return mfc.GetEngineType();
  238. }
  239. }
  240. if(m_fRtspFileExtFirst && path.Find(_T("rtsp://")) == 0)
  241. return m_iRtspHandler;
  242. return DirectShow;
  243. }
  244. bool CMediaFormats::FindExt(CString ext, bool fAudioOnly)
  245. {
  246. ext.TrimLeft(_T("."));
  247. if(!ext.IsEmpty())
  248. {
  249. for(int i = 0; i < GetCount(); i++)
  250. {
  251. CMediaFormatCategory& mfc = GetAt(i);
  252. if((!fAudioOnly || mfc.IsAudioOnly()) && mfc.FindExt(ext)) 
  253. return(true);
  254. }
  255. }
  256. return(false);
  257. }