[PATCH] Add option '-s @' to write raw RGB directly to stdout

Shuang He shuang.he at intel.com
Wed Apr 17 20:39:55 PDT 2013


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 -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
---
 image/CMakeLists.txt     |    1 +
 image/image.hpp          |   13 +++++++++++++
 image/image_raw.cpp      |   47 ++++++++++++++++++++++++++++++++++++++++++++++
 retrace/retrace_main.cpp |    4 +++-
 4 files changed, 64 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>
+ * 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..a0dc47b 100644
--- a/retrace/retrace_main.cpp
+++ b/retrace/retrace_main.cpp
@@ -129,6 +129,8 @@ takeSnapshot(unsigned call_no) {
             snprintf(comment, sizeof comment, "%u",
                      useCallNos ? call_no : snapshot_no);
             src->writePNM(std::cout, comment);
+        } else if (snapshotPrefix[0] == '@' && snapshotPrefix[1] == 0) {
+            src->writeRAW(std::cout);
         } else {
             os::String filename = os::String::format("%s%010u.png",
                                                      snapshotPrefix,
@@ -566,7 +568,7 @@ usage(const char *argv0) {
         "      --db                use a double buffer visual (default)\n"
         "      --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"
+        "  -s, --snapshot-prefix=PREFIX    take snapshots; `-` for PNM stdout output; `@` for raw RGB 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"
-- 
1.7.10.1



More information about the apitrace mailing list