1 /* 2 * Copyright (c) 2007 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 #define TEST_DESCRIPTION "vaCreateSurfaces with different VASurfaceAttrib" 26 27 #include "test_common.c" 28 #include <va/va_drmcommon.h> 29 30 void pre() 31 { 32 test_init(); 33 } 34 35 void test() 36 { 37 VAEntrypoint entrypoints[5]; 38 int num_entrypoints,slice_entrypoint; 39 VAConfigAttrib attrib[2]; 40 VAConfigID config_id; 41 unsigned int fourcc, luma_stride, chroma_u_stride, chroma_v_stride, luma_offset, chroma_u_offset; 42 unsigned int chroma_v_offset, buffer_name; 43 unsigned int *p_buffer; 44 int i, ret; 45 char c; 46 int frame_width=640, frame_height=480; 47 VASurfaceID surface_id; 48 VAImage image_id; 49 unsigned char *usrbuf; 50 51 usrbuf = (unsigned char*)malloc(frame_width * frame_height * 2); 52 ASSERT ( usrbuf != NULL); 53 54 VASurfaceAttribExternalBuffers vaSurfaceExternBuf; 55 VASurfaceAttrib attrib_list[2]; 56 57 va_status = vaQueryConfigEntrypoints(va_dpy, VAProfileH264Baseline, entrypoints, &num_entrypoints); 58 ASSERT( VA_STATUS_SUCCESS == va_status ); 59 60 for (slice_entrypoint = 0; slice_entrypoint < num_entrypoints; slice_entrypoint++) { 61 if (entrypoints[slice_entrypoint] == VAEntrypointEncSlice) 62 break; 63 } 64 if (slice_entrypoint == num_entrypoints) { 65 /* not find Slice entry point */ 66 status("VAEntrypointEncSlice doesn't support, exit.\n"); 67 ASSERT(0); 68 } 69 70 /* find out the format for the render target, and rate control mode */ 71 attrib[0].type = VAConfigAttribRTFormat; 72 attrib[1].type = VAConfigAttribRateControl; 73 va_status = vaGetConfigAttributes(va_dpy, VAProfileH264Baseline, VAEntrypointEncSlice, &attrib[0], 2); 74 ASSERT( VA_STATUS_SUCCESS == va_status ); 75 76 if ((attrib[0].value & VA_RT_FORMAT_YUV420) == 0) { 77 /* not find desired YUV420 RT format */ 78 status("VA_RT_FORMAT_YUV420 doesn't support, exit\n"); 79 ASSERT(0); 80 } 81 if ((attrib[1].value & VA_RC_VBR) == 0) { 82 /* Can't find matched RC mode */ 83 status("VBR mode doesn't found, exit\n"); 84 ASSERT(0); 85 } 86 87 attrib[0].value = VA_RT_FORMAT_YUV420; /* set to desired RT format */ 88 attrib[1].value = VA_RC_VBR; /* set to desired RC mode */ 89 90 va_status = vaCreateConfig(va_dpy, VAProfileH264Baseline, VAEntrypointEncSlice, &attrib[0], 2, &config_id); 91 ASSERT( VA_STATUS_SUCCESS == va_status ); 92 93 attrib_list[1].type = (VASurfaceAttribType)VASurfaceAttribExternalBufferDescriptor; 94 attrib_list[0].type = (VASurfaceAttribType)VASurfaceAttribMemoryType; 95 va_status = vaGetSurfaceAttributes(va_dpy, config_id, attrib_list, 2); 96 ASSERT( VA_STATUS_SUCCESS == va_status ); 97 98 if (attrib_list[0].flags != VA_SURFACE_ATTRIB_NOT_SUPPORTED) { 99 status("supported memory type:\n"); 100 if (attrib_list[0].value.value.i & VA_SURFACE_ATTRIB_MEM_TYPE_VA) 101 status("\tVA_SURFACE_ATTRIB_MEM_TYPE_VA\n"); 102 if (attrib_list[0].value.value.i & VA_SURFACE_ATTRIB_MEM_TYPE_V4L2) 103 status("\tVA_SURFACE_ATTRIB_MEM_TYPE_V4L2\n"); 104 if (attrib_list[0].value.value.i & VA_SURFACE_ATTRIB_MEM_TYPE_USER_PTR) 105 status("\tVA_SURFACE_ATTRIB_MEM_TYPE_USER_PTR\n"); 106 if (attrib_list[0].value.value.i & VA_SURFACE_ATTRIB_MEM_TYPE_ANDROID_GRALLOC) 107 status("\tVA_SURFACE_ATTRIB_MEM_TYPE_ANDROID_GRALLOC\n"); 108 if (attrib_list[0].value.value.i & VA_SURFACE_ATTRIB_MEM_TYPE_ANDROID_ION) 109 status("\tVA_SURFACE_ATTRIB_MEM_TYPE_ANDROID_ION\n"); 110 if (attrib_list[0].value.value.i & VA_SURFACE_ATTRIB_MEM_TYPE_KERNEL_DRM) 111 status("\tVA_SURFACE_ATTRIB_MEM_TYPE_KERNEL_DRM\n"); 112 } 113 114 if ((attrib_list[1].flags != VA_SURFACE_ATTRIB_NOT_SUPPORTED) && 115 (attrib_list[0].value.value.i & VA_SURFACE_ATTRIB_MEM_TYPE_USER_PTR)) { 116 status("vaCreateSurfaces from external usr pointer\n"); 117 118 vaSurfaceExternBuf.buffers = (unsigned long*)malloc(sizeof(unsigned int)); 119 vaSurfaceExternBuf.buffers[0] = usrbuf; 120 vaSurfaceExternBuf.num_buffers = 1; 121 vaSurfaceExternBuf.width = frame_width; 122 vaSurfaceExternBuf.height = frame_height; 123 vaSurfaceExternBuf.pitches[0] = vaSurfaceExternBuf.pitches[1] = vaSurfaceExternBuf.pitches[2] = frame_width; 124 //vaSurfaceExternBuf.flags = VA_SURFACE_ATTRIB_MEM_TYPE_ANDROID_GRALLOC; 125 vaSurfaceExternBuf.pixel_format = VA_FOURCC_NV12; 126 //vaSurfaceExternBuf.pitches[0] = attribute_tpi->luma_stride; 127 128 attrib_list[1].flags = VA_SURFACE_ATTRIB_SETTABLE; 129 attrib_list[1].value.type = VAGenericValueTypePointer; 130 attrib_list[1].value.value.p = (void *)&vaSurfaceExternBuf; 131 132 attrib_list[0].flags = VA_SURFACE_ATTRIB_SETTABLE; 133 attrib_list[0].value.type = VAGenericValueTypeInteger; 134 attrib_list[0].value.value.i = VA_SURFACE_ATTRIB_MEM_TYPE_USER_PTR; 135 136 va_status = vaCreateSurfaces(va_dpy, VA_RT_FORMAT_YUV420, frame_width, frame_height, &surface_id, 1, attrib_list, 2); 137 ASSERT( VA_STATUS_SUCCESS == va_status ); 138 139 va_status = vaDeriveImage(va_dpy, surface_id, &image_id); 140 ASSERT( VA_STATUS_SUCCESS == va_status ); 141 142 va_status = vaMapBuffer(va_dpy, image_id.buf, (void**)&p_buffer); 143 ASSERT( VA_STATUS_SUCCESS == va_status ); 144 145 memset(p_buffer, 0x80, image_id.width * image_id.height); 146 147 va_status = vaUnmapBuffer(va_dpy, image_id.buf); 148 ASSERT( VA_STATUS_SUCCESS == va_status ); 149 150 va_status = vaDestroyImage(va_dpy, image_id.image_id); 151 ASSERT( VA_STATUS_SUCCESS == va_status ); 152 153 va_status = vaDestroySurfaces(va_dpy, &surface_id, 1); 154 ASSERT( VA_STATUS_SUCCESS == va_status ); 155 156 } 157 158 va_status = vaDestroyConfig(va_dpy, config_id); 159 ASSERT( VA_STATUS_SUCCESS == va_status ); 160 161 free(usrbuf); 162 163 } 164 165 void post() 166 { 167 test_terminate(); 168 } 169