wmp4player.cpp
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:12k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. // wmp4player.cpp : Defines the class behaviors for the application.
  2. //
  3. #include "stdafx.h"
  4. #include <afxadv.h>
  5. #include "wmp4player.h"
  6. #include "MainFrm.h"
  7. #include "wmp4playerDoc.h"
  8. #include "wmp4playerView.h"
  9. #include "our_config_file.h"
  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #undef THIS_FILE
  13. static char THIS_FILE[] = __FILE__;
  14. #endif
  15. /////////////////////////////////////////////////////////////////////////////
  16. // CWmp4playerApp
  17. BEGIN_MESSAGE_MAP(CWmp4playerApp, CWinApp)
  18. //{{AFX_MSG_MAP(CWmp4playerApp)
  19. ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
  20. ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
  21. ON_COMMAND_RANGE(ID_FILE_MRU_FILE1,ID_FILE_MRU_LAST, OnOpenRecentFile)
  22. ON_COMMAND(ID_VIDEO_FULLSCREEN, OnVideoFullscreen)
  23. ON_UPDATE_COMMAND_UI(ID_DEBUG_MPEG4ISOONLY, OnUpdateDebugMpeg4isoonly)
  24. ON_COMMAND(ID_DEBUG_MPEG4ISOONLY, OnDebugMpeg4isoonly)
  25. ON_UPDATE_COMMAND_UI(ID_AUDIO_MUTE, OnUpdateAudioMute)
  26. ON_COMMAND(ID_AUDIO_MUTE, OnAudioMute)
  27. ON_COMMAND(ID_RTP_OVER_RTSP, OnRtpOverRtsp)
  28. ON_UPDATE_COMMAND_UI(ID_RTP_OVER_RTSP, OnUpdateRtpOverRtsp)
  29. //}}AFX_MSG_MAP
  30. // Standard file based document commands
  31. ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
  32. ON_UPDATE_COMMAND_UI_RANGE(ID_MEDIA_VIDEO_50, ID_MEDIA_VIDEO_200, OnUpdateMediaVideo)
  33. ON_COMMAND_RANGE(ID_MEDIA_VIDEO_50, ID_MEDIA_VIDEO_200, OnMediaVideo)
  34. ON_UPDATE_COMMAND_UI_RANGE(ID_RTP_DEBUG_EMERG, ID_RTP_DEBUG_DEBUG, OnUpdateDebugRtp)
  35. ON_COMMAND_RANGE(ID_RTP_DEBUG_EMERG, ID_RTP_DEBUG_DEBUG, OnDebugRtp)
  36. ON_UPDATE_COMMAND_UI_RANGE(ID_HTTP_EMERG, ID_HTTP_DEBUG, OnUpdateDebugHttp)
  37. ON_COMMAND_RANGE(ID_HTTP_EMERG, ID_HTTP_DEBUG, OnDebugHttp)
  38. ON_UPDATE_COMMAND_UI_RANGE(ID_RTSP_EMERG, ID_RTSP_DEBUG, OnUpdateDebugRtsp)
  39. ON_COMMAND_RANGE(ID_RTSP_EMERG, ID_RTSP_DEBUG, OnDebugRtsp)
  40. ON_UPDATE_COMMAND_UI_RANGE(ID_SDP_EMERG, ID_SDP_DEBUG, OnUpdateDebugSdp)
  41. ON_COMMAND_RANGE(ID_SDP_EMERG, ID_SDP_DEBUG, OnDebugSdp)
  42. END_MESSAGE_MAP()
  43. /////////////////////////////////////////////////////////////////////////////
  44. // CWmp4playerApp construction
  45. CWmp4playerApp::CWmp4playerApp()
  46. {
  47. // TODO: add construction code here,
  48. // Place all significant initialization in InitInstance
  49. m_mp4if = NULL;
  50. m_video_size = 1;
  51. m_session_died = 0;
  52. }
  53. /////////////////////////////////////////////////////////////////////////////
  54. // The one and only CWmp4playerApp object
  55. CWmp4playerApp theApp;
  56. /////////////////////////////////////////////////////////////////////////////
  57. // CWmp4playerApp initialization
  58. BOOL CWmp4playerApp::InitInstance()
  59. {
  60. AfxEnableControlContainer();
  61. // Standard initialization
  62. // If you are not using these features and wish to reduce the size
  63. //  of your final executable, you should remove from the following
  64. //  the specific initialization routines you do not need.
  65. #ifdef _AFXDLL
  66. Enable3dControls(); // Call this when using MFC in a shared DLL
  67. #else
  68. Enable3dControlsStatic(); // Call this when linking to MFC statically
  69. #endif
  70. // Change the registry key under which our settings are stored.
  71. // TODO: You should modify this string to be something appropriate
  72. // such as the name of your company or organization.
  73. SetRegistryKey(_T("Mpeg4ip"));
  74. LoadStdProfileSettings();  // Load standard INI file options (including MRU)
  75. const char *str;
  76. config.read_config_file("Software\Mpeg4ip", "Config");
  77. str = config.get_config_string(CONFIG_PREV_FILE_0);
  78. if (str != NULL) {
  79. m_played.AddTail(str);
  80. }
  81. str = config.get_config_string(CONFIG_PREV_FILE_1);
  82. if (str != NULL) {
  83. m_played.AddTail(str);
  84. }
  85. str = config.get_config_string(CONFIG_PREV_FILE_2);
  86. if (str != NULL) {
  87. m_played.AddTail(str);
  88. }
  89. str = config.get_config_string(CONFIG_PREV_FILE_3);
  90. if (str != NULL) {
  91. m_played.AddTail(str);
  92. }
  93. // Register the application's document templates.  Document templates
  94. //  serve as the connection between documents, frame windows and views.
  95. CSingleDocTemplate* pDocTemplate;
  96. pDocTemplate = new CSingleDocTemplate(
  97. IDR_MAINFRAME,
  98. RUNTIME_CLASS(CWmp4playerDoc),
  99. RUNTIME_CLASS(CMainFrame),       // main SDI frame window
  100. RUNTIME_CLASS(CWmp4playerView));
  101. AddDocTemplate(pDocTemplate);
  102. // Parse command line for standard shell commands, DDE, file open
  103. CCommandLineInfo cmdInfo;
  104. ParseCommandLine(cmdInfo);
  105. // Dispatch commands specified on the command line
  106. if (!ProcessShellCommand(cmdInfo))
  107. return FALSE;
  108. // The one and only window has been initialized, so show and update it.
  109. m_pMainWnd->ShowWindow(SW_SHOW);
  110. m_pMainWnd->UpdateWindow();
  111. return TRUE;
  112. }
  113. /////////////////////////////////////////////////////////////////////////////
  114. // CAboutDlg dialog used for App About
  115. class CAboutDlg : public CDialog
  116. {
  117. public:
  118. CAboutDlg();
  119. // Dialog Data
  120. //{{AFX_DATA(CAboutDlg)
  121. enum { IDD = IDD_ABOUTBOX };
  122. CString m_version;
  123. //}}AFX_DATA
  124. // ClassWizard generated virtual function overrides
  125. //{{AFX_VIRTUAL(CAboutDlg)
  126. protected:
  127. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  128. //}}AFX_VIRTUAL
  129. // Implementation
  130. protected:
  131. //{{AFX_MSG(CAboutDlg)
  132. // No message handlers
  133. //}}AFX_MSG
  134. DECLARE_MESSAGE_MAP()
  135. };
  136. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  137. {
  138. //{{AFX_DATA_INIT(CAboutDlg)
  139. m_version.Format("%s - %s", AfxGetAppName(), VERSION);
  140. //}}AFX_DATA_INIT
  141. }
  142. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  143. {
  144. CDialog::DoDataExchange(pDX);
  145. //{{AFX_DATA_MAP(CAboutDlg)
  146. DDX_Text(pDX, IDC_VERSION_STRING, m_version);
  147. //}}AFX_DATA_MAP
  148. }
  149. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  150. //{{AFX_MSG_MAP(CAboutDlg)
  151. // No message handlers
  152. //}}AFX_MSG_MAP
  153. END_MESSAGE_MAP()
  154. // App command to run the dialog
  155. void CWmp4playerApp::OnAppAbout()
  156. {
  157. CAboutDlg aboutDlg;
  158. aboutDlg.DoModal();
  159. }
  160. /////////////////////////////////////////////////////////////////////////////
  161. // CWmp4playerApp message handlers
  162. void CWmp4playerApp::OnFileOpen() 
  163. {
  164. // TODO: Add your command handler code here
  165. OutputDebugString("nApp - OnFileOpen()n");
  166. int recent_files;
  167. CString file_name = "";
  168. recent_files = m_pRecentFileList->GetSize();
  169. if (recent_files > 0) {
  170. if (m_pRecentFileList->GetDisplayName(file_name, 
  171.   0,
  172.   NULL, 0, FALSE)) {
  173. } else file_name = "";
  174. CFileDialog fd(TRUE, 
  175.    NULL, 
  176.    file_name, 
  177.    OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_NOCHANGEDIR, 
  178.    NULL, NULL);
  179. if (fd.DoModal() == IDOK) {
  180. StartSession(fd.GetPathName());
  181. }
  182. //CWinApp::AddToRecentFileList
  183. }
  184. BOOL CWmp4playerApp::OnOpenRecentFile(UINT nID)
  185. {
  186. int nIndex = nID - ID_FILE_MRU_FILE1;
  187. StartSession((*m_pRecentFileList)[nIndex]);
  188. OutputDebugString((*m_pRecentFileList)[nIndex]);
  189. OutputDebugString("n");
  190. //if (OpenDocumentFile((*m_pRecentFileList)[nIndex]) == NULL)
  191. // m_pRecentFileList->Remove(nIndex);
  192. return TRUE;
  193. }
  194. void CWmp4playerApp::StartSession (CString &name)
  195. {
  196. int added_to_list = 0;
  197. BeginWaitCursor();
  198. if (config.changed()) {
  199. config.write_config_file("Software\Mpeg4ip", "Config");
  200. }
  201. if (m_mp4if != NULL) {
  202. StopSession();
  203. }
  204. m_current_playing = name;
  205. if (m_played.Find(name) == NULL) {
  206. added_to_list = 1;
  207. m_played.AddHead(name);
  208. }
  209. //m_pRecentFileList->Add(name);
  210. m_mp4if = new CMP4If(name);
  211. if (m_mp4if->is_valid() == FALSE) {
  212. OutputDebugString("Could not create mp4ifn");
  213. delete m_mp4if;
  214. m_mp4if = NULL;
  215. EndWaitCursor();
  216. AfxMessageBox("Could not create valid Client");
  217. return;
  218. }
  219. CString errmsg;
  220. int err = m_mp4if->get_initial_response(errmsg);
  221. if (err < 0) {
  222. OutputDebugString("mp4if response is falsen");
  223. OutputDebugString(errmsg);
  224. OutputDebugString("n");
  225. delete m_mp4if;
  226. m_mp4if = NULL;
  227. EndWaitCursor();
  228. AfxMessageBox(errmsg);
  229. return;
  230. } else {
  231. if (err > 0) {
  232. AfxMessageBox(errmsg);
  233. }
  234. if (m_video_size != 1) {
  235. m_mp4if->set_screen_size(m_video_size);
  236. }
  237. if (added_to_list == 1) {
  238. config.move_config_strings(CONFIG_PREV_FILE_3, CONFIG_PREV_FILE_2);
  239. config.move_config_strings(CONFIG_PREV_FILE_2, CONFIG_PREV_FILE_1);
  240. config.move_config_strings(CONFIG_PREV_FILE_1, CONFIG_PREV_FILE_0);
  241. config.set_config_string(CONFIG_PREV_FILE_0, strdup(name));
  242. }
  243. //m_played.AddTail(name);
  244. }
  245. OnFileNew();
  246. EndWaitCursor();
  247. //OpenDocumentFile(name);
  248. //GetDocument()->SetPathName(name, FALSE);
  249. //OpenDocumentFile(name);
  250. }
  251. void CWmp4playerApp::StopSession (int terminating)
  252. {
  253. OutputDebugString("Stopping Sessionn");
  254. if (m_mp4if != NULL) {
  255. delete m_mp4if;
  256. m_mp4if = NULL;
  257. }
  258. if (terminating != 1)
  259. OnFileNew();
  260. OutputDebugString("Stopped Sessionn");
  261. return;
  262. }
  263. void CWmp4playerApp::SessionDied (void)
  264. {
  265. if (m_session_died == 0) {
  266. m_session_died = 1;
  267. AfxMessageBox("Client Session Crashed");
  268. StopSession();
  269. m_session_died = 0;
  270. }
  271. }
  272. void CWmp4playerApp::RemoveLast (void)
  273. {
  274. m_pRecentFileList->Remove(0);
  275. }
  276. void CWmp4playerApp::OnVideoFullscreen() 
  277. {
  278. // TODO: Add your command handler code here
  279. OutputDebugString("OnVIdeoFullScreenn");
  280. }
  281. void CWmp4playerApp::OnUpdateMediaVideo(CCmdUI* pCmdUI) 
  282. {
  283. int id = pCmdUI->m_nID - ID_MEDIA_VIDEO_50;
  284. // TODO: Add your command update UI handler code here
  285. pCmdUI->Enable();
  286. pCmdUI->SetRadio(m_video_size == id);
  287. }
  288. void CWmp4playerApp::OnMediaVideo(UINT id) 
  289. {
  290. id -= ID_MEDIA_VIDEO_50;
  291. // TODO: Add your command handler code here
  292. m_video_size = id;
  293. if (m_mp4if)
  294. m_mp4if->set_screen_size(m_video_size);
  295. }
  296. void CWmp4playerApp::OnUpdateDebugRtp (CCmdUI* pCmdUI)
  297. {
  298. int id = pCmdUI->m_nID - ID_RTP_DEBUG_EMERG;
  299. pCmdUI->Enable();
  300. pCmdUI->SetRadio(config.get_config_value(CONFIG_RTP_DEBUG) == id);
  301. }
  302. void CWmp4playerApp::OnDebugRtp (UINT id)
  303. {
  304. id -= ID_RTP_DEBUG_EMERG;
  305. config.set_config_value(CONFIG_RTP_DEBUG, id);
  306. UpdateClientConfig();
  307. }
  308. void CWmp4playerApp::OnUpdateDebugHttp (CCmdUI* pCmdUI)
  309. {
  310. int id = pCmdUI->m_nID - ID_HTTP_EMERG;
  311. pCmdUI->Enable();
  312. pCmdUI->SetRadio(config.get_config_value(CONFIG_HTTP_DEBUG) == id);
  313. }
  314. void CWmp4playerApp::OnDebugHttp (UINT id)
  315. {
  316. id -= ID_HTTP_EMERG;
  317. config.set_config_value(CONFIG_HTTP_DEBUG, id);
  318. UpdateClientConfig();
  319. }
  320. void CWmp4playerApp::OnUpdateDebugRtsp (CCmdUI* pCmdUI)
  321. {
  322. int id = pCmdUI->m_nID - ID_RTSP_EMERG;
  323. pCmdUI->Enable();
  324. pCmdUI->SetRadio(config.get_config_value(CONFIG_RTSP_DEBUG) == id);
  325. }
  326. void CWmp4playerApp::OnDebugRtsp (UINT id)
  327. {
  328. id -= ID_RTSP_EMERG;
  329. config.set_config_value(CONFIG_RTSP_DEBUG, id);
  330. UpdateClientConfig();
  331. }
  332. void CWmp4playerApp::OnUpdateDebugSdp (CCmdUI* pCmdUI)
  333. {
  334. int id = pCmdUI->m_nID - ID_SDP_EMERG;
  335. pCmdUI->Enable();
  336. pCmdUI->SetRadio(config.get_config_value(CONFIG_SDP_DEBUG) == id);
  337. }
  338. void CWmp4playerApp::OnDebugSdp (UINT id)
  339. {
  340. id -= ID_SDP_EMERG;
  341. config.set_config_value(CONFIG_SDP_DEBUG, id);
  342. UpdateClientConfig();
  343. }
  344. int CWmp4playerApp::ExitInstance() 
  345. {
  346. if (config.changed()) {
  347. config.write_config_file("Software\Mpeg4ip", "Config");
  348. }
  349. return CWinApp::ExitInstance();
  350. }
  351. void CWmp4playerApp::OnUpdateDebugMpeg4isoonly(CCmdUI* pCmdUI) 
  352. {
  353. // TODO: Add your command update UI handler code here
  354. pCmdUI->Enable();
  355. pCmdUI->SetCheck(config.get_config_value(CONFIG_USE_MPEG4_ISO_ONLY));
  356. }
  357. void CWmp4playerApp::OnDebugMpeg4isoonly() 
  358. {
  359. // TODO: Add your command handler code here
  360. int value;
  361. value = config.get_config_value(CONFIG_USE_MPEG4_ISO_ONLY);
  362. value = (value == 0) ? 1 : 0;
  363. config.set_config_value(CONFIG_USE_MPEG4_ISO_ONLY, value);
  364. }
  365. void CWmp4playerApp::UpdateClientConfig (void)
  366. {
  367. if (m_mp4if) {
  368. m_mp4if->client_read_config();
  369. }
  370. }
  371. void CWmp4playerApp::OnUpdateAudioMute(CCmdUI* pCmdUI) 
  372. {
  373. // TODO: Add your command update UI handler code here
  374. if (m_mp4if != NULL && m_mp4if->has_audio()) {
  375. pCmdUI->Enable();
  376. pCmdUI->SetCheck(m_mp4if->get_mute());
  377. } else
  378. pCmdUI->Enable(FALSE);
  379. }
  380. void CWmp4playerApp::OnAudioMute() 
  381. {
  382. if (m_mp4if != NULL) {
  383.     m_mp4if->toggle_mute();
  384. }
  385. }
  386. void CWmp4playerApp::OnRtpOverRtsp() 
  387. {
  388. int value;
  389. value = config.get_config_value(CONFIG_USE_RTP_OVER_RTSP);
  390. value = (value == 0) ? 1 : 0;
  391. config.set_config_value(CONFIG_USE_RTP_OVER_RTSP, value);
  392. }
  393. void CWmp4playerApp::OnUpdateRtpOverRtsp(CCmdUI* pCmdUI) 
  394. {
  395. pCmdUI->Enable();
  396. pCmdUI->SetCheck(config.get_config_value(CONFIG_USE_RTP_OVER_RTSP));
  397. }