winamp/Src/nsv/nsvplay/main.cpp
2024-09-24 14:54:57 +02:00

231 lines
5.5 KiB
C++

#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;
}