diff options
Diffstat (limited to 'Src/nsv/nsvplay/main.cpp')
-rw-r--r-- | Src/nsv/nsvplay/main.cpp | 230 |
1 files changed, 230 insertions, 0 deletions
diff --git a/Src/nsv/nsvplay/main.cpp b/Src/nsv/nsvplay/main.cpp new file mode 100644 index 00000000..76f2f5c1 --- /dev/null +++ b/Src/nsv/nsvplay/main.cpp @@ -0,0 +1,230 @@ +#include <windows.h> + +#include "main.h" +#include "video.h" +#include "resource.h" + +typedef struct +{ + VideoOutput *vidOut; + NSVDecoder *decode; + int quit; +} parms; + +HINSTANCE g_hInstance; +int g_bitmap_id=IDB_BITMAP1; + +//#define NO_ABOUT_EGG + +extern long glCounterNSVf, glSyncFrameCount, glNonSyncFrameCount; + +#define WNDMENU_CAPTION "NSVPlay/0.994" +#include "about.h" +#include "wndmenu.h" + +DWORD WINAPI pooThread(LPVOID p) +{ + parms *parm=(parms*)p; + unsigned int last_title_check=0; + + while (!parm->quit) + { + int r=parm->decode->run(&parm->quit); + if (r < 0) + { + if (parm->decode->get_error()) MessageBox(parm->vidOut->getHwnd(),parm->decode->get_error(),"NSV Player Error",MB_OK|MB_ICONSTOP); + break; + } + else if (!r) + { + if ((GetTickCount()-last_title_check) > 1000) + { + char *v=parm->decode->getTitle(); + char *buf=(char*)malloc((v?strlen(v):0)+128); + int posms=parm->decode->getpos(); + int lenms=parm->decode->getlen(); + char *s=parm->decode->getStatus(); + if (lenms != ~0) + wsprintf(buf,"%s [%d:%02d/%d:%02d] @ %dkbps %s%s%s- NSV Player",v?v:"", + posms/60000,(posms/1000)%60, + lenms/60000,(lenms/1000)%60, + parm->decode->getBitrate()/1000, + s?"[":"",s?s:"",s?"] ":"" + ); + else + wsprintf(buf,"%s [%d:%02d] @ %dkbps %s%s%s- NSV Player",v?v:"", + posms/60000,(posms/1000)%60, + parm->decode->getBitrate()/1000, + s?"[":"",s?s:"",s?"] ":"" + ); + + char *p=buf; + while (*p) + { + if (*p == '_') *p=' '; + p++; + } + + SetWindowText(parm->vidOut->getHwnd(),buf); + free(buf); + + last_title_check=GetTickCount(); + } + Sleep(1); + } + } + parm->quit++; + return 0; +} + + +int g_quit; + +int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpszCmdParam, int nCmdShow) +{ + g_hInstance=hInstance; + + BOOL bDisplayInfoAtEnd = FALSE; + char *subtitlefile=NULL; + char buf[11]; + lstrcpyn(buf,lpszCmdParam,11); + + if(strstr(lpszCmdParam, "/info")) { + bDisplayInfoAtEnd = TRUE; + } + + if (!lstrcmpi(buf,"/subtitle=")) + { + lpszCmdParam += 10; + char scanc=' '; + if (*lpszCmdParam == '\"') + { + scanc=*lpszCmdParam++; + } + subtitlefile=lpszCmdParam; + while (*lpszCmdParam && *lpszCmdParam != scanc) lpszCmdParam++; + *lpszCmdParam++=0; + while (*lpszCmdParam == ' ') lpszCmdParam++; + } + + if (*lpszCmdParam == '\"') + { + lpszCmdParam++; + char *p=strstr(lpszCmdParam,"\""); + if (p) *p=0; + } + + if (!*lpszCmdParam) + { + MessageBox(NULL,"Usage: nsvplay.exe [/subtitle=\"file|url\"] filename.nsv|http://url.nsv","NSV Player",MB_OK|MB_ICONINFORMATION); + return 0; + } + + int xpos=CW_USEDEFAULT; + int ypos=CW_USEDEFAULT; + + _ReadConfigItemInt("xpos",&xpos); + _ReadConfigItemInt("ypos",&ypos); + + VideoOutput *vidOut = new VideoOutput(NULL,xpos,ypos); + Decoders_Init(); + + + NSVDecoder *decode=new NSVDecoder(lpszCmdParam,vidOut,subtitlefile); + vidOut->setNSVDecoder(decode); + + int m_pause=0; + + + vidOut->vid_vsync=false; + + + _ReadConfigItemInt("vsync",&vidOut->vid_vsync); + _ReadConfigItemInt("overlays",&vidOut->vid_overlays); + _ReadConfigItemInt("ddraw",&vidOut->vid_ddraw); + _ReadConfigItemInt("aspectadj",&vidOut->vid_aspectadj); + _ReadConfigItemInt("use_mixer",&g_audio_use_mixer); + { + int temp=1; + _ReadConfigItemInt("subtitles",&temp); + decode->enableSubs(temp); + temp=0; + _ReadConfigItemInt("subtitles_size",&temp); + decode->setSubsFontSize(temp); + } + + DWORD id; + parms parm={0,}; + parm.decode=decode; + parm.vidOut=vidOut; + + vidOut->setcallback(my_wndcallback,&parm); + + HANDLE hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)pooThread,(LPVOID)&parm,0,&id); + + for (;;) + { + MSG msg; + while (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) + { + if (msg.hwnd == vidOut->getHwnd() && msg.message == WM_KEYDOWN) + { + if (msg.wParam == VK_SPACE) decode->pause(m_pause=!m_pause); + if (msg.wParam == VK_LEFT) decode->seek(decode->getpos()-30000); + if (msg.wParam == VK_RIGHT) decode->seek(decode->getpos()+30000); + if (msg.wParam == VK_UP) + { + int vol=decode->getvolume()+16; + if (vol > 255) vol=255; + decode->setvolume(vol); + } + if (msg.wParam == VK_DOWN) + { + int vol=decode->getvolume()-16; + if (vol < 0) vol=0; + decode->setvolume(vol); + } + if (msg.wParam == VK_RETURN) + { + if (vidOut->is_fullscreen()) vidOut->remove_fullscreen(); + else vidOut->fullscreen(); + } + if (msg.wParam == 'v' || msg.wParam == 'V') + { + vidOut->vid_vsync=!vidOut->vid_vsync; + } + if (msg.wParam == 'a' || msg.wParam == 'A') + { + vidOut->vid_aspectadj=!vidOut->vid_aspectadj; + PostMessage(vidOut->getHwnd(),WM_TIMER,1,0); + } + } + DispatchMessage(&msg); + } + + if (!IsWindow(vidOut->getHwnd()) || parm.quit) break; + + Sleep(50); + + } + parm.quit++; + WaitForSingleObject(hThread,INFINITE); + CloseHandle(hThread); + delete decode; + delete vidOut; + + Decoders_Quit(); + +#if _DEBUG + // if "/info" on the command line, display some statistics about the movie + if(bDisplayInfoAtEnd) { + char szMessage[MAX_PATH]; + + wsprintf(szMessage, "File Header Count=%ld\nSync Frames=%ld\nNon-sync Frames=%ld", glCounterNSVf, glSyncFrameCount, glNonSyncFrameCount); + MessageBox(NULL, szMessage, WNDMENU_CAPTION, MB_OK); + } +#endif + + return 0; +} + |