[x265] [PATCH] input: read y4m input from stdin if filename is passed as "-"
Steve Borho
steve at borho.org
Mon Oct 28 17:47:30 CET 2013
On Mon, Oct 28, 2013 at 1:42 AM, Gopu Govindaswamy <
gopu at multicorewareinc.com> wrote:
> # HG changeset patch
> # User Gopu Govindaswamy <gopu at multicorewareinc.com>
> # Date 1382942530 -19800
> # Node ID 4327bc0b1bce6cbbeb28f4ef81063b63802b3a9a
> # Parent ef2428fd32feddd60168f3430c50f4d7e6f02741
> input: read y4m input from stdin if filename is passed as "-"
>
queued for default, along with a commit that adds --y4m cli option to force
y4m parser
> diff -r ef2428fd32fe -r 4327bc0b1bce source/input/y4m.cpp
> --- a/source/input/y4m.cpp Mon Oct 28 00:08:06 2013 -0500
> +++ b/source/input/y4m.cpp Mon Oct 28 12:12:10 2013 +0530
> @@ -26,6 +26,15 @@
> #include "common.h"
> #include <stdio.h>
> #include <string.h>
> +#include <iostream>
> +
> +#if WIN32
> +#include "io.h"
> +#include "fcntl.h"
> +#if defined(_MSC_VER)
> +#pragma warning(disable: 4996) // POSIX setmode and fileno deprecated
> +#endif
> +#endif
>
> using namespace x265;
> using namespace std;
> @@ -40,9 +49,19 @@
> buf = NULL;
> #endif
>
> - ifs.open(filename, ios::binary | ios::in);
> + ifs = NULL;
> + if (!strcmp(filename, "-"))
> + {
> + ifs = &cin;
> +#if WIN32
> + setmode(fileno(stdin), O_BINARY);
> +#endif
> + }
> + else
> + ifs = new ifstream(filename, ios::binary | ios::in);
> +
> threadActive = false;
> - if (!ifs.fail())
> + if (ifs && !ifs->fail())
> {
> if (parseHeader())
> {
> @@ -64,13 +83,17 @@
> #endif // if defined(ENABLE_THREAD)
> }
> }
> - if (!threadActive)
> - ifs.close();
> + if (!threadActive && ifs && ifs != &cin)
> + {
> + delete ifs;
> + ifs = NULL;
> + }
> }
>
> Y4MInput::~Y4MInput()
> {
> - ifs.close();
> + if (ifs && ifs != &cin)
> + delete ifs;
> #if defined(ENABLE_THREAD)
> for (int i = 0; i < QUEUE_SIZE; i++)
> {
> @@ -84,6 +107,9 @@
>
> bool Y4MInput::parseHeader()
> {
> + if (!ifs)
> + return false;
> +
> width = 0;
> height = 0;
> rateNum = 0;
> @@ -92,22 +118,22 @@
> while (ifs)
> {
> // Skip Y4MPEG string
> - int c = ifs.get();
> - while (!ifs.eof() && (c != ' ') && (c != '\n'))
> + int c = ifs->get();
> + while (!ifs->eof() && (c != ' ') && (c != '\n'))
> {
> - c = ifs.get();
> + c = ifs->get();
> }
>
> while (c == ' ' && ifs)
> {
> // read parameter identifier
> - switch (ifs.get())
> + switch (ifs->get())
> {
> case 'W':
> width = 0;
> while (ifs)
> {
> - c = ifs.get();
> + c = ifs->get();
>
> if (c == ' ' || c == '\n')
> {
> @@ -125,7 +151,7 @@
> height = 0;
> while (ifs)
> {
> - c = ifs.get();
> + c = ifs->get();
> if (c == ' ' || c == '\n')
> {
> break;
> @@ -143,13 +169,13 @@
> rateDenom = 0;
> while (ifs)
> {
> - c = ifs.get();
> + c = ifs->get();
> if (c == '.')
> {
> rateDenom = 1;
> while (ifs)
> {
> - c = ifs.get();
> + c = ifs->get();
> if (c == ' ' || c == '\n')
> {
> break;
> @@ -167,7 +193,7 @@
> {
> while (ifs)
> {
> - c = ifs.get();
> + c = ifs->get();
> if (c == ' ' || c == '\n')
> {
> break;
> @@ -190,7 +216,7 @@
> while (ifs)
> {
> // consume this unsupported configuration word
> - c = ifs.get();
> + c = ifs->get();
> if (c == ' ' || c == '\n')
> break;
> }
> @@ -217,25 +243,33 @@
>
> int Y4MInput::guessFrameCount()
> {
> - istream::pos_type cur = ifs.tellg();
> + if (!ifs || ifs == &cin)
> + return -1;
> + istream::pos_type cur = ifs->tellg();
> if (cur < 0)
> return -1;
>
> - ifs.seekg(0, ios::end);
> - istream::pos_type size = ifs.tellg();
> + ifs->seekg(0, ios::end);
> + istream::pos_type size = ifs->tellg();
> if (size < 0)
> return -1;
> - ifs.seekg(cur, ios::beg);
> + ifs->seekg(cur, ios::beg);
>
> return (int)((size - cur) / ((width * height * 3 / 2) +
> strlen(header) + 1));
> }
>
> void Y4MInput::skipFrames(int numFrames)
> {
> - const size_t count = (width * height * 3 / 2) + strlen(header);
> - for (int i = 0; i < numFrames; i++)
> + const size_t count = (width * height * 3 / 2) + strlen(header) + 1;
> + if (ifs && numFrames)
> {
> - ifs.ignore(count);
> + if (ifs == &cin)
> + {
> + for (int i = 0; i < numFrames; i++)
> + ifs->ignore(count);
> + }
> + else
> + ifs->seekg(count * numFrames, ios::cur);
> }
> }
>
> @@ -296,8 +330,10 @@
> {
> /* strip off the FRAME header */
> char hbuf[sizeof(header)];
> + if (!ifs)
> + return false;
>
> - ifs.read(hbuf, strlen(header));
> + ifs->read(hbuf, strlen(header));
> if (!ifs || memcmp(hbuf, header, strlen(header)))
> {
> if (ifs)
> @@ -305,10 +341,10 @@
> return false;
> }
> /* consume bytes up to line feed */
> - int c = ifs.get();
> + int c = ifs->get();
> while (c != '\n' && !ifs)
> {
> - c = ifs.get();
> + c = ifs->get();
> }
>
> const size_t count = width * height * 3 / 2;
> @@ -319,11 +355,11 @@
> return false;
> }
>
> - ifs.read(buf[tail], count);
> - frameStat[tail] = !ifs.fail();
> + ifs->read(buf[tail], count);
> + frameStat[tail] = !ifs->fail();
> tail = (tail + 1) % QUEUE_SIZE;
> notEmpty.trigger();
> - return !ifs.fail();
> + return !ifs->fail();
> }
>
> #else // if defined(ENABLE_THREAD)
> @@ -333,7 +369,11 @@
>
> /* strip off the FRAME header */
> char hbuf[sizeof(header)];
> - ifs.read(hbuf, strlen(header));
> +
> + if (!ifs)
> + return false;
> +
> + ifs->read(hbuf, strlen(header));
> if (!ifs || memcmp(hbuf, header, strlen(header)))
> {
> x265_log(NULL, X265_LOG_ERROR, "y4m: frame header missing\n");
> @@ -341,10 +381,10 @@
> }
>
> /* consume bytes up to line feed */
> - int c = ifs.get();
> + int c = ifs->get();
> while (c != '\n' && !ifs)
> {
> - c = ifs.get();
> + c = ifs->get();
> }
>
> const size_t count = width * height * 3 / 2;
> @@ -361,10 +401,10 @@
>
> pic.stride[1] = pic.stride[2] = pic.stride[0] >> 1;
>
> - ifs.read(buf, count);
> + ifs->read(buf, count);
> PPAStopCpuEventFunc(read_yuv);
>
> - return !ifs.fail();
> + return !ifs->fail();
> }
>
> #endif // if defined(ENABLE_THREAD)
> diff -r ef2428fd32fe -r 4327bc0b1bce source/input/y4m.h
> --- a/source/input/y4m.h Mon Oct 28 00:08:06 2013 -0500
> +++ b/source/input/y4m.h Mon Oct 28 12:12:10 2013 +0530
> @@ -68,7 +68,7 @@
> #else // if defined(ENABLE_THREAD)
> char *buf;
> #endif // if defined(ENABLE_THREAD)
> - std::ifstream ifs;
> + std::istream *ifs;
>
> bool parseHeader();
>
> @@ -88,9 +88,9 @@
>
> int getHeight() const { return height; }
>
> - bool isEof() const { return ifs.eof(); }
> + bool isEof() const { return (ifs &&
> ifs->eof()); }
>
> - bool isFail() { return
> !(ifs.is_open() && threadActive); }
> + bool isFail() { return !(ifs &&
> !ifs->fail() && threadActive); }
>
> void startReader();
>
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
>
--
Steve Borho
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20131028/9137a018/attachment.html>
More information about the x265-devel
mailing list