[x265] [PATCH] input: change from ifstream to stdio stream

Pradeep Ramachandran pradeep at multicorewareinc.com
Thu May 25 06:46:27 CEST 2017


On Sun, Apr 30, 2017 at 5:24 PM, Mateusz Brzostek <mateusz at msystem.waw.pl>
wrote:

> 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
>

I finally got around to testing this patch! Apologies for the delay.

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.

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?


> 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();
>
>
>
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20170525/ef851e48/attachment-0001.html>


More information about the x265-devel mailing list