1 /* 2 * Copyright (c) 2012 Intel Corporation. All Rights Reserved. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the 6 * "Software"), to deal in the Software without restriction, including 7 * without limitation the rights to use, copy, modify, merge, publish, 8 * distribute, sub license, and/or sell copies of the Software, and to 9 * permit persons to whom the Software is furnished to do so, subject to 10 * the following conditions: 11 * 12 * The above copyright notice and this permission notice (including the 13 * next paragraph) shall be included in all copies or substantial portions 14 * of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 19 * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR 20 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 21 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 22 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 */ 24 25 #include <va/va_android.h> 26 #include "va_display.h" 27 28 #include <gui/Surface.h> 29 #include <gui/SurfaceComposerClient.h> 30 #include <gui/ISurfaceComposer.h> 31 32 static unsigned int fake_display = 0xdeada01d; 33 34 using namespace android; 35 36 static sp<SurfaceComposerClient> client = NULL; 37 static sp<SurfaceControl> surface_ctr = NULL; 38 static sp<ANativeWindow> anw = NULL; 39 40 static VADisplay 41 va_open_display_android(void) 42 { 43 return vaGetDisplay(&fake_display); 44 } 45 46 static void 47 va_close_display_android(VADisplay va_dpy) 48 { 49 } 50 51 static int create_window(int x, int y, int width, int height) 52 { 53 client = new SurfaceComposerClient(); 54 55 surface_ctr = client->createSurface( 56 String8("Test Surface"), 57 width, height, 58 PIXEL_FORMAT_RGB_888, 0); 59 60 SurfaceComposerClient::openGlobalTransaction(); 61 surface_ctr->setLayer(0x7FFFFFFF); 62 surface_ctr->show(); 63 SurfaceComposerClient::closeGlobalTransaction(); 64 65 SurfaceComposerClient::openGlobalTransaction(); 66 surface_ctr->setPosition(x, y); 67 SurfaceComposerClient::closeGlobalTransaction(); 68 69 SurfaceComposerClient::openGlobalTransaction(); 70 surface_ctr->setSize(width, height); 71 SurfaceComposerClient::closeGlobalTransaction(); 72 73 anw = surface_ctr->getSurface(); 74 75 return 0; 76 } 77 78 79 static VAStatus 80 va_put_surface_android( 81 VADisplay va_dpy, 82 VASurfaceID surface, 83 const VARectangle *src_rect, 84 const VARectangle *dst_rect 85 ) 86 { 87 if (anw == NULL) 88 create_window(dst_rect->x, dst_rect->y, dst_rect->width, dst_rect->height); 89 90 return vaPutSurface(va_dpy, surface, anw, 91 src_rect->x, src_rect->y, 92 src_rect->width, src_rect->height, 93 dst_rect->x, dst_rect->y, 94 dst_rect->width, dst_rect->height, 95 NULL, 0, 96 VA_FRAME_PICTURE); 97 } 98 99 extern "C" 100 const VADisplayHooks va_display_hooks_android = { 101 "android", 102 va_open_display_android, 103 va_close_display_android, 104 va_put_surface_android 105 }; 106