132 lines
4.0 KiB
C++
132 lines
4.0 KiB
C++
//////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Application.h
|
|
//
|
|
// Contains most of the application logic.
|
|
//
|
|
// WinMain creates an instance of this class. This class runs the
|
|
// message loop for the application window.
|
|
//
|
|
// 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.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#pragma once
|
|
|
|
class Application
|
|
{
|
|
enum ApplicationMode
|
|
{
|
|
Mode1 = VK_F1,
|
|
Mode2 = VK_F2,
|
|
Mode3 = VK_F3,
|
|
Mode4 = VK_F4,
|
|
Mode5 = VK_F5,
|
|
Mode6 = VK_F6,
|
|
Mode7 = VK_F7,
|
|
Mode8 = VK_F8,
|
|
Mode9 = VK_F9
|
|
};
|
|
|
|
HWND m_Hwnd; // Application window
|
|
DwmHelper m_DWM; // DWM functions
|
|
D3DHelper m_D3D; // Manages the Direct3D device
|
|
Timer m_timer; // Timer for running the render loop.
|
|
|
|
ApplicationMode m_mode; // Current mode for user interaction.
|
|
|
|
DXVAHD_DEVICE_USAGE m_usage; // DXVA-HD device usage (command-line parameter)
|
|
|
|
// DXVA-HD interfaces
|
|
IDXVAHD_Device *m_pDXVAHD;
|
|
IDXVAHD_VideoProcessor *m_pDXVAVP;
|
|
IDirect3DSurface9 *m_pMainStream;
|
|
IDirect3DSurface9* m_ppSubStream[SUB_STREAM_COUNT];
|
|
|
|
// Current settings
|
|
WORD m_PlanarAlphaValue;
|
|
BYTE m_PixelAlphaValue;
|
|
|
|
RECT m_rcMainVideoSourceRect; // Source rectangle for the main video image.
|
|
RECT m_rcMainVideoDestRect; // Destination rectangle for the main video image.
|
|
RECT m_rcVideoSubRect; // Source rectangle for the substream image.
|
|
|
|
// Note: The Substream destination rectangle is calculated per frame, so we do not
|
|
// store it in a member variable.
|
|
|
|
// Values for calculating the target rectangle, as a percentage of the
|
|
// destination surface.
|
|
INT m_TargetWidthPercent;
|
|
INT m_TargetHeightPercent;
|
|
|
|
// Color information.
|
|
INT m_iExtendedColor; // Index into the EX_COLOR_INFO array.
|
|
INT m_iBackgroundColor; // Index into the BACKGROUND_COLORS array.
|
|
|
|
// Proc amp filtering information
|
|
|
|
struct ProcAmpInfo
|
|
{
|
|
BOOL bSupported;
|
|
DXVAHD_FILTER_RANGE_DATA Range;
|
|
INT CurrentValue;
|
|
INT Step;
|
|
};
|
|
|
|
ProcAmpInfo m_Filters[ NUM_FILTERS ];
|
|
|
|
public:
|
|
Application() :
|
|
m_pDXVAHD(NULL),
|
|
m_pDXVAVP(NULL),
|
|
m_pMainStream(NULL),
|
|
m_PlanarAlphaValue(DEFAULT_PLANAR_ALPHA_VALUE),
|
|
m_PixelAlphaValue(DEFAULT_PIXEL_ALPHA_VALUE),
|
|
m_mode(Mode1),
|
|
m_usage(DXVAHD_DEVICE_USAGE_PLAYBACK_NORMAL)
|
|
{
|
|
ZeroMemory(m_ppSubStream, sizeof( m_ppSubStream) );
|
|
|
|
ZeroMemory(&m_Filters, sizeof(m_Filters));
|
|
|
|
ResetSettings();
|
|
}
|
|
|
|
~Application()
|
|
{
|
|
DestroyDXVAHD();
|
|
}
|
|
|
|
BOOL Initialize();
|
|
INT MessageLoop();
|
|
LRESULT HandleMessage(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
|
|
private:
|
|
BOOL InitializeDXVAHD();
|
|
void DestroyDXVAHD();
|
|
|
|
BOOL ProcessVideoFrame();
|
|
BOOL ResetDevice(BOOL bChangeWindowMode = FALSE);
|
|
|
|
BOOL ParseCommandLine();
|
|
BOOL PreTranslateMessage(const MSG& msg);
|
|
void OnKeyDown(UINT vk, BOOL fDown, int cRepeat, UINT flags);
|
|
void OnSize();
|
|
|
|
HRESULT UpdateVideoSubRect();
|
|
HRESULT ApplySettings();
|
|
HRESULT ResetSettings();
|
|
HRESULT AdjustSetting(int dx, int dy);
|
|
HRESULT AdjustAlphaSetting(int dx, int dy);
|
|
HRESULT AdjustExtendedColor(int dy);
|
|
HRESULT AdjustBackgroundColor(int dx);
|
|
HRESULT AdjustFilter(DXVAHD_FILTER filter, int dy);
|
|
HRESULT AdjustTargetRect(int dx, int dy);
|
|
|
|
void CalculateSubstreamRect(INT frame, RECT *prect);
|
|
}; |