forked from LosaDev/ls-2019-source
LosaDev source snapshot 2019
This commit is contained in:
commit
c198676e97
20588 files changed
+8812878
No files matched your search
@@ -0,0 +1,416 @@
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// BandiVideoLibrary 2.1 Sample
|
||||
///
|
||||
/// Copyright(C) 2008-2011 BandiSoft.com All rights reserved.
|
||||
///
|
||||
/// Visit http://www.bandisoft.com for more information.
|
||||
///
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "StdAfx.h"
|
||||
#include "VideoTest.h"
|
||||
#include "BandiVideoTexture_DX9.h"
|
||||
|
||||
|
||||
static BOOL GetThisPath(LPCTSTR szFileName, LPTSTR buf, int nLenBuf)
|
||||
{
|
||||
TCHAR szModuleName[MAX_PATH*4];
|
||||
::GetModuleFileName(NULL,szModuleName,MAX_PATH*4);
|
||||
*(_tcsrchr( szModuleName, '\\' ) + 1) = NULL;
|
||||
|
||||
_sntprintf(buf, nLenBuf, _T("%s%s"), szModuleName, szFileName);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
CVideoTest::CVideoTest(void)
|
||||
{
|
||||
m_nWidth = 0;
|
||||
m_nHeight = 0;
|
||||
|
||||
m_hWnd = NULL;
|
||||
m_hInstance = NULL;
|
||||
|
||||
m_pd3d9 = NULL;
|
||||
m_pd3dDevice = NULL;
|
||||
|
||||
m_bvt = NULL;
|
||||
|
||||
m_current_time = 0;
|
||||
m_current_frame = 0;
|
||||
}
|
||||
|
||||
CVideoTest::~CVideoTest(void)
|
||||
{
|
||||
Close();
|
||||
}
|
||||
|
||||
void CVideoTest::Init(HINSTANCE hInstance, HWND hWnd)
|
||||
{
|
||||
m_hInstance = hInstance;
|
||||
m_hWnd = hWnd;
|
||||
TCHAR szPathName[MAX_PATH];
|
||||
|
||||
GetThisPath(_T("sample.avi"), szPathName, MAX_PATH);
|
||||
|
||||
// Load bandi video library dll
|
||||
if(FAILED(m_bvl.Create(BANDIVIDEO_DLL_FILE_NAME)))
|
||||
ASSERT(0);
|
||||
|
||||
// verify
|
||||
if(FAILED(m_bvl.Verify("BANDISOFT-TRIAL-200909", "ea92bc5b")))
|
||||
ASSERT(0);
|
||||
|
||||
if(Bvl_Open(szPathName) == FALSE)
|
||||
ASSERT(0);
|
||||
}
|
||||
|
||||
void CVideoTest::Close()
|
||||
{
|
||||
if(m_bvt)
|
||||
{
|
||||
delete m_bvt;
|
||||
m_bvt = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static int vid_y = 0;
|
||||
extern CDXUTDialog g_HUD; // dialog for standard controls
|
||||
void CVideoTest::InitializeDialogs(int iY)
|
||||
{
|
||||
g_HUD.AddStatic(IDC_INFO, L"[ Video file ]", 35, iY, 125, 22);
|
||||
g_HUD.AddButton(IDC_OPEN, L"Open", 35, iY += 24, 125, 22, VK_F5);
|
||||
g_HUD.AddButton(IDC_CLOSE, L"Close", 35, iY += 24, 125, 22, VK_F4);
|
||||
|
||||
g_HUD.AddStatic(IDC_INFO, L"[ Playback ]", 35, iY += 24, 125, 22);
|
||||
g_HUD.AddButton(IDC_PLAY, L"Play", 35, iY += 24, 125, 22, VK_F6);
|
||||
g_HUD.AddButton(IDC_PAUSE, L"Pause", 35, iY += 24, 125, 22, VK_F7);
|
||||
g_HUD.AddButton(IDC_STOP, L"Stop", 35, iY += 24, 125, 22, VK_F8);
|
||||
|
||||
g_HUD.AddButton(IDC_REW, L"-10sec", 35, iY += 24, 125, 22, VK_F11);
|
||||
g_HUD.AddButton(IDC_FF, L"+10sec", 35, iY += 24, 125, 22, VK_F12);
|
||||
g_HUD.AddButton(IDC_FRAME, L"+frame", 35, iY += 24, 125, 22);
|
||||
|
||||
g_HUD.AddStatic(IDC_INFO, L"[ Small screen ]", 35, iY += 24, 125, 22);
|
||||
|
||||
vid_y = iY + 24;
|
||||
}
|
||||
|
||||
|
||||
void CVideoTest::OnGUIEvent( UINT nEvent, int nControlID, CDXUTControl* pControl)
|
||||
{
|
||||
switch( nControlID )
|
||||
{
|
||||
case IDC_OPEN :
|
||||
{
|
||||
TCHAR file_path[MAX_PATH];
|
||||
|
||||
OPENFILENAME ofn;
|
||||
ZeroMemory(&ofn, sizeof(ofn));
|
||||
file_path[0] = NULL;
|
||||
|
||||
static const TCHAR szFilter[]
|
||||
= TEXT("BVL Video Files (.AVI)\0*.AVI\0") \
|
||||
TEXT("All Files (*.*)\0*.*\0\0");
|
||||
ofn.lStructSize = sizeof(OPENFILENAME);
|
||||
ofn.hwndOwner = m_hWnd;
|
||||
ofn.hInstance = NULL;
|
||||
ofn.lpstrFilter = szFilter;
|
||||
ofn.nFilterIndex = 1;
|
||||
ofn.lpstrCustomFilter = NULL;
|
||||
ofn.nMaxCustFilter = 0;
|
||||
ofn.lpstrFile = file_path;
|
||||
ofn.nMaxFile = MAX_PATH;
|
||||
ofn.lpstrFileTitle = NULL;
|
||||
ofn.nMaxFileTitle = 0;
|
||||
ofn.lpstrInitialDir = NULL;
|
||||
ofn.lpstrTitle = TEXT("Select a video file to play...");
|
||||
ofn.Flags = OFN_HIDEREADONLY;
|
||||
ofn.nFileOffset = 0;
|
||||
ofn.nFileExtension = 0;
|
||||
ofn.lpstrDefExt = TEXT("AVI");
|
||||
ofn.lCustData = 0L;
|
||||
ofn.lpfnHook = NULL;
|
||||
ofn.lpTemplateName = NULL;
|
||||
|
||||
m_pd3dDevice->SetDialogBoxMode(TRUE);
|
||||
if(GetOpenFileName (&ofn)) // user specified a file
|
||||
{
|
||||
Bvl_Open(file_path);
|
||||
}
|
||||
m_pd3dDevice->SetDialogBoxMode(FALSE);
|
||||
break;
|
||||
}
|
||||
case IDC_PLAY :
|
||||
Bvl_Play();
|
||||
break;
|
||||
case IDC_PAUSE :
|
||||
Bvl_Pause();
|
||||
break;
|
||||
case IDC_STOP :
|
||||
Bvl_Stop();
|
||||
break;
|
||||
case IDC_REW :
|
||||
Bvl_REW();
|
||||
break;
|
||||
case IDC_FF :
|
||||
Bvl_FF();
|
||||
break;
|
||||
case IDC_FRAME :
|
||||
Bvl_Frame();
|
||||
break;
|
||||
case IDC_CLOSE :
|
||||
Bvl_Close();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
HRESULT CVideoTest::OnD3D9CreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc)
|
||||
{
|
||||
m_pd3dDevice = pd3dDevice;
|
||||
m_pd3dDevice->GetDirect3D(&m_pd3d9);
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT CVideoTest::OnD3D9ResetDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc)
|
||||
{
|
||||
m_pd3dDevice = pd3dDevice;
|
||||
m_pd3dDevice->GetDirect3D(&m_pd3d9);
|
||||
|
||||
m_nWidth = pBackBufferSurfaceDesc->Width;
|
||||
m_nHeight = pBackBufferSurfaceDesc->Height;
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
void CVideoTest::OnFrameMove( double fTime, float fElapsedTime)
|
||||
{
|
||||
}
|
||||
|
||||
LRESULT CVideoTest::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, bool* pbNoFurtherProcessing)
|
||||
{
|
||||
if(uMsg==WM_TIMER)
|
||||
{
|
||||
OnTimer(wParam);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void CVideoTest::OnD3D9LostDevice()
|
||||
{
|
||||
if(m_bvt)
|
||||
{
|
||||
delete m_bvt;
|
||||
m_bvt = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void CVideoTest::OnD3D9DestroyDevice()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/// message to screen
|
||||
/// @date Thursday, August 07, 2008 3:26:06 PM
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
void CVideoTest::Message(LPCTSTR szMsg, ...)
|
||||
{
|
||||
CAtlString sMsg;
|
||||
va_list args;
|
||||
va_start(args, szMsg);
|
||||
sMsg.FormatV(szMsg, args);
|
||||
va_end(args);
|
||||
|
||||
m_messages.AddHead(sMsg);
|
||||
SetTimer(m_hWnd, TIMER_PROCESSMESSAGE, 2000, NULL);
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/// process timer
|
||||
/// @date Thursday, August 07, 2008 3:26:00 PM
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
void CVideoTest::OnTimer(int nTimerID)
|
||||
{
|
||||
if(nTimerID == TIMER_PROCESSMESSAGE)
|
||||
{
|
||||
if(m_messages.GetCount())
|
||||
m_messages.RemoveAll();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/// render text after capture processing
|
||||
/// @param &txtHelper
|
||||
/// @param bCaptured
|
||||
/// @date 2008-09-02 14:29:34
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
void CVideoTest::RenderText(CDXUTTextHelper &txtHelper)
|
||||
{
|
||||
BVL_STATUS status;
|
||||
m_bvl.GetStatus(status);
|
||||
if(status >= BVL_STATUS_PLAYING)
|
||||
{
|
||||
TCHAR s[128];
|
||||
INT cmsec = INT(m_current_time/10000i64);
|
||||
INT tmsec = INT(m_video_info.total_time/10000i64);
|
||||
|
||||
_stprintf(s, _T("[ %02d:%02d:%03d (%I64d) / %02d:%02d:%03d ]"),
|
||||
cmsec/(60*1000), cmsec%(60*1000)/1000, cmsec%1000, m_current_frame,
|
||||
tmsec/(60*1000), tmsec%(60*1000)/1000, tmsec%1000);
|
||||
|
||||
txtHelper.DrawTextLine(_T(""));
|
||||
txtHelper.DrawTextLine(s);
|
||||
}
|
||||
|
||||
POSITION p = m_messages.GetHeadPosition();
|
||||
while(p)
|
||||
{
|
||||
txtHelper.DrawTextLine(m_messages.GetNext(p));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/// render scene
|
||||
/// @param pd3dDevice
|
||||
/// @date 2008-09-02 14:28:26
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
void CVideoTest::RenderScene( IDirect3DDevice9* pd3dDevice)
|
||||
{
|
||||
// Draw small screen.
|
||||
if(m_bvt) m_bvt->Draw(m_nWidth - 125 - 10, vid_y, 125, 100);
|
||||
}
|
||||
|
||||
|
||||
LPDIRECT3DTEXTURE9 CVideoTest::GetVideoTexture()
|
||||
{
|
||||
if(m_bvl.IsCreated() == FALSE)
|
||||
return NULL;
|
||||
|
||||
BVL_STATUS status;
|
||||
m_bvl.GetStatus(status);
|
||||
if(status == BVL_STATUS_PLAYEND)
|
||||
{
|
||||
m_bvl.Seek(0, BVL_SEEK_TIME);
|
||||
m_bvl.Play();
|
||||
}
|
||||
|
||||
if(m_bvl.IsNextFrame())
|
||||
{
|
||||
if(m_bvt == NULL)
|
||||
{
|
||||
BV_DEVICE_DX9 bvd = { m_pd3d9, m_pd3dDevice, m_hWnd };
|
||||
m_bvt = new CBandiVideoTexture_DX9(&bvd);
|
||||
if(!m_bvt || FAILED(m_bvt->Open(m_video_info.width , m_video_info.height)))
|
||||
{
|
||||
if(m_bvt) delete m_bvt; m_bvt = NULL;
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
INT pitch;
|
||||
BYTE* buf = m_bvt->Lock(pitch);
|
||||
if(buf)
|
||||
{
|
||||
// Get frame
|
||||
BVL_FRAME frame;
|
||||
frame.frame_buf = buf;
|
||||
frame.frame_buf_size = m_video_info.height*pitch;
|
||||
frame.pitch = pitch;
|
||||
frame.width = m_video_info.width;
|
||||
frame.height = m_video_info.height;
|
||||
frame.pixel_format = m_bvt->GetFormat();
|
||||
|
||||
m_bvl.GetFrame(frame, TRUE);
|
||||
|
||||
m_bvt->Unlock();
|
||||
|
||||
m_current_time = frame.frame_time;
|
||||
m_current_frame = frame.frame_number;
|
||||
}
|
||||
}
|
||||
|
||||
return m_bvt ? (LPDIRECT3DTEXTURE9)m_bvt->GetObject() : NULL;
|
||||
}
|
||||
|
||||
|
||||
BOOL CVideoTest::Bvl_Open(LPCTSTR path)
|
||||
{
|
||||
Bvl_Close();
|
||||
|
||||
if(FAILED(m_bvl.Open(path, FALSE)))
|
||||
{
|
||||
ASSERT(0);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if(FAILED(m_bvl.GetVideoInfo(m_video_info)))
|
||||
{
|
||||
ASSERT(0);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return SUCCEEDED(m_bvl.Play());
|
||||
}
|
||||
|
||||
|
||||
void CVideoTest::Bvl_Play()
|
||||
{
|
||||
m_bvl.Seek(0, BVL_SEEK_TIME);
|
||||
m_bvl.Play();
|
||||
}
|
||||
|
||||
|
||||
void CVideoTest::Bvl_Pause()
|
||||
{
|
||||
BVL_STATUS status;
|
||||
if(SUCCEEDED(m_bvl.GetStatus(status)))
|
||||
{
|
||||
m_bvl.Pause(status != BVL_STATUS_PAUSED);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CVideoTest::Bvl_Stop()
|
||||
{
|
||||
m_bvl.Stop();
|
||||
}
|
||||
|
||||
|
||||
void CVideoTest::Bvl_FF()
|
||||
{
|
||||
m_bvl.Seek(m_current_time + 100000000i64, BVL_SEEK_TIME);
|
||||
}
|
||||
|
||||
|
||||
void CVideoTest::Bvl_REW()
|
||||
{
|
||||
m_bvl.Seek(m_current_time - 100000000i64, BVL_SEEK_TIME);
|
||||
}
|
||||
|
||||
|
||||
void CVideoTest::Bvl_Close()
|
||||
{
|
||||
if(m_bvt)
|
||||
{
|
||||
delete m_bvt;
|
||||
m_bvt = NULL;
|
||||
}
|
||||
|
||||
m_bvl.Close();
|
||||
}
|
||||
|
||||
|
||||
void CVideoTest::Bvl_Frame()
|
||||
{
|
||||
m_bvl.Pause(TRUE);
|
||||
m_bvl.Seek(m_current_frame + 1, BVL_SEEK_FRAME);
|
||||
}
|
||||
Reference in new issue
Block a user