2016-03-19 06:57:51 +13:00
|
|
|
|
|
|
|
|
|
|
|
#include "casmfileinfo.h"
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
namespace {
|
2016-03-19 06:57:51 +13:00
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
#define SKIP_BLANKS(s) \
|
|
|
|
{ \
|
|
|
|
while (*s && (*s == ' ' || *s == '\t') && *s != 10 && *s != 13) s++; \
|
|
|
|
}
|
|
|
|
|
|
|
|
#define GET_WORD(s, p) \
|
|
|
|
{ \
|
|
|
|
while (*s && *s != ' ' && *s != '\t' && *s != 10 && *s != 13) \
|
|
|
|
*(p++) = *(s++); \
|
|
|
|
*p = '\0'; \
|
|
|
|
}
|
|
|
|
|
|
|
|
#define SKIP_WORD(s) \
|
|
|
|
{ \
|
|
|
|
while (*s && *s != ' ' && *s != '\t' && *s != 10 && *s != 13) s++; \
|
|
|
|
}
|
2016-03-19 06:57:51 +13:00
|
|
|
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
#ifdef WIN32
|
|
|
|
#include <stdlib.h>
|
|
|
|
#define TOONZMAXPATHLEN _MAX_PATH
|
|
|
|
#else
|
|
|
|
#include <sys/param.h>
|
|
|
|
#define TOONZMAXPATHLEN MAXPATHLEN
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
int get_frame_number(char *s) {
|
|
|
|
int j, i = 0;
|
|
|
|
while (s[i] && (s[i] < '0' || s[i] > '9')) i++;
|
|
|
|
if (!s[i]) return 0;
|
|
|
|
j = i;
|
|
|
|
while (s[i] && (s[i] >= '0' && s[i] <= '9')) i++;
|
|
|
|
s[i] = '\0';
|
|
|
|
|
|
|
|
return (atoi(s + j));
|
2016-03-19 06:57:51 +13:00
|
|
|
}
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
int compute_casm_range(const char *filename, int &start, int &end,
|
|
|
|
bool &interlaced) {
|
|
|
|
FILE *fp;
|
|
|
|
bool first_flag = true;
|
|
|
|
int cnt, frame = 1;
|
|
|
|
char buffer[TOONZMAXPATHLEN], *s;
|
|
|
|
|
|
|
|
start = 0;
|
|
|
|
end = 0;
|
|
|
|
interlaced = false;
|
|
|
|
|
|
|
|
if (filename)
|
|
|
|
fp = fopen(filename, "r");
|
|
|
|
else
|
|
|
|
fp = fdopen(0, "r");
|
|
|
|
|
|
|
|
if (!fp) return 0;
|
|
|
|
|
|
|
|
cnt = 0;
|
|
|
|
|
|
|
|
while (fgets(buffer, TOONZMAXPATHLEN, fp)) {
|
|
|
|
s = buffer;
|
|
|
|
SKIP_BLANKS(s)
|
|
|
|
if (strncmp(s, "FRAME", 5) == 0) {
|
|
|
|
frame = get_frame_number(s);
|
|
|
|
if (first_flag) {
|
|
|
|
start = frame;
|
|
|
|
first_flag = false;
|
|
|
|
}
|
|
|
|
cnt++;
|
|
|
|
} else if (strncmp(s, "FIELD", 5) == 0)
|
|
|
|
interlaced = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!first_flag)
|
|
|
|
end = frame;
|
|
|
|
else {
|
|
|
|
start = 0;
|
|
|
|
end = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (fp != stdin) fclose(fp);
|
|
|
|
|
|
|
|
if (interlaced) {
|
|
|
|
start = ((start) + 1) / 2;
|
|
|
|
end = ((end) + 1) / 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
return cnt;
|
2016-03-19 06:57:51 +13:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
CasmFileInfo::CasmFileInfo(const TFilePath &fp) : m_fp(fp) {}
|
2016-03-19 06:57:51 +13:00
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
void CasmFileInfo::getFrameRange(int &startFrame, int &endFrame,
|
|
|
|
bool &interlaced) {
|
|
|
|
int rc = compute_casm_range(toString(m_fp.getWideString()).c_str(),
|
|
|
|
startFrame, endFrame, interlaced);
|
2016-03-19 06:57:51 +13:00
|
|
|
}
|