Massive amount of untested Singe code added.
This commit is contained in:
parent
90a24f67d4
commit
fa91f8e281
5 changed files with 1493 additions and 95 deletions
112
singe/main.c
112
singe/main.c
|
@ -37,10 +37,6 @@
|
|||
#include "extensions.h"
|
||||
|
||||
|
||||
#define VERSION_STRING "v2.00"
|
||||
#define COPYRIGHT_END_YEAR "2020"
|
||||
|
||||
|
||||
typedef struct RatioS {
|
||||
int aspectNum;
|
||||
int aspectDom;
|
||||
|
@ -85,6 +81,8 @@ void showUsage(char *name, char *message) {
|
|||
// 00000000011111111112222222222333333333344444444445555555555666666666677777777778
|
||||
// 12345678901234567890123456789012345678901234567890123456789012345678901234567890
|
||||
utilSay(" -z, --scalefactor=PERCENT reduce screen size for overscan compensation");
|
||||
utilSay(" -a, --aspect=N:D force aspect ratio");
|
||||
utilSay(" -u, --stretch use ugly stretched video");
|
||||
utilSay(" -x, --xresolution=VALUE specify horizontal resolution");
|
||||
utilSay(" -y, --yresolution=VALUE specify vertical resolution");
|
||||
utilSay(" -h, --help this display");
|
||||
|
@ -103,19 +101,17 @@ int main(int argc, char *argv[]) {
|
|||
int x = 0;
|
||||
int err = 0;
|
||||
int flags = 0;
|
||||
int thisFrame = -1;
|
||||
int lastFrame = -1;
|
||||
int videoHandle = -1;
|
||||
int optionIndex = 0;
|
||||
int bestResIndex = -1;
|
||||
int bestRatioIndex = -1;
|
||||
int aspectNum = -1;
|
||||
int aspectDom = -1;
|
||||
char *temp = NULL;
|
||||
char *aspectString = NULL;
|
||||
float thisRatio = 0;
|
||||
float bestRatio = 9999;
|
||||
bool running = true;
|
||||
SDL_Window *window = NULL;
|
||||
SDL_Renderer *renderer = NULL;
|
||||
SDL_Texture *texture = NULL;
|
||||
SDL_DisplayMode mode;
|
||||
static struct option options[] = {
|
||||
{ "nomouse", no_argument, NULL, 'm' },
|
||||
|
@ -124,11 +120,13 @@ int main(int argc, char *argv[]) {
|
|||
{ "mutesound", no_argument, NULL, 's' },
|
||||
{ "fullscreen", no_argument, NULL, 'f' },
|
||||
{ "fullscreen_window", no_argument, NULL, 'w' },
|
||||
{ "stretch", no_argument, NULL, 'u' },
|
||||
{ "datadir", optional_argument, NULL, 'd' },
|
||||
{ "framefile", optional_argument, NULL, 'v' },
|
||||
{ "volume_vldp", optional_argument, NULL, 'l' },
|
||||
{ "volume_nonlvdp", optional_argument, NULL, 'e' },
|
||||
{ "scalefactor", optional_argument, NULL, 'z' },
|
||||
{ "aspect", optional_argument, NULL, 'a' },
|
||||
{ "xresolution", optional_argument, NULL, 'x' },
|
||||
{ "yresolution", optional_argument, NULL, 'y' },
|
||||
{ "help", no_argument, NULL, 'h' },
|
||||
|
@ -167,7 +165,7 @@ int main(int argc, char *argv[]) {
|
|||
while (true) {
|
||||
optionIndex = 0;
|
||||
opterr = 0;
|
||||
x = getopt_long(argc, argv, "mnsfwhd:v:l:e:z:x:y:", options, &optionIndex);
|
||||
x = getopt_long(argc, argv, "mnsfwha:d:v:l:e:z:x:y:", options, &optionIndex);
|
||||
|
||||
// Out of options?
|
||||
if (x == -1) break;
|
||||
|
@ -199,6 +197,11 @@ int main(int argc, char *argv[]) {
|
|||
_confFullScreenWindow = true;
|
||||
break;
|
||||
|
||||
// Ugly Stretched Video
|
||||
case 'u':
|
||||
_confStretchVideo = true;
|
||||
break;
|
||||
|
||||
// Video File
|
||||
case 'v':
|
||||
if (_confVideoFile) free(_confVideoFile);
|
||||
|
@ -226,6 +229,12 @@ int main(int argc, char *argv[]) {
|
|||
_confScaleFactor = atoi(optarg);
|
||||
break;
|
||||
|
||||
// Aspect
|
||||
case 'a':
|
||||
if (aspectString) free(aspectString);
|
||||
aspectString = strdup(optarg);
|
||||
break;
|
||||
|
||||
// X Resolution
|
||||
case 'x':
|
||||
_confXResolution = atoi(optarg);
|
||||
|
@ -339,6 +348,27 @@ int main(int argc, char *argv[]) {
|
|||
|
||||
// Determine resolution if not specified
|
||||
if ((_confXResolution <= 0) || (_confYResolution <= 0)) {
|
||||
// Did they specify an aspect ratio?
|
||||
if (aspectString) {
|
||||
aspectNum = atoi(aspectString);
|
||||
temp = strstr(aspectString, ":");
|
||||
if (temp) {
|
||||
temp++;
|
||||
aspectDom = atoi(temp);
|
||||
temp = NULL;
|
||||
}
|
||||
if ((aspectNum > 0) && (aspectDom > 0)) {
|
||||
// Do we understand what they asked for?
|
||||
x = 0;
|
||||
while (modes[x].ratio.aspectNum != 0) {
|
||||
if ((modes[x].ratio.aspectNum == aspectNum) && (modes[x].ratio.aspectDom == aspectDom)) {
|
||||
bestRatioIndex = x;
|
||||
break;
|
||||
}
|
||||
x++;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Find our current aspect ratio
|
||||
x = 0;
|
||||
while (modes[x].ratio.aspectNum != 0) {
|
||||
|
@ -349,6 +379,8 @@ int main(int argc, char *argv[]) {
|
|||
}
|
||||
x++;
|
||||
}
|
||||
}
|
||||
if (bestRatioIndex < 0) showUsage(argv[0], "Unknown aspect ratio.");
|
||||
x = 0;
|
||||
// Were both resolutions not specified?
|
||||
if ((_confXResolution <= 0) && (_confYResolution <= 0)) {
|
||||
|
@ -436,65 +468,13 @@ int main(int argc, char *argv[]) {
|
|||
err = Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 44100 /* freq */ * 16 /* bits */ * 2 /* channels */ * 2 /* seconds */);
|
||||
if (err != 0) utilDie("%s", Mix_GetError());
|
||||
|
||||
// Start our video playback system
|
||||
if (videoInit()) utilDie("Unable to initialize video player.");
|
||||
|
||||
// Finish our setup
|
||||
SDL_DisableScreenSaver();
|
||||
|
||||
if (videoInit()) utilDie("Unable to initialize video player.");
|
||||
|
||||
videoHandle = videoLoad(_confVideoFile, _confDataDir, renderer);
|
||||
if (videoHandle < 0) utilDie("Unable to load video file: %s", _confVideoFile);
|
||||
|
||||
videoPlay(videoHandle);
|
||||
|
||||
while (running) {
|
||||
|
||||
SDL_Event event;
|
||||
while (SDL_PollEvent(&event)) {
|
||||
switch (event.type) {
|
||||
case SDL_KEYUP:
|
||||
switch (event.key.keysym.sym) {
|
||||
case SDLK_ESCAPE:
|
||||
running = false;
|
||||
break;
|
||||
case SDLK_SPACE:
|
||||
if (videoIsPlaying(videoHandle)) {
|
||||
videoPause(videoHandle);
|
||||
} else {
|
||||
videoPlay(videoHandle);
|
||||
}
|
||||
break;
|
||||
case SDLK_RIGHT:
|
||||
videoSeek(videoHandle, lastFrame + 1);
|
||||
break;
|
||||
case SDLK_LEFT:
|
||||
videoSeek(videoHandle, lastFrame - 1);
|
||||
break;
|
||||
case SDLK_UP:
|
||||
videoSeek(videoHandle, lastFrame + 100);
|
||||
break;
|
||||
case SDLK_DOWN:
|
||||
videoSeek(videoHandle, lastFrame - 100);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case SDL_QUIT:
|
||||
running = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
thisFrame = videoUpdate(videoHandle, &texture);
|
||||
if ((thisFrame != lastFrame) && (thisFrame >= 0)) {
|
||||
utilSay("Presenting frame %d", thisFrame);
|
||||
lastFrame = thisFrame;
|
||||
SDL_RenderCopy(renderer, texture, NULL, NULL);
|
||||
SDL_RenderPresent(renderer);
|
||||
}
|
||||
}
|
||||
|
||||
videoUnload(videoHandle);
|
||||
|
||||
singe(window, renderer);
|
||||
|
||||
// Shutdown
|
||||
videoQuit();
|
||||
|
|
1368
singe/singe.c
1368
singe/singe.c
File diff suppressed because it is too large
Load diff
|
@ -24,10 +24,19 @@
|
|||
#define SINGE_H
|
||||
|
||||
|
||||
#include <SDL2/SDL.h>
|
||||
|
||||
|
||||
#define SINGE_VERSION 2.00
|
||||
#define VERSION_STRING "v2.00"
|
||||
#define COPYRIGHT_END_YEAR "2020"
|
||||
|
||||
|
||||
// Command line options
|
||||
extern char *_confVideoFile;
|
||||
extern char *_confScriptFile;
|
||||
extern char *_confDataDir;
|
||||
extern int _confStretchVideo;
|
||||
extern int _confNoMouse;
|
||||
extern int _confNoStats;
|
||||
extern int _confNoSound;
|
||||
|
@ -40,4 +49,7 @@ extern int _confXResolution;
|
|||
extern int _confYResolution;
|
||||
|
||||
|
||||
void singe(SDL_Window *window, SDL_Renderer *renderer);
|
||||
|
||||
|
||||
#endif // SINGE_H
|
||||
|
|
|
@ -25,7 +25,6 @@
|
|||
|
||||
#include "thirdparty/uthash.h"
|
||||
|
||||
#include "common.h"
|
||||
#include "util.h"
|
||||
#include "videoPlayer.h"
|
||||
|
||||
|
@ -154,7 +153,40 @@ int videoIsPlaying(int playerIndex) {
|
|||
}
|
||||
|
||||
|
||||
int videoLoad(char *filename, char *indexPath, SDL_Renderer *renderer) {
|
||||
int videoGetFrame(int playerIndex) {
|
||||
VideoPlayerT *v = NULL;
|
||||
|
||||
// Get our player structure
|
||||
HASH_FIND_INT(_videoPlayerHash, &playerIndex, v);
|
||||
if (!v) utilDie("No video player at index %d in videoGetHeight.", playerIndex);
|
||||
|
||||
return v->frame;
|
||||
}
|
||||
|
||||
|
||||
int videoGetHeight(int playerIndex) {
|
||||
VideoPlayerT *v = NULL;
|
||||
|
||||
// Get our player structure
|
||||
HASH_FIND_INT(_videoPlayerHash, &playerIndex, v);
|
||||
if (!v) utilDie("No video player at index %d in videoGetHeight.", playerIndex);
|
||||
|
||||
return v->propFrame->EncodedHeight;
|
||||
}
|
||||
|
||||
|
||||
int videoGetWidth(int playerIndex) {
|
||||
VideoPlayerT *v = NULL;
|
||||
|
||||
// Get our player structure
|
||||
HASH_FIND_INT(_videoPlayerHash, &playerIndex, v);
|
||||
if (!v) utilDie("No video player at index %d in videoGetWidth.", playerIndex);
|
||||
|
||||
return v->propFrame->EncodedWidth;
|
||||
}
|
||||
|
||||
|
||||
int videoLoad(char *filename, char *indexPath, bool stretchVideo, SDL_Renderer *renderer) {
|
||||
char indexName[1024];
|
||||
int pixelFormats[2];
|
||||
int result = -1;
|
||||
|
@ -232,10 +264,11 @@ int videoLoad(char *filename, char *indexPath, SDL_Renderer *renderer) {
|
|||
|
||||
// Create video texture
|
||||
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear");
|
||||
v->videoTexture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_BGRA32, SDL_TEXTUREACCESS_STATIC, v->propFrame->EncodedWidth, v->propFrame->EncodedHeight);
|
||||
v->videoTexture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_BGRA32, SDL_TEXTUREACCESS_STREAMING, v->propFrame->EncodedWidth, v->propFrame->EncodedHeight);
|
||||
if (v->videoTexture == NULL) utilDie("%s", SDL_GetError());
|
||||
|
||||
if (!stretchVideo) {
|
||||
SDL_RenderSetLogicalSize(renderer, v->propFrame->EncodedWidth, v->propFrame->EncodedHeight);
|
||||
}
|
||||
|
||||
// Determine audio format
|
||||
switch (v->audioProps->SampleFormat) {
|
||||
|
|
|
@ -26,10 +26,15 @@
|
|||
|
||||
#include <SDL2/SDL.h>
|
||||
|
||||
#include "common.h"
|
||||
|
||||
|
||||
int videoInit(void);
|
||||
int videoIsPlaying(int playerIndex);
|
||||
int videoLoad(char *filename, char *indexPath, SDL_Renderer *renderer);
|
||||
int videoGetFrame(int playerIndex);
|
||||
int videoGetHeight(int playerIndex);
|
||||
int videoGetWidth(int playerIndex);
|
||||
int videoLoad(char *filename, char *indexPath, bool stretchVideo, SDL_Renderer *renderer);
|
||||
int videoPause(int playerIndex);
|
||||
int videoPlay(int playerIndex);
|
||||
int videoQuit(void);
|
||||
|
|
Loading…
Add table
Reference in a new issue