[Libva] [PATCH v2] test: add putsurface option for color conversion test
Halley Zhao
halley.zhao at intel.com
Thu May 31 02:03:40 PDT 2012
From: Zhao halley <halley.zhao at intel.com>
---
test/putsurface/putsurface_common.c | 95 ++++++++++++++++++++++++++++++++---
1 files changed, 87 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..d1d2469
--- 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,72 @@ 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 YUY2 image from surface with default format (YV12 or NV12 or others)
+ // so default format to 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, for example: YV12 or NV12 etc
+ VAImage temp_image;
+ vaStatus = vaDeriveImage(va_dpy,new_surface,&temp_image);
+ vaDestroyImage(va_dpy,temp_image.image_id);
+
+
+ // render YUY2 image to surface, so YUY2 to default format 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 +318,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 +329,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 +380,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 +411,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