Commit 72dd51a2 authored by Austin Yuan's avatar Austin Yuan

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: default avatarGuoliang Ji <guoliangx.ji@intel.com>
Signed-off-by: default avatarZhaohan Ren <zhaohan.ren@intel.com>
Signed-off-by: default avatarAustin Yuan <shengquan.yuan@gmail.com>
parent a983263f
...@@ -92,6 +92,7 @@ AC_SUBST(LIBVA_DRIVERS_PATH) ...@@ -92,6 +92,7 @@ AC_SUBST(LIBVA_DRIVERS_PATH)
AC_DISABLE_STATIC AC_DISABLE_STATIC
AC_PROG_LIBTOOL AC_PROG_LIBTOOL
AC_PROG_CC AC_PROG_CC
AC_PROG_CXX
AC_HEADER_STDC AC_HEADER_STDC
AC_SYS_LARGEFILE AC_SYS_LARGEFILE
......
namespace android {
class Test {
public:
static const sp<ISurface>& getISurface(const sp<Surface>& 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();\
\
}\
# 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)
/*
* 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;
}
}
...@@ -22,8 +22,12 @@ ...@@ -22,8 +22,12 @@
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/ */
#include <va/va.h>
#ifdef ANDROID
#include <va/va_android.h>
#else
#include <va/va_x11.h> #include <va/va_x11.h>
#endif
#include "assert.h" #include "assert.h"
#include <stdarg.h> #include <stdarg.h>
#include <stdio.h> #include <stdio.h>
...@@ -34,6 +38,13 @@ ...@@ -34,6 +38,13 @@
#define ASSERT assert #define ASSERT assert
void status(const char *msg, ...);
#ifdef ANDROID
#include "test_android.c"
#else
#include "test_x11.c"
#endif
Display *dpy; Display *dpy;
VADisplay va_dpy; VADisplay va_dpy;
VAStatus va_status; VAStatus va_status;
...@@ -74,37 +85,6 @@ int main(int argc, const char* argv[]) ...@@ -74,37 +85,6 @@ int main(int argc, const char* argv[])
return 0; 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); #define PROFILE(profile) case VAProfile##profile: return("VAProfile" #profile);
const char *profile2string(VAProfile profile) const char *profile2string(VAProfile profile)
......
/*
* 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;
}
}
# 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)
...@@ -27,7 +27,7 @@ AM_CFLAGS = -I$(top_srcdir)/va -I$(top_srcdir)/src/x11 ...@@ -27,7 +27,7 @@ AM_CFLAGS = -I$(top_srcdir)/va -I$(top_srcdir)/src/x11
TEST_LIBS = $(top_builddir)/va/$(libvabackendlib) TEST_LIBS = $(top_builddir)/va/$(libvabackendlib)
mpeg2vldemo_LDADD = $(TEST_LIBS) mpeg2vldemo_LDADD = $(TEST_LIBS)
mpeg2vldemo_SOURCES = mpeg2vldemo.c mpeg2vldemo_SOURCES = mpeg2vldemo.cpp
valgrind: $(bin_PROGRAMS) valgrind: $(bin_PROGRAMS)
......
...@@ -37,18 +37,36 @@ ...@@ -37,18 +37,36 @@
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <getopt.h> #include <getopt.h>
#include <X11/Xlib.h>
#include <unistd.h> #include <unistd.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <fcntl.h> #include <fcntl.h>
#include <assert.h> #include <assert.h>
#include <va/va.h> #include <va/va.h>
#ifdef ANDROID
#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
using namespace android;
sp<SurfaceComposerClient> client;
sp<Surface> android_surface;
sp<ISurface> android_isurface;
sp<SurfaceControl> surface_ctrl;
#include "../android_winsys.cpp"
#else
#include <va/va_x11.h> #include <va/va_x11.h>
#include <X11/Xlib.h>
#endif
#define CHECK_VASTATUS(va_status,func) \ #define CHECK_VASTATUS(va_status,func) \
if (va_status != VA_STATUS_SUCCESS) { \ if (va_status != VA_STATUS_SUCCESS) { \
...@@ -122,15 +140,18 @@ static VAIQMatrixBufferMPEG2 iq_matrix = { ...@@ -122,15 +140,18 @@ static VAIQMatrixBufferMPEG2 iq_matrix = {
chroma_non_intra_quantiser_matrix:{0} chroma_non_intra_quantiser_matrix:{0}
}; };
#if 1
static VASliceParameterBufferMPEG2 slice_param={ static VASliceParameterBufferMPEG2 slice_param={
slice_data_size:150, slice_data_size:150,
slice_data_offset:0, slice_data_offset:0,
slice_data_flag: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, slice_vertical_position:0,
quantiser_scale_code:2, quantiser_scale_code:2,
intra_slice_flag:0 intra_slice_flag:0
}; };
#endif
#define CLIP_WIDTH 16 #define CLIP_WIDTH 16
#define CLIP_HEIGHT 16 #define CLIP_HEIGHT 16
...@@ -155,8 +176,12 @@ int main(int argc,char **argv) ...@@ -155,8 +176,12 @@ int main(int argc,char **argv)
if (argc > 1) if (argc > 1)
putsurface=1; putsurface=1;
#ifdef ANDROID
x11_display = (Display*)malloc(sizeof(Display));
*(x11_display ) = 0x18c34078;
#else
x11_display = XOpenDisplay(":0.0"); x11_display = XOpenDisplay(":0.0");
#endif
if (x11_display == NULL) { if (x11_display == NULL) {
fprintf(stderr, "Can't connect X server!\n"); fprintf(stderr, "Can't connect X server!\n");
...@@ -260,6 +285,18 @@ int main(int argc,char **argv) ...@@ -260,6 +285,18 @@ int main(int argc,char **argv)
CHECK_VASTATUS(va_status, "vaSyncSurface"); CHECK_VASTATUS(va_status, "vaSyncSurface");
if (putsurface) { if (putsurface) {
#ifdef ANDROID
sp<ProcessState> 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; Window win;
win = XCreateSimpleWindow(x11_display, RootWindow(x11_display, 0), 0, 0, 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));
...@@ -269,9 +306,9 @@ int main(int argc,char **argv) ...@@ -269,9 +306,9 @@ int main(int argc,char **argv)
0,0,CLIP_WIDTH,CLIP_HEIGHT, 0,0,CLIP_WIDTH,CLIP_HEIGHT,
0,0,WIN_WIDTH,WIN_HEIGHT, 0,0,WIN_WIDTH,WIN_HEIGHT,
NULL,0,0); NULL,0,0);
#endif
CHECK_VASTATUS(va_status, "vaPutSurface"); CHECK_VASTATUS(va_status, "vaPutSurface");
} }
printf("press any key to exit\n"); printf("press any key to exit\n");
getchar(); getchar();
...@@ -280,7 +317,11 @@ int main(int argc,char **argv) ...@@ -280,7 +317,11 @@ int main(int argc,char **argv)
vaDestroyContext(va_dpy,context_id); vaDestroyContext(va_dpy,context_id);
vaTerminate(va_dpy); vaTerminate(va_dpy);
#ifdef ANDROID
free(x11_display);
#else
XCloseDisplay(x11_display); XCloseDisplay(x11_display);
#endif
return 0; return 0;
} }
# 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)
...@@ -27,7 +27,7 @@ AM_CFLAGS = -I$(top_srcdir)/va -I$(top_srcdir)/src/x11 ...@@ -27,7 +27,7 @@ AM_CFLAGS = -I$(top_srcdir)/va -I$(top_srcdir)/src/x11
TEST_LIBS = $(top_builddir)/va/$(libvabackendlib) TEST_LIBS = $(top_builddir)/va/$(libvabackendlib)
h264encode_LDADD = $(TEST_LIBS) h264encode_LDADD = $(TEST_LIBS)
h264encode_SOURCES = h264encode.c h264encode_SOURCES = h264encode_x11.c
avcenc_LDADD= $(TEST_LIBS) avcenc_LDADD= $(TEST_LIBS)
avcenc_SOURCES= avcenc.c avcenc_SOURCES= avcenc.c
......
/*
* 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 <width> -h <height> -n <frame_num>
*
*/
#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
using namespace android;
#include "../android_winsys.cpp"
#include "h264encode_common.c"
sp<SurfaceComposerClient> client;
sp<Surface> android_surface;
sp<ISurface> android_isurface;
sp<SurfaceControl> surface_ctrl;
static int display_surface(int frame_id, int *exit_encode)
{
VAStatus va_status;
sp<ProcessState> 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;
}
...@@ -34,18 +34,17 @@ ...@@ -34,18 +34,17 @@
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <getopt.h> #include <getopt.h>
#include <X11/Xlib.h>
#include <unistd.h> #include <unistd.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <fcntl.h> #include <fcntl.h>
#include <assert.h> #include <assert.h>
#include <va/va.h> #include <va/va.h>
#ifdef ANDROID
#include <va/va_android.h>
#else
#include <va/va_x11.h> #include <va/va_x11.h>
#endif
#define CHECK_VASTATUS(va_status,func) \ #define CHECK_VASTATUS(va_status,func) \
if (va_status != VA_STATUS_SUCCESS) { \ if (va_status != VA_STATUS_SUCCESS) { \
...@@ -54,25 +53,19 @@ if (va_status != VA_STATUS_SUCCESS) { \ ...@@ -54,25 +53,19 @@ if (va_status != VA_STATUS_SUCCESS) { \
} }
#include "loadsurface.h" #include "loadsurface.h"
#define SURFACE_NUM 18 /* 16 surfaces for src, 2 surface for reconstructed/reference */ #define SURFACE_NUM 18 /* 16 surfaces for src, 2 surface for reconstructed/reference */
#define CODEDBUF_NUM 5
static Display *x11_display;
static VADisplay va_dpy; static VADisplay va_dpy;
static VAContextID context_id;
static VASurfaceID surface_id[SURFACE_NUM]; static VASurfaceID surface_id[SURFACE_NUM];
static Window display_win = 0; static VABufferID coded_buf[CODEDBUF_NUM];
static int win_width; static VAContextID context_id;
static int win_height; static Display *x11_display;
static int coded_fd; static int coded_fd;
static char coded_file[256]; static char coded_file[256];
static int frame_width, frame_height;
#define CODEDBUF_NUM 5 static int win_width;
static VABufferID coded_buf[CODEDBUF_NUM]; static int win_height;
static int frame_display = 0; /* display the frame during encoding */ 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_rate = 30;
static int frame_count = 400; static int frame_count = 400;
static int intra_count = 30; static int intra_count = 30;
...@@ -80,6 +73,8 @@ static int frame_bitrate = 8000000; /* 8M */ ...@@ -80,6 +73,8 @@ static int frame_bitrate = 8000000; /* 8M */
static int initial_qp = 15; static int initial_qp = 15;
static int minimal_qp = 0; static int minimal_qp = 0;
static int display_surface(int frame_id, int *exit_encode);
static int upload_source_YUV_once_for_all() static int upload_source_YUV_once_for_all()
{ {
VAImage surface_image; VAImage surface_image;
...@@ -96,7 +91,7 @@ static int upload_source_YUV_once_for_all() ...@@ -96,7 +91,7 @@ static int upload_source_YUV_once_for_all()
row_shift++; row_shift++;
if (row_shift==(2*box_width)) row_shift= 0; if (row_shift==(2*box_width)) row_shift= 0;
} }
printf("\n", i); printf("\n");
return 0; return 0;
} }
...@@ -114,7 +109,7 @@ static int save_coded_buf(VABufferID coded_buf, int current_frame, int frame_ski ...@@ -114,7 +109,7 @@ static int save_coded_buf(VABufferID coded_buf, int current_frame, int frame_ski
while (buf_list != NULL) { while (buf_list != NULL) {
printf("Write %d bytes", buf_list->size); printf("Write %d bytes", buf_list->size);
coded_size += write(coded_fd, buf_list->buf, 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); vaUnmapBuffer(va_dpy,coded_buf);
...@@ -144,53 +139,10 @@ static int save_coded_buf(VABufferID coded_buf, int current_frame, int frame_ski ...@@ -144,53 +139,10 @@ static int save_coded_buf(VABufferID coded_buf, int current_frame, int frame_ski
printf("(SKipped)"); printf("(SKipped)");
printf(" "); 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 { enum {
SH_LEVEL_1=10, SH_LEVEL_1=10,
SH_LEVEL_1B=11, SH_LEVEL_1B=11,
...@@ -302,7 +254,7 @@ static int do_h264_encoding(void) ...@@ -302,7 +254,7 @@ static int do_h264_encoding(void)
va_status = vaSyncSurface(va_dpy, surface_id[src_surface]); va_status = vaSyncSurface(va_dpy, surface_id[src_surface]);
CHECK_VASTATUS(va_status,"vaSyncSurface"); CHECK_VASTATUS(va_status,"vaSyncSurface");
surface_status = 0; surface_status = (VASurfaceStatus) 0;
va_status = vaQuerySurfaceStatus(va_dpy, surface_id[src_surface],&surface_status); va_status = vaQuerySurfaceStatus(va_dpy, surface_id[src_surface],&surface_status);
frame_skipped = (surface_status & VASurfaceSkipped); frame_skipped = (surface_status & VASurfaceSkipped);
...@@ -398,7 +350,12 @@ int main(int argc,char **argv) ...@@ -398,7 +350,12 @@ int main(int argc,char **argv)
} }
} }
#ifdef ANDROID
x11_display = (Display*)malloc(sizeof(Display));
*(x11_display) = 0x18c34078;
#else
x11_display = XOpenDisplay(":0.0"); x11_display = XOpenDisplay(":0.0");
#endif
assert(x11_display); assert(x11_display);
va_dpy = vaGetDisplay(x11_display); va_dpy = vaGetDisplay(x11_display);
...@@ -466,7 +423,11 @@ int main(int argc,char **argv) ...@@ -466,7 +423,11 @@ int main(int argc,char **argv)
vaTerminate(va_dpy); vaTerminate(va_dpy);
#ifdef ANDROID
free(x11_display);
#else
XCloseDisplay(x11_display); XCloseDisplay(x11_display);
#endif
return 0; return 0;
} }
/*
* 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 <width> -h <height> -n <frame_num>
*
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <getopt.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <assert.h>
#include <va/va.h>
#include <X11/Xlib.h>
#include <va/va_x11.h>
#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"
...@@ -6,7 +6,8 @@ LOCAL_PATH:= $(call my-dir) ...@@ -6,7 +6,8 @@ LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS) include $(CLEAR_VARS)
LOCAL_SRC_FILES := \ LOCAL_SRC_FILES := \
putsurface-android.cpp putsurface_android.cpp
#putsurface_x11.c
LOCAL_CFLAGS += \ LOCAL_CFLAGS += \
-DANDROID -DANDROID
......
...@@ -27,7 +27,7 @@ AM_CFLAGS = -I$(top_srcdir)/va -I$(top_srcdir)/src/x11 ...@@ -27,7 +27,7 @@ AM_CFLAGS = -I$(top_srcdir)/va -I$(top_srcdir)/src/x11
TEST_LIBS = $(top_builddir)/va/$(libvabackendlib) -lpthread TEST_LIBS = $(top_builddir)/va/$(libvabackendlib) -lpthread
putsurface_LDADD = $(TEST_LIBS) putsurface_LDADD = $(TEST_LIBS)
putsurface_SOURCES = putsurface.c putsurface_SOURCES = putsurface_x11.c
EXTRA_DIST = loadsurface.h EXTRA_DIST = loadsurface.h
......
/*
* 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 <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <getopt.h>
#include <X11/Xlib.h>
#include <X11/Xutil.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_x11.h>
#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 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<SURFACE_NUM; i++) {
surface_status = 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 int putsurface_thread(void *data)
{
int width=win_width, height=win_height;
Drawable draw;
Window win = (Window)data;
Pixmap pixmap = 0;
GC context = NULL;
int quit = 0;
VAStatus vaStatus;
int row_shift = 0;
int index = 0;
Bool is_event;
XEvent event;
unsigned int frame_num=0, start_time, putsurface_time;
VARectangle cliprects[2]; /* client supplied clip list */
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;
}
if (put_pixmap) {
printf("vaPutSurface into a Pixmap, then copy into the Window\n\n");
draw = pixmap;
} else {
printf("vaPutSurface into a Window directly\n\n");
draw = win;
}
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, draw,
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);
}
}
if (put_pixmap)
XCopyArea(x11_display, pixmap, win, context, 0, 0, width, height, 0, 0);
pthread_mutex_unlock(&surface_mutex[index]);
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;
}
/* 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);
}
}
}
row_shift++;
if (row_shift==(2*box_width)) row_shift= 0;
frame_num++;
}
pthread_exit(NULL);
}
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(" -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;
}
/*
* 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 <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>
#include <assert.h>
#include <pthread.h>
#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<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;
static int create_window(int width, int height)
{
sp<ProcessState> 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"
...@@ -38,21 +38,12 @@ ...@@ -38,21 +38,12 @@
#include <fcntl.h> #include <fcntl.h>
#include <va/va.h> #include <va/va.h>
#ifdef ANDROID
#include <va/va_android.h> #include <va/va_android.h>
#include <binder/IPCThreadState.h> #else
#include <binder/ProcessState.h> #include <va/va_x11.h>
#include <binder/IServiceManager.h> #endif
#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 <assert.h>
#include <pthread.h> #include <pthread.h>
/*currently, if XCheckWindowEvent was called in more than one thread, it would cause /*currently, if XCheckWindowEvent was called in more than one thread, it would cause
...@@ -71,104 +62,27 @@ if (va_status != VA_STATUS_SUCCESS) { \ ...@@ -71,104 +62,27 @@ if (va_status != VA_STATUS_SUCCESS) { \
fprintf(stderr,"%s:%s (%d) failed,exit\n", __func__, func, __LINE__); \ fprintf(stderr,"%s:%s (%d) failed,exit\n", __func__, func, __LINE__); \
exit(1); \ exit(1); \
} }
#include "loadsurface.h" #include "loadsurface.h"
#define SURFACE_NUM 5 #define SURFACE_NUM 5
static VASurfaceID surface_id[SURFACE_NUM]; static VASurfaceID surface_id[SURFACE_NUM];
static int surface_width = 352, surface_height = 288; static int surface_width = 352, surface_height = 288;
static int win_width=352, win_height=288; static int win_width=352, win_height=288;
static int win_thread0 = 0, win_thread1 = 0;
static Display *x11_display; static Display *x11_display;
static VADisplay va_dpy; 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 test_clip = 0;
static int display_field = VA_FRAME_PICTURE; static int display_field = VA_FRAME_PICTURE;
static int verbose = 0; static int verbose = 0;
static pthread_mutex_t surface_mutex[SURFACE_NUM]; static pthread_mutex_t surface_mutex[SURFACE_NUM];
static pthread_mutex_t gmutex;
//static pthread_mutex_t gmutex;
static int box_width = 32; static int box_width = 32;
#ifndef ANDROID
using namespace android; static Pixmap create_pixmap(int width, int height);
#endif
sp<SurfaceComposerClient> client; static int create_window(int width, int height);
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) static VASurfaceID get_next_free_surface(int *index)
{ {
...@@ -210,13 +124,23 @@ static unsigned long get_tick_count(void) ...@@ -210,13 +124,23 @@ static unsigned long get_tick_count(void)
static void* putsurface_thread(void *data) static void* putsurface_thread(void *data)
{ {
int width=win_width, height=win_height; int width=win_width, height=win_height;
#ifdef ANDROID
int win = (int)data; 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; int quit = 0;
VAStatus vaStatus; VAStatus vaStatus;
int row_shift = 0; int row_shift = 0;
int index = 0; int index = 0;
unsigned int frame_num=0, start_time, putsurface_time; unsigned int frame_num=0, start_time, putsurface_time;
VARectangle cliprects[2]; /* client supplied clip list */ VARectangle cliprects[2]; /* client supplied clip list */
#ifdef ANDROID
sp<ISurface> win_isurface; sp<ISurface> win_isurface;
if (win == win_thread0) { if (win == win_thread0) {
printf("Enter into thread0\n\n"); printf("Enter into thread0\n\n");
...@@ -227,6 +151,20 @@ static void* putsurface_thread(void *data) ...@@ -227,6 +151,20 @@ static void* putsurface_thread(void *data)
printf("Enter into thread1\n\n"); printf("Enter into thread1\n\n");
win_isurface = android_isurface1; 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"); printf("vaPutSurface into a Window directly\n\n");
putsurface_time = 0; putsurface_time = 0;
...@@ -242,12 +180,21 @@ static void* putsurface_thread(void *data) ...@@ -242,12 +180,21 @@ static void* putsurface_thread(void *data)
start_time = get_tick_count(); start_time = get_tick_count();
#ifdef ANDROID
vaStatus = vaPutSurface(va_dpy, surface_id, win_isurface, vaStatus = vaPutSurface(va_dpy, surface_id, win_isurface,
0,0,surface_width,surface_height, 0,0,surface_width,surface_height,
0,0,width,height, 0,0,width,height,
(test_clip==0)?NULL:&cliprects[0], (test_clip==0)?NULL:&cliprects[0],
(test_clip==0)?0:2, (test_clip==0)?0:2,
display_field); 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"); CHECK_VASTATUS(vaStatus,"vaPutSurface");
...@@ -277,7 +224,28 @@ static void* putsurface_thread(void *data) ...@@ -277,7 +224,28 @@ static void* putsurface_thread(void *data)
pthread_mutex_unlock(&surface_mutex[index]); 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++; row_shift++;
if (row_shift==(2*box_width)) row_shift= 0; if (row_shift==(2*box_width)) row_shift= 0;
...@@ -326,6 +294,14 @@ int main(int argc,char **argv) ...@@ -326,6 +294,14 @@ int main(int argc,char **argv)
multi_thread = 1; multi_thread = 1;
printf("Two threads to do vaPutSurface\n"); printf("Two threads to do vaPutSurface\n");
break; break;
#ifndef ANDROID
case 'e':
check_event = 0;
break;
case 'p':
put_pixmap = 1;
break;
#endif
case 'c': case 'c':
test_clip = 1; test_clip = 1;
break; break;
...@@ -346,8 +322,12 @@ int main(int argc,char **argv) ...@@ -346,8 +322,12 @@ int main(int argc,char **argv)
} }
} }
#ifdef ANDROID
x11_display = (Display*)malloc(sizeof(Display)); x11_display = (Display*)malloc(sizeof(Display));
*(x11_display) = 0x18c34078; *(x11_display) = 0x18c34078;
#else
x11_display = XOpenDisplay(":0.0");
#endif
if (x11_display == NULL) { if (x11_display == NULL) {
fprintf(stderr, "Can't connect X server!\n"); fprintf(stderr, "Can't connect X server!\n");
...@@ -365,10 +345,10 @@ int main(int argc,char **argv) ...@@ -365,10 +345,10 @@ int main(int argc,char **argv)
va_status = vaCreateSurfaces(va_dpy,surface_width, surface_height, va_status = vaCreateSurfaces(va_dpy,surface_width, surface_height,
VA_RT_FORMAT_YUV420, SURFACE_NUM, &surface_id[0]); VA_RT_FORMAT_YUV420, SURFACE_NUM, &surface_id[0]);
CHECK_VASTATUS(va_status, "vaCreateSurfaces"); CHECK_VASTATUS(va_status, "vaCreateSurfaces");
/*
if (check_event) if (check_event)
pthread_mutex_init(&gmutex, NULL); pthread_mutex_init(&gmutex, NULL);
*/
for(i = 0; i< SURFACE_NUM; i++) for(i = 0; i< SURFACE_NUM; i++)
pthread_mutex_init(&surface_mutex[i], NULL); pthread_mutex_init(&surface_mutex[i], NULL);
......
/*
* 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 <X11/Xlib.h>
#include <X11/Xutil.h>
#include <va/va_x11.h>
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;
}
...@@ -407,25 +407,21 @@ void va_TraceSurface(VADisplay dpy) ...@@ -407,25 +407,21 @@ void va_TraceSurface(VADisplay dpy)
} }
VAStatus va_TraceInitialize ( void va_TraceInitialize (
VADisplay dpy, VADisplay dpy,
int *major_version, /* out */ int *major_version, /* out */
int *minor_version /* out */ int *minor_version /* out */
) )
{ {
int i;
DPY2INDEX(dpy); DPY2INDEX(dpy);
TRACE_FUNCNAME(idx); TRACE_FUNCNAME(idx);
} }
VAStatus va_TraceTerminate ( void va_TraceTerminate (
VADisplay dpy VADisplay dpy
) )
{ {
int i;
DPY2INDEX(dpy); DPY2INDEX(dpy);
TRACE_FUNCNAME(idx); TRACE_FUNCNAME(idx);
} }
...@@ -1841,12 +1837,12 @@ void va_TracePutSurface ( ...@@ -1841,12 +1837,12 @@ void va_TracePutSurface (
va_TraceMsg(idx, "\tsurface = 0x%08x\n", surface); va_TraceMsg(idx, "\tsurface = 0x%08x\n", surface);
va_TraceMsg(idx, "\tdraw = 0x%08x\n", draw); va_TraceMsg(idx, "\tdraw = 0x%08x\n", draw);
va_TraceMsg(idx, "\tsrcx = %d\n", surface); va_TraceMsg(idx, "\tsrcx = %d\n", srcx);
va_TraceMsg(idx, "\tsrcy = %d\n", surface); va_TraceMsg(idx, "\tsrcy = %d\n", srcy);
va_TraceMsg(idx, "\tsrcw = %d\n", surface); va_TraceMsg(idx, "\tsrcw = %d\n", srcw);
va_TraceMsg(idx, "\tsrch = %d\n", surface); va_TraceMsg(idx, "\tsrch = %d\n", srch);
va_TraceMsg(idx, "\tdestx = %d\n", surface); va_TraceMsg(idx, "\tdestx = %d\n", destx);
va_TraceMsg(idx, "\tdesty = %d\n", surface); va_TraceMsg(idx, "\tdesty = %d\n", desty);
va_TraceMsg(idx, "\tdestw = %d\n", destw); va_TraceMsg(idx, "\tdestw = %d\n", destw);
va_TraceMsg(idx, "\tdesth = %d\n", desth); va_TraceMsg(idx, "\tdesth = %d\n", desth);
va_TraceMsg(idx, "\tcliprects = 0x%08x\n", cliprects); va_TraceMsg(idx, "\tcliprects = 0x%08x\n", cliprects);
......
...@@ -340,9 +340,9 @@ void VA_DRI2SwapBuffers(Display *dpy, XID drawable, CARD64 target_msc, ...@@ -340,9 +340,9 @@ void VA_DRI2SwapBuffers(Display *dpy, XID drawable, CARD64 target_msc,
req->drawable = drawable; req->drawable = drawable;
load_swap_req(req, target_msc, divisor, remainder); 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); UnlockDisplay(dpy);
SyncHandle(); SyncHandle();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment