| |
| |
| #include "casmfileinfo.h" |
| |
| namespace { |
| |
| |
| |
| #include <stdlib.h> |
| #include <stdio.h> |
| #include <string.h> |
| |
| |
| |
| #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++; \ |
| } |
| |
| |
| |
| #ifdef WIN32 |
| #include <stdlib.h> |
| #define TOONZMAXPATHLEN _MAX_PATH |
| #else |
| #include <sys/param.h> |
| #define TOONZMAXPATHLEN MAXPATHLEN |
| #endif |
| |
| |
| |
| 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)); |
| } |
| |
| |
| |
| 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; |
| } |
| } |
| |
| |
| |
| CasmFileInfo::CasmFileInfo(const TFilePath &fp) : m_fp(fp) {} |
| |
| |
| |
| void CasmFileInfo::getFrameRange(int &startFrame, int &endFrame, |
| bool &interlaced) { |
| int rc = compute_casm_range(toString(m_fp.getWideString()).c_str(), |
| startFrame, endFrame, interlaced); |
| } |
| |