jedi-outcast/utils/roq2/main/param.c

963 lines
25 KiB
C
Raw Permalink Normal View History

2013-04-22 05:25:59 +00:00
//
// read a parameter file in (yes I bloddy well had to do this again)
//
#include "Param.h"
#include <stdio.h>
#include <string.h>
#include <math.h>
#ifndef MAXPATHLEN
#include <stdlib.h>
#define MAXPATHLEN _MAX_PATH
#endif
#ifndef MAXINT
#include <limits.h>
#define MAXINT INT_MAX
#endif
void ParamFree(Param *self)
{
free(self->soundfile);
free(self->currentPath);
free(self->outputFilename);
free(self->tempFilename);
free(self->startPal);
free(self->endPal);
free(self->currentFile);
if (self->range)
{
free(self->range);
}
if (self->padding)
{
free(self->padding);
}
if (self->padding2)
{
free(self->padding2);
}
if (self->skipnum)
{
free(self->skipnum);
}
if (self->skipnum2)
{
free(self->skipnum2);
}
if (self->startnum)
{
free(self->startnum);
}
if (self->startnum2)
{
free(self->startnum2);
}
if (self->endnum)
{
free(self->endnum);
}
if (self->endnum2)
{
free(self->endnum2);
}
if (self->numpadding)
{
free(self->numpadding);
}
if (self->numpadding2)
{
free(self->numpadding2);
}
if (self->numfiles)
{
free(self->numfiles);
}
if (self->file)
{
free(self->file);
}
if (self->file2)
{
free(self->file2);
}
free(self);
}
Param *ParamNewFromFile(const char *fileName)
{
FILE *script_fp;
char arg0[MAXPATHLEN+1];
char arg1[MAXPATHLEN+1];
char arg2[MAXPATHLEN+1];
char arg3[MAXPATHLEN+1];
char buffer[MAXPATHLEN*4+1];
int i, readarg;
Param *self;
// "c:\\clan\\player\\roq\\debug\\alt_07m.par"
#ifndef WIN32
if ( ( script_fp = fopen( fileName, "r" ) ) == NULL ) {
fprintf(stderr,"Error: can't open param file %s\n", fileName);
exit(1);
}
#else
if ( ( script_fp = fopen( fileName, "r+b" ) ) == NULL ) {
fprintf(stderr,"Error: can't open param file %s\n", fileName);
exit(1);
}
#endif
//printf("initFromFile: %s\n", fileName);
self = calloc(1, sizeof(Param));
self->soundfile = calloc( MAXPATHLEN, sizeof(char) );
self->currentPath = calloc( MAXPATHLEN, sizeof(char) );
self->outputFilename = calloc( MAXPATHLEN, sizeof(char) );
self->tempFilename = calloc( MAXPATHLEN, sizeof(char) );
self->startPal = calloc( MAXPATHLEN, sizeof(char) );
self->endPal = calloc( MAXPATHLEN, sizeof(char) );
self->currentFile = calloc( MAXPATHLEN, sizeof(char) );
self->range = NULL;
self->padding = NULL;
self->padding2 = NULL;
self->skipnum = NULL;
self->skipnum2 = NULL;
self->startnum = NULL;
self->startnum2 = NULL;
self->endnum = NULL;
self->endnum2 = NULL;
self->numpadding = NULL;
self->numpadding2 = NULL;
self->numfiles = NULL;
self->file = NULL;
self->file2 = NULL;
self->fullSearch = NO;
self->scaleDown = NO;
self->encodeVideo = NO;
self->addPath = NO;
self->screenShots = NO;
self->startPalette = NO;
self->endPalette = NO;
self->fixedPalette = NO;
self->keyColor = NO;
self->justDelta = NO;
self->useTimecodeForRange = NO;
self->onFrame = 0;
self->numInputFiles = 0;
self->currentPath[0] = '\0';
self->makeVectors = NO;
self->justDeltaFlag = NO;
self->noAlphaAtAll = NO;
self->hasSound = NO;
self->isScaleable = NO;
self->firstframesize = 56*1024;
self->normalframesize = 16384;
self->jpegDefault = 85;
self->fadeDownStartFrame = MAXINT;
self->fadeDownDuration = 0;
self->fadeUpStartFrame = 0;
self->fadeUpDuration = 0;
self->mpegCropWidth = 0;
self->mpegCropHeight = 0;
self->mpegCropXOrigin = 0;
self->mpegCropYOrigin = 0; // just worked out that way for test mpegs
self->fps = 30;
self->realnum = 0;
do
{
buffer[0] = '\0';
arg0[0] = '\0';
fgets( buffer, 256, script_fp );
if (buffer[strlen(buffer)-2] == '\r') //strip \r
{
buffer[strlen(buffer)-2] = '\n';
buffer[strlen(buffer)-1] = '\0';
}
sscanf(buffer, "%s %s %s %s", arg0, arg1, arg2, arg3);
readarg = 0;
// input dir
if (strcasecmp(arg0, "input_dir") == 0) {
self->addPath = YES;
strcpy( self->currentPath, arg1 );
// [textDirectory setStringValue: "hello world"];
// fprintf(stderr," + input directory is %s\n", self->currentPath );
readarg++;
}
// input dir
if (strcasecmp(arg0, "scale_down") == 0) {
self->scaleDown = YES;
// fprintf(stderr," + scaling down input\n" );
readarg++;
}
// full search
if (strcasecmp(arg0, "fullsearch") == 0) {
self->normalframesize += self->normalframesize/2;
self->fullSearch = YES;
readarg++;
}
// scaleable
if (strcasecmp(arg0, "scaleable") == 0) {
self->isScaleable = YES;
readarg++;
}
// input dir
if (strcasecmp(arg0, "no_alpha") == 0) {
self->noAlphaAtAll = YES;
// fprintf(stderr," + scaling down input\n" );
readarg++;
}
//timecode range
if (strcasecmp(arg0, "timecode") == 0) {
self->useTimecodeForRange = YES;
self->firstframesize = 12*1024;
self->normalframesize = 4500;
if (self->mpegCropWidth == 0)
{
self->mpegCropWidth = 640;
}
if (self->mpegCropHeight == 0)
{
self->mpegCropHeight = 160;
}
if (self->mpegCropXOrigin == 0)
{
self->mpegCropXOrigin = (704-640)/2;
}
if (self->mpegCropYOrigin == 0)
{
self->mpegCropYOrigin = (240-160)/2 + 1; // just worked out that way for test mpegs
}
// fprintf(stderr," + Using timecode as range\n");
}
// soundfile for making a .RnR
if (strcasecmp(arg0, "sound") == 0) {
strcpy(self->soundfile,arg1);
self->hasSound = YES;
// fprintf(stderr," + Using timecode as range\n");
}
// soundfile for making a .RnR
if (strcasecmp(arg0, "has_sound") == 0) {
self->hasSound = YES;
}
// outfile
if (strcasecmp(arg0, "filename") == 0) {
strcpy( self->outputFilename, arg1 );
i = strlen(self->outputFilename);
if (self->outputFilename[i-3] == 'v' && self->outputFilename[i-2] == 'd' && self->outputFilename[i-1] == 'x') {
// fprintf(stderr,"correcting file extension to .RoQ\n");
self->outputFilename[i-3] = 'R';
self->outputFilename[i-2] = 'o';
self->outputFilename[i-1] = 'Q';
}
// fprintf(stderr," + output file is %s\n", self->outputFilename );
readarg++;
}
// starting palette
if (strcasecmp(arg0, "start_palette") == 0) {
sprintf(self->startPal, "/LocalLibrary/vdxPalettes/%s", arg1);
// fprintf(stderr," + starting palette is %s\n", self->startPal );
self->startPalette = YES;
readarg++;
}
// ending palette
if (strcasecmp(arg0, "end_palette") == 0) {
sprintf(self->endPal, "/LocalLibrary/vdxPalettes/%s", arg1);
// fprintf(stderr," + ending palette is %s\n", self->endPal );
self->endPalette = YES;
readarg++;
}
// fixed palette
if (strcasecmp(arg0, "fixed_palette") == 0) {
sprintf(self->startPal, "/LocalLibrary/vdxPalettes/%s", arg1);
// fprintf(stderr," + fixed palette is %s\n", self->startPal );
self->fixedPalette = YES;
readarg++;
}
// these are screen shots
if (strcasecmp(arg0, "screenshot") == 0) {
// fprintf(stderr," + shooting screen shots\n" );
self->screenShots = YES;
readarg++;
}
// key_color r g b
if (strcasecmp(arg0, "key_color") == 0) {
self->keyR = atoi(arg1);
self->keyG = atoi(arg2);
self->keyB = atoi(arg3);
self->keyColor = YES;
// fprintf(stderr," + key color is %03d %03d %03d\n", self->keyR, self->keyG, self->keyB );
readarg++;
}
// only want deltas
if (strcasecmp(arg0, "just_delta") == 0) {
// fprintf(stderr," + outputting deltas in the night\n" );
// self->justDelta = YES;
// self->justDeltaFlag = YES;
readarg++;
}
// makes codebook vector tables
if (strcasecmp(arg0, "codebook") == 0) {
self->makeVectors = YES;
readarg++;
}
// set first frame size
if (strcasecmp(arg0, "firstframesize") == 0) {
self->firstframesize = atoi( arg1 );
readarg++;
}
// set normal frame size
if (strcasecmp(arg0, "normalframesize") == 0) {
self->normalframesize = atoi( arg1 );
readarg++;
}
// set still frame quality
if (strcasecmp(arg0, "stillframequality") == 0) {
self->jpegDefault = atoi( arg1 );
readarg++;
}
// set fade down start frame
if (strcasecmp(arg0, "fadeDownStartFrame") == 0) {
self->fadeDownStartFrame = atoi( arg1 );
readarg++;
}
// set fade down duration
if (strcasecmp(arg0, "fadeDownDuration") == 0) {
self->fadeDownDuration = atoi( arg1 );
readarg++;
}
// set fade up start frame
if (strcasecmp(arg0, "fadeUpStartFrame") == 0) {
self->fadeUpStartFrame = atoi( arg1 );
readarg++;
}
// set fade up duration
if (strcasecmp(arg0, "fadeUpDuration") == 0) {
self->fadeUpDuration = atoi( arg1 );
readarg++;
}
// set mpeg crop width
if (strcasecmp(arg0, "mpegCropWidth") == 0) {
self->mpegCropWidth = atoi( arg1 );
readarg++;
}
// set mpeg crop height
if (strcasecmp(arg0, "mpegCropHeight") == 0) {
self->mpegCropHeight = atoi( arg1 );
readarg++;
}
// set mpeg x origin
if (strcasecmp(arg0, "mpegCropXOrigin") == 0) {
self->mpegCropXOrigin = atoi( arg1 );
readarg++;
}
// set mpeg y origin
if (strcasecmp(arg0, "mpegCropYOrigin") == 0) {
self->mpegCropYOrigin = atoi( arg1 );
readarg++;
}
// set frames per second
if (strcasecmp(arg0, "fps") == 0) {
self->fps = atoi( arg1 );
readarg++;
}
if (strcasecmp(arg0, "input") == 0) {
int num_files = 0;
long filepos = ftell( script_fp );
do {
fgets( buffer, 256, script_fp );
if (buffer[strlen(buffer)-2] == '\r') //strip \r
{
buffer[strlen(buffer)-2] = '\n';
buffer[strlen(buffer)-1] = '\0';
}
sscanf(buffer, "%s %s %s %s", arg0, arg1, arg2, arg3);
num_files++;
} while ( strcasecmp(arg0, "end_input") != 0 );
fseek( script_fp, filepos, SEEK_SET );
//printf("roqParam: reading %d lines from param file\n", num_files);
self->range = calloc( num_files, sizeof(int) );
self->padding = calloc( num_files, sizeof(BOOL) );
self->padding2 = calloc( num_files, sizeof(BOOL) );
self->skipnum = calloc( num_files, sizeof(int) );
self->skipnum2 = calloc( num_files, sizeof(int) );
self->startnum = calloc( num_files, sizeof(int) );
self->startnum2 = calloc( num_files, sizeof(int) );
self->endnum = calloc( num_files, sizeof(int) );
self->endnum2 = calloc( num_files, sizeof(int) );
self->numpadding = calloc( num_files, sizeof(int) );
self->numpadding2 = calloc( num_files ,sizeof(int) );
self->numfiles = calloc( num_files, sizeof(int) );
self->file = calloc( num_files, sizeof(char *) );
self->file2 = calloc( num_files, sizeof(char *) );
for(i=0;i<num_files;i++) {
self->file[i] = NULL;
self->file2[i] = NULL;
}
self->field = 0;
self->realnum = 0;
do {
buffer[0] = '\0';
arg0[0] = '\0';
arg1[0] = '\0';
arg2[0] = '\0';
arg3[0] = '\0';
fgets( buffer, 256, script_fp );
if (buffer[strlen(buffer)-2] == '\r') //strip \r
{
buffer[strlen(buffer)-2] = '\n';
buffer[strlen(buffer)-1] = '\0';
}
sscanf(buffer, "%s %s %s %s", arg0, arg1, arg2, arg3);
if ( arg0[0] && strcasecmp(arg0, "end_input") != 0 ) {
if ( !self->file[self->field] ) self->file[self->field] = calloc( MAXPATHLEN, sizeof(char) );
strcpy( self->file[self->field], arg0 );
if ( !arg1[0] ) {
// fprintf(stderr," + reading %s\n", self->file[self->field] );
self->range[self->field] = 0;
self->numfiles[self->field] = 1;
self->realnum++;
}
else {
if (arg1[0] == '[')
{
self->range[self->field] = 1;
if (self->useTimecodeForRange) {
self->realnum += parseTimecodeRange(arg1, self->field, self->skipnum, self->startnum, self->endnum, self->numfiles, self->padding, self->numpadding);
// fprintf(stderr," + reading %s from %d to %d\n", self->file[self->field], self->startnum[self->field], self->endnum[self->field]);
}
else {
self->realnum += parseRange(arg1, self->field, self->skipnum, self->startnum, self->endnum, self->numfiles, self->padding, self->numpadding);
// fprintf(stderr," + reading %s from %d to %d\n", self->file[self->field], self->startnum[self->field], self->endnum[self->field]);
}
}
else if (( arg1[0] != '[' ) && (arg2[0] == '[') && (arg3[0] =='[')) { //a double ranger...
int files1,files2;
if ( !self->file2[self->field] ) self->file2[self->field] = calloc( MAXPATHLEN, sizeof(char) );
strcpy(self->file2[self->field],arg1);
self->range[self->field] = 2;
files1 = parseRange(arg2, self->field, self->skipnum, self->startnum, self->endnum, self->numfiles, self->padding, self->numpadding);
// fprintf(stderr," + reading %s from %d to %d\n", self->file[self->field], self->startnum[self->field], self->endnum[self->field]);
files2 = parseRange(arg3, self->field, self->skipnum2, self->startnum2, self->endnum2, self->numfiles, self->padding2, self->numpadding2);
// fprintf(stderr," + reading %s from %d to %d\n", self->file2[self->field], self->startnum2[self->field], self->endnum2[self->field]);
if (files1 != files2) {
// fprintf(stderr,"You had %d files for %s and %d for %s!",files1,arg0,files2,arg1);
exit(1);
}
else {
self->realnum += files1;//not both, they are parallel
}
}
else {
fprintf(stderr,"Error: invalid range on open (%s %s %s)\n", arg1,arg2,arg3 );
exit(1);
}
} self->field++;
}
} while (strcasecmp(arg0, "end_input") != 0);
}
}while ( !feof( script_fp ) );
self->numInputFiles = self->realnum;
//fprintf(stderr," + reading a total of %d frames in %s\n", self->numInputFiles, self->currentPath );
fclose(script_fp);
if (self->mpegCropWidth == 0)
{
self->mpegCropWidth = 512;
}
if (self->mpegCropHeight == 0)
{
self->mpegCropHeight = 256;
}
if (self->mpegCropXOrigin == 0)
{
self->mpegCropXOrigin = (704-512)/2;
}
if (self->mpegCropYOrigin == 0)
{
self->mpegCropYOrigin = (480-256)/2 -2; // just worked out that way for test mpegs
}
return self;
}
void ParamGetCurrentRange(Param *self, int * start, int *end,int * skip,BOOL incr)
{
int i, myfield;
i = 0;
myfield = 0;
while (i <= self->onFrame) {
i += self->numfiles[myfield++];
}
myfield--;
i -= self->numfiles[myfield];
if ( self->range[myfield] == 1 ) {
*start = self->startnum[myfield];
*end = self->endnum[myfield];
*skip = self->skipnum[myfield];
if (incr)
{
self->onFrame += self->numfiles[myfield] -1;
}
}
}
void ParamGetNthInputFileName(Param *self, byte* fileName, int n)
{
int i, myfield, index,hrs,mins,secs,frs;
char tempfile[33], left[256], right[256], *strp;
if ( n > self->realnum ) n = self->realnum;
i = 0;
myfield = 0;
while (i <= n) {
i += self->numfiles[myfield++];
}
myfield--;
i -= self->numfiles[myfield];
if ( self->range[myfield] == 1 ) {
strcpy( left, self->file[myfield] );
strp = strstr( left, "*" );
*strp++ = 0;
sprintf(right, "%s", strp);
if ( self->startnum[myfield] <= self->endnum[myfield] ) {
index = self->startnum[myfield] + ((n-i)*self->skipnum[myfield]);
} else {
index = self->startnum[myfield] - ((n-i)*self->skipnum[myfield]);
}
if ( self->padding[myfield] == YES ) {
if (self->useTimecodeForRange) {
hrs = index/(30*60*60) ;
mins = (index/(30*60)) %60;
secs = (index/(30)) % 60;
frs = index % 30;
sprintf(fileName,"%s%.02d%.02d/%.02d%.02d%.02d%.02d%s",left,hrs,mins,hrs,mins,secs,frs,right);
}
else {
sprintf(tempfile, "%032d", index );
sprintf(fileName, "%s%s%s", left, &tempfile[ 32-self->numpadding[myfield] ], right );
}
} else {
if (self->useTimecodeForRange) {
hrs = index/(30*60*60) ;
mins = (index/(30*60)) %60;
secs = (index/(30)) % 60;
frs = index % 30;
sprintf(fileName,"%s%.02d%.02d/%.02d%.02d%.02d%.02d%s",left,hrs,mins,hrs,mins,secs,frs,right);
}
else {
sprintf(fileName, "%s%d%s", left, index, right );
}
}
} else if ( self->range[myfield] == 2 ) {
strcpy( left, self->file[myfield] );
strp = strstr( left, "*" );
*strp++ = 0;
sprintf(right, "%s", strp);
if ( self->startnum[myfield] <= self->endnum[myfield] ) {
index = self->startnum[myfield] + ((n-i)*self->skipnum[myfield]);
} else {
index = self->startnum[myfield] - ((n-i)*self->skipnum[myfield]);
}
if ( self->padding[myfield] == YES ) {
sprintf(tempfile, "%032d", index );
sprintf(fileName, "%s%s%s", left, &tempfile[ 32-self->numpadding[myfield] ], right );
} else {
sprintf(fileName, "%s%d%s", left, index, right );
}
strcpy( left, self->file2[myfield] );
strp = strstr( left, "*" );
*strp++ = 0;
sprintf(right, "%s", strp);
if ( self->startnum2[myfield] <= self->endnum2[myfield] ) {
index = self->startnum2[myfield] + ((n-i)*self->skipnum2[myfield]);
} else {
index = self->startnum2[myfield] - ((n-i)*self->skipnum2[myfield]);
}
if ( self->padding2[myfield] == YES ) {
sprintf(tempfile, "%032d", index );
sprintf(fileName+strlen(fileName), "\n%s%s%s", left, &tempfile[ 32-self->numpadding2[myfield] ], right );
} else {
sprintf(fileName+strlen(fileName), "\n%s%d%s", left, index, right );
}
} else {
strcpy( fileName, self->file[myfield] );
}
}
const char*ParamGetNextImageFilename(Param *self)
{
char tempBuffer[MAXPATHLEN*2+1];
char *hey;
ParamGetNthInputFileName(self, tempBuffer, self->onFrame++);
if ( self->justDeltaFlag == YES ) {
self->onFrame--;
self->justDeltaFlag = NO;
}
if ( self->addPath == YES ) {
sprintf(self->currentFile, "%s\\%s", self->currentPath, tempBuffer );
if (hey = strchr(self->currentFile,'\n')) //two files in there
{
*hey++ = '\0';
sprintf(tempBuffer,"%s\n%s\\%s",self->currentFile,self->currentPath,hey);
strcpy(self->currentFile,tempBuffer);
}
} else {
sprintf(self->currentFile, "%s", tempBuffer );
}
return self->currentFile;
}
const char *ParamRoqFilename(Param *self)
{
return self->outputFilename;
}
const char *ParamSoundFilename(Param *self)
{
return self->soundfile;
}
const char *ParamRoqTempFilename(Param *self)
{
unsigned int i, j;
j = 0;
for(i=0; i<strlen( self->outputFilename ); i++ ){
if ( self->outputFilename[i] == '/' ) j = i;
if ( self->outputFilename[i] == '\\' ) j = i;
}
#ifndef WIN32
sprintf(self->tempFilename, "/tmp/%s_temp", &self->outputFilename[j+1] );
#else
sprintf(self->tempFilename, "C:\\%s_temp", &self->outputFilename[j+1] );
#endif
return self->tempFilename;
}
int ParamMoveFile(Param *self)
{
char temp[MAXPATHLEN*2+10];
int res, mess;
FILE *test, *outfp;
byte *buffer;
sprintf(temp, "%s.bak",self->outputFilename );
if ((test=fopen(temp,"rb"))==NULL) {
if ((test=fopen(self->outputFilename,"rb"))!=NULL) {
fclose(test);
fprintf(stderr,"file %s does not exist, making backup\n", temp);
sprintf(temp, "%s.bak", self->outputFilename );
res = rename( self->outputFilename, temp );
if (res)
{
fprintf(stderr,"%s\rename returned non-zero status: %d\n",temp,res);
}
}
} else {
fclose(test);
}
#define BUFFER_COPY_SIZE (1024*1024)
buffer = malloc( BUFFER_COPY_SIZE );
if (!buffer) {
fprintf(stderr,"malloc failed moving %s\n",self->tempFilename);
exit(1);
}
test = fopen( self->tempFilename, "rb" );
outfp = fopen( self->outputFilename, "wb" );
if (!test||!outfp) {
fprintf(stderr,"fopen could not open files\n");
exit(1);
}
do {
res = fread( buffer, 1, BUFFER_COPY_SIZE, test);
mess = fwrite( buffer, 1, res, outfp );
if (res != mess) {
fprintf(stderr, "Could not write to output stream %s\n",self->outputFilename);
exit(1);
}
} while ( res == BUFFER_COPY_SIZE );
fclose( test );
fclose( outfp );
unlink( self->tempFilename );
free( buffer );
return 1;
}
BOOL ParamTimecode(Param *self)
{
return self->useTimecodeForRange;
}
BOOL outputVectors(Param *self)
{
return self->makeVectors;
}
BOOL ParamHasSound(Param *self)
{
return self->hasSound;
}
BOOL ParamDeltaFrames(Param *self)
{
return self->justDelta;
}
BOOL ParamNoAlpha(Param *self)
{
return self->noAlphaAtAll;
}
BOOL ParamSearchType(Param *self)
{
return self->fullSearch;
}
BOOL ParamMoreFrames(Param *self)
{
if (self->onFrame < self->numInputFiles) {
return YES;
} else {
return NO;
}
}
int ParamNumberOfFrames(Param *self)
{
return self->numInputFiles;
}
int ParamFirstframesize(Param *self)
{
return self->firstframesize;
}
int ParamNormalframesize(Param *self)
{
return self->normalframesize;
}
BOOL ParamScaleDown(Param *self)
{
return self->scaleDown;
}
BOOL ParamIsScaleable(Param *self)
{
return self->isScaleable;
}
int ParamJpegQuality(Param *self)
{
return self->jpegDefault;
}
int ParamMpegCropWidth(Param *self)
{
return self->mpegCropWidth;
}
int ParamMpegCropHeight(Param *self)
{
return self->mpegCropHeight;
}
int ParamMpegCropXOrigin(Param *self)
{
return self->mpegCropXOrigin;
}
int ParamMpegCropYOrigin(Param *self)
{
return self->mpegCropYOrigin;
}
double ParamFadeFromFrame(Param *self, int frame)
{
double currentFade = 1.0;
int framesIntoFade = 0;
if (frame >= self->fadeDownStartFrame)
{
framesIntoFade = frame - self->fadeDownStartFrame;
if (framesIntoFade >= self->fadeDownDuration)
{
currentFade = 0.0;
}
else
{
if (self->fadeDownDuration == 0)
{
currentFade = 0.0;// a zero frame fade
}
else
{
currentFade = 1.0 - (double) framesIntoFade/ (double) self->fadeDownDuration;
}
}
}
else if ((frame < self->fadeUpStartFrame))
{
currentFade = 0.0;
}
else if (frame >= self->fadeUpStartFrame)
{
framesIntoFade = frame - self->fadeUpStartFrame;
if (framesIntoFade >= self->fadeUpDuration)
{
currentFade = 1.0;
}
else
{
if (self->fadeUpDuration == 0)
{
currentFade = 1.0;// a zero frame fade
}
else
{
currentFade = (double) framesIntoFade/ (double) self->fadeUpDuration;
}
}
}
return currentFade;
}
int parseRange(char *rangeStr,int field, int skipnum[], int startnum[], int endnum[],int numfiles[],BOOL padding[],int numpadding[] )
{
char start[64], end[64], skip[64];
char *stptr, *enptr, *skptr;
int i,realnum;
i = 1;
realnum = 0;
stptr = start;
enptr = end;
skptr = skip;
do {
*stptr++ = rangeStr[i++];
} while ( rangeStr[i] >= '0' && rangeStr[i] <= '9' );
*stptr = '\0';
if ( rangeStr[i++] != '-' ) {
fprintf(stderr,"Error: invalid range on middle \n");
exit(1);
}
do {
*enptr++ = rangeStr[i++];
} while ( rangeStr[i] >= '0' && rangeStr[i] <= '9' );
*enptr = '\0';
if ( rangeStr[i] != ']' ) {
if ( rangeStr[i++] != '+' ) {
fprintf(stderr,"Error: invalid range on close\n");
exit(1);
}
do {
*skptr++ = rangeStr[i++];
} while ( rangeStr[i] >= '0' && rangeStr[i] <= '9' );
*skptr = '\0';
skipnum[field] = atoi( skip );
} else {
skipnum[field] = 1;
}
startnum[field] = atoi( start );
endnum[field] = atoi( end );
numfiles[field] = (abs( startnum[field] - endnum[field] ) / skipnum[field]) + 1;
realnum += numfiles[field];
if ( start[0] == '0' && start[1] != '\0' ) {
padding[field] = YES;
numpadding[field] = strlen( start );
} else {
padding[field] = NO;
}
return realnum;
}
int parseTimecodeRange(char *rangeStr,int field, int skipnum[], int startnum[], int endnum[],int numfiles[],BOOL padding[],int numpadding[] )
{
char start[64], end[64], skip[64];
char *stptr, *enptr, *skptr;
int i,realnum,hrs,mins,secs,frs;
i = 1;//skip the '['
realnum = 0;
stptr = start;
enptr = end;
skptr = skip;
do {
*stptr++ = rangeStr[i++];
} while ( rangeStr[i] >= '0' && rangeStr[i] <= '9' );
*stptr = '\0';
if ( rangeStr[i++] != '-' ) {
fprintf(stderr,"Error: invalid range on middle \n");
exit(1);
}
do {
*enptr++ = rangeStr[i++];
} while ( rangeStr[i] >= '0' && rangeStr[i] <= '9' );
*enptr = '\0';
if ( rangeStr[i] != ']' ) {
if ( rangeStr[i++] != '+' ) {
fprintf(stderr,"Error: invalid range on close\n");
exit(1);
}
do {
*skptr++ = rangeStr[i++];
} while ( rangeStr[i] >= '0' && rangeStr[i] <= '9' );
*skptr = '\0';
skipnum[field] = atoi( skip );
} else {
skipnum[field] = 1;
}
sscanf(start,"%2d%2d%2d%2d",&hrs,&mins,&secs,&frs);
startnum[field] = hrs*30*60*60 + mins *60*30 + secs*30 +frs;
sscanf(end,"%2d%2d%2d%2d",&hrs,&mins,&secs,&frs);
endnum[field] = hrs*30*60*60 + mins *60*30 + secs*30 +frs;
numfiles[field] = (abs( startnum[field] - endnum[field] ) / skipnum[field]) + 1;
realnum += numfiles[field];
if ( start[0] == '0' && start[1] != '\0' ) {
padding[field] = YES;
numpadding[field] = strlen( start );
} else {
padding[field] = NO;
}
return realnum;
}