[PATCH v2] Add option '--snapshot-format=' to allow write raw RGB directly to stdout

Shuang He shuang.he at intel.com
Tue Apr 23 18:58:46 PDT 2013


On 2013/4/23 15:47, José Fonseca wrote:
> Just a few requests:
> - Please make snapshotFormat global an enum, and do the string compare 
> when parsing the options.
> - Please add an example to the README.markdown, just after "Recording 
> a video with FFmpeg" section.

Totally agree

>
> Otherwise looks greast.
>
> Given that raw does not encode the frame buffer size, and framebuffer 
> sizes are variable/fickle, I think a nice future improvement would be 
> to allow forcing the size on command line, to prevent video to go 
> bust. For example:
>
> glretrace --snapshot-format=RGB:1920x1080 ...

Yes, I think that's why you're using PNM or BITMAP, forcing size seems a 
good idea for it to work

Thanks
     --Shuang

>
> Jose
>
>
> On Fri, Apr 19, 2013 at 3:23 AM, Shuang He <shuang.he at intel.com 
> <mailto:shuang.he at intel.com>> wrote:
>
>     This allows to create h264 video with gstreamer-vaapi very fast,
>     and save much more disk space.
>     Using PNM format couldn't reach same performance, since PNM
>     decoding seems inefficient in gstreamer.
>     Following are some experiment data with smokinguns demo 1920x1080
>     resolution on Ivybridge:
>     1. With png saving, it runs at around 4.5 FPS, which has
>     compression rate 5.15x against raw RGB data
>        Reference command:
>             glretrace -s snapshot/ smokinguns.trace
>
>     2. Using PNM with gstreamer-vaapi, which could run at around 9
>     FPS, which has compression rate
>        485x (QP dependent) against raw RGB data.
>        Reference command:
>             glretrace -s - smokinguns.trace | gst-launch-0.10 fdsrc
>     blocksize=409600 ! queue \
>             ! pnmdec ! videoparse format=rgb width=1920 height=1080 !
>     ffmpegcolorspace ! queue \
>             ! vaapiupload direct-rendering=0 ! queue ! vaapiencodeh264
>     ! filesink location=xxx.264
>
>     3. With following command that directly write raw RGB stream and
>     encoded into H264 video, it
>        runs at around 18.5 FPS, which has compression rate 485x (QP
>     dependent) against raw RGB data,
>        Reference command:
>             glretrace --snapshot-format=RGB -s - smokinguns.trace |
>     gst-launch-0.10 fdsrc blocksize=409600 ! queue \
>             ! videoparse format=rgb width=1920 height=1080 ! queue !
>     ffmpegcolorspace ! queue \
>             ! vaapiupload direct-rendering=0 ! queue ! vaapiencodeh264
>     ! filesink location=xxx.264
>
>     v2: Use --snapshot-format= option to specify which format is used
>     to write to stdout output
>     ---
>      image/CMakeLists.txt     |    1 +
>      image/image.hpp          |   13 +++++++++++++
>      image/image_raw.cpp      |   47
>     ++++++++++++++++++++++++++++++++++++++++++++++
>      retrace/retrace_main.cpp |   12 +++++++++++-
>      4 files changed, 72 insertions(+), 1 deletion(-)
>      create mode 100644 image/image_raw.cpp
>
>     diff --git a/image/CMakeLists.txt b/image/CMakeLists.txt
>     index ee4d98f..37203f8 100644
>     --- a/image/CMakeLists.txt
>     +++ b/image/CMakeLists.txt
>     @@ -7,6 +7,7 @@ add_library (image STATIC
>          image_bmp.cpp
>          image_png.cpp
>          image_pnm.cpp
>     +    image_raw.cpp
>      )
>
>      target_link_libraries (image
>     diff --git a/image/image.hpp b/image/image.hpp
>     index 7dd18c1..11bfc63 100644
>     --- a/image/image.hpp
>     +++ b/image/image.hpp
>     @@ -106,6 +106,19 @@ public:
>              return writePNG(os);
>          }
>
>     +    void
>     +    writeRAW(std::ostream &os) const;
>     +
>     +    inline bool
>     +    writeRAW(const char *filename) const {
>     +       std::ofstream os(filename, std::ofstream::binary);
>     +       if (!os) {
>     +           return false;
>     +       }
>     +       writeRAW(os);
>     +       return true;
>     +    }
>     +
>          double compare(Image &ref);
>      };
>
>     diff --git a/image/image_raw.cpp b/image/image_raw.cpp
>     new file mode 100644
>     index 0000000..dd45d10
>     --- /dev/null
>     +++ b/image/image_raw.cpp
>     @@ -0,0 +1,47 @@
>     +/**************************************************************************
>     + *
>     + * Copyright (C) 2013 Intel Corporation. All rights reversed.
>     + * Author: Shuang He <shuang.he at intel.com
>     <mailto:shuang.he at intel.com>>
>     + * All Rights Reserved.
>     + *
>     + * Permission is hereby granted, free of charge, to any person
>     obtaining a copy
>     + * of this software and associated documentation files (the
>     "Software"), to deal
>     + * in the Software without restriction, including without
>     limitation the rights
>     + * to use, copy, modify, merge, publish, distribute, sublicense,
>     and/or sell
>     + * copies of the Software, and to permit persons to whom the
>     Software is
>     + * furnished to do so, subject to the following conditions:
>     + *
>     + * The above copyright notice and this permission notice shall be
>     included in
>     + * all copies or substantial portions of the Software.
>     + *
>     + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
>     KIND, EXPRESS OR
>     + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
>     MERCHANTABILITY,
>     + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
>     EVENT SHALL THE
>     + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
>     OR OTHER
>     + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
>     OTHERWISE, ARISING FROM,
>     + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>     DEALINGS IN
>     + * THE SOFTWARE.
>     + *
>     +
>     **************************************************************************/
>     +
>     +
>     +#include <assert.h>
>     +#include <string.h>
>     +#include <stdint.h>
>     +#include <stdio.h>
>     +
>     +#include "image.hpp"
>     +
>     +
>     +namespace image {
>     +
>     +void
>     +Image::writeRAW(std::ostream &os) const {
>     +    const unsigned char *row;
>     +
>     +    for (row = start(); row != end(); row += stride()) {
>     +        os.write((const char *)row, width*channels);
>     +    }
>     +}
>     +
>     +} /* namespace image */
>     diff --git a/retrace/retrace_main.cpp b/retrace/retrace_main.cpp
>     index 2d3311f..dbe34f8 100644
>     --- a/retrace/retrace_main.cpp
>     +++ b/retrace/retrace_main.cpp
>     @@ -46,6 +46,7 @@ static bool loopOnFinish = false;
>
>      static const char *comparePrefix = NULL;
>      static const char *snapshotPrefix = NULL;
>     +static const char *snapshotFormat = NULL;
>      static trace::CallSet snapshotFrequency;
>      static trace::CallSet compareFrequency;
>      static trace::ParseBookmark lastFrameStart;
>     @@ -128,7 +129,10 @@ takeSnapshot(unsigned call_no) {
>                  char comment[21];
>                  snprintf(comment, sizeof comment, "%u",
>                           useCallNos ? call_no : snapshot_no);
>     -            src->writePNM(std::cout, comment);
>     +            if (snapshotFormat != NULL && strcmp(snapshotFormat,
>     "RGB") == 0)
>     +                src->writeRAW(std::cout);
>     +            else
>     +                src->writePNM(std::cout, comment);
>              } else {
>                  os::String filename = os::String::format("%s%010u.png",
>     snapshotPrefix,
>     @@ -567,6 +571,7 @@ usage(const char *argv0) {
>              "      --driver=DRIVER     force driver type (`hw`, `sw`,
>     `ref`, `null`, or driver module name)\n"
>              "      --sb                use a single buffer visual\n"
>              "  -s, --snapshot-prefix=PREFIX    take snapshots; `-`
>     for PNM stdout output\n"
>     +        "      --snapshot-format=FMT       use (PNM or RGB;
>     default is PNM) when writing to stdout output\n"
>              "  -S, --snapshot=CALLSET  calls to snapshot (default is
>     every frame)\n"
>              "  -v, --verbose           increase output verbosity\n"
>              "  -D, --dump-state=CALL   dump state at specific call no\n"
>     @@ -585,6 +590,7 @@ enum {
>          PPD_OPT,
>          PMEM_OPT,
>          SB_OPT,
>     +    SNAPSHOT_FORMAT_OPT,
>          LOOP_OPT,
>          SINGLETHREAD_OPT
>      };
>     @@ -609,6 +615,7 @@ longOptions[] = {
>          {"pmem", no_argument, 0, PMEM_OPT},
>          {"sb", no_argument, 0, SB_OPT},
>          {"snapshot-prefix", required_argument, 0, 's'},
>     +    {"snapshot-format", required_argument, 0, SNAPSHOT_FORMAT_OPT},
>          {"snapshot", required_argument, 0, 'S'},
>          {"verbose", no_argument, 0, 'v'},
>          {"wait", no_argument, 0, 'w'},
>     @@ -699,6 +706,9 @@ int main(int argc, char **argv)
>                      retrace::verbosity = -2;
>                  }
>                  break;
>     +       case SNAPSHOT_FORMAT_OPT:
>     +           snapshotFormat = optarg;
>     +           break;
>              case 'S':
>                  snapshotFrequency = trace::CallSet(optarg);
>                  if (snapshotPrefix == NULL) {
>     --
>     1.7.10.1
>
>     _______________________________________________
>     apitrace mailing list
>     apitrace at lists.freedesktop.org <mailto:apitrace at lists.freedesktop.org>
>     http://lists.freedesktop.org/mailman/listinfo/apitrace
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/apitrace/attachments/20130424/4f5de823/attachment.html>


More information about the apitrace mailing list