//------------------------------------------------------------------------------
// File: BlenderDlg.h
//
// Desc: DirectShow sample code - header for CBlenderDlg class
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//------------------------------------------------------------------------------


#if !defined(AFX_BLENDERDLG_H__6856886E_8D59_4F30_83CF_E08E72D52C9F__INCLUDED_)
#define AFX_BLENDERDLG_H__6856886E_8D59_4F30_83CF_E08E72D52C9F__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include <dshow.h>

//
// Macros
//
#define SAFE_RELEASE(i) {if (i) i->Release(); i = NULL;}

#define JIF(x) if (FAILED(hr=(x))) \
    {Msg(TEXT("FAILED(0x%x) ") TEXT(#x) TEXT("\n\0"), hr); return hr;}

// File filter for OpenFile dialog
#define FILE_FILTER_TEXT \
    TEXT("Video Files (*.asf; *.avi; *.qt; *.mov; *.mpg; *.mpeg; *.m1v; *.wmv)\0*.asf; *.avi; *.qt; *.mov; *.mpg; *.mpeg; *.m1v; *.wmv\0\0")

// Begin default media search at root directory
#define DEFAULT_MEDIA_PATH  TEXT("\\\0")

#define WM_GRAPHNOTIFY  WM_USER+13
#define REGISTER_FILTERGRAPH
#define STRM_A  0
#define STRM_B  1

//
// Constants
//
const int TICKLEN=100, TIMERID=55;


/////////////////////////////////////////////////////////////////////////////
// CBlenderDlg dialog

class CBlenderDlg : public CDialog
{
// Construction
public:
    CBlenderDlg(CWnd* pParent = NULL);  // standard constructor

    HRESULT PrepareMedia(LPTSTR lpszMovie);
    HRESULT InitDirectShow(void);
    HRESULT FreeDirectShow(void);
    HRESULT HandleGraphEvent(void);
    HRESULT UpdatePinAlpha(int nStreamID);
    HRESULT UpdatePinPos(int nStreamID);
    HRESULT RepaintVideo(void);

    HRESULT WaitForState(OAFilterState fsReq);
    HRESULT AddGraphToRot(IUnknown *pUnkGraph, DWORD *pdwRegister);
    void RemoveGraphFromRot(DWORD pdwRegister);

    void ResetDirectShow(void);
    void CenterVideo(void);
    void MoveVideoWindow(void);
    BOOL GetClipFileName(LPTSTR szName);
    BOOL VerifyVMR(void);
    HRESULT InitializeVideo(void);
    HRESULT InitializeWindowlessVMR(void);
    HRESULT DisplayFileDuration(void);
    void UpdatePosition(void);

    void Msg(TCHAR *szFormat, ...);
    void RetailOutput(TCHAR *tszErr, ...);

    void InitStreamParams(void);
    void InitButtons(void);
    void InitControls(void);
    void EnableControls(BOOL bEnable);
    void SetSliders(void);
    void HandleHorizontalTrackbar(WPARAM wParam, LPARAM lParam);
    void HandleVerticalTrackbar(WPARAM wParam, LPARAM lParam);
    void StartTimer(void);
    void StopTimer(void);
    void DisplayCoordinates(int nStreamID, NORMALIZEDRECT& r);
    void DisplayAlpha(int nStreamID);

// Dialog Data
    //{{AFX_DATA(CBlenderDlg)
    enum { IDD = IDD_BLENDER_DIALOG };
    CStatic m_StrPosition;
    CStatic m_StrDuration;
    CButton m_ButtonStop;
    CButton m_ButtonPause;
    CButton m_ButtonPlay;
    CStatic m_Screen;
    //}}AFX_DATA

    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CBlenderDlg)
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
    //}}AFX_VIRTUAL

// Implementation
protected:
    HICON m_hIcon;

    DWORD m_dwGraphRegister;
    HWND m_hwndScreen;
    UINT_PTR g_wTimerID;

    IGraphBuilder *pGB;
    IMediaSeeking *pMS;
    IMediaControl *pMC;
    IMediaEventEx *pME;
    IVMRWindowlessControl *pWC;
    IVMRMixerControl *pMix;

    TCHAR m_szFile1[MAX_PATH], m_szFile2[MAX_PATH];

    // Generated message map functions
    //{{AFX_MSG(CBlenderDlg)
    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    afx_msg void OnButtonStream1();
    afx_msg void OnButtonStream2();
    afx_msg void OnStop();
    afx_msg void OnPause();
    afx_msg void OnPlay();
    afx_msg void OnClose();
    afx_msg void OnDestroy();
    afx_msg void OnTimer(UINT nIDEvent);
    afx_msg void OnCheckFlip();
    afx_msg void OnCheckMirror();
    afx_msg void OnCheckFlip2();
    afx_msg void OnCheckMirror2();
    afx_msg void OnButtonAbout();
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_BLENDERDLG_H__6856886E_8D59_4F30_83CF_E08E72D52C9F__INCLUDED_)
