<div dir="ltr"><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Apr 30, 2017 at 5:24 PM, Mateusz Brzostek <span dir="ltr"><<a href="mailto:mateusz@msystem.waw.pl" target="_blank">mateusz@msystem.waw.pl</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">This patch fixes issue #341 and allows Unicode filenames in Windows.<br>
<br>
Please review.<br>
<br>
# HG changeset patch<br>
# User Ma0 <<a href="mailto:mateuszb@poczta.onet.pl">mateuszb@poczta.onet.pl</a>><br>
# Date 1493552587 -7200<br>
# Sun Apr 30 13:43:07 2017 +0200<br>
# Node ID 0c7e08be80975e4b52f6c8aabe95d3<wbr>b817d6723d<br>
# Parent 5bc5e73760cdb61d2674e74cc52149<wbr>fa0603af8a<br>
input: change from ifstream to stdio stream<br></blockquote><div><br></div><div>I finally got around to testing this patch! Apologies for the delay.</div><div><br>I like this change and would like to pull it in. I don't see any performance improvement from my test with my linux box, but I would suspect there would be benefits of moving to stdio stream from ifstream.</div><div><br></div><div>This patch no longer applied on top of the default tip. Could you please refactor and resend so that I can pull-it in and commit it to the default tip?</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
diff -r 5bc5e73760cd -r 0c7e08be8097 source/common/common.h<br>
--- a/source/common/common.h Sat Apr 22 17:00:28 2017 -0700<br>
+++ b/source/common/common.h Sun Apr 30 13:43:07 2017 +0200<br>
@@ -78,6 +78,7 @@<br>
<br>
#if defined(__MINGW32__)<br>
#define fseeko fseeko64<br>
+#define ftello ftello64<br>
#endif<br>
<br>
#elif defined(_MSC_VER)<br>
@@ -87,6 +88,7 @@<br>
#define ALIGN_VAR_16(T, var) __declspec(align(16)) T var<br>
#define ALIGN_VAR_32(T, var) __declspec(align(32)) T var<br>
#define fseeko _fseeki64<br>
+#define ftello _ftelli64<br>
<br>
#endif // if defined(__GNUC__)<br>
<br>
diff -r 5bc5e73760cd -r 0c7e08be8097 source/input/y4m.cpp<br>
--- a/source/input/y4m.cpp Sat Apr 22 17:00:28 2017 -0700<br>
+++ b/source/input/y4m.cpp Sun Apr 30 13:43:07 2017 +0200<br>
@@ -60,15 +60,15 @@<br>
ifs = NULL;<br>
if (!strcmp(info.filename, "-"))<br>
{<br>
- ifs = &cin;<br>
+ ifs = stdin;<br>
#if _WIN32<br>
setmode(fileno(stdin), O_BINARY);<br>
#endif<br>
}<br>
else<br>
- ifs = new ifstream(info.filename, ios::binary | ios::in);<br>
+ ifs = x265_fopen(info.filename, "rb");<br>
<br>
- if (ifs && ifs->good() && parseHeader())<br>
+ if (ifs && !ferror(ifs) && parseHeader())<br>
{<br>
int pixelbytes = depth > 8 ? 2 : 1;<br>
for (int i = 0; i < x265_cli_csps[colorSpace].<wbr>planes; i++)<br>
@@ -91,8 +91,8 @@<br>
}<br>
if (!threadActive)<br>
{<br>
- if (ifs && ifs != &cin)<br>
- delete ifs;<br>
+ if (ifs && ifs != stdin)<br>
+ fclose(ifs);<br>
ifs = NULL;<br>
return;<br>
}<br>
@@ -110,56 +110,35 @@<br>
size_t estFrameSize = framesize + strlen(header) + 1; /* assume basic FRAME\n headers */<br>
<br>
/* try to estimate frame count, if this is not stdin */<br>
- if (ifs != &cin)<br>
+ if (ifs != stdin)<br>
{<br>
- istream::pos_type cur = ifs->tellg();<br>
+ int64_t cur = ftello(ifs);<br>
<br>
-#if defined(_MSC_VER) && _MSC_VER < 1700<br>
- /* Older MSVC versions cannot handle 64bit file sizes properly, so go native */<br>
- HANDLE hFile = CreateFileA(info.filename, GENERIC_READ,<br>
- FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,<br>
- FILE_ATTRIBUTE_NORMAL, NULL);<br>
- if (hFile != INVALID_HANDLE_VALUE)<br>
- {<br>
- LARGE_INTEGER size;<br>
- if (GetFileSizeEx(hFile, &size))<br>
- info.frameCount = (int)((size.QuadPart - (int64_t)cur) / estFrameSize);<br>
- CloseHandle(hFile);<br>
- }<br>
-#else // if defined(_MSC_VER) && _MSC_VER < 1700<br>
if (cur >= 0)<br>
{<br>
- ifs->seekg(0, ios::end);<br>
- istream::pos_type size = ifs->tellg();<br>
- ifs->seekg(cur, ios::beg);<br>
+ fseeko(ifs, 0, SEEK_END);<br>
+ int64_t size = ftello(ifs);<br>
+ fseeko(ifs, cur, SEEK_SET);<br>
if (size > 0)<br>
info.frameCount = (int)((size - cur) / estFrameSize);<br>
}<br>
-#endif // if defined(_MSC_VER) && _MSC_VER < 1700<br>
}<br>
<br>
if (info.skipFrames)<br>
{<br>
-#if X86_64<br>
- if (ifs != &cin)<br>
- ifs->seekg((uint64_t)<wbr>estFrameSize * info.skipFrames, ios::cur);<br>
+ if (ifs != stdin)<br>
+ fseeko(ifs, (int64_t)estFrameSize * info.skipFrames, SEEK_CUR);<br>
else<br>
for (int i = 0; i < info.skipFrames; i++)<br>
- {<br>
- ifs->read(buf[0], estFrameSize - framesize);<br>
- ifs->read(buf[0], framesize);<br>
- }<br>
-#else<br>
- for (int i = 0; i < info.skipFrames; i++)<br>
- ifs->ignore(estFrameSize);<br>
-#endif<br>
+ if (fread(buf[0], estFrameSize - framesize, 1, ifs) + fread(buf[0], framesize, 1, ifs) != 2)<br>
+ break;<br>
}<br>
}<br>
<br>
Y4MInput::~Y4MInput()<br>
{<br>
- if (ifs && ifs != &cin)<br>
- delete ifs;<br>
+ if (ifs && ifs != stdin)<br>
+ fclose(ifs);<br>
<br>
for (int i = 0; i < QUEUE_SIZE; i++)<br>
X265_FREE(buf[i]);<br>
@@ -181,24 +160,22 @@<br>
int csp = 0;<br>
int d = 0;<br>
<br>
- while (ifs->good())<br>
+ int c;<br>
+ while ((c = fgetc(ifs)) != EOF)<br>
{<br>
// Skip Y4MPEG string<br>
- int c = ifs->get();<br>
- while (ifs->good() && (c != ' ') && (c != '\n'))<br>
- c = ifs->get();<br>
+ while ((c != EOF) && (c != ' ') && (c != '\n'))<br>
+ c = fgetc(ifs);<br>
<br>
- while (c == ' ' && ifs->good())<br>
+ while (c == ' ')<br>
{<br>
// read parameter identifier<br>
- switch (ifs->get())<br>
+ switch (fgetc(ifs))<br>
{<br>
case 'W':<br>
width = 0;<br>
- while (ifs->good())<br>
+ while ((c = fgetc(ifs)) != EOF)<br>
{<br>
- c = ifs->get();<br>
-<br>
if (c == ' ' || c == '\n')<br>
break;<br>
else<br>
@@ -208,9 +185,8 @@<br>
<br>
case 'H':<br>
height = 0;<br>
- while (ifs->good())<br>
+ while ((c = fgetc(ifs)) != EOF)<br>
{<br>
- c = ifs->get();<br>
if (c == ' ' || c == '\n')<br>
break;<br>
else<br>
@@ -221,15 +197,13 @@<br>
case 'F':<br>
rateNum = 0;<br>
rateDenom = 0;<br>
- while (ifs->good())<br>
+ while ((c = fgetc(ifs)) != EOF)<br>
{<br>
- c = ifs->get();<br>
if (c == '.')<br>
{<br>
rateDenom = 1;<br>
- while (ifs->good())<br>
+ while ((c = fgetc(ifs)) != EOF)<br>
{<br>
- c = ifs->get();<br>
if (c == ' ' || c == '\n')<br>
break;<br>
else<br>
@@ -242,9 +216,8 @@<br>
}<br>
else if (c == ':')<br>
{<br>
- while (ifs->good())<br>
+ while ((c = fgetc(ifs)) != EOF)<br>
{<br>
- c = ifs->get();<br>
if (c == ' ' || c == '\n')<br>
break;<br>
else<br>
@@ -260,14 +233,12 @@<br>
case 'A':<br>
sarWidth = 0;<br>
sarHeight = 0;<br>
- while (ifs->good())<br>
+ while ((c = fgetc(ifs)) != EOF)<br>
{<br>
- c = ifs->get();<br>
if (c == ':')<br>
{<br>
- while (ifs->good())<br>
+ while ((c = fgetc(ifs)) != EOF)<br>
{<br>
- c = ifs->get();<br>
if (c == ' ' || c == '\n')<br>
break;<br>
else<br>
@@ -283,19 +254,15 @@<br>
case 'C':<br>
csp = 0;<br>
d = 0;<br>
- while (ifs->good())<br>
+ while ((c = fgetc(ifs)) != EOF)<br>
{<br>
- c = ifs->get();<br>
-<br>
if (c <= 'o' && c >= '0')<br>
csp = csp * 10 + (c - '0');<br>
else if (c == 'p')<br>
{<br>
// example: C420p16<br>
- while (ifs->good())<br>
+ while ((c = fgetc(ifs)) != EOF)<br>
{<br>
- c = ifs->get();<br>
-<br>
if (c <= '9' && c >= '0')<br>
d = d * 10 + (c - '0');<br>
else<br>
@@ -327,10 +294,9 @@<br>
break;<br>
<br>
default:<br>
- while (ifs->good())<br>
+ while ((c = fgetc(ifs)) != EOF)<br>
{<br>
// consume this unsupported configuration word<br>
- c = ifs->get();<br>
if (c == ' ' || c == '\n')<br>
break;<br>
}<br>
@@ -375,26 +341,24 @@<br>
<br>
bool Y4MInput::populateFrameQueue()<br>
{<br>
- if (!ifs || ifs->fail())<br>
+ if (!ifs || ferror(ifs))<br>
return false;<br>
<br>
/* strip off the FRAME header */<br>
char hbuf[sizeof(header)];<br>
<br>
- ifs->read(hbuf, strlen(header));<br>
- if (ifs->eof())<br>
- return false;<br>
-<br>
- if (!ifs->good() || memcmp(hbuf, header, strlen(header)))<br>
+ if (fread(hbuf, strlen(header), 1, ifs) != 1 || memcmp(hbuf, header, strlen(header)))<br>
{<br>
- x265_log(NULL, X265_LOG_ERROR, "y4m: frame header missing\n");<br>
+ if (!feof(ifs))<br>
+ x265_log(NULL, X265_LOG_ERROR, "y4m: frame header missing\n");<br>
return false;<br>
}<br>
<br>
/* consume bytes up to line feed */<br>
- int c = ifs->get();<br>
- while (c != '\n' && ifs->good())<br>
- c = ifs->get();<br>
+ int c;<br>
+ while ((c = fgetc(ifs)) != EOF)<br>
+ if (c == '\n')<br>
+ break;<br>
<br>
/* wait for room in the ring buffer */<br>
int written = writeCount.get();<br>
@@ -407,8 +371,7 @@<br>
}<br>
<br>
ProfileScopeEvent(frameRead);<br>
- ifs->read(buf[written % QUEUE_SIZE], framesize);<br>
- if (ifs->good())<br>
+ if (fread(buf[written % QUEUE_SIZE], framesize, 1, ifs) == 1)<br>
{<br>
writeCount.incr();<br>
return true;<br>
diff -r 5bc5e73760cd -r 0c7e08be8097 source/input/y4m.h<br>
--- a/source/input/y4m.h Sat Apr 22 17:00:28 2017 -0700<br>
+++ b/source/input/y4m.h Sun Apr 30 13:43:07 2017 +0200<br>
@@ -63,7 +63,7 @@<br>
<br>
char* buf[QUEUE_SIZE];<br>
<br>
- std::istream *ifs;<br>
+ FILE *ifs;<br>
<br>
bool parseHeader();<br>
<br>
@@ -79,9 +79,9 @@<br>
<br>
void release();<br>
<br>
- bool isEof() const { return ifs && ifs->eof(); }<br>
+ bool isEof() const { return ifs && feof(ifs); }<br>
<br>
- bool isFail() { return !(ifs && !ifs->fail() && threadActive); }<br>
+ bool isFail() { return !(ifs && !ferror(ifs) && threadActive); }<br>
<br>
void startReader();<br>
<br>
diff -r 5bc5e73760cd -r 0c7e08be8097 source/input/yuv.cpp<br>
--- a/source/input/yuv.cpp Sat Apr 22 17:00:28 2017 -0700<br>
+++ b/source/input/yuv.cpp Sun Apr 30 13:43:07 2017 +0200<br>
@@ -68,20 +68,20 @@<br>
<br>
if (!strcmp(info.filename, "-"))<br>
{<br>
- ifs = &cin;<br>
+ ifs = stdin;<br>
#if _WIN32<br>
setmode(fileno(stdin), O_BINARY);<br>
#endif<br>
}<br>
else<br>
- ifs = new ifstream(info.filename, ios::binary | ios::in);<br>
+ ifs = x265_fopen(info.filename, "rb");<br>
<br>
- if (ifs && ifs->good())<br>
+ if (ifs && !ferror(ifs))<br>
threadActive = true;<br>
else<br>
{<br>
- if (ifs && ifs != &cin)<br>
- delete ifs;<br>
+ if (ifs && ifs != stdin)<br>
+ fclose(ifs);<br>
ifs = NULL;<br>
return;<br>
}<br>
@@ -100,53 +100,35 @@<br>
info.frameCount = -1;<br>
<br>
/* try to estimate frame count, if this is not stdin */<br>
- if (ifs != &cin)<br>
+ if (ifs != stdin)<br>
{<br>
- istream::pos_type cur = ifs->tellg();<br>
+ int64_t cur = ftello(ifs);<br>
<br>
-#if defined(_MSC_VER) && _MSC_VER < 1700<br>
- /* Older MSVC versions cannot handle 64bit file sizes properly, so go native */<br>
- HANDLE hFile = CreateFileA(info.filename, GENERIC_READ,<br>
- FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,<br>
- FILE_ATTRIBUTE_NORMAL, NULL);<br>
- if (hFile != INVALID_HANDLE_VALUE)<br>
- {<br>
- LARGE_INTEGER size;<br>
- if (GetFileSizeEx(hFile, &size))<br>
- info.frameCount = (int)((size.QuadPart - (int64_t)cur) / framesize);<br>
- CloseHandle(hFile);<br>
- }<br>
-#else // if defined(_MSC_VER) && _MSC_VER < 1700<br>
if (cur >= 0)<br>
{<br>
- ifs->seekg(0, ios::end);<br>
- istream::pos_type size = ifs->tellg();<br>
- ifs->seekg(cur, ios::beg);<br>
+ fseeko(ifs, 0, SEEK_END);<br>
+ int64_t size = ftello(ifs);<br>
+ fseeko(ifs, cur, SEEK_SET);<br>
if (size > 0)<br>
info.frameCount = (int)((size - cur) / framesize);<br>
}<br>
-#endif // if defined(_MSC_VER) && _MSC_VER < 1700<br>
}<br>
<br>
if (info.skipFrames)<br>
{<br>
-#if X86_64<br>
- if (ifs != &cin)<br>
- ifs->seekg((uint64_t)framesize * info.skipFrames, ios::cur);<br>
+ if (ifs != stdin)<br>
+ fseeko(ifs, (int64_t)framesize * info.skipFrames, SEEK_CUR);<br>
else<br>
for (int i = 0; i < info.skipFrames; i++)<br>
- ifs->read(buf[0], framesize);<br>
-#else<br>
- for (int i = 0; i < info.skipFrames; i++)<br>
- ifs->ignore(framesize);<br>
-#endif<br>
+ if (fread(buf[0], framesize, 1, ifs) != 1)<br>
+ break;<br>
}<br>
}<br>
<br>
YUVInput::~YUVInput()<br>
{<br>
- if (ifs && ifs != &cin)<br>
- delete ifs;<br>
+ if (ifs && ifs != stdin)<br>
+ fclose(ifs);<br>
for (int i = 0; i < QUEUE_SIZE; i++)<br>
X265_FREE(buf[i]);<br>
}<br>
@@ -182,7 +164,7 @@<br>
<br>
bool YUVInput::populateFrameQueue()<br>
{<br>
- if (!ifs || ifs->fail())<br>
+ if (!ifs || ferror(ifs))<br>
return false;<br>
<br>
/* wait for room in the ring buffer */<br>
@@ -197,8 +179,7 @@<br>
}<br>
<br>
ProfileScopeEvent(frameRead);<br>
- ifs->read(buf[written % QUEUE_SIZE], framesize);<br>
- if (ifs->good())<br>
+ if (fread(buf[written % QUEUE_SIZE], framesize, 1, ifs) == 1)<br>
{<br>
writeCount.incr();<br>
return true;<br>
diff -r 5bc5e73760cd -r 0c7e08be8097 source/input/yuv.h<br>
--- a/source/input/yuv.h Sat Apr 22 17:00:28 2017 -0700<br>
+++ b/source/input/yuv.h Sun Apr 30 13:43:07 2017 +0200<br>
@@ -55,7 +55,7 @@<br>
<br>
char* buf[QUEUE_SIZE];<br>
<br>
- std::istream *ifs;<br>
+ FILE *ifs;<br>
<br>
int guessFrameCount();<br>
<br>
@@ -71,9 +71,9 @@<br>
<br>
void release();<br>
<br>
- bool isEof() const { return ifs && ifs->eof(); }<br>
+ bool isEof() const { return ifs && feof(ifs); }<br>
<br>
- bool isFail() { return !(ifs && !ifs->fail() && threadActive); }<br>
+ bool isFail() { return !(ifs && !ferror(ifs) && threadActive); }<br>
<br>
void startReader();<br>
<br>
<br>
<br>______________________________<wbr>_________________<br>
x265-devel mailing list<br>
<a href="mailto:x265-devel@videolan.org">x265-devel@videolan.org</a><br>
<a href="https://mailman.videolan.org/listinfo/x265-devel" rel="noreferrer" target="_blank">https://mailman.videolan.org/<wbr>listinfo/x265-devel</a><br>
<br></blockquote></div><br></div></div>