loadsurface.h revision 4b672db6ee89c9846451bbab23cf18e93c4260b2
186c93d9c46415cf7746351c502a3513f637e77e4root/* 286c93d9c46415cf7746351c502a3513f637e77e4root * Copyright (c) 2008-2009 Intel Corporation. All Rights Reserved. 386c93d9c46415cf7746351c502a3513f637e77e4root * 486c93d9c46415cf7746351c502a3513f637e77e4root * Permission is hereby granted, free of charge, to any person obtaining a 586c93d9c46415cf7746351c502a3513f637e77e4root * copy of this software and associated documentation files (the 686c93d9c46415cf7746351c502a3513f637e77e4root * "Software"), to deal in the Software without restriction, including 786c93d9c46415cf7746351c502a3513f637e77e4root * without limitation the rights to use, copy, modify, merge, publish, 886c93d9c46415cf7746351c502a3513f637e77e4root * distribute, sub license, and/or sell copies of the Software, and to 986c93d9c46415cf7746351c502a3513f637e77e4root * permit persons to whom the Software is furnished to do so, subject to 1086c93d9c46415cf7746351c502a3513f637e77e4root * the following conditions: 1186c93d9c46415cf7746351c502a3513f637e77e4root * 1286c93d9c46415cf7746351c502a3513f637e77e4root * The above copyright notice and this permission notice (including the 1386c93d9c46415cf7746351c502a3513f637e77e4root * next paragraph) shall be included in all copies or substantial portions 1486c93d9c46415cf7746351c502a3513f637e77e4root * of the Software. 1586c93d9c46415cf7746351c502a3513f637e77e4root * 1686c93d9c46415cf7746351c502a3513f637e77e4root * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1786c93d9c46415cf7746351c502a3513f637e77e4root * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 1886c93d9c46415cf7746351c502a3513f637e77e4root * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 1986c93d9c46415cf7746351c502a3513f637e77e4root * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR 2086c93d9c46415cf7746351c502a3513f637e77e4root * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2186c93d9c46415cf7746351c502a3513f637e77e4root * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2286c93d9c46415cf7746351c502a3513f637e77e4root * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2386c93d9c46415cf7746351c502a3513f637e77e4root */ 24e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan#include "loadsurface_yuv.h" 25e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 26e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuanstatic int scale_2dimage(unsigned char *src_img, int src_imgw, int src_imgh, 27e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan unsigned char *dst_img, int dst_imgw, int dst_imgh) 28e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan{ 29e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan int row=0, col=0; 30e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 31e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan for (row=0; row<dst_imgh; row++) { 32e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan for (col=0; col<dst_imgw; col++) { 33e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan *(dst_img + row * dst_imgw + col) = *(src_img + (row * src_imgh/dst_imgh) * src_imgw + col * src_imgw/dst_imgw); 34e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan } 35e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan } 36e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 37e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan return 0; 38e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan} 39e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 40e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 41e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuanstatic int YUV_blend_with_pic(int width, int height, 42e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan unsigned char *Y_start, int Y_pitch, 43e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan unsigned char *U_start, int U_pitch, 44e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan unsigned char *V_start, int V_pitch, 45e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan int UV_interleave, int fixed_alpha) 46e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan{ 47e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan /* PIC YUV format */ 48e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan unsigned char *pic_y_old = yuvga_pic; 49e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan unsigned char *pic_u_old = pic_y_old + 640*480; 50e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan unsigned char *pic_v_old = pic_u_old + 640*480/4; 51e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan unsigned char *pic_y, *pic_u, *pic_v; 52e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 53e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan int alpha_values[] = {100,90,80,70,60,50,40,30,20,30,40,50,60,70,80,90}; 54e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 55e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan static int alpha_idx = 0; 56e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan int alpha; 57e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan int allocated = 0; 58e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 59e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan int row, col; 60e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 61e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan if (fixed_alpha == 0) { 62e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan alpha = alpha_values[alpha_idx % 16 ]; 63e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan alpha_idx ++; 64e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan } else 65e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan alpha = fixed_alpha; 66e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 67e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan //alpha = 0; 68e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 69e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan pic_y = pic_y_old; 70e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan pic_u = pic_u_old; 71e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan pic_v = pic_v_old; 72e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 73e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan if (width != 640 || height != 480) { /* need to scale the pic */ 74e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan pic_y = (unsigned char *)malloc(width * height); 75e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan pic_u = (unsigned char *)malloc(width * height/4); 76e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan pic_v = (unsigned char *)malloc(width * height/4); 77e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 78e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan allocated = 1; 79e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 80e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan scale_2dimage(pic_y_old, 640, 480, 81e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan pic_y, width, height); 82e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan scale_2dimage(pic_u_old, 320, 240, 83e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan pic_u, width/2, height/2); 84e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan scale_2dimage(pic_v_old, 320, 240, 85e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan pic_v, width/2, height/2); 86e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan } 87e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 88e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan /* begin blend */ 89e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 90e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan /* Y plane */ 91e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan for (row=0; row<height; row++) 92e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan for (col=0; col<width; col++) { 93e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan unsigned char *p = Y_start + row * Y_pitch + col; 94e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan unsigned char *q = pic_y + row * width + col; 95e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 96e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan *p = *p * (100 - alpha) / 100 + *q * alpha/100; 97e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan } 98e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 99e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan if (UV_interleave == 0) { 100e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan for (row=0; row<height/2; row++) 101e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan for (col=0; col<width/2; col++) { 102e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan unsigned char *p = U_start + row * U_pitch + col; 103e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan unsigned char *q = pic_u + row * width/2 + col; 104e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 105e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan *p = *p * (100 - alpha) / 100 + *q * alpha/100; 106e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan } 107e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 108e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan for (row=0; row<height/2; row++) 109e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan for (col=0; col<width/2; col++) { 110e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan unsigned char *p = V_start + row * V_pitch + col; 111e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan unsigned char *q = pic_v + row * width/2 + col; 112e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 113e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan *p = *p * (100 - alpha) / 100 + *q * alpha/100; 114e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan } 115e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan } else { /* NV12 */ 116e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan for (row=0; row<height/2; row++) 117e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan for (col=0; col<width/2; col++) { 118e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan unsigned char *pU = U_start + row * U_pitch + col*2; 119e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan unsigned char *qU = pic_u + row * width/2 + col; 120e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan unsigned char *pV = pU + 1; 121e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan unsigned char *qV = pic_v + row * width/2 + col; 122e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 123e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan *pU = *pU * (100 - alpha) / 100 + *qU * alpha/100; 124e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan *pV = *pV * (100 - alpha) / 100 + *qV * alpha/100; 125e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan } 126e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan } 127e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 128e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 129e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan if (allocated) { 130e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan free(pic_y); 131e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan free(pic_u); 132e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan free(pic_v); 133e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan } 134e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 135e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan return 0; 136e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan} 137e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 13886c93d9c46415cf7746351c502a3513f637e77e4rootstatic int yuvgen_planar(int width, int height, 13986c93d9c46415cf7746351c502a3513f637e77e4root unsigned char *Y_start, int Y_pitch, 14086c93d9c46415cf7746351c502a3513f637e77e4root unsigned char *U_start, int U_pitch, 14186c93d9c46415cf7746351c502a3513f637e77e4root unsigned char *V_start, int V_pitch, 14286c93d9c46415cf7746351c502a3513f637e77e4root int UV_interleave, int box_width, int row_shift, 14386c93d9c46415cf7746351c502a3513f637e77e4root int field) 14486c93d9c46415cf7746351c502a3513f637e77e4root{ 145e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan int row, alpha; 14686c93d9c46415cf7746351c502a3513f637e77e4root 14786c93d9c46415cf7746351c502a3513f637e77e4root /* copy Y plane */ 14886c93d9c46415cf7746351c502a3513f637e77e4root for (row=0;row<height;row++) { 14986c93d9c46415cf7746351c502a3513f637e77e4root unsigned char *Y_row = Y_start + row * Y_pitch; 15086c93d9c46415cf7746351c502a3513f637e77e4root int jj, xpos, ypos; 15186c93d9c46415cf7746351c502a3513f637e77e4root 15286c93d9c46415cf7746351c502a3513f637e77e4root ypos = (row / box_width) & 0x1; 15386c93d9c46415cf7746351c502a3513f637e77e4root 15486c93d9c46415cf7746351c502a3513f637e77e4root /* fill garbage data into the other field */ 15586c93d9c46415cf7746351c502a3513f637e77e4root if (((field == VA_TOP_FIELD) && (row &1)) 15686c93d9c46415cf7746351c502a3513f637e77e4root || ((field == VA_BOTTOM_FIELD) && ((row &1)==0))) { 15786c93d9c46415cf7746351c502a3513f637e77e4root memset(Y_row, 0xff, width); 15886c93d9c46415cf7746351c502a3513f637e77e4root continue; 15986c93d9c46415cf7746351c502a3513f637e77e4root } 16086c93d9c46415cf7746351c502a3513f637e77e4root 16186c93d9c46415cf7746351c502a3513f637e77e4root for (jj=0; jj<width; jj++) { 16286c93d9c46415cf7746351c502a3513f637e77e4root xpos = ((row_shift + jj) / box_width) & 0x1; 16386c93d9c46415cf7746351c502a3513f637e77e4root 16486c93d9c46415cf7746351c502a3513f637e77e4root if ((xpos == 0) && (ypos == 0)) 16586c93d9c46415cf7746351c502a3513f637e77e4root Y_row[jj] = 0xeb; 16686c93d9c46415cf7746351c502a3513f637e77e4root if ((xpos == 1) && (ypos == 1)) 16786c93d9c46415cf7746351c502a3513f637e77e4root Y_row[jj] = 0xeb; 16886c93d9c46415cf7746351c502a3513f637e77e4root 16986c93d9c46415cf7746351c502a3513f637e77e4root if ((xpos == 1) && (ypos == 0)) 17086c93d9c46415cf7746351c502a3513f637e77e4root Y_row[jj] = 0x10; 17186c93d9c46415cf7746351c502a3513f637e77e4root if ((xpos == 0) && (ypos == 1)) 17286c93d9c46415cf7746351c502a3513f637e77e4root Y_row[jj] = 0x10; 17386c93d9c46415cf7746351c502a3513f637e77e4root } 17486c93d9c46415cf7746351c502a3513f637e77e4root } 17586c93d9c46415cf7746351c502a3513f637e77e4root 17686c93d9c46415cf7746351c502a3513f637e77e4root /* copy UV data */ 17786c93d9c46415cf7746351c502a3513f637e77e4root for( row =0; row < height/2; row++) { 17886c93d9c46415cf7746351c502a3513f637e77e4root unsigned short value = 0x80; 17986c93d9c46415cf7746351c502a3513f637e77e4root 18086c93d9c46415cf7746351c502a3513f637e77e4root /* fill garbage data into the other field */ 18186c93d9c46415cf7746351c502a3513f637e77e4root if (((field == VA_TOP_FIELD) && (row &1)) 18286c93d9c46415cf7746351c502a3513f637e77e4root || ((field == VA_BOTTOM_FIELD) && ((row &1)==0))) { 18386c93d9c46415cf7746351c502a3513f637e77e4root value = 0xff; 18486c93d9c46415cf7746351c502a3513f637e77e4root } 18586c93d9c46415cf7746351c502a3513f637e77e4root 18686c93d9c46415cf7746351c502a3513f637e77e4root if (UV_interleave) { 18786c93d9c46415cf7746351c502a3513f637e77e4root unsigned short *UV_row = (unsigned short *)(U_start + row * U_pitch); 18886c93d9c46415cf7746351c502a3513f637e77e4root 18986c93d9c46415cf7746351c502a3513f637e77e4root memset(UV_row, value, width); 19086c93d9c46415cf7746351c502a3513f637e77e4root } else { 19186c93d9c46415cf7746351c502a3513f637e77e4root unsigned char *U_row = U_start + row * U_pitch; 19286c93d9c46415cf7746351c502a3513f637e77e4root unsigned char *V_row = V_start + row * V_pitch; 19386c93d9c46415cf7746351c502a3513f637e77e4root 19486c93d9c46415cf7746351c502a3513f637e77e4root memset (U_row,value,width/2); 19586c93d9c46415cf7746351c502a3513f637e77e4root memset (V_row,value,width/2); 19686c93d9c46415cf7746351c502a3513f637e77e4root } 19786c93d9c46415cf7746351c502a3513f637e77e4root } 19886c93d9c46415cf7746351c502a3513f637e77e4root 199e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan if (getenv("AUTO_NOUV")) 200e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan return 0; 201e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 202e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan if (getenv("AUTO_ALPHA")) 203e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan alpha = 0; 204e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan else 205e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan alpha = 70; 206e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 207e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan YUV_blend_with_pic(width,height, 208e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan Y_start, Y_pitch, 209e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan U_start, U_pitch, 210e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan V_start, V_pitch, 211e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan UV_interleave, alpha); 212e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 21386c93d9c46415cf7746351c502a3513f637e77e4root return 0; 21486c93d9c46415cf7746351c502a3513f637e77e4root} 21586c93d9c46415cf7746351c502a3513f637e77e4root 21686c93d9c46415cf7746351c502a3513f637e77e4rootstatic int upload_surface(VADisplay va_dpy, VASurfaceID surface_id, 21786c93d9c46415cf7746351c502a3513f637e77e4root int box_width, int row_shift, 21886c93d9c46415cf7746351c502a3513f637e77e4root int field) 21986c93d9c46415cf7746351c502a3513f637e77e4root{ 22086c93d9c46415cf7746351c502a3513f637e77e4root VAImage surface_image; 22186c93d9c46415cf7746351c502a3513f637e77e4root void *surface_p=NULL, *U_start,*V_start; 22286c93d9c46415cf7746351c502a3513f637e77e4root VAStatus va_status; 22386c93d9c46415cf7746351c502a3513f637e77e4root 22486c93d9c46415cf7746351c502a3513f637e77e4root va_status = vaDeriveImage(va_dpy,surface_id,&surface_image); 22586c93d9c46415cf7746351c502a3513f637e77e4root CHECK_VASTATUS(va_status,"vaDeriveImage"); 22686c93d9c46415cf7746351c502a3513f637e77e4root 22786c93d9c46415cf7746351c502a3513f637e77e4root vaMapBuffer(va_dpy,surface_image.buf,&surface_p); 22886c93d9c46415cf7746351c502a3513f637e77e4root assert(VA_STATUS_SUCCESS == va_status); 22986c93d9c46415cf7746351c502a3513f637e77e4root 230cceaa0568f77a7452857559614100b71fb36ee3awangkun U_start = (char *)surface_p + surface_image.offsets[1]; 231cceaa0568f77a7452857559614100b71fb36ee3awangkun V_start = (char *)surface_p + surface_image.offsets[2]; 23286c93d9c46415cf7746351c502a3513f637e77e4root 23386c93d9c46415cf7746351c502a3513f637e77e4root /* assume surface is planar format */ 23486c93d9c46415cf7746351c502a3513f637e77e4root yuvgen_planar(surface_image.width, surface_image.height, 235cceaa0568f77a7452857559614100b71fb36ee3awangkun (unsigned char *)surface_p, surface_image.pitches[0], 236cceaa0568f77a7452857559614100b71fb36ee3awangkun (unsigned char *)U_start, surface_image.pitches[1], 237cceaa0568f77a7452857559614100b71fb36ee3awangkun (unsigned char *)V_start, surface_image.pitches[2], 23886c93d9c46415cf7746351c502a3513f637e77e4root (surface_image.format.fourcc==VA_FOURCC_NV12), 23986c93d9c46415cf7746351c502a3513f637e77e4root box_width, row_shift, field); 24086c93d9c46415cf7746351c502a3513f637e77e4root 24186c93d9c46415cf7746351c502a3513f637e77e4root vaUnmapBuffer(va_dpy,surface_image.buf); 24286c93d9c46415cf7746351c502a3513f637e77e4root 24386c93d9c46415cf7746351c502a3513f637e77e4root vaDestroyImage(va_dpy,surface_image.image_id); 24486c93d9c46415cf7746351c502a3513f637e77e4root 24586c93d9c46415cf7746351c502a3513f637e77e4root return 0; 24686c93d9c46415cf7746351c502a3513f637e77e4root} 2474b672db6ee89c9846451bbab23cf18e93c4260b2hding 2484b672db6ee89c9846451bbab23cf18e93c4260b2hding 2494b672db6ee89c9846451bbab23cf18e93c4260b2hdingstatic int upload_surface_attrib(VADisplay va_dpy, VASurfaceID surface_id, 2504b672db6ee89c9846451bbab23cf18e93c4260b2hding int box_width, int row_shift, 2514b672db6ee89c9846451bbab23cf18e93c4260b2hding int field, unsigned int *addr) 2524b672db6ee89c9846451bbab23cf18e93c4260b2hding{ 2534b672db6ee89c9846451bbab23cf18e93c4260b2hding VAImage surface_image; 2544b672db6ee89c9846451bbab23cf18e93c4260b2hding void *surface_p=NULL, *U_start,*V_start; 2554b672db6ee89c9846451bbab23cf18e93c4260b2hding VAStatus va_status; 2564b672db6ee89c9846451bbab23cf18e93c4260b2hding 2574b672db6ee89c9846451bbab23cf18e93c4260b2hding va_status = vaDeriveImage(va_dpy,surface_id,&surface_image); 2584b672db6ee89c9846451bbab23cf18e93c4260b2hding CHECK_VASTATUS(va_status,"vaDeriveImage"); 2594b672db6ee89c9846451bbab23cf18e93c4260b2hding 2604b672db6ee89c9846451bbab23cf18e93c4260b2hding surface_p = addr; 2614b672db6ee89c9846451bbab23cf18e93c4260b2hding U_start = (char *)surface_p + surface_image.offsets[1]; 2624b672db6ee89c9846451bbab23cf18e93c4260b2hding V_start = (char *)surface_p + surface_image.offsets[2]; 2634b672db6ee89c9846451bbab23cf18e93c4260b2hding 2644b672db6ee89c9846451bbab23cf18e93c4260b2hding /* assume surface is planar format */ 2654b672db6ee89c9846451bbab23cf18e93c4260b2hding yuvgen_planar(surface_image.width, surface_image.height, 2664b672db6ee89c9846451bbab23cf18e93c4260b2hding (unsigned char *)surface_p, surface_image.pitches[0], 2674b672db6ee89c9846451bbab23cf18e93c4260b2hding (unsigned char *)U_start, surface_image.pitches[1], 2684b672db6ee89c9846451bbab23cf18e93c4260b2hding (unsigned char *)V_start, surface_image.pitches[2], 2694b672db6ee89c9846451bbab23cf18e93c4260b2hding (surface_image.format.fourcc==VA_FOURCC_NV12), 2704b672db6ee89c9846451bbab23cf18e93c4260b2hding box_width, row_shift, field); 2714b672db6ee89c9846451bbab23cf18e93c4260b2hding 2724b672db6ee89c9846451bbab23cf18e93c4260b2hding vaUnmapBuffer(va_dpy,surface_image.buf); 2734b672db6ee89c9846451bbab23cf18e93c4260b2hding 2744b672db6ee89c9846451bbab23cf18e93c4260b2hding vaDestroyImage(va_dpy,surface_image.image_id); 2754b672db6ee89c9846451bbab23cf18e93c4260b2hding 2764b672db6ee89c9846451bbab23cf18e93c4260b2hding return 0; 2774b672db6ee89c9846451bbab23cf18e93c4260b2hding} 2784b672db6ee89c9846451bbab23cf18e93c4260b2hding 279