aboutsummaryrefslogtreecommitdiff
path: root/Src/nsv/nsvplay/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/nsv/nsvplay/main.cpp')
-rw-r--r--Src/nsv/nsvplay/main.cpp230
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;
+}
+