2025-11-28 00:35:46 +09:00

360 lines
13 KiB
C++

// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (c) Microsoft Corporation. All rights reserved
#ifndef __TRACEAPP__
#define __TRACEAPP__
#include "resource.h"
#include "tedobj.h"
#include "tedplayer.h"
#include "MFErrorHandler.h"
#include "..\tedutil\tedutilinc.h"
#include "tedutil.h"
class CTedAppVideoWindowHandler
: public ITedVideoWindowHandler
{
public:
CTedAppVideoWindowHandler(HWND hWndParent);
~CTedAppVideoWindowHandler();
HRESULT STDMETHODCALLTYPE GetVideoWindow(LONG_PTR* phWnd);
HRESULT STDMETHODCALLTYPE ReleaseVideoWindow(LONG_PTR hWnd);
HRESULT STDMETHODCALLTYPE ShowWindows(int nCmdShow);
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppInterface);
ULONG STDMETHODCALLTYPE AddRef();
ULONG STDMETHODCALLTYPE Release();
private:
HWND m_hWndParent;
LONG m_cRef;
CAtlArray<CTedVideoWindow*> m_arrWindows;
const static DWORD m_dwDefaultWindowWidth = 320;
const static DWORD m_dwDefaultWindowHeight = 240;
const static DWORD m_dwCascadeMargin = 20;
};
class CTedAppMediaEventHandler
: public CTedMediaEventHandler
{
public:
CTedAppMediaEventHandler(CTedApp* pApp);
void NotifyEventError(HRESULT hr);
void HandleMediaEvent(IMFMediaEvent* pEvent);
private:
CTedApp* m_pApp;
};
class CTedAppTopoEventHandler
: public ITedTopoEventHandler
{
public:
CTedAppTopoEventHandler(CTedApp* pApp);
~CTedAppTopoEventHandler();
HRESULT STDMETHODCALLTYPE NotifyAddedNode(int nNodeID);
HRESULT STDMETHODCALLTYPE NotifyRemovedNode(int nNodeID);
HRESULT STDMETHODCALLTYPE NotifyConnection(int nUpNodeID, int nDownNodeID);
HRESULT STDMETHODCALLTYPE NotifyDisconnection(int nUpNodeID, int nDownNodeID);
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppInterface);
ULONG STDMETHODCALLTYPE AddRef();
ULONG STDMETHODCALLTYPE Release();
private:
CTedApp* m_pApp;
LONG m_cRef;
};
class CTedChooserDialog
: public CDialogImpl<CTedChooserDialog>
{
public:
CTedChooserDialog(const CAtlString& strTitle);
enum { IDD = IDD_CHOOSER };
void AddPossibleChoice(CAtlStringW strChoice);
CAtlStringW GetChoice() { return m_strChoice; }
protected:
LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnOK(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
LRESULT OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
BEGIN_MSG_MAP( CTedChooserDialog )
MESSAGE_HANDLER( WM_INITDIALOG, OnInitDialog )
COMMAND_HANDLER(IDOK, 0, OnOK)
COMMAND_HANDLER(IDCANCEL, 0, OnCancel)
END_MSG_MAP()
private:
CAtlString m_strTitle;
CAtlArray<CAtlStringW> m_arrChoices;
CAtlStringW m_strChoice;
DWORD m_nChosenIndex;
HWND m_hChooserCombo;
};
class CTedAboutDialog
: public CDialogImpl<CTedAboutDialog>
{
public:
enum { IDD = IDD_ABOUTBOX };
protected:
LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnOK(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { EndDialog(IDOK); return 0; }
BEGIN_MSG_MAP( CTedAboutDialog )
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog);
COMMAND_HANDLER(IDOK, 0, OnOK)
END_MSG_MAP()
};
class CTedInputURLDialog
: public CDialogImpl<CTedInputURLDialog>
{
public:
enum { IDD = IDD_INPUTURL };
CAtlString GetURL();
protected:
LRESULT OnOK(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
BEGIN_MSG_MAP( CTedInputURLDialog )
COMMAND_HANDLER(IDOK, 0, OnOK)
END_MSG_MAP()
private:
CAtlString m_strURL;
};
class CTedCaptureSourceDialog
: public CDialogImpl<CTedCaptureSourceDialog>
{
public:
enum { IDD = IDD_INPUTCAPSOURCE };
CTedCaptureSourceDialog( bool bVideo );
~CTedCaptureSourceDialog();
IMFActivate* GetSourceActivate();
protected:
LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnOK(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
LRESULT OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
EndDialog(IDCANCEL);
return 0;
}
BEGIN_MSG_MAP( CTedCaptureSourceDialog )
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
COMMAND_HANDLER(IDOK, 0, OnOK)
COMMAND_HANDLER(IDCANCEL, 0, OnCancel)
END_MSG_MAP()
private:
HRESULT EnumCaptureSources( bool bVideo );
private:
IMFActivate** m_ppSourceActivates;
DWORD m_dwActivates;
DWORD m_dwSelectedIndex;
};
///////////////////////////////////////////////////////////////////////////////
//
class CTedApp
: public CWindowImpl<CTedApp>
{
public:
CTedApp();
~CTedApp();
HRESULT Init(LPCWSTR lpCmdLine);
void HandleMMError(const CAtlStringW& message, HRESULT errResult);
void HandleSeekerScroll(WORD wPos);
void HandleRateScroll(WORD wPos);
void NotifySplitterMoved();
void NotifyTopoChange();
protected:
void HandleTopologySet(HRESULT hrTopologySet);
LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnSessionPlay(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnTopologySet(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnTopologyReady(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnSessionEnded(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnSplitterMoved(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnUntrustedComponent(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnProtectedContent(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnIndividualization(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnMediaCapabilitiesChanged(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnSave(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
LRESULT OnLoad(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
LRESULT OnDelete(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
LRESULT OnNewTopology(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
LRESULT OnAddSource(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
LRESULT OnAddSink(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
LRESULT OnAddSAR(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
LRESULT OnAddEVR(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
LRESULT OnAddTransform(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
LRESULT OnAddTee(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
LRESULT OnAddCustomMFT(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
LRESULT OnAddCustomSink(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
LRESULT OnAddVideoCaptureSource(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
LRESULT OnAddAudioCaptureSource(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
LRESULT OnLoadTopology(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
LRESULT OnActionPlay(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
LRESULT OnActionStop(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
LRESULT OnActionPause(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
LRESULT OnSpy(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
LRESULT OnCustomTopoloader(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
LRESULT OnRemote(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnExit(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
LRESULT OnHelpHelp(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
LRESULT OnHelpAbout(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
LRESULT OnRenderFile(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
LRESULT OnRenderURL(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
LRESULT OnRenderTranscode(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
BEGIN_MSG_MAP(CTedApp)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
MESSAGE_HANDLER(WM_SIZE, OnSize)
MESSAGE_HANDLER(WM_MF_SESSIONPLAY, OnSessionPlay)
MESSAGE_HANDLER(WM_MF_TOPOLOGYSET, OnTopologySet)
MESSAGE_HANDLER(WM_MF_TOPOLOGYREADY, OnTopologyReady)
MESSAGE_HANDLER(WM_MF_SESSIONENDED, OnSessionEnded)
MESSAGE_HANDLER(WM_SPLITTERSIZE, OnSplitterMoved)
MESSAGE_HANDLER(WM_TIMER, OnTimer)
MESSAGE_HANDLER(WM_MF_HANDLE_UNTRUSTED_COMPONENT, OnUntrustedComponent)
MESSAGE_HANDLER(WM_MF_HANDLE_PROTECTED_CONTENT, OnProtectedContent)
MESSAGE_HANDLER(WM_MF_HANDLE_INDIVIDUALIZATION, OnIndividualization)
MESSAGE_HANDLER(WM_NOTIFY, OnNotify)
MESSAGE_HANDLER(WM_MF_CAPABILITIES_CHANGED, OnMediaCapabilitiesChanged)
COMMAND_HANDLER(ID_FILE_SAVE, 0, OnSave)
COMMAND_HANDLER(ID_FILE_SAVE, 1, OnSave)
COMMAND_HANDLER(ID_FILE_LOAD, 0, OnLoad)
COMMAND_HANDLER(ID_FILE_LOAD, 1, OnLoad)
COMMAND_HANDLER(ID_EDIT_DELETE, 0, OnDelete)
COMMAND_HANDLER(ID_EDIT_DELETE, 1, OnDelete)
COMMAND_HANDLER(ID_TOPOLOGY_NEWTOPOLOGY, 0, OnNewTopology)
COMMAND_HANDLER(ID_TOPOLOGY_NEWTOPOLOGY, 1, OnNewTopology)
COMMAND_HANDLER(ID_ADD_SOURCE, 0, OnAddSource)
COMMAND_HANDLER(ID_ADD_SOURCE, 1, OnAddSource)
COMMAND_HANDLER(ID_ADD_SINK, 0, OnAddSink)
COMMAND_HANDLER(ID_ADD_SAR, 0, OnAddSAR)
COMMAND_HANDLER(ID_ADD_SAR, 1, OnAddSAR)
COMMAND_HANDLER(ID_ADD_EVR, 0, OnAddEVR)
COMMAND_HANDLER(ID_ADD_EVR, 1, OnAddEVR)
COMMAND_HANDLER(ID_ADD_TRANSFORM, 0, OnAddTransform)
COMMAND_HANDLER(ID_ADD_TRANSFORM, 1, OnAddTransform)
COMMAND_HANDLER(ID_ADD_TEE, 0, OnAddTee)
COMMAND_HANDLER(ID_TOPOLOGY_ADDCUSTOMMFT, 0, OnAddCustomMFT)
COMMAND_HANDLER(ID_TOPOLOGY_ADDCUSTOMSINK, 0, OnAddCustomSink)
COMMAND_HANDLER(ID_TOPOLOGY_ADD_VIDEO_CAPTURE_SOURCE, 0, OnAddVideoCaptureSource)
COMMAND_HANDLER(ID_TOPOLOGY_ADD_VIDEO_CAPTURE_SOURCE, 1, OnAddVideoCaptureSource)
COMMAND_HANDLER(ID_TOPOLOGY_ADD_AUDIO_CAPTURE_SOURCE, 0, OnAddAudioCaptureSource)
COMMAND_HANDLER(ID_TOPOLOGY_ADD_AUDIO_CAPTURE_SOURCE, 1, OnAddAudioCaptureSource)
COMMAND_HANDLER(ID_LOAD_TOPOLOGY, 0, OnLoadTopology)
COMMAND_HANDLER(ID_LOAD_TOPOLOGY, 1, OnLoadTopology)
COMMAND_HANDLER(ID_PLAY_PLAY, 0, OnActionPlay)
COMMAND_HANDLER(ID_PLAY_STOP, 0, OnActionStop)
COMMAND_HANDLER(ID_PLAY_PAUSE, 0, OnActionPause)
COMMAND_HANDLER(ID_TOOLS_SPY, 0, OnSpy)
COMMAND_HANDLER(ID_TOOLS_CUSTOMTOPOLOADER, 0, OnCustomTopoloader)
COMMAND_HANDLER(IDM_EXIT, 0, OnExit)
COMMAND_HANDLER(ID_HELP_HELP, 0, OnHelpHelp)
COMMAND_HANDLER(ID_HELP_HELP, 1, OnHelpHelp)
COMMAND_HANDLER(ID_HELP_ABOUT, 0, OnHelpAbout)
COMMAND_HANDLER(ID_FILE_RENDER, 0, OnRenderFile)
COMMAND_HANDLER(ID_FILE_RENDERURL, 0, OnRenderURL)
COMMAND_HANDLER(ID_FILE_TRANSCODE, 0, OnRenderTranscode)
END_MSG_MAP()
public:
CTedPlayer* PPlayer() { return m_pPlayer; }
protected:
void EnableInput(UINT item, BOOL enabled);
void RebuildDockWithOneView();
void DisablePlayback();
HRESULT HasBuggedPins(IMFTopology* pTopology, bool* fBuggedPins);
void ResetInterface();
HRESULT ResolveTopologyFromEditor();
HRESULT SetTopologyOnPlayer(IMFTopology* pTopo, BOOL fIsProtected, BOOL fIsTranscode);
HRESULT Play();
void LoadFile(LPCWSTR szFile);
private:
ITedTopoView* m_pTopoView;
CPropertyController* m_pPropertyController;
CTedAppVideoWindowHandler* m_pVideoWindowHandler;
CTedAppTopoEventHandler* m_pTopoEventHandler;
CTedAppMediaEventHandler* m_pMediaEventHandler;
CTedContentProtectionManager* m_pCPM;
CTedPlayer * m_pPlayer;
CDock* m_pDock;
CSplitterBar* m_pSplitter;
CSplitterBar* m_pPropSplitter;
CTedMainToolbar* m_pMainToolbar;
HMENU m_hMenu;
CMFErrorHandler m_MFErrorHandler;
bool m_fStopTrackingUntilSessionStarted;
IMFTopology* m_pPendingTopo;
TOPOID m_PendingTopoID;
bool m_fMergeRequired;
bool m_fResolved;
bool m_fPendingPlay;
bool m_fCanSeek;
HWND m_hEditWnd;
CWindow m_EditWindow;
static const DWORD m_dwMaxAcceptedFileNameLength = 1024;
static const double m_dblInitialSplitterPos;
static const DWORD m_dwSplitterWidth = 4;
static unsigned int MAIN_TOOLBAR_ID;
static const int m_nSeekerRange;
static const UINT_PTR ms_nTimerID;
static const DWORD ms_dwTimerLen;
};
void HandleSeekerScrollFunc(WORD wPos);
void HandleRateScrollFunc(WORD wPos);
#endif