[Libva] [PATCH] test: add putsurface option for color conversion test

Halley Zhao halley.zhao at intel.com
Wed May 30 02:21:34 PDT 2012


From: Zhao halley <halley.zhao at intel.com>

---
 test/putsurface/putsurface_common.c |   93 ++++++++++++++++++++++++++++++++---
 1 files changed, 85 insertions(+), 8 deletions(-)
 mode change 100644 => 100755 test/putsurface/putsurface_common.c

diff --git a/test/putsurface/putsurface_common.c b/test/putsurface/putsurface_common.c
old mode 100644
new mode 100755
index 54ae8d3..2ab4245
--- a/test/putsurface/putsurface_common.c
+++ b/test/putsurface/putsurface_common.c
@@ -76,6 +76,7 @@ static  pthread_mutex_t gmutex;
 static  int box_width = 32;
 static  int multi_thread = 0;
 static  int verbose = 0;
+static  int test_color_conversion = 0;
 
 static VASurfaceID get_next_free_surface(int *index)
 {
@@ -206,13 +207,70 @@ static void* putsurface_thread(void *data)
             if (c == 'c' || c == 'C')
                 continue_display = 1;
         }
-        vaStatus = vaPutSurface(va_dpy, surface_id, CAST_DRAWABLE(drawable),
-                                0,0,surface_width,surface_height,
-                                0,0,width,height,
-                                (test_clip==0)?NULL:&cliprects[0],
-                                (test_clip==0)?0:2,
-                                display_field);
-        CHECK_VASTATUS(vaStatus,"vaPutSurface");
+    if (test_color_conversion) {
+            VAImageFormat image_format;
+            VAImage image ;
+            VASurfaceID new_surface;
+    
+	        // create VAImage with YUY2 format
+    		image_format.fourcc = VA_FOURCC_YUY2;
+    		image_format.byte_order = VA_LSB_FIRST;
+    		image_format.bits_per_pixel = 16;
+    
+    		vaStatus = vaCreateImage(va_dpy, &image_format,
+                            surface_width, surface_height,
+                            &image);
+            CHECK_VASTATUS(vaStatus,"vaCreateImage");
+    
+	        // get image from surface (default YV12 format), so YV12->YUY2 conversion happens
+            vaStatus = vaGetImage(va_dpy, surface_id, 0, 0, surface_width, surface_height, image.image_id);
+            CHECK_VASTATUS(vaStatus,"vaGetImage");
+            
+			// create a temp VASurface
+            vaStatus = vaCreateSurfaces(va_dpy, VA_RT_FORMAT_YUV420, 
+                                         surface_width, surface_height,
+                                         &new_surface, 1, 
+                                         NULL, 0);
+            CHECK_VASTATUS(vaStatus,"vaCreateSurfaces");
+    
+            // decide surface format here by derive an image (so surface format is the default one, ie. YV12)
+            VAImage temp_image;
+            vaStatus = vaDeriveImage(va_dpy,new_surface,&temp_image);
+            vaDestroyImage(va_dpy,temp_image.image_id);
+            
+    
+			// render YUY2 image to YV12 surface, so YUY2->YV12 conversion happens.
+            vaStatus = vaPutImage(va_dpy, new_surface, image.image_id,
+                                    0, 0, surface_width, surface_height, 
+                                    0, 0, surface_width, surface_height);
+            CHECK_VASTATUS(vaStatus,"vaPutImage");
+            
+			// render the temp surface, it should be same with original surface without color conversion test
+            vaStatus = vaPutSurface(va_dpy, new_surface, CAST_DRAWABLE(drawable),
+                                    0,0,surface_width,surface_height,
+                                    0,0,width,height,
+                                    (test_clip==0)?NULL:&cliprects[0],
+                                    (test_clip==0)?0:2,
+                                    display_field);
+            CHECK_VASTATUS(vaStatus,"vaPutSurface");
+    
+            // destroy temp surface/image
+            vaStatus = vaDestroySurfaces(va_dpy, &new_surface, 1);
+            CHECK_VASTATUS(vaStatus,"vaDestroySurfaces");
+    
+            vaStatus = vaDestroyImage(va_dpy, image.image_id);
+            CHECK_VASTATUS(vaStatus,"vaDestroyImage");
+        }
+        else {
+            vaStatus = vaPutSurface(va_dpy, surface_id, CAST_DRAWABLE(drawable),
+                                    0,0,surface_width,surface_height,
+                                    0,0,width,height,
+                                    (test_clip==0)?NULL:&cliprects[0],
+                                    (test_clip==0)?0:2,
+                                    display_field);
+            CHECK_VASTATUS(vaStatus,"vaPutSurface");
+        }
+    
         putsurface_time += (get_tick_count() - start_time);
         
         if (check_event)
@@ -258,7 +316,7 @@ int main(int argc,char **argv)
     char c;
     int i;
 
-    while ((c =getopt(argc,argv,"w:h:g:r:d:f:tcep?n:v") ) != EOF) {
+    while ((c =getopt(argc,argv,"w:h:g:r:d:f:tcep?nx:v") ) != EOF) {
         switch (c) {
             case '?':
                 printf("putsurface <options>\n");
@@ -269,6 +327,7 @@ int main(int argc,char **argv)
                 printf("           -t multi-threads\n");
                 printf("           -c test clipbox\n");
                 printf("           -f <1/2> top field, or bottom field\n");
+                printf("           -x test color conversion(NV12/YV12 --> YUY2 --> NV12/YV12) \n");
                 printf("           -v verbose output\n");
                 exit(0);
                 break;
@@ -319,6 +378,10 @@ int main(int argc,char **argv)
                 } else
                     printf("The validate input for -f is: 1(top field)/2(bottom field)\n");
                 break;
+            case 'x':
+                test_color_conversion = atoi(optarg);
+                printf("do additional NV12/YV12 <--> YUY2 conversion for test\n");
+                break;
             case 'v':
                 verbose = 1;
                 printf("Enable verbose output\n");
@@ -346,6 +409,20 @@ int main(int argc,char **argv)
     CHECK_VASTATUS(va_status, "vaCreateSurfaces");
     if (multi_thread == 0) /* upload the content for all surfaces */
         upload_source_YUV_once_for_all();
+
+    if (test_color_conversion) {
+        #define MAX_IMAGE_FORMAT_COUNT      10
+        VAImageFormat format_list[MAX_IMAGE_FORMAT_COUNT];
+        int num_formats = 0, find_yuy2 = 0;
+        
+        va_status = vaQueryImageFormats(va_dpy, format_list,&num_formats);
+        for (i=0; i<num_formats; i++) {
+            if (format_list[i].fourcc == VA_FOURCC_YUY2) {
+                find_yuy2 = 1;
+            }
+        }
+        if (!find_yuy2) test_color_conversion = 0;
+    }
     
     if (check_event)
         pthread_mutex_init(&gmutex, NULL);
-- 
1.7.5.4



More information about the Libva mailing list