[x265] [PATCH] input: change from ifstream to stdio stream
Mateusz Brzostek
mateusz at msystem.waw.pl
Sun Apr 30 13:54:32 CEST 2017
This patch fixes issue #341 and allows Unicode filenames in Windows.
Please review.
# HG changeset patch
# User Ma0 <mateuszb at poczta.onet.pl>
# Date 1493552587 -7200
# Sun Apr 30 13:43:07 2017 +0200
# Node ID 0c7e08be80975e4b52f6c8aabe95d3b817d6723d
# Parent 5bc5e73760cdb61d2674e74cc52149fa0603af8a
input: change from ifstream to stdio stream
diff -r 5bc5e73760cd -r 0c7e08be8097 source/common/common.h
--- a/source/common/common.h Sat Apr 22 17:00:28 2017 -0700
+++ b/source/common/common.h Sun Apr 30 13:43:07 2017 +0200
@@ -78,6 +78,7 @@
#if defined(__MINGW32__)
#define fseeko fseeko64
+#define ftello ftello64
#endif
#elif defined(_MSC_VER)
@@ -87,6 +88,7 @@
#define ALIGN_VAR_16(T, var) __declspec(align(16)) T var
#define ALIGN_VAR_32(T, var) __declspec(align(32)) T var
#define fseeko _fseeki64
+#define ftello _ftelli64
#endif // if defined(__GNUC__)
diff -r 5bc5e73760cd -r 0c7e08be8097 source/input/y4m.cpp
--- a/source/input/y4m.cpp Sat Apr 22 17:00:28 2017 -0700
+++ b/source/input/y4m.cpp Sun Apr 30 13:43:07 2017 +0200
@@ -60,15 +60,15 @@
ifs = NULL;
if (!strcmp(info.filename, "-"))
{
- ifs = &cin;
+ ifs = stdin;
#if _WIN32
setmode(fileno(stdin), O_BINARY);
#endif
}
else
- ifs = new ifstream(info.filename, ios::binary | ios::in);
+ ifs = x265_fopen(info.filename, "rb");
- if (ifs && ifs->good() && parseHeader())
+ if (ifs && !ferror(ifs) && parseHeader())
{
int pixelbytes = depth > 8 ? 2 : 1;
for (int i = 0; i < x265_cli_csps[colorSpace].planes; i++)
@@ -91,8 +91,8 @@
}
if (!threadActive)
{
- if (ifs && ifs != &cin)
- delete ifs;
+ if (ifs && ifs != stdin)
+ fclose(ifs);
ifs = NULL;
return;
}
@@ -110,56 +110,35 @@
size_t estFrameSize = framesize + strlen(header) + 1; /* assume basic FRAME\n headers */
/* try to estimate frame count, if this is not stdin */
- if (ifs != &cin)
+ if (ifs != stdin)
{
- istream::pos_type cur = ifs->tellg();
+ int64_t cur = ftello(ifs);
-#if defined(_MSC_VER) && _MSC_VER < 1700
- /* Older MSVC versions cannot handle 64bit file sizes properly, so go native */
- HANDLE hFile = CreateFileA(info.filename, GENERIC_READ,
- FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
- FILE_ATTRIBUTE_NORMAL, NULL);
- if (hFile != INVALID_HANDLE_VALUE)
- {
- LARGE_INTEGER size;
- if (GetFileSizeEx(hFile, &size))
- info.frameCount = (int)((size.QuadPart - (int64_t)cur) / estFrameSize);
- CloseHandle(hFile);
- }
-#else // if defined(_MSC_VER) && _MSC_VER < 1700
if (cur >= 0)
{
- ifs->seekg(0, ios::end);
- istream::pos_type size = ifs->tellg();
- ifs->seekg(cur, ios::beg);
+ fseeko(ifs, 0, SEEK_END);
+ int64_t size = ftello(ifs);
+ fseeko(ifs, cur, SEEK_SET);
if (size > 0)
info.frameCount = (int)((size - cur) / estFrameSize);
}
-#endif // if defined(_MSC_VER) && _MSC_VER < 1700
}
if (info.skipFrames)
{
-#if X86_64
- if (ifs != &cin)
- ifs->seekg((uint64_t)estFrameSize * info.skipFrames, ios::cur);
+ if (ifs != stdin)
+ fseeko(ifs, (int64_t)estFrameSize * info.skipFrames, SEEK_CUR);
else
for (int i = 0; i < info.skipFrames; i++)
- {
- ifs->read(buf[0], estFrameSize - framesize);
- ifs->read(buf[0], framesize);
- }
-#else
- for (int i = 0; i < info.skipFrames; i++)
- ifs->ignore(estFrameSize);
-#endif
+ if (fread(buf[0], estFrameSize - framesize, 1, ifs) + fread(buf[0], framesize, 1, ifs) != 2)
+ break;
}
}
Y4MInput::~Y4MInput()
{
- if (ifs && ifs != &cin)
- delete ifs;
+ if (ifs && ifs != stdin)
+ fclose(ifs);
for (int i = 0; i < QUEUE_SIZE; i++)
X265_FREE(buf[i]);
@@ -181,24 +160,22 @@
int csp = 0;
int d = 0;
- while (ifs->good())
+ int c;
+ while ((c = fgetc(ifs)) != EOF)
{
// Skip Y4MPEG string
- int c = ifs->get();
- while (ifs->good() && (c != ' ') && (c != '\n'))
- c = ifs->get();
+ while ((c != EOF) && (c != ' ') && (c != '\n'))
+ c = fgetc(ifs);
- while (c == ' ' && ifs->good())
+ while (c == ' ')
{
// read parameter identifier
- switch (ifs->get())
+ switch (fgetc(ifs))
{
case 'W':
width = 0;
- while (ifs->good())
+ while ((c = fgetc(ifs)) != EOF)
{
- c = ifs->get();
-
if (c == ' ' || c == '\n')
break;
else
@@ -208,9 +185,8 @@
case 'H':
height = 0;
- while (ifs->good())
+ while ((c = fgetc(ifs)) != EOF)
{
- c = ifs->get();
if (c == ' ' || c == '\n')
break;
else
@@ -221,15 +197,13 @@
case 'F':
rateNum = 0;
rateDenom = 0;
- while (ifs->good())
+ while ((c = fgetc(ifs)) != EOF)
{
- c = ifs->get();
if (c == '.')
{
rateDenom = 1;
- while (ifs->good())
+ while ((c = fgetc(ifs)) != EOF)
{
- c = ifs->get();
if (c == ' ' || c == '\n')
break;
else
@@ -242,9 +216,8 @@
}
else if (c == ':')
{
- while (ifs->good())
+ while ((c = fgetc(ifs)) != EOF)
{
- c = ifs->get();
if (c == ' ' || c == '\n')
break;
else
@@ -260,14 +233,12 @@
case 'A':
sarWidth = 0;
sarHeight = 0;
- while (ifs->good())
+ while ((c = fgetc(ifs)) != EOF)
{
- c = ifs->get();
if (c == ':')
{
- while (ifs->good())
+ while ((c = fgetc(ifs)) != EOF)
{
- c = ifs->get();
if (c == ' ' || c == '\n')
break;
else
@@ -283,19 +254,15 @@
case 'C':
csp = 0;
d = 0;
- while (ifs->good())
+ while ((c = fgetc(ifs)) != EOF)
{
- c = ifs->get();
-
if (c <= 'o' && c >= '0')
csp = csp * 10 + (c - '0');
else if (c == 'p')
{
// example: C420p16
- while (ifs->good())
+ while ((c = fgetc(ifs)) != EOF)
{
- c = ifs->get();
-
if (c <= '9' && c >= '0')
d = d * 10 + (c - '0');
else
@@ -327,10 +294,9 @@
break;
default:
- while (ifs->good())
+ while ((c = fgetc(ifs)) != EOF)
{
// consume this unsupported configuration word
- c = ifs->get();
if (c == ' ' || c == '\n')
break;
}
@@ -375,26 +341,24 @@
bool Y4MInput::populateFrameQueue()
{
- if (!ifs || ifs->fail())
+ if (!ifs || ferror(ifs))
return false;
/* strip off the FRAME header */
char hbuf[sizeof(header)];
- ifs->read(hbuf, strlen(header));
- if (ifs->eof())
- return false;
-
- if (!ifs->good() || memcmp(hbuf, header, strlen(header)))
+ if (fread(hbuf, strlen(header), 1, ifs) != 1 || memcmp(hbuf, header, strlen(header)))
{
- x265_log(NULL, X265_LOG_ERROR, "y4m: frame header missing\n");
+ if (!feof(ifs))
+ x265_log(NULL, X265_LOG_ERROR, "y4m: frame header missing\n");
return false;
}
/* consume bytes up to line feed */
- int c = ifs->get();
- while (c != '\n' && ifs->good())
- c = ifs->get();
+ int c;
+ while ((c = fgetc(ifs)) != EOF)
+ if (c == '\n')
+ break;
/* wait for room in the ring buffer */
int written = writeCount.get();
@@ -407,8 +371,7 @@
}
ProfileScopeEvent(frameRead);
- ifs->read(buf[written % QUEUE_SIZE], framesize);
- if (ifs->good())
+ if (fread(buf[written % QUEUE_SIZE], framesize, 1, ifs) == 1)
{
writeCount.incr();
return true;
diff -r 5bc5e73760cd -r 0c7e08be8097 source/input/y4m.h
--- a/source/input/y4m.h Sat Apr 22 17:00:28 2017 -0700
+++ b/source/input/y4m.h Sun Apr 30 13:43:07 2017 +0200
@@ -63,7 +63,7 @@
char* buf[QUEUE_SIZE];
- std::istream *ifs;
+ FILE *ifs;
bool parseHeader();
@@ -79,9 +79,9 @@
void release();
- bool isEof() const { return ifs && ifs->eof(); }
+ bool isEof() const { return ifs && feof(ifs); }
- bool isFail() { return !(ifs && !ifs->fail() && threadActive); }
+ bool isFail() { return !(ifs && !ferror(ifs) && threadActive); }
void startReader();
diff -r 5bc5e73760cd -r 0c7e08be8097 source/input/yuv.cpp
--- a/source/input/yuv.cpp Sat Apr 22 17:00:28 2017 -0700
+++ b/source/input/yuv.cpp Sun Apr 30 13:43:07 2017 +0200
@@ -68,20 +68,20 @@
if (!strcmp(info.filename, "-"))
{
- ifs = &cin;
+ ifs = stdin;
#if _WIN32
setmode(fileno(stdin), O_BINARY);
#endif
}
else
- ifs = new ifstream(info.filename, ios::binary | ios::in);
+ ifs = x265_fopen(info.filename, "rb");
- if (ifs && ifs->good())
+ if (ifs && !ferror(ifs))
threadActive = true;
else
{
- if (ifs && ifs != &cin)
- delete ifs;
+ if (ifs && ifs != stdin)
+ fclose(ifs);
ifs = NULL;
return;
}
@@ -100,53 +100,35 @@
info.frameCount = -1;
/* try to estimate frame count, if this is not stdin */
- if (ifs != &cin)
+ if (ifs != stdin)
{
- istream::pos_type cur = ifs->tellg();
+ int64_t cur = ftello(ifs);
-#if defined(_MSC_VER) && _MSC_VER < 1700
- /* Older MSVC versions cannot handle 64bit file sizes properly, so go native */
- HANDLE hFile = CreateFileA(info.filename, GENERIC_READ,
- FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
- FILE_ATTRIBUTE_NORMAL, NULL);
- if (hFile != INVALID_HANDLE_VALUE)
- {
- LARGE_INTEGER size;
- if (GetFileSizeEx(hFile, &size))
- info.frameCount = (int)((size.QuadPart - (int64_t)cur) / framesize);
- CloseHandle(hFile);
- }
-#else // if defined(_MSC_VER) && _MSC_VER < 1700
if (cur >= 0)
{
- ifs->seekg(0, ios::end);
- istream::pos_type size = ifs->tellg();
- ifs->seekg(cur, ios::beg);
+ fseeko(ifs, 0, SEEK_END);
+ int64_t size = ftello(ifs);
+ fseeko(ifs, cur, SEEK_SET);
if (size > 0)
info.frameCount = (int)((size - cur) / framesize);
}
-#endif // if defined(_MSC_VER) && _MSC_VER < 1700
}
if (info.skipFrames)
{
-#if X86_64
- if (ifs != &cin)
- ifs->seekg((uint64_t)framesize * info.skipFrames, ios::cur);
+ if (ifs != stdin)
+ fseeko(ifs, (int64_t)framesize * info.skipFrames, SEEK_CUR);
else
for (int i = 0; i < info.skipFrames; i++)
- ifs->read(buf[0], framesize);
-#else
- for (int i = 0; i < info.skipFrames; i++)
- ifs->ignore(framesize);
-#endif
+ if (fread(buf[0], framesize, 1, ifs) != 1)
+ break;
}
}
YUVInput::~YUVInput()
{
- if (ifs && ifs != &cin)
- delete ifs;
+ if (ifs && ifs != stdin)
+ fclose(ifs);
for (int i = 0; i < QUEUE_SIZE; i++)
X265_FREE(buf[i]);
}
@@ -182,7 +164,7 @@
bool YUVInput::populateFrameQueue()
{
- if (!ifs || ifs->fail())
+ if (!ifs || ferror(ifs))
return false;
/* wait for room in the ring buffer */
@@ -197,8 +179,7 @@
}
ProfileScopeEvent(frameRead);
- ifs->read(buf[written % QUEUE_SIZE], framesize);
- if (ifs->good())
+ if (fread(buf[written % QUEUE_SIZE], framesize, 1, ifs) == 1)
{
writeCount.incr();
return true;
diff -r 5bc5e73760cd -r 0c7e08be8097 source/input/yuv.h
--- a/source/input/yuv.h Sat Apr 22 17:00:28 2017 -0700
+++ b/source/input/yuv.h Sun Apr 30 13:43:07 2017 +0200
@@ -55,7 +55,7 @@
char* buf[QUEUE_SIZE];
- std::istream *ifs;
+ FILE *ifs;
int guessFrameCount();
@@ -71,9 +71,9 @@
void release();
- bool isEof() const { return ifs && ifs->eof(); }
+ bool isEof() const { return ifs && feof(ifs); }
- bool isFail() { return !(ifs && !ifs->fail() && threadActive); }
+ bool isFail() { return !(ifs && !ferror(ifs) && threadActive); }
void startReader();
-------------- next part --------------
# HG changeset patch
# User Ma0 <mateuszb at poczta.onet.pl>
# Date 1493552587 -7200
# Sun Apr 30 13:43:07 2017 +0200
# Node ID 0c7e08be80975e4b52f6c8aabe95d3b817d6723d
# Parent 5bc5e73760cdb61d2674e74cc52149fa0603af8a
input: change from ifstream to stdio stream
diff -r 5bc5e73760cd -r 0c7e08be8097 source/common/common.h
--- a/source/common/common.h Sat Apr 22 17:00:28 2017 -0700
+++ b/source/common/common.h Sun Apr 30 13:43:07 2017 +0200
@@ -78,6 +78,7 @@
#if defined(__MINGW32__)
#define fseeko fseeko64
+#define ftello ftello64
#endif
#elif defined(_MSC_VER)
@@ -87,6 +88,7 @@
#define ALIGN_VAR_16(T, var) __declspec(align(16)) T var
#define ALIGN_VAR_32(T, var) __declspec(align(32)) T var
#define fseeko _fseeki64
+#define ftello _ftelli64
#endif // if defined(__GNUC__)
diff -r 5bc5e73760cd -r 0c7e08be8097 source/input/y4m.cpp
--- a/source/input/y4m.cpp Sat Apr 22 17:00:28 2017 -0700
+++ b/source/input/y4m.cpp Sun Apr 30 13:43:07 2017 +0200
@@ -60,15 +60,15 @@
ifs = NULL;
if (!strcmp(info.filename, "-"))
{
- ifs = &cin;
+ ifs = stdin;
#if _WIN32
setmode(fileno(stdin), O_BINARY);
#endif
}
else
- ifs = new ifstream(info.filename, ios::binary | ios::in);
+ ifs = x265_fopen(info.filename, "rb");
- if (ifs && ifs->good() && parseHeader())
+ if (ifs && !ferror(ifs) && parseHeader())
{
int pixelbytes = depth > 8 ? 2 : 1;
for (int i = 0; i < x265_cli_csps[colorSpace].planes; i++)
@@ -91,8 +91,8 @@
}
if (!threadActive)
{
- if (ifs && ifs != &cin)
- delete ifs;
+ if (ifs && ifs != stdin)
+ fclose(ifs);
ifs = NULL;
return;
}
@@ -110,56 +110,35 @@
size_t estFrameSize = framesize + strlen(header) + 1; /* assume basic FRAME\n headers */
/* try to estimate frame count, if this is not stdin */
- if (ifs != &cin)
+ if (ifs != stdin)
{
- istream::pos_type cur = ifs->tellg();
+ int64_t cur = ftello(ifs);
-#if defined(_MSC_VER) && _MSC_VER < 1700
- /* Older MSVC versions cannot handle 64bit file sizes properly, so go native */
- HANDLE hFile = CreateFileA(info.filename, GENERIC_READ,
- FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
- FILE_ATTRIBUTE_NORMAL, NULL);
- if (hFile != INVALID_HANDLE_VALUE)
- {
- LARGE_INTEGER size;
- if (GetFileSizeEx(hFile, &size))
- info.frameCount = (int)((size.QuadPart - (int64_t)cur) / estFrameSize);
- CloseHandle(hFile);
- }
-#else // if defined(_MSC_VER) && _MSC_VER < 1700
if (cur >= 0)
{
- ifs->seekg(0, ios::end);
- istream::pos_type size = ifs->tellg();
- ifs->seekg(cur, ios::beg);
+ fseeko(ifs, 0, SEEK_END);
+ int64_t size = ftello(ifs);
+ fseeko(ifs, cur, SEEK_SET);
if (size > 0)
info.frameCount = (int)((size - cur) / estFrameSize);
}
-#endif // if defined(_MSC_VER) && _MSC_VER < 1700
}
if (info.skipFrames)
{
-#if X86_64
- if (ifs != &cin)
- ifs->seekg((uint64_t)estFrameSize * info.skipFrames, ios::cur);
+ if (ifs != stdin)
+ fseeko(ifs, (int64_t)estFrameSize * info.skipFrames, SEEK_CUR);
else
for (int i = 0; i < info.skipFrames; i++)
- {
- ifs->read(buf[0], estFrameSize - framesize);
- ifs->read(buf[0], framesize);
- }
-#else
- for (int i = 0; i < info.skipFrames; i++)
- ifs->ignore(estFrameSize);
-#endif
+ if (fread(buf[0], estFrameSize - framesize, 1, ifs) + fread(buf[0], framesize, 1, ifs) != 2)
+ break;
}
}
Y4MInput::~Y4MInput()
{
- if (ifs && ifs != &cin)
- delete ifs;
+ if (ifs && ifs != stdin)
+ fclose(ifs);
for (int i = 0; i < QUEUE_SIZE; i++)
X265_FREE(buf[i]);
@@ -181,24 +160,22 @@
int csp = 0;
int d = 0;
- while (ifs->good())
+ int c;
+ while ((c = fgetc(ifs)) != EOF)
{
// Skip Y4MPEG string
- int c = ifs->get();
- while (ifs->good() && (c != ' ') && (c != '\n'))
- c = ifs->get();
+ while ((c != EOF) && (c != ' ') && (c != '\n'))
+ c = fgetc(ifs);
- while (c == ' ' && ifs->good())
+ while (c == ' ')
{
// read parameter identifier
- switch (ifs->get())
+ switch (fgetc(ifs))
{
case 'W':
width = 0;
- while (ifs->good())
+ while ((c = fgetc(ifs)) != EOF)
{
- c = ifs->get();
-
if (c == ' ' || c == '\n')
break;
else
@@ -208,9 +185,8 @@
case 'H':
height = 0;
- while (ifs->good())
+ while ((c = fgetc(ifs)) != EOF)
{
- c = ifs->get();
if (c == ' ' || c == '\n')
break;
else
@@ -221,15 +197,13 @@
case 'F':
rateNum = 0;
rateDenom = 0;
- while (ifs->good())
+ while ((c = fgetc(ifs)) != EOF)
{
- c = ifs->get();
if (c == '.')
{
rateDenom = 1;
- while (ifs->good())
+ while ((c = fgetc(ifs)) != EOF)
{
- c = ifs->get();
if (c == ' ' || c == '\n')
break;
else
@@ -242,9 +216,8 @@
}
else if (c == ':')
{
- while (ifs->good())
+ while ((c = fgetc(ifs)) != EOF)
{
- c = ifs->get();
if (c == ' ' || c == '\n')
break;
else
@@ -260,14 +233,12 @@
case 'A':
sarWidth = 0;
sarHeight = 0;
- while (ifs->good())
+ while ((c = fgetc(ifs)) != EOF)
{
- c = ifs->get();
if (c == ':')
{
- while (ifs->good())
+ while ((c = fgetc(ifs)) != EOF)
{
- c = ifs->get();
if (c == ' ' || c == '\n')
break;
else
@@ -283,19 +254,15 @@
case 'C':
csp = 0;
d = 0;
- while (ifs->good())
+ while ((c = fgetc(ifs)) != EOF)
{
- c = ifs->get();
-
if (c <= 'o' && c >= '0')
csp = csp * 10 + (c - '0');
else if (c == 'p')
{
// example: C420p16
- while (ifs->good())
+ while ((c = fgetc(ifs)) != EOF)
{
- c = ifs->get();
-
if (c <= '9' && c >= '0')
d = d * 10 + (c - '0');
else
@@ -327,10 +294,9 @@
break;
default:
- while (ifs->good())
+ while ((c = fgetc(ifs)) != EOF)
{
// consume this unsupported configuration word
- c = ifs->get();
if (c == ' ' || c == '\n')
break;
}
@@ -375,26 +341,24 @@
bool Y4MInput::populateFrameQueue()
{
- if (!ifs || ifs->fail())
+ if (!ifs || ferror(ifs))
return false;
/* strip off the FRAME header */
char hbuf[sizeof(header)];
- ifs->read(hbuf, strlen(header));
- if (ifs->eof())
- return false;
-
- if (!ifs->good() || memcmp(hbuf, header, strlen(header)))
+ if (fread(hbuf, strlen(header), 1, ifs) != 1 || memcmp(hbuf, header, strlen(header)))
{
- x265_log(NULL, X265_LOG_ERROR, "y4m: frame header missing\n");
+ if (!feof(ifs))
+ x265_log(NULL, X265_LOG_ERROR, "y4m: frame header missing\n");
return false;
}
/* consume bytes up to line feed */
- int c = ifs->get();
- while (c != '\n' && ifs->good())
- c = ifs->get();
+ int c;
+ while ((c = fgetc(ifs)) != EOF)
+ if (c == '\n')
+ break;
/* wait for room in the ring buffer */
int written = writeCount.get();
@@ -407,8 +371,7 @@
}
ProfileScopeEvent(frameRead);
- ifs->read(buf[written % QUEUE_SIZE], framesize);
- if (ifs->good())
+ if (fread(buf[written % QUEUE_SIZE], framesize, 1, ifs) == 1)
{
writeCount.incr();
return true;
diff -r 5bc5e73760cd -r 0c7e08be8097 source/input/y4m.h
--- a/source/input/y4m.h Sat Apr 22 17:00:28 2017 -0700
+++ b/source/input/y4m.h Sun Apr 30 13:43:07 2017 +0200
@@ -63,7 +63,7 @@
char* buf[QUEUE_SIZE];
- std::istream *ifs;
+ FILE *ifs;
bool parseHeader();
@@ -79,9 +79,9 @@
void release();
- bool isEof() const { return ifs && ifs->eof(); }
+ bool isEof() const { return ifs && feof(ifs); }
- bool isFail() { return !(ifs && !ifs->fail() && threadActive); }
+ bool isFail() { return !(ifs && !ferror(ifs) && threadActive); }
void startReader();
diff -r 5bc5e73760cd -r 0c7e08be8097 source/input/yuv.cpp
--- a/source/input/yuv.cpp Sat Apr 22 17:00:28 2017 -0700
+++ b/source/input/yuv.cpp Sun Apr 30 13:43:07 2017 +0200
@@ -68,20 +68,20 @@
if (!strcmp(info.filename, "-"))
{
- ifs = &cin;
+ ifs = stdin;
#if _WIN32
setmode(fileno(stdin), O_BINARY);
#endif
}
else
- ifs = new ifstream(info.filename, ios::binary | ios::in);
+ ifs = x265_fopen(info.filename, "rb");
- if (ifs && ifs->good())
+ if (ifs && !ferror(ifs))
threadActive = true;
else
{
- if (ifs && ifs != &cin)
- delete ifs;
+ if (ifs && ifs != stdin)
+ fclose(ifs);
ifs = NULL;
return;
}
@@ -100,53 +100,35 @@
info.frameCount = -1;
/* try to estimate frame count, if this is not stdin */
- if (ifs != &cin)
+ if (ifs != stdin)
{
- istream::pos_type cur = ifs->tellg();
+ int64_t cur = ftello(ifs);
-#if defined(_MSC_VER) && _MSC_VER < 1700
- /* Older MSVC versions cannot handle 64bit file sizes properly, so go native */
- HANDLE hFile = CreateFileA(info.filename, GENERIC_READ,
- FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
- FILE_ATTRIBUTE_NORMAL, NULL);
- if (hFile != INVALID_HANDLE_VALUE)
- {
- LARGE_INTEGER size;
- if (GetFileSizeEx(hFile, &size))
- info.frameCount = (int)((size.QuadPart - (int64_t)cur) / framesize);
- CloseHandle(hFile);
- }
-#else // if defined(_MSC_VER) && _MSC_VER < 1700
if (cur >= 0)
{
- ifs->seekg(0, ios::end);
- istream::pos_type size = ifs->tellg();
- ifs->seekg(cur, ios::beg);
+ fseeko(ifs, 0, SEEK_END);
+ int64_t size = ftello(ifs);
+ fseeko(ifs, cur, SEEK_SET);
if (size > 0)
info.frameCount = (int)((size - cur) / framesize);
}
-#endif // if defined(_MSC_VER) && _MSC_VER < 1700
}
if (info.skipFrames)
{
-#if X86_64
- if (ifs != &cin)
- ifs->seekg((uint64_t)framesize * info.skipFrames, ios::cur);
+ if (ifs != stdin)
+ fseeko(ifs, (int64_t)framesize * info.skipFrames, SEEK_CUR);
else
for (int i = 0; i < info.skipFrames; i++)
- ifs->read(buf[0], framesize);
-#else
- for (int i = 0; i < info.skipFrames; i++)
- ifs->ignore(framesize);
-#endif
+ if (fread(buf[0], framesize, 1, ifs) != 1)
+ break;
}
}
YUVInput::~YUVInput()
{
- if (ifs && ifs != &cin)
- delete ifs;
+ if (ifs && ifs != stdin)
+ fclose(ifs);
for (int i = 0; i < QUEUE_SIZE; i++)
X265_FREE(buf[i]);
}
@@ -182,7 +164,7 @@
bool YUVInput::populateFrameQueue()
{
- if (!ifs || ifs->fail())
+ if (!ifs || ferror(ifs))
return false;
/* wait for room in the ring buffer */
@@ -197,8 +179,7 @@
}
ProfileScopeEvent(frameRead);
- ifs->read(buf[written % QUEUE_SIZE], framesize);
- if (ifs->good())
+ if (fread(buf[written % QUEUE_SIZE], framesize, 1, ifs) == 1)
{
writeCount.incr();
return true;
diff -r 5bc5e73760cd -r 0c7e08be8097 source/input/yuv.h
--- a/source/input/yuv.h Sat Apr 22 17:00:28 2017 -0700
+++ b/source/input/yuv.h Sun Apr 30 13:43:07 2017 +0200
@@ -55,7 +55,7 @@
char* buf[QUEUE_SIZE];
- std::istream *ifs;
+ FILE *ifs;
int guessFrameCount();
@@ -71,9 +71,9 @@
void release();
- bool isEof() const { return ifs && ifs->eof(); }
+ bool isEof() const { return ifs && feof(ifs); }
- bool isFail() { return !(ifs && !ifs->fail() && threadActive); }
+ bool isFail() { return !(ifs && !ferror(ifs) && threadActive); }
void startReader();
More information about the x265-devel
mailing list