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