[Libva] [PATCH] va_trace: allow surface trace to dump part of surface content

Yuan, Shengquan shengquan.yuan at gmail.com
Tue Aug 7 20:55:57 PDT 2012


>From 5190a7465756a41808a562c8eccec521dbf77d8c Mon Sep 17 00:00:00 2001
From: Austin Yuan <shengquan.yuan at intel.com>
Date: Wed, 8 Aug 2012 11:34:00 +0800
Subject: [PATCH 4/4] va_trace: allow surface trace to dump part of surface
 content

To debug/isolate video record quality issue (blocky/corruption, etc),
we always need to dump the YUV image from camera. LibVA has such
functionality, but due to storage bandwidth issue (~10M Byte/second),
it is hard to write 1080P 30fps YUV data to disk (~88M Byte/second).
Now refine the functionality to only dump part of the image, and
won't need to modify the code in the default build.

The method is:
edit /etc/libva.conf to include bellow (all export them):
	LIBVA_TRACE_SURFACE=/data/enc-XXX.yuv
	LIBVA_TRACE_GEOMETRY=320x240+20+20

It will only save 320x240 from (20,20) of the source surface to file
/data/enc-XXX.yuv.

Signed-off-by: Austin Yuan <shengquan.yuan at intel.com>
---
 va/va_trace.c |   53 ++++++++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 44 insertions(+), 9 deletions(-)

diff --git a/va/va_trace.c b/va/va_trace.c
index 893a3fa..08e7873 100644
--- a/va/va_trace.c
+++ b/va/va_trace.c
@@ -27,6 +27,7 @@
 #include "va_enc_h264.h"
 #include "va_backend.h"
 #include "va_trace.h"
+#include "va_enc_h264.h"

 #include <assert.h>
 #include <stdarg.h>
@@ -48,6 +49,8 @@
  * .LIBVA_TRACE_CODEDBUF=coded_clip_file: save the coded clip into
file coded_clip_file
  * .LIBVA_TRACE_SURFACE=yuv_file: save surface YUV into file
yuv_file. Use file name to determine
  *                                decode/encode or jpeg surfaces
+ * .LIBVA_TRACE_SURFACE_GEOMETRY=WIDTHxHEIGHT+XOFF+YOFF: only save
part of surface context into file
+ *                                due to storage bandwidth limitation
  * .LIBVA_TRACE_LOGSIZE=numeric number: truncate the log_file or
coded_clip_file, or decoded_yuv_file
  *                                      when the size is bigger than the number
  */
@@ -88,6 +91,11 @@ static struct _trace_context {
     unsigned int trace_slice_no; /* current slice NO */
     unsigned int trace_slice_size; /* current slice buffer size */

+    unsigned int trace_surface_width; /* surface dumping geometry */
+    unsigned int trace_surface_height;
+    unsigned int trace_surface_xoff;
+    unsigned int trace_surface_yoff;
+
     unsigned int trace_frame_width; /* current frame width */
     unsigned int trace_frame_height; /* current frame height */
     unsigned int trace_sequence_start; /* get a new sequence for
encoding or not */
@@ -201,7 +209,7 @@ void va_TraceInit(VADisplay dpy)
     if (va_parseConfig("LIBVA_TRACE_SURFACE", &env_value[0]) == 0) {
         FILE_NAME_SUFFIX(env_value);
         trace_context[trace_index].trace_surface_fn = strdup(env_value);
-
+
         va_infoMessage("LIBVA_TRACE_SURFACE is on, save surface into %s\n",
                        trace_context[trace_index].trace_surface_fn);

@@ -217,6 +225,24 @@ void va_TraceInit(VADisplay dpy)
             trace_flag |= VA_TRACE_FLAG_SURFACE_ENCODE;
         if (strstr(env_value, "jpeg") || strstr(env_value, "jpg"))
             trace_flag |= VA_TRACE_FLAG_SURFACE_JPEG;
+
+        if (va_parseConfig("LIBVA_TRACE_SURFACE_GEOMETRY",
&env_value[0]) == 0) {
+            char *p = env_value, *q;
+
+            trace_context[trace_index].trace_surface_width = strtod(p, &q);
+            p = q+1; /* skip "x" */
+            trace_context[trace_index].trace_surface_height = strtod(p, &q);
+            p = q+1; /* skip "+" */
+            trace_context[trace_index].trace_surface_xoff = strtod(p, &q);
+            p = q+1; /* skip "+" */
+            trace_context[trace_index].trace_surface_yoff = strtod(p, &q);
+
+            va_infoMessage("LIBVA_TRACE_SURFACE_GEOMETRY is on, only
dump surface %dx%d+%d+%d content\n",
+                           trace_context[trace_index].trace_surface_width,
+                           trace_context[trace_index].trace_surface_height,
+                           trace_context[trace_index].trace_surface_xoff,
+                           trace_context[trace_index].trace_surface_yoff);
+        }
     }

     trace_context[trace_index].dpy = dpy;
@@ -385,20 +411,24 @@ void va_TraceSurface(VADisplay dpy)
     Y_data = (unsigned char*)buffer;
     UV_data = (unsigned char*)buffer + chroma_u_offset;

-    tmp = Y_data;
-    for (i=0; i<trace_context[idx].trace_frame_height; i++) {
+    tmp = Y_data + luma_stride * trace_context[idx].trace_surface_yoff;
+    for (i=0; i<trace_context[idx].trace_surface_height; i++) {
         if (trace_context[idx].trace_fp_surface)
-            fwrite(tmp, trace_context[idx].trace_frame_width, 1,
trace_context[idx].trace_fp_surface);
+            fwrite(tmp + trace_context[idx].trace_surface_xoff,
+                   trace_context[idx].trace_surface_width,
+                   1, trace_context[idx].trace_fp_surface);

-        tmp = Y_data + i * luma_stride;
+        tmp += luma_stride;
     }
-    tmp = UV_data;
+    tmp = UV_data + chroma_u_stride * trace_context[idx].trace_surface_yoff;
     if (fourcc == VA_FOURCC_NV12) {
-        for (i=0; i<trace_context[idx].trace_frame_height/2; i++) {
+        for (i=0; i<trace_context[idx].trace_surface_height/2; i++) {
             if (trace_context[idx].trace_fp_surface)
-                fwrite(tmp, trace_context[idx].trace_frame_width, 1,
trace_context[idx].trace_fp_surface);
+                fwrite(tmp + trace_context[idx].trace_surface_xoff,
+                       trace_context[idx].trace_surface_width,
+                       1, trace_context[idx].trace_fp_surface);

-            tmp = UV_data + i * chroma_u_stride;
+            tmp += chroma_u_stride;
         }
     }

@@ -550,6 +580,11 @@ void va_TraceCreateContext(

     trace_context[idx].trace_frame_width = picture_width;
     trace_context[idx].trace_frame_height = picture_height;
+
+    if (trace_context[idx].trace_surface_width == 0)
+        trace_context[idx].trace_surface_width = picture_width;
+    if (trace_context[idx].trace_surface_height == 0)
+        trace_context[idx].trace_surface_height = picture_height;
 }


-- 
1.7.9.5



-- 
Thanks
-Austin


More information about the Libva mailing list