From 72dd51a2324ae7a976ef433d547f6e8b85b00347 Mon Sep 17 00:00:00 2001 From: Austin Yuan Date: Thu, 5 May 2011 20:04:50 -0700 Subject: [PATCH] 1) test/*: enable/refine the test/* for both X11 and Android 2) va_dri2.c: use _XSend instead of _XReply which is time-consuming 3) trace message for vaPutSurface/vaInitialize/vaTerminate Signed-off-by: Guoliang Ji Signed-off-by: Zhaohan Ren Signed-off-by: Austin Yuan --- configure.ac | 1 + test/android_winsys.cpp | 32 ++ test/basic/Android.mk | 234 ++++++++++++ test/basic/test_android.c | 62 ++++ test/basic/test_common.c | 44 +-- test/basic/test_x11.c | 61 +++ test/decode/Android.mk | 25 ++ test/decode/Makefile.am | 2 +- test/decode/{mpeg2vldemo.c => mpeg2vldemo.cpp} | 65 +++- test/encode/Android.mk | 26 ++ test/encode/Makefile.am | 2 +- test/encode/h264encode_android.cpp | 70 ++++ test/encode/{h264encode.c => h264encode_common.c} | 93 ++--- test/encode/h264encode_x11.c | 99 +++++ test/putsurface/Android.mk | 3 +- test/putsurface/Makefile.am | 2 +- test/putsurface/putsurface.c | 412 --------------------- test/putsurface/putsurface_android.cpp | 77 ++++ ...{putsurface-android.cpp => putsurface_common.c} | 184 ++++----- test/putsurface/putsurface_x11.c | 109 ++++++ va/va_trace.c | 24 +- va/x11/va_dri2.c | 4 +- 22 files changed, 987 insertions(+), 644 deletions(-) create mode 100644 test/android_winsys.cpp create mode 100755 test/basic/Android.mk create mode 100644 test/basic/test_android.c create mode 100644 test/basic/test_x11.c create mode 100755 test/decode/Android.mk rename test/decode/{mpeg2vldemo.c => mpeg2vldemo.cpp} (87%) create mode 100755 test/encode/Android.mk create mode 100644 test/encode/h264encode_android.cpp rename test/encode/{h264encode.c => h264encode_common.c} (90%) create mode 100644 test/encode/h264encode_x11.c delete mode 100644 test/putsurface/putsurface.c create mode 100644 test/putsurface/putsurface_android.cpp rename test/putsurface/{putsurface-android.cpp => putsurface_common.c} (79%) create mode 100644 test/putsurface/putsurface_x11.c diff --git a/configure.ac b/configure.ac index 99693b4..2d8381e 100644 --- a/configure.ac +++ b/configure.ac @@ -92,6 +92,7 @@ AC_SUBST(LIBVA_DRIVERS_PATH) AC_DISABLE_STATIC AC_PROG_LIBTOOL AC_PROG_CC +AC_PROG_CXX AC_HEADER_STDC AC_SYS_LARGEFILE diff --git a/test/android_winsys.cpp b/test/android_winsys.cpp new file mode 100644 index 0000000..6f84e38 --- /dev/null +++ b/test/android_winsys.cpp @@ -0,0 +1,32 @@ + +namespace android { + class Test { + public: + static const sp& getISurface(const sp& s) { + return s->getISurface(); + } + }; +}; + +#define SURFACE_CREATE(client,surface_ctrl,android_surface, android_isurface, win_width, win_height) \ +{\ + client = new SurfaceComposerClient();\ + surface_ctrl = client->createSurface(getpid(), 0, win_width, win_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(win_width, win_height);\ + client->closeTransaction();\ +\ + client->openTransaction();\ + surface_ctrl->setLayer(0x100000);\ + client->closeTransaction();\ +\ +}\ + + diff --git a/test/basic/Android.mk b/test/basic/Android.mk new file mode 100755 index 0000000..a4b136c --- /dev/null +++ b/test/basic/Android.mk @@ -0,0 +1,234 @@ +# For test_01 +# ===================================================== + +LOCAL_PATH:= $(call my-dir) + +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := \ + test_01.c \ + +LOCAL_CFLAGS += \ + -DANDROID + +LOCAL_C_INCLUDES += \ + $(TARGET_OUT_HEADERS)/libva \ + $(TOPDIR)/hardware/intel/libva/va/ + +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE := test_001 + +LOCAL_SHARED_LIBRARIES := libva-android libva libdl libdrm libcutils libutils libui libsurfaceflinger_client + +include $(BUILD_EXECUTABLE) + +# For test_02 +# ===================================================== +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := \ + test_02.c \ + +LOCAL_CFLAGS += \ + -DANDROID + +LOCAL_C_INCLUDES += \ + $(TARGET_OUT_HEADERS)/libva \ + $(TOPDIR)/hardware/intel/libva/va/ + +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE := test_02_android + +LOCAL_SHARED_LIBRARIES := libva-android libva libdl libdrm libcutils libutils libui libsurfaceflinger_client + +include $(BUILD_EXECUTABLE) + +# For test_03 +# ===================================================== +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := \ + test_03.c \ + +LOCAL_CFLAGS += \ + -DANDROID + +LOCAL_C_INCLUDES += \ + $(TARGET_OUT_HEADERS)/libva \ + $(TOPDIR)/hardware/intel/libva/va/ + +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE := test_03_android + +LOCAL_SHARED_LIBRARIES := libva-android libva libdl libdrm libcutils libutils libui libsurfaceflinger_client + +include $(BUILD_EXECUTABLE) + +# For test_04g +# ===================================================== +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := \ + test_04.c \ + +LOCAL_CFLAGS += \ + -DANDROID + +LOCAL_C_INCLUDES += \ + $(TARGET_OUT_HEADERS)/libva \ + $(TOPDIR)/hardware/intel/libva/va/ + +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE := test_04_android + +LOCAL_SHARED_LIBRARIES := libva-android libva libdl libdrm libcutils libutils libui libsurfaceflinger_client + +include $(BUILD_EXECUTABLE) + +# For test_05 +# ===================================================== +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := \ + test_05.c \ + +LOCAL_CFLAGS += \ + -DANDROID + +LOCAL_C_INCLUDES += \ + $(TARGET_OUT_HEADERS)/libva \ + $(TOPDIR)/hardware/intel/libva/va/ + +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE := test_05_android + +LOCAL_SHARED_LIBRARIES := libva-android libva libdl libdrm libcutils libutils libui libsurfaceflinger_client + +include $(BUILD_EXECUTABLE) + +# For test_06 +# ===================================================== +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := \ + test_06.c \ + +LOCAL_CFLAGS += \ + -DANDROID + +LOCAL_C_INCLUDES += \ + $(TARGET_OUT_HEADERS)/libva \ + $(TOPDIR)/hardware/intel/libva/va/ + +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE := test_06_android + +LOCAL_SHARED_LIBRARIES := libva-android libva libdl libdrm libcutils libutils libui libsurfaceflinger_client + +include $(BUILD_EXECUTABLE) + +# For test_07 +# ===================================================== +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := \ + test_07.c \ + +LOCAL_CFLAGS += \ + -DANDROID + +LOCAL_C_INCLUDES += \ + $(TARGET_OUT_HEADERS)/libva \ + $(TOPDIR)/hardware/intel/libva/va/ + +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE := test_07_android + +LOCAL_SHARED_LIBRARIES := libva-android libva libdl libdrm libcutils libutils libui libsurfaceflinger_client + +include $(BUILD_EXECUTABLE) + +# For test_08 +# ===================================================== +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := \ + test_08.c \ + +LOCAL_CFLAGS += \ + -DANDROID + +LOCAL_C_INCLUDES += \ + $(TARGET_OUT_HEADERS)/libva \ + $(TOPDIR)/hardware/intel/libva/va/ + +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE := test_08_android + +LOCAL_SHARED_LIBRARIES := libva-android libva libdl libdrm libcutils libutils libui libsurfaceflinger_client + +include $(BUILD_EXECUTABLE) + +# For test_09 +# ===================================================== +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := \ + test_09.c \ + +LOCAL_CFLAGS += \ + -DANDROID + +LOCAL_C_INCLUDES += \ + $(TARGET_OUT_HEADERS)/libva \ + $(TOPDIR)/hardware/intel/libva/va/ + +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE := test_09_android + +LOCAL_SHARED_LIBRARIES := libva-android libva libdl libdrm libcutils libutils libui libsurfaceflinger_client + +include $(BUILD_EXECUTABLE) + +# For test_10 +# ===================================================== +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := \ + test_10.c + +LOCAL_CFLAGS += \ + -DANDROID + +LOCAL_C_INCLUDES += \ + $(TARGET_OUT_HEADERS)/libva \ + $(TOPDIR)/hardware/intel/libva/va/ + +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE := test_10_android + +LOCAL_SHARED_LIBRARIES := libva-android libva libdl libdrm libcutils libutils libui libsurfaceflinger_client + +include $(BUILD_EXECUTABLE) + +# For test_11 +# ===================================================== +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := \ + test_11.c + +LOCAL_CFLAGS += \ + -DANDROID + +LOCAL_C_INCLUDES += \ + $(TARGET_OUT_HEADERS)/libva \ + $(TOPDIR)/hardware/intel/libva/va/ + +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE := test_11_android + +LOCAL_SHARED_LIBRARIES := libva-android libva libdl libdrm libcutils libutils libui libsurfaceflinger_client + +include $(BUILD_EXECUTABLE) + diff --git a/test/basic/test_android.c b/test/basic/test_android.c new file mode 100644 index 0000000..2bb247a --- /dev/null +++ b/test/basic/test_android.c @@ -0,0 +1,62 @@ +/* + * 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. + */ +#define Display unsigned int +Display *dpy; +VADisplay va_dpy; +VAStatus va_status; +VAProfile *profiles ; +int major_version, minor_version; + +void test_init() +{ + dpy = (Display*)malloc(sizeof(Display)); + *(dpy) = 0x18c34078; + ASSERT( dpy ); + status("malloc Display: dpy = %08x\n", dpy); + + va_dpy = vaGetDisplay(dpy); + ASSERT( va_dpy ); + status("vaGetDisplay: va_dpy = %08x\n", va_dpy); + + va_status = vaInitialize(va_dpy, &major_version, &minor_version); + ASSERT( VA_STATUS_SUCCESS == va_status ); + status("vaInitialize: major = %d minor = %d\n", major_version, minor_version); +} + +void test_terminate() +{ + va_status = vaTerminate(va_dpy); + ASSERT( VA_STATUS_SUCCESS == va_status ); + status("vaTerminate\n"); + + free(dpy); + status("free Display\n"); + + if (profiles) + { + free(profiles); + profiles = NULL; + } +} + diff --git a/test/basic/test_common.c b/test/basic/test_common.c index 8287d1e..ae730a4 100644 --- a/test/basic/test_common.c +++ b/test/basic/test_common.c @@ -22,8 +22,12 @@ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +#include +#ifdef ANDROID +#include +#else #include - +#endif #include "assert.h" #include #include @@ -34,6 +38,13 @@ #define ASSERT assert +void status(const char *msg, ...); +#ifdef ANDROID +#include "test_android.c" +#else +#include "test_x11.c" +#endif + Display *dpy; VADisplay va_dpy; VAStatus va_status; @@ -74,37 +85,6 @@ int main(int argc, const char* argv[]) return 0; } -void test_init() -{ - dpy = XOpenDisplay(NULL); - ASSERT( dpy ); - status("XOpenDisplay: dpy = %08x\n", dpy); - - va_dpy = vaGetDisplay(dpy); - ASSERT( va_dpy ); - status("vaGetDisplay: va_dpy = %08x\n", va_dpy); - - va_status = vaInitialize(va_dpy, &major_version, &minor_version); - ASSERT( VA_STATUS_SUCCESS == va_status ); - status("vaInitialize: major = %d minor = %d\n", major_version, minor_version); -} - -void test_terminate() -{ - va_status = vaTerminate(va_dpy); - ASSERT( VA_STATUS_SUCCESS == va_status ); - status("vaTerminate\n"); - - XCloseDisplay(dpy); - status("XCloseDisplay\n"); - - if (profiles) - { - free(profiles); - profiles = NULL; - } -} - #define PROFILE(profile) case VAProfile##profile: return("VAProfile" #profile); const char *profile2string(VAProfile profile) diff --git a/test/basic/test_x11.c b/test/basic/test_x11.c new file mode 100644 index 0000000..df8f362 --- /dev/null +++ b/test/basic/test_x11.c @@ -0,0 +1,61 @@ +/* + * 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. + */ + +Display *dpy; +VADisplay va_dpy; +VAStatus va_status; +VAProfile *profiles ; +int major_version, minor_version; + +void test_init() +{ + dpy = XOpenDisplay(NULL); + ASSERT( dpy ); + status("XOpenDisplay: dpy = %08x\n", dpy); + + va_dpy = vaGetDisplay(dpy); + ASSERT( va_dpy ); + status("vaGetDisplay: va_dpy = %08x\n", va_dpy); + + va_status = vaInitialize(va_dpy, &major_version, &minor_version); + ASSERT( VA_STATUS_SUCCESS == va_status ); + status("vaInitialize: major = %d minor = %d\n", major_version, minor_version); +} + +void test_terminate() +{ + va_status = vaTerminate(va_dpy); + ASSERT( VA_STATUS_SUCCESS == va_status ); + status("vaTerminate\n"); + + XCloseDisplay(dpy); + status("XCloseDisplay\n"); + + if (profiles) + { + free(profiles); + profiles = NULL; + } +} + diff --git a/test/decode/Android.mk b/test/decode/Android.mk new file mode 100755 index 0000000..3541ee2 --- /dev/null +++ b/test/decode/Android.mk @@ -0,0 +1,25 @@ +# For test_01 +# ===================================================== + +LOCAL_PATH:= $(call my-dir) + +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := \ + mpeg2vldemo.cpp \ + +LOCAL_CFLAGS += \ + -DANDROID + +LOCAL_C_INCLUDES += \ + $(TARGET_OUT_HEADERS)/libva \ + $(TOPDIR)/hardware/intel/libva/va/ \ + $(TARGET_OUT_HEADERS)/X11 + +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE := mpeg2vldemo + +LOCAL_SHARED_LIBRARIES := libva-android libva libdl libdrm libcutils libutils libui libsurfaceflinger_client + +include $(BUILD_EXECUTABLE) + diff --git a/test/decode/Makefile.am b/test/decode/Makefile.am index ea30643..9d74137 100644 --- a/test/decode/Makefile.am +++ b/test/decode/Makefile.am @@ -27,7 +27,7 @@ AM_CFLAGS = -I$(top_srcdir)/va -I$(top_srcdir)/src/x11 TEST_LIBS = $(top_builddir)/va/$(libvabackendlib) mpeg2vldemo_LDADD = $(TEST_LIBS) -mpeg2vldemo_SOURCES = mpeg2vldemo.c +mpeg2vldemo_SOURCES = mpeg2vldemo.cpp valgrind: $(bin_PROGRAMS) diff --git a/test/decode/mpeg2vldemo.c b/test/decode/mpeg2vldemo.cpp similarity index 87% rename from test/decode/mpeg2vldemo.c rename to test/decode/mpeg2vldemo.cpp index 7057675..4799a5c 100644 --- a/test/decode/mpeg2vldemo.c +++ b/test/decode/mpeg2vldemo.cpp @@ -37,18 +37,36 @@ #include #include #include -#include - #include - #include #include #include - #include - #include + +#ifdef ANDROID +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define Display unsigned int + +using namespace android; +sp client; +sp android_surface; +sp android_isurface; +sp surface_ctrl; +#include "../android_winsys.cpp" +#else #include +#include +#endif #define CHECK_VASTATUS(va_status,func) \ if (va_status != VA_STATUS_SUCCESS) { \ @@ -122,15 +140,18 @@ static VAIQMatrixBufferMPEG2 iq_matrix = { chroma_non_intra_quantiser_matrix:{0} }; +#if 1 static VASliceParameterBufferMPEG2 slice_param={ slice_data_size:150, slice_data_offset:0, slice_data_flag:0, - macroblock_offset:38,/* 4byte + 6bits=38bits */ + macroblock_offset:38, /* 4byte + 6bits=38bits */ + slice_horizontal_position:0, slice_vertical_position:0, quantiser_scale_code:2, intra_slice_flag:0 }; +#endif #define CLIP_WIDTH 16 #define CLIP_HEIGHT 16 @@ -155,8 +176,12 @@ int main(int argc,char **argv) if (argc > 1) putsurface=1; - +#ifdef ANDROID + x11_display = (Display*)malloc(sizeof(Display)); + *(x11_display ) = 0x18c34078; +#else x11_display = XOpenDisplay(":0.0"); +#endif if (x11_display == NULL) { fprintf(stderr, "Can't connect X server!\n"); @@ -222,7 +247,7 @@ int main(int argc,char **argv) 1, &iq_matrix, &iqmatrix_buf ); CHECK_VASTATUS(va_status, "vaCreateBuffer"); - + va_status = vaCreateBuffer(va_dpy, context_id, VASliceParameterBufferType, sizeof(VASliceParameterBufferMPEG2), @@ -258,20 +283,32 @@ int main(int argc,char **argv) va_status = vaSyncSurface(va_dpy, surface_id); CHECK_VASTATUS(va_status, "vaSyncSurface"); - + if (putsurface) { +#ifdef ANDROID + sp proc(ProcessState::self()); + ProcessState::self()->startThreadPool(); + + printf("Create window0 for thread0\n"); + SURFACE_CREATE(client,surface_ctrl,android_surface, android_isurface, WIN_WIDTH, WIN_HEIGHT); + + va_status = vaPutSurface(va_dpy, surface_id, android_isurface, + 0,0,CLIP_WIDTH,CLIP_HEIGHT, + 0,0,WIN_WIDTH,WIN_HEIGHT, + NULL,0,0); +#else Window win; win = XCreateSimpleWindow(x11_display, RootWindow(x11_display, 0), 0, 0, - WIN_WIDTH,WIN_HEIGHT, 0, 0, WhitePixel(x11_display, 0)); + WIN_WIDTH,WIN_HEIGHT, 0, 0, WhitePixel(x11_display, 0)); XMapWindow(x11_display, win); XSync(x11_display, False); va_status = vaPutSurface(va_dpy, surface_id, win, 0,0,CLIP_WIDTH,CLIP_HEIGHT, 0,0,WIN_WIDTH,WIN_HEIGHT, NULL,0,0); - CHECK_VASTATUS(va_status, "vaPutSurface"); +#endif + CHECK_VASTATUS(va_status, "vaPutSurface"); } - printf("press any key to exit\n"); getchar(); @@ -280,7 +317,11 @@ int main(int argc,char **argv) vaDestroyContext(va_dpy,context_id); vaTerminate(va_dpy); +#ifdef ANDROID + free(x11_display); +#else XCloseDisplay(x11_display); +#endif return 0; } diff --git a/test/encode/Android.mk b/test/encode/Android.mk new file mode 100755 index 0000000..8395cdd --- /dev/null +++ b/test/encode/Android.mk @@ -0,0 +1,26 @@ +# For test_01 +# ===================================================== + +LOCAL_PATH:= $(call my-dir) + +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := \ + h264encode_android.cpp \ + #h264encode_x11.c \ + +LOCAL_CFLAGS += \ + -DANDROID + +LOCAL_C_INCLUDES += \ + $(TARGET_OUT_HEADERS)/libva \ + $(TOPDIR)/hardware/intel/libva/va/ \ + $(TARGET_OUT_HEADERS)/X11 + +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE := h264encode + +LOCAL_SHARED_LIBRARIES := libva-android libva libdl libdrm libcutils libutils libui libsurfaceflinger_client + +include $(BUILD_EXECUTABLE) + diff --git a/test/encode/Makefile.am b/test/encode/Makefile.am index db4e67e..133b08e 100644 --- a/test/encode/Makefile.am +++ b/test/encode/Makefile.am @@ -27,7 +27,7 @@ AM_CFLAGS = -I$(top_srcdir)/va -I$(top_srcdir)/src/x11 TEST_LIBS = $(top_builddir)/va/$(libvabackendlib) h264encode_LDADD = $(TEST_LIBS) -h264encode_SOURCES = h264encode.c +h264encode_SOURCES = h264encode_x11.c avcenc_LDADD= $(TEST_LIBS) avcenc_SOURCES= avcenc.c diff --git a/test/encode/h264encode_android.cpp b/test/encode/h264encode_android.cpp new file mode 100644 index 0000000..9960c48 --- /dev/null +++ b/test/encode/h264encode_android.cpp @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2007-2008 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. + */ + +/* + * it is a real program to show how VAAPI encoding work, + * It does H264 element stream level encoding on auto-generated YUV data + * + * gcc -o h264encode h264encode -lva -lva-x11 + * ./h264encode -w -h -n + * + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define Display unsigned int + +using namespace android; +#include "../android_winsys.cpp" +#include "h264encode_common.c" + +sp client; +sp android_surface; +sp android_isurface; +sp surface_ctrl; + +static int display_surface(int frame_id, int *exit_encode) +{ + VAStatus va_status; + + sp proc(ProcessState::self()); + ProcessState::self()->startThreadPool(); + + printf("Create window0 for thread0\n"); + SURFACE_CREATE(client,surface_ctrl,android_surface, android_isurface, win_width, win_height); + va_status = vaPutSurface(va_dpy, surface_id[frame_id], android_isurface, + 0,0, frame_width, frame_height, + 0,0, win_width, win_height, + NULL,0,0); + + *exit_encode = 0; + return 0; +} + diff --git a/test/encode/h264encode.c b/test/encode/h264encode_common.c similarity index 90% rename from test/encode/h264encode.c rename to test/encode/h264encode_common.c index cfdaea6..97dd719 100644 --- a/test/encode/h264encode.c +++ b/test/encode/h264encode_common.c @@ -34,18 +34,17 @@ #include #include #include -#include - #include - #include #include #include - #include - #include +#ifdef ANDROID +#include +#else #include +#endif #define CHECK_VASTATUS(va_status,func) \ if (va_status != VA_STATUS_SUCCESS) { \ @@ -54,25 +53,19 @@ if (va_status != VA_STATUS_SUCCESS) { \ } #include "loadsurface.h" - #define SURFACE_NUM 18 /* 16 surfaces for src, 2 surface for reconstructed/reference */ - -static Display *x11_display; +#define CODEDBUF_NUM 5 static VADisplay va_dpy; -static VAContextID context_id; static VASurfaceID surface_id[SURFACE_NUM]; -static Window display_win = 0; -static int win_width; -static int win_height; - +static VABufferID coded_buf[CODEDBUF_NUM]; +static VAContextID context_id; +static Display *x11_display; static int coded_fd; static char coded_file[256]; - -#define CODEDBUF_NUM 5 -static VABufferID coded_buf[CODEDBUF_NUM]; - +static int frame_width, frame_height; +static int win_width; +static int win_height; static int frame_display = 0; /* display the frame during encoding */ -static int frame_width=352, frame_height=288; static int frame_rate = 30; static int frame_count = 400; static int intra_count = 30; @@ -80,6 +73,8 @@ static int frame_bitrate = 8000000; /* 8M */ static int initial_qp = 15; static int minimal_qp = 0; +static int display_surface(int frame_id, int *exit_encode); + static int upload_source_YUV_once_for_all() { VAImage surface_image; @@ -96,7 +91,7 @@ static int upload_source_YUV_once_for_all() row_shift++; if (row_shift==(2*box_width)) row_shift= 0; } - printf("\n", i); + printf("\n"); return 0; } @@ -114,7 +109,7 @@ static int save_coded_buf(VABufferID coded_buf, int current_frame, int frame_ski while (buf_list != NULL) { printf("Write %d bytes", buf_list->size); coded_size += write(coded_fd, buf_list->buf, buf_list->size); - buf_list = buf_list->next; + buf_list = (VACodedBufferSegment *) buf_list->next; } vaUnmapBuffer(va_dpy,coded_buf); @@ -144,53 +139,10 @@ static int save_coded_buf(VABufferID coded_buf, int current_frame, int frame_ski printf("(SKipped)"); printf(" "); - return; + return 0; } -static int display_surface(int frame_id, int *exit_encode) -{ - Window win = display_win; - XEvent event; - VAStatus va_status; - - if (win == 0) { /* display reconstructed surface */ - win_width = frame_width; - win_height = frame_height; - - win = XCreateSimpleWindow(x11_display, RootWindow(x11_display, 0), 0, 0, - frame_width, frame_height, 0, 0, WhitePixel(x11_display, 0)); - XMapWindow(x11_display, win); - XSync(x11_display, False); - - display_win = win; - } - - va_status = vaPutSurface(va_dpy, surface_id[frame_id], win, - 0,0, frame_width, frame_height, - 0,0, win_width, win_height, - NULL,0,0); - - *exit_encode = 0; - while(XPending(x11_display)) { - XNextEvent(x11_display, &event); - - /* bail on any focused key press */ - if(event.type == KeyPress) { - *exit_encode = 1; - break; - } - - /* rescale the video to fit the window */ - if(event.type == ConfigureNotify) { - win_width = event.xconfigure.width; - win_height = event.xconfigure.height; - } - } - - return; -} - enum { SH_LEVEL_1=10, SH_LEVEL_1B=11, @@ -302,7 +254,7 @@ static int do_h264_encoding(void) va_status = vaSyncSurface(va_dpy, surface_id[src_surface]); CHECK_VASTATUS(va_status,"vaSyncSurface"); - surface_status = 0; + surface_status = (VASurfaceStatus) 0; va_status = vaQuerySurfaceStatus(va_dpy, surface_id[src_surface],&surface_status); frame_skipped = (surface_status & VASurfaceSkipped); @@ -398,9 +350,14 @@ int main(int argc,char **argv) } } +#ifdef ANDROID + x11_display = (Display*)malloc(sizeof(Display)); + *(x11_display) = 0x18c34078; +#else x11_display = XOpenDisplay(":0.0"); +#endif assert(x11_display); - + va_dpy = vaGetDisplay(x11_display); va_status = vaInitialize(va_dpy, &major_ver, &minor_ver); CHECK_VASTATUS(va_status, "vaInitialize"); @@ -466,7 +423,11 @@ int main(int argc,char **argv) vaTerminate(va_dpy); +#ifdef ANDROID + free(x11_display); +#else XCloseDisplay(x11_display); +#endif return 0; } diff --git a/test/encode/h264encode_x11.c b/test/encode/h264encode_x11.c new file mode 100644 index 0000000..a30e667 --- /dev/null +++ b/test/encode/h264encode_x11.c @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2007-2008 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. + */ + +/* + * it is a real program to show how VAAPI encoding work, + * It does H264 element stream level encoding on auto-generated YUV data + * + * gcc -o h264encode h264encode -lva -lva-x11 + * ./h264encode -w -h -n + * + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define SURFACE_NUM 18 /* 16 surfaces for src, 2 surface for reconstructed/reference */ + +static Display *x11_display; +static VADisplay va_dpy; +static VASurfaceID surface_id[SURFACE_NUM]; +static Window display_win = 0; +static int win_width; +static int win_height; +static int frame_width=352, frame_height=288; + +static int display_surface(int frame_id, int *exit_encode) +{ + Window win = display_win; + XEvent event; + VAStatus va_status; + + if (win == 0) { /* display reconstructed surface */ + win_width = frame_width; + win_height = frame_height; + + win = XCreateSimpleWindow(x11_display, RootWindow(x11_display, 0), 0, 0, + frame_width, frame_height, 0, 0, WhitePixel(x11_display, 0)); + XMapWindow(x11_display, win); + XSync(x11_display, False); + + display_win = win; + } + + va_status = vaPutSurface(va_dpy, surface_id[frame_id], win, + 0,0, frame_width, frame_height, + 0,0, win_width, win_height, + NULL,0,0); + + *exit_encode = 0; + while(XPending(x11_display)) { + XNextEvent(x11_display, &event); + + /* bail on any focused key press */ + if(event.type == KeyPress) { + *exit_encode = 1; + break; + } + + /* rescale the video to fit the window */ + if(event.type == ConfigureNotify) { + win_width = event.xconfigure.width; + win_height = event.xconfigure.height; + } + } + + return; +} + +#include "h264encode_common.c" diff --git a/test/putsurface/Android.mk b/test/putsurface/Android.mk index 8bcfd0c..cce0b63 100644 --- a/test/putsurface/Android.mk +++ b/test/putsurface/Android.mk @@ -6,7 +6,8 @@ LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := \ - putsurface-android.cpp + putsurface_android.cpp + #putsurface_x11.c LOCAL_CFLAGS += \ -DANDROID diff --git a/test/putsurface/Makefile.am b/test/putsurface/Makefile.am index fe18388..c43bde2 100644 --- a/test/putsurface/Makefile.am +++ b/test/putsurface/Makefile.am @@ -27,7 +27,7 @@ AM_CFLAGS = -I$(top_srcdir)/va -I$(top_srcdir)/src/x11 TEST_LIBS = $(top_builddir)/va/$(libvabackendlib) -lpthread putsurface_LDADD = $(TEST_LIBS) -putsurface_SOURCES = putsurface.c +putsurface_SOURCES = putsurface_x11.c EXTRA_DIST = loadsurface.h diff --git a/test/putsurface/putsurface.c b/test/putsurface/putsurface.c deleted file mode 100644 index fcea3ad..0000000 --- a/test/putsurface/putsurface.c +++ /dev/null @@ -1,412 +0,0 @@ -/* - * 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. - */ - - -/* gcc -o putsurface putsurface.c -lva -lva-x11 */ - -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include - -#include -#include - -#include - -#include - -/*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 Window win_thread0, win_thread1; -static Pixmap pixmap_thread0, pixmap_thread1; -static GC context_thread0, context_thread1; -static Display *x11_display; -static VADisplay *va_dpy; -static int multi_thread=0; -static int put_pixmap = 0; -static int test_clip = 0; -static int display_field = VA_FRAME_PICTURE; -static int check_event = 1; -static int verbose=0; -static pthread_mutex_t surface_mutex[SURFACE_NUM]; - -static pthread_mutex_t gmutex; - -static int box_width=32; - -static Pixmap create_pixmap(int width, int height) -{ - int screen = DefaultScreen(x11_display); - Window root; - Pixmap pixmap; - XWindowAttributes attr; - - root = RootWindow(x11_display, screen); - - XGetWindowAttributes (x11_display, root, &attr); - - 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; -} - -static int create_window(int width, int height) -{ - int screen = DefaultScreen(x11_display); - Window root, win; - - root = RootWindow(x11_display, screen); - - printf("Create window0 for thread0\n"); - win_thread0 = win = XCreateSimpleWindow(x11_display, root, 0, 0, width, height, - 0, 0, WhitePixel(x11_display, 0)); - if (win) { - XSizeHints sizehints; - sizehints.width = width; - sizehints.height = height; - sizehints.flags = USSize; - XSetNormalHints(x11_display, win, &sizehints); - XSetStandardProperties(x11_display, win, "Thread 0", "Thread 0", - None, (char **)NULL, 0, &sizehints); - - XMapWindow(x11_display, win); - } - context_thread0 = XCreateGC(x11_display, win, 0, 0); - XSelectInput(x11_display, win, KeyPressMask | StructureNotifyMask); - XSync(x11_display, False); - - if (put_pixmap) - pixmap_thread0 = create_pixmap(width, height); - - if (multi_thread == 0) - return 0; - - printf("Create window1 for thread1\n"); - - win_thread1 = win = XCreateSimpleWindow(x11_display, root, width, 0, width, height, - 0, 0, WhitePixel(x11_display, 0)); - if (win) { - XSizeHints sizehints; - sizehints.width = width; - sizehints.height = height; - sizehints.flags = USSize; - XSetNormalHints(x11_display, win, &sizehints); - XSetStandardProperties(x11_display, win, "Thread 1", "Thread 1", - None, (char **)NULL, 0, &sizehints); - - XMapWindow(x11_display, win); - } - if (put_pixmap) - pixmap_thread1 = create_pixmap(width, height); - - context_thread1 = XCreateGC(x11_display, win, 0, 0); - XSelectInput(x11_display, win, KeyPressMask | StructureNotifyMask); - XSync(x11_display, False); - - return 0; -} - -static VASurfaceID get_next_free_surface(int *index) -{ - VASurfaceStatus surface_status; - int i; - - assert(index); - - for (i=0; i\n"); - printf(" -p output to pixmap\n"); - printf(" -d the dimension of black/write square box, default is 32\n"); - printf(" -t multi-threads\n"); - printf(" -e don't check X11 event\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 'e': - check_event = 0; - break; - case 'p': - put_pixmap = 1; - 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 = XOpenDisplay(":0.0"); - 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, (void *)putsurface_thread, (void*)win_thread1); - - putsurface_thread((void *)win_thread0); - - if (multi_thread == 1) - pthread_join(thread1, (void **)&ret); - - vaDestroySurfaces(va_dpy,&surface_id[0],SURFACE_NUM); - vaTerminate(va_dpy); - - return 0; -} diff --git a/test/putsurface/putsurface_android.cpp b/test/putsurface/putsurface_android.cpp new file mode 100644 index 0000000..e168727 --- /dev/null +++ b/test/putsurface/putsurface_android.cpp @@ -0,0 +1,77 @@ +/* + * 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define Display unsigned int +static int win_thread0 = 0, win_thread1 = 0; +static int multi_thread = 0; + +using namespace android; +#include "../android_winsys.cpp" + +sp client; +sp android_surface; +sp android_isurface; +sp surface_ctrl; + +sp client1; +sp android_surface1; +sp android_isurface1; +sp surface_ctrl1; + + +static int create_window(int width, int height) +{ + sp proc(ProcessState::self()); + ProcessState::self()->startThreadPool(); + + printf("Create window0 for thread0\n"); + SURFACE_CREATE(client,surface_ctrl,android_surface, android_isurface, width, height); + + win_thread0 = 1; + if (multi_thread == 0) + return 0; + + printf("Create window1 for thread1\n"); + /* need to modify here jgl*/ + SURFACE_CREATE(client1,surface_ctrl1,android_surface1, android_isurface1, width, height); + + win_thread1 = 2; + return 0; +} + +#include "putsurface_common.c" diff --git a/test/putsurface/putsurface-android.cpp b/test/putsurface/putsurface_common.c similarity index 79% rename from test/putsurface/putsurface-android.cpp rename to test/putsurface/putsurface_common.c index ec2c865..23736ca 100644 --- a/test/putsurface/putsurface-android.cpp +++ b/test/putsurface/putsurface_common.c @@ -38,21 +38,12 @@ #include #include +#ifdef ANDROID #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#define Display unsigned int - - +#else +#include +#endif #include - #include /*currently, if XCheckWindowEvent was called in more than one thread, it would cause @@ -71,104 +62,27 @@ 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 check_event = 1; +static int put_pixmap = 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 pthread_mutex_t gmutex; static int box_width = 32; - -using namespace android; - -sp client; -sp android_surface; -sp android_isurface; -sp surface_ctrl; - -sp client1; -sp android_surface1; -sp android_isurface1; -sp surface_ctrl1; - -namespace android { -class Test { -public: - static const sp& getISurface(const sp& s) { - return s->getISurface(); - } -}; -}; - - - - - -static int create_window(int width, int height) -{ - sp 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; - -} - - +#ifndef ANDROID +static Pixmap create_pixmap(int width, int height); +#endif +static int create_window(int width, int height); static VASurfaceID get_next_free_surface(int *index) { @@ -210,13 +124,23 @@ static unsigned long get_tick_count(void) static void* putsurface_thread(void *data) { int width=win_width, height=win_height; +#ifdef ANDROID int win = (int)data; +#else + Window win = (Window)data; + Pixmap pixmap = 0; + GC context = NULL; + Bool is_event; + XEvent event; + Drawable draw; +#endif 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 */ +#ifdef ANDROID sp win_isurface; if (win == win_thread0) { printf("Enter into thread0\n\n"); @@ -227,6 +151,20 @@ static void* putsurface_thread(void *data) printf("Enter into thread1\n\n"); win_isurface = android_isurface1; } +#else + if (win == win_thread0) { + printf("Enter into thread0\n\n"); + pixmap = pixmap_thread0; + context = context_thread0; + } + + if (win == win_thread1) { + printf("Enter into thread1\n\n"); + pixmap = pixmap_thread1; + context = context_thread1; + } +#endif + printf("vaPutSurface into a Window directly\n\n"); putsurface_time = 0; @@ -242,12 +180,21 @@ static void* putsurface_thread(void *data) start_time = get_tick_count(); +#ifdef ANDROID 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); +#else + vaStatus = vaPutSurface(va_dpy, surface_id, draw, + 0,0,surface_width,surface_height, + 0,0,width,height, + (test_clip==0)?NULL:&cliprects[0], + (test_clip==0)?0:2, + display_field); +#endif CHECK_VASTATUS(vaStatus,"vaPutSurface"); @@ -274,10 +221,31 @@ static void* putsurface_thread(void *data) cliprects[1].x, cliprects[1].y, cliprects[1].width, cliprects[1].height); } } - - + + pthread_mutex_unlock(&surface_mutex[index]); - +#ifndef ANDROID + if (check_event) { + pthread_mutex_lock(&gmutex); + is_event = XCheckWindowEvent(x11_display, win, StructureNotifyMask|KeyPressMask,&event); + pthread_mutex_unlock(&gmutex); + if (is_event) { + /* bail on any focused key press */ + if(event.type == KeyPress) { + quit = 1; + break; + } +#if 0 + /* rescale the video to fit the window */ + if(event.type == ConfigureNotify) { + width = event.xconfigure.width; + height = event.xconfigure.height; + printf("Scale window to %dx%d\n", width, height); + } +#endif + } + } +#endif row_shift++; if (row_shift==(2*box_width)) row_shift= 0; @@ -326,6 +294,14 @@ int main(int argc,char **argv) multi_thread = 1; printf("Two threads to do vaPutSurface\n"); break; +#ifndef ANDROID + case 'e': + check_event = 0; + break; + case 'p': + put_pixmap = 1; + break; +#endif case 'c': test_clip = 1; break; @@ -346,8 +322,12 @@ int main(int argc,char **argv) } } +#ifdef ANDROID x11_display = (Display*)malloc(sizeof(Display)); *(x11_display) = 0x18c34078; +#else + x11_display = XOpenDisplay(":0.0"); +#endif if (x11_display == NULL) { fprintf(stderr, "Can't connect X server!\n"); @@ -365,10 +345,10 @@ int main(int argc,char **argv) 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); diff --git a/test/putsurface/putsurface_x11.c b/test/putsurface/putsurface_x11.c new file mode 100644 index 0000000..3968ad3 --- /dev/null +++ b/test/putsurface/putsurface_x11.c @@ -0,0 +1,109 @@ +/* + * 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 +#include +#include + +static Window win_thread0, win_thread1; +static int multi_thread = 0; +static Pixmap pixmap_thread0, pixmap_thread1; +static GC context_thread0, context_thread1; +static pthread_mutex_t gmutex; + +#include "putsurface_common.c" + +static Pixmap create_pixmap(int width, int height) +{ + int screen = DefaultScreen(x11_display); + Window root; + Pixmap pixmap; + XWindowAttributes attr; + + root = RootWindow(x11_display, screen); + + XGetWindowAttributes (x11_display, root, &attr); + + 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; +} + +static int create_window(int width, int height) +{ + int screen = DefaultScreen(x11_display); + Window root, win; + + root = RootWindow(x11_display, screen); + + printf("Create window0 for thread0\n"); + win_thread0 = win = XCreateSimpleWindow(x11_display, root, 0, 0, width, height, + 0, 0, WhitePixel(x11_display, 0)); + if (win) { + XSizeHints sizehints; + sizehints.width = width; + sizehints.height = height; + sizehints.flags = USSize; + XSetNormalHints(x11_display, win, &sizehints); + XSetStandardProperties(x11_display, win, "Thread 0", "Thread 0", + None, (char **)NULL, 0, &sizehints); + + XMapWindow(x11_display, win); + } + context_thread0 = XCreateGC(x11_display, win, 0, 0); + XSelectInput(x11_display, win, KeyPressMask | StructureNotifyMask); + XSync(x11_display, False); + + if (put_pixmap) + pixmap_thread0 = create_pixmap(width, height); + + if (multi_thread == 0) + return 0; + + printf("Create window1 for thread1\n"); + + win_thread1 = win = XCreateSimpleWindow(x11_display, root, width, 0, width, height, + 0, 0, WhitePixel(x11_display, 0)); + if (win) { + XSizeHints sizehints; + sizehints.width = width; + sizehints.height = height; + sizehints.flags = USSize; + XSetNormalHints(x11_display, win, &sizehints); + XSetStandardProperties(x11_display, win, "Thread 1", "Thread 1", + None, (char **)NULL, 0, &sizehints); + + XMapWindow(x11_display, win); + } + if (put_pixmap) + pixmap_thread1 = create_pixmap(width, height); + + context_thread1 = XCreateGC(x11_display, win, 0, 0); + XSelectInput(x11_display, win, KeyPressMask | StructureNotifyMask); + XSync(x11_display, False); + + return 0; +} diff --git a/va/va_trace.c b/va/va_trace.c index eb268db..cd15312 100644 --- a/va/va_trace.c +++ b/va/va_trace.c @@ -407,25 +407,21 @@ void va_TraceSurface(VADisplay dpy) } -VAStatus va_TraceInitialize ( +void va_TraceInitialize ( VADisplay dpy, int *major_version, /* out */ int *minor_version /* out */ ) { - int i; - DPY2INDEX(dpy); - + DPY2INDEX(dpy); TRACE_FUNCNAME(idx); } -VAStatus va_TraceTerminate ( +void va_TraceTerminate ( VADisplay dpy ) { - int i; - DPY2INDEX(dpy); - + DPY2INDEX(dpy); TRACE_FUNCNAME(idx); } @@ -1841,12 +1837,12 @@ void va_TracePutSurface ( va_TraceMsg(idx, "\tsurface = 0x%08x\n", surface); va_TraceMsg(idx, "\tdraw = 0x%08x\n", draw); - va_TraceMsg(idx, "\tsrcx = %d\n", surface); - va_TraceMsg(idx, "\tsrcy = %d\n", surface); - va_TraceMsg(idx, "\tsrcw = %d\n", surface); - va_TraceMsg(idx, "\tsrch = %d\n", surface); - va_TraceMsg(idx, "\tdestx = %d\n", surface); - va_TraceMsg(idx, "\tdesty = %d\n", surface); + va_TraceMsg(idx, "\tsrcx = %d\n", srcx); + va_TraceMsg(idx, "\tsrcy = %d\n", srcy); + va_TraceMsg(idx, "\tsrcw = %d\n", srcw); + va_TraceMsg(idx, "\tsrch = %d\n", srch); + va_TraceMsg(idx, "\tdestx = %d\n", destx); + va_TraceMsg(idx, "\tdesty = %d\n", desty); va_TraceMsg(idx, "\tdestw = %d\n", destw); va_TraceMsg(idx, "\tdesth = %d\n", desth); va_TraceMsg(idx, "\tcliprects = 0x%08x\n", cliprects); diff --git a/va/x11/va_dri2.c b/va/x11/va_dri2.c index 4915651..8e9f304 100644 --- a/va/x11/va_dri2.c +++ b/va/x11/va_dri2.c @@ -340,9 +340,9 @@ void VA_DRI2SwapBuffers(Display *dpy, XID drawable, CARD64 target_msc, req->drawable = drawable; load_swap_req(req, target_msc, divisor, remainder); - _XReply(dpy, (xReply *)&rep, 0, xFalse); + _XSend(dpy, NULL, 0); - *count = vals_to_card64(rep.swap_lo, rep.swap_hi); + *count = 0; UnlockDisplay(dpy); SyncHandle(); -- 2.7.4