diff options
author | Austin Yuan <shengquan.yuan@gmail.com> | 2011-01-14 16:22:47 +0800 |
---|---|---|
committer | Austin Yuan <shengquan.yuan@gmail.com> | 2011-01-14 16:22:47 +0800 |
commit | b7849f39151a5efda5ae103486b8d00dbe6b2ff2 (patch) | |
tree | c32005d2c7e9435b15eab2638846128090e95931 /test | |
parent | aa7a8a0b05d25f9daedaa3c1e7dd5fa360dd28cd (diff) |
Refine VA_FOOL, and delete the hard coded clip va_fool_264.h
Move test/vainfo into test/vainfo/*
Add prototype of vaCreateSurfacesForUserPtr for V4L2 user pointer support
Fix klocwork critical issues. Use strnlen and snprintf instead of strlen and sprintf.
New interface vaQuerySrufaceError for decode error report and concealment
Encode data structure change (long term reference picture interface)
Add h264 constrained baseline profile support.
Signed-off-by: Elaine Wang <elaine.wang@intel.com>
Signed-off-by: Bignlin Chen <binglin.chen.wang@intel.com>
Signed-off-by: Yan Zhuang <yanx.zhunag@intel.com>
Signed-off-by: Guoliang Ji <guoliangx.ji@intel.com>
Diffstat (limited to 'test')
-rw-r--r-- | test/Android.mk | 24 | ||||
-rw-r--r-- | test/Makefile.am | 10 | ||||
-rw-r--r-- | test/encode/h264encode.c | 2 | ||||
-rw-r--r-- | test/putsurface/Android.mk | 22 | ||||
-rw-r--r-- | test/putsurface/loadsurface.h | 8 | ||||
-rw-r--r-- | test/putsurface/putsurface-android.cpp | 387 | ||||
-rw-r--r-- | test/putsurface/putsurface.c | 4 | ||||
-rw-r--r-- | test/vainfo/Android.mk | 22 | ||||
-rw-r--r-- | test/vainfo/Makefile.am | 33 | ||||
-rw-r--r-- | test/vainfo/vainfo.c (renamed from test/vainfo.c) | 1 |
10 files changed, 475 insertions, 38 deletions
diff --git a/test/Android.mk b/test/Android.mk index b7c0c0b..f3f122c 100644 --- a/test/Android.mk +++ b/test/Android.mk @@ -1,22 +1,4 @@ -# For vainfo -# ===================================================== - -LOCAL_PATH:= $(call my-dir) - -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := \ - vainfo.c - -LOCAL_CFLAGS += \ - -DANDROID - -LOCAL_C_INCLUDES += \ - $(TARGET_OUT_HEADERS)/libva - -LOCAL_MODULE := vainfo - -LOCAL_SHARED_LIBRARIES := libva-android libva libdl libdrm libcutils - -include $(BUILD_EXECUTABLE) +# Recursive call sub-folder Android.mk +# + include $(call all-subdir-makefiles) diff --git a/test/Makefile.am b/test/Makefile.am index 7153b10..a4d1af5 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -21,15 +21,7 @@ # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -bin_PROGRAMS = vainfo - AM_CFLAGS = -I$(top_srcdir)/va -I$(top_srcdir)/test/basic -I$(top_srcdir)/src/x11 -vainfo_LDADD = $(top_builddir)/va/$(libvacorelib) $(top_builddir)/va/$(libvabackendlib) -vainfo_DEPENDENCIES = $(top_builddir)/va/$(libvacorelib) $(top_builddir)/va/$(libvabackendlib) -vainfo_SOURCES = vainfo.c - -SUBDIRS = basic decode encode putsurface +SUBDIRS = basic decode encode putsurface vainfo -valgrind: vainfo - valgrind --leak-check=full --show-reachable=yes .libs/vainfo; diff --git a/test/encode/h264encode.c b/test/encode/h264encode.c index 1e4ecec..1d268b9 100644 --- a/test/encode/h264encode.c +++ b/test/encode/h264encode.c @@ -112,7 +112,7 @@ static int save_coded_buf(VABufferID coded_buf, int current_frame, int frame_ski va_status = vaMapBuffer(va_dpy,coded_buf,(void **)(&buf_list)); CHECK_VASTATUS(va_status,"vaMapBuffer"); while (buf_list != NULL) { - printf("Write %d bytes\n", buf_list->size); + printf("Write %d bytes", buf_list->size); coded_size += write(coded_fd, buf_list->buf, buf_list->size); buf_list = buf_list->next; } diff --git a/test/putsurface/Android.mk b/test/putsurface/Android.mk new file mode 100644 index 0000000..9bf1438 --- /dev/null +++ b/test/putsurface/Android.mk @@ -0,0 +1,22 @@ +# For putsurface +# ===================================================== + +LOCAL_PATH:= $(call my-dir) + +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := \ + putsurface-android.cpp + +LOCAL_CFLAGS += \ + -DANDROID + +LOCAL_C_INCLUDES += \ + $(TARGET_OUT_HEADERS)/libva + +LOCAL_MODULE := putsurface + +LOCAL_SHARED_LIBRARIES := libva-android libva libdl libdrm libcutils libutils libui libsurfaceflinger_client + +include $(BUILD_EXECUTABLE) + diff --git a/test/putsurface/loadsurface.h b/test/putsurface/loadsurface.h index ef792c8..b14241f 100644 --- a/test/putsurface/loadsurface.h +++ b/test/putsurface/loadsurface.h @@ -21,8 +21,6 @@ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - - static int yuvgen_planar(int width, int height, unsigned char *Y_start, int Y_pitch, unsigned char *U_start, int U_pitch, @@ -106,9 +104,9 @@ static int upload_surface(VADisplay va_dpy, VASurfaceID surface_id, /* assume surface is planar format */ yuvgen_planar(surface_image.width, surface_image.height, - surface_p, surface_image.pitches[0], - U_start, surface_image.pitches[1], - V_start, surface_image.pitches[2], + (unsigned char *)surface_p, surface_image.pitches[0], + (unsigned char *)U_start, surface_image.pitches[1], + (unsigned char *)V_start, surface_image.pitches[2], (surface_image.format.fourcc==VA_FOURCC_NV12), box_width, row_shift, field); diff --git a/test/putsurface/putsurface-android.cpp b/test/putsurface/putsurface-android.cpp new file mode 100644 index 0000000..ec2c865 --- /dev/null +++ b/test/putsurface/putsurface-android.cpp @@ -0,0 +1,387 @@ +/* + * Copyright (c) 2008-2009 Intel Corporation. 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, sub license, 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 (including the + * next paragraph) 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 NON-INFRINGEMENT. + * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS 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 <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <getopt.h> + +#include <sys/time.h> + +#include <unistd.h> + +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> + +#include <va/va.h> +#include <va/va_android.h> +#include <binder/IPCThreadState.h> +#include <binder/ProcessState.h> +#include <binder/IServiceManager.h> +#include <utils/Log.h> +#include <surfaceflinger/ISurfaceComposer.h> +#include <surfaceflinger/Surface.h> +#include <surfaceflinger/ISurface.h> +#include <surfaceflinger/SurfaceComposerClient.h> +#include <binder/MemoryHeapBase.h> +#define Display unsigned int + + +#include <assert.h> + +#include <pthread.h> + +/*currently, if XCheckWindowEvent was called in more than one thread, it would cause + * XIO: fatal IO error 11 (Resource temporarily unavailable) on X server ":0.0" + * after 87 requests (83 known processed) with 0 events remaining. + * + * X Error of failed request: BadGC (invalid GC parameter) + * Major opcode of failed request: 60 (X_FreeGC) + * Resource id in failed request: 0x600034 + * Serial number of failed request: 398 + * Current serial number in output stream: 399 + * The root cause is unknown. */ + +#define CHECK_VASTATUS(va_status,func) \ +if (va_status != VA_STATUS_SUCCESS) { \ + fprintf(stderr,"%s:%s (%d) failed,exit\n", __func__, func, __LINE__); \ + exit(1); \ +} + +#include "loadsurface.h" + + +#define SURFACE_NUM 5 +static VASurfaceID surface_id[SURFACE_NUM]; +static int surface_width = 352, surface_height = 288; +static int win_width=352, win_height=288; +static int win_thread0 = 0, win_thread1 = 0; +static Display *x11_display; +static VADisplay va_dpy; +static int multi_thread = 0; +static int test_clip = 0; +static int display_field = VA_FRAME_PICTURE; +static int verbose = 0; +static pthread_mutex_t surface_mutex[SURFACE_NUM]; + +//static pthread_mutex_t gmutex; + +static int box_width = 32; + + +using namespace android; + +sp<SurfaceComposerClient> client; +sp<Surface> android_surface; +sp<ISurface> android_isurface; +sp<SurfaceControl> surface_ctrl; + +sp<SurfaceComposerClient> client1; +sp<Surface> android_surface1; +sp<ISurface> android_isurface1; +sp<SurfaceControl> surface_ctrl1; + +namespace android { +class Test { +public: + static const sp<ISurface>& getISurface(const sp<Surface>& s) { + return s->getISurface(); + } +}; +}; + + + + + +static int create_window(int width, int height) +{ + sp<ProcessState> proc(ProcessState::self()); + ProcessState::self()->startThreadPool(); + + printf("Create window0 for thread0\n"); + client = new SurfaceComposerClient(); + surface_ctrl = client->createSurface(getpid(), 0, width, height, PIXEL_FORMAT_RGB_565, ISurfaceComposer::ePushBuffers); + android_surface = surface_ctrl->getSurface(); + android_isurface = Test::getISurface(android_surface); + + client->openTransaction(); + surface_ctrl->setPosition(0, 0); + client->closeTransaction(); + + client->openTransaction(); + surface_ctrl->setSize(width, height); + client->closeTransaction(); + + client->openTransaction(); + surface_ctrl->setLayer(0x100000); + client->closeTransaction(); + + win_thread0 = 1; + if (multi_thread == 0) + return 0; + + printf("Create window1 for thread1\n"); + client1 = new SurfaceComposerClient(); + surface_ctrl1 = client1->createSurface(getpid(), 0, width, height, PIXEL_FORMAT_RGB_565, ISurfaceComposer::ePushBuffers); + android_surface1 = surface_ctrl1->getSurface(); + android_isurface1 = Test::getISurface(android_surface1); + + client1->openTransaction(); + surface_ctrl1->setPosition(width, 0); + client1->closeTransaction(); + + client1->openTransaction(); + surface_ctrl1->setSize(width, height); + client1->closeTransaction(); + + client1->openTransaction(); + surface_ctrl1->setLayer(0x100000); + client1->closeTransaction(); + + win_thread1 = 2; + return 0; + +} + + + +static VASurfaceID get_next_free_surface(int *index) +{ + VASurfaceStatus surface_status; + int i; + + assert(index); + + for (i=0; i<SURFACE_NUM; i++) { + surface_status = (VASurfaceStatus)0; + vaQuerySurfaceStatus(va_dpy, surface_id[i], &surface_status); + if (surface_status == VASurfaceReady) + { + if (0 == pthread_mutex_trylock(&surface_mutex[i])) + { + *index = i; + break; + } + } + } + + if (i==SURFACE_NUM) + return VA_INVALID_SURFACE; + else + return surface_id[i]; +} + +/* + * Helper function for profiling purposes + */ +static unsigned long get_tick_count(void) +{ + struct timeval tv; + if (gettimeofday(&tv, NULL)) + return 0; + return tv.tv_usec/1000+tv.tv_sec*1000; +} + +static void* putsurface_thread(void *data) +{ + int width=win_width, height=win_height; + int win = (int)data; + int quit = 0; + VAStatus vaStatus; + int row_shift = 0; + int index = 0; + unsigned int frame_num=0, start_time, putsurface_time; + VARectangle cliprects[2]; /* client supplied clip list */ + sp<ISurface> win_isurface; + if (win == win_thread0) { + printf("Enter into thread0\n\n"); + win_isurface = android_isurface; + } + + if (win == win_thread1) { + printf("Enter into thread1\n\n"); + win_isurface = android_isurface1; + } + printf("vaPutSurface into a Window directly\n\n"); + + putsurface_time = 0; + while (!quit) { + VASurfaceID surface_id = VA_INVALID_SURFACE; + + while (surface_id == VA_INVALID_SURFACE) + surface_id = get_next_free_surface(&index); + + if (verbose) printf("Thread %x Display surface 0x%p,\n", (unsigned int)win, (void *)surface_id); + + upload_surface(va_dpy, surface_id, box_width, row_shift, display_field); + + start_time = get_tick_count(); + + vaStatus = vaPutSurface(va_dpy, surface_id, win_isurface, + 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 ((frame_num % 0xff) == 0) { + fprintf(stderr, "%.2f FPS \r", 256000.0 / (float)putsurface_time); + putsurface_time = 0; + + if (test_clip) { + srand((unsigned)time(NULL)); + + cliprects[0].x = (rand() % width); + cliprects[0].y = (rand() % height); + cliprects[0].width = (rand() % (width - cliprects[0].x)); + cliprects[0].height = (rand() % (height - cliprects[0].y)); + + cliprects[1].x = (rand() % width); + cliprects[1].y = (rand() % height); + cliprects[1].width = (rand() % (width - cliprects[1].x)); + cliprects[1].height = (rand() % (height - cliprects[1].y)); + printf("\nTest clip (%d,%d, %d x %d) and (%d,%d, %d x %d) \n", + cliprects[0].x, cliprects[0].y, cliprects[0].width, cliprects[0].height, + cliprects[1].x, cliprects[1].y, cliprects[1].width, cliprects[1].height); + } + } + + + pthread_mutex_unlock(&surface_mutex[index]); + + row_shift++; + if (row_shift==(2*box_width)) row_shift= 0; + + frame_num++; + + if( frame_num == 0x200 ) + quit = 1; + + } + if(win == win_thread1) + pthread_exit(NULL); + return 0; +} + + +int main(int argc,char **argv) +{ + int major_ver, minor_ver; + VAStatus va_status; + pthread_t thread1; + int ret; + char c; + int i; + + while ((c =getopt(argc,argv,"w:h:d:f:tcep?nv") ) != EOF) { + switch (c) { + case '?': + printf("putsurface <options>\n"); + printf(" -d the dimension of black/write square box, default is 32\n"); + printf(" -t multi-threads\n"); + printf(" -c test clipbox\n"); + printf(" -f <1/2> top field, or bottom field\n"); + printf(" -v verbose output\n"); + exit(0); + break; + case 'w': + win_width = atoi(optarg); + break; + case 'h': + win_height = atoi(optarg); + break; + case 'd': + box_width = atoi(optarg); + break; + case 't': + multi_thread = 1; + printf("Two threads to do vaPutSurface\n"); + break; + case 'c': + test_clip = 1; + break; + case 'f': + if (atoi(optarg) == 1) { + printf("Display TOP field\n"); + display_field = VA_TOP_FIELD; + } else if (atoi(optarg) == 2) { + printf("Display BOTTOM field\n"); + display_field = VA_BOTTOM_FIELD; + } else + printf("The validate input for -f is: 1(top field)/2(bottom field)\n"); + break; + case 'v': + verbose = 1; + printf("Enable verbose output\n"); + break; + } + } + + x11_display = (Display*)malloc(sizeof(Display)); + *(x11_display) = 0x18c34078; + + if (x11_display == NULL) { + fprintf(stderr, "Can't connect X server!\n"); + exit(-1); + } + + create_window(win_width, win_height); + + va_dpy = vaGetDisplay(x11_display); + va_status = vaInitialize(va_dpy, &major_ver, &minor_ver); + CHECK_VASTATUS(va_status, "vaInitialize"); + + surface_width = win_width; + surface_height = win_height; + va_status = vaCreateSurfaces(va_dpy,surface_width, surface_height, + VA_RT_FORMAT_YUV420, SURFACE_NUM, &surface_id[0]); + CHECK_VASTATUS(va_status, "vaCreateSurfaces"); +/* + if (check_event) + pthread_mutex_init(&gmutex, NULL); +*/ + for(i = 0; i< SURFACE_NUM; i++) + pthread_mutex_init(&surface_mutex[i], NULL); + + if (multi_thread == 1) + ret = pthread_create(&thread1, NULL, putsurface_thread, (void*)win_thread1); + + putsurface_thread((void *)win_thread0); + + if (multi_thread == 1) + pthread_join(thread1, (void **)&ret); + printf("thread1 is free\n"); + vaDestroySurfaces(va_dpy,&surface_id[0],SURFACE_NUM); + vaTerminate(va_dpy); + + return 0; +} diff --git a/test/putsurface/putsurface.c b/test/putsurface/putsurface.c index 0de786c..fcea3ad 100644 --- a/test/putsurface/putsurface.c +++ b/test/putsurface/putsurface.c @@ -98,8 +98,8 @@ static Pixmap create_pixmap(int width, int height) XGetWindowAttributes (x11_display, root, &attr); - printf("Create a pixmap from ROOT window %dx%d\n\n", attr.width, attr.height); - pixmap = XCreatePixmap(x11_display, root, attr.width, attr.height, + printf("Create a pixmap from ROOT window %dx%d, pixmap size %dx%d\n\n", attr.width, attr.height, width, height); + pixmap = XCreatePixmap(x11_display, root, width, height, DefaultDepth(x11_display, DefaultScreen(x11_display))); return pixmap; diff --git a/test/vainfo/Android.mk b/test/vainfo/Android.mk new file mode 100644 index 0000000..b7c0c0b --- /dev/null +++ b/test/vainfo/Android.mk @@ -0,0 +1,22 @@ +# For vainfo +# ===================================================== + +LOCAL_PATH:= $(call my-dir) + +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := \ + vainfo.c + +LOCAL_CFLAGS += \ + -DANDROID + +LOCAL_C_INCLUDES += \ + $(TARGET_OUT_HEADERS)/libva + +LOCAL_MODULE := vainfo + +LOCAL_SHARED_LIBRARIES := libva-android libva libdl libdrm libcutils + +include $(BUILD_EXECUTABLE) + diff --git a/test/vainfo/Makefile.am b/test/vainfo/Makefile.am new file mode 100644 index 0000000..5fd0070 --- /dev/null +++ b/test/vainfo/Makefile.am @@ -0,0 +1,33 @@ +# Copyright (c) 2007 Intel Corporation. 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, sub license, 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 (including the +# next paragraph) 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 NON-INFRINGEMENT. +# IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS 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. + + +bin_PROGRAMS = vainfo + +AM_CFLAGS = -I$(top_srcdir)/va -I$(top_srcdir)/test/basic -I$(top_srcdir)/src/x11 + +vainfo_LDADD = $(top_builddir)/va/$(libvacorelib) $(top_builddir)/va/$(libvabackendlib) +vainfo_DEPENDENCIES = $(top_builddir)/va/$(libvacorelib) $(top_builddir)/va/$(libvabackendlib) +vainfo_SOURCES = vainfo.c + +valgrind: vainfo + valgrind --leak-check=full --show-reachable=yes .libs/vainfo; diff --git a/test/vainfo.c b/test/vainfo/vainfo.c index 847e57e..96b7142 100644 --- a/test/vainfo.c +++ b/test/vainfo/vainfo.c @@ -56,6 +56,7 @@ static char * profile_string(VAProfile profile) case VAProfileVC1Main: return "VAProfileVC1Main"; case VAProfileVC1Advanced: return "VAProfileVC1Advanced"; case VAProfileH263Baseline: return "VAProfileH263Baseline"; + case VAProfileH264ConstrainedBaseline: return "VAProfileH264ConstrainedBaseline"; } return "<unknown profile>"; } |