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, 272efbafef6046e1d9372c58de2b0d7b03377c686cAustin 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, 422efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan unsigned char *Y_start, int Y_pitch, 432efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan unsigned char *U_start, int U_pitch, 442efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan unsigned char *V_start, int V_pitch, 452efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan unsigned int fourcc, 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 */ 91409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan int Y_pixel_stride = 1; 92409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan if (fourcc == VA_FOURCC_YUY2) 93409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan Y_pixel_stride = 2; 94409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 95409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan for (row=0; row<height; row++) { 96409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan unsigned char *p = Y_start + row * Y_pitch; 97409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan unsigned char *q = pic_y + row * width; 98409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan for (col=0; col<width; col++, q++) { 99e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan *p = *p * (100 - alpha) / 100 + *q * alpha/100; 100409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan p += Y_pixel_stride; 101e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan } 102409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan } 103e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 104409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan /* U/V plane */ 105409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan int U_pixel_stride = 0, V_pixel_stride = 0; 106409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan int v_factor_to_nv12 = 1; 107409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan switch (fourcc) { 108409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan case VA_FOURCC_YV12: 109409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan U_pixel_stride = V_pixel_stride = 1; 110409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan break; 111409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan case VA_FOURCC_NV12: 112409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan U_pixel_stride = V_pixel_stride = 2; 113409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan break; 114409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan case VA_FOURCC_YUY2: 115409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan U_pixel_stride = V_pixel_stride = 4; 116409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan v_factor_to_nv12 = 2; 117409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan break; 118409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan default: 119409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan break; 120409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan } 121409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan for (row=0; row<height/2*v_factor_to_nv12; row++) { 122409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan unsigned char *pU = U_start + row * U_pitch; 123409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan unsigned char *pV = V_start + row * V_pitch; 124409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan unsigned char *qU = pic_u + row/v_factor_to_nv12 * width/2; 125409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan unsigned char *qV = pic_v + row/v_factor_to_nv12 * width/2; 126e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 127409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan for (col=0; col<width/2; col++, qU++, qV++) { 128409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan *pU = *pU * (100 - alpha) / 100 + *qU * alpha/100; 129409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan *pV = *pV * (100 - alpha) / 100 + *qV * alpha/100; 130409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 131409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan pU += U_pixel_stride; 132409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan pV += V_pixel_stride; 133409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan } 134e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan } 135e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 136e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 137e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan if (allocated) { 138e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan free(pic_y); 139e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan free(pic_u); 140e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan free(pic_v); 141e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan } 142e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 143e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan return 0; 144e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan} 145e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 14686c93d9c46415cf7746351c502a3513f637e77e4rootstatic int yuvgen_planar(int width, int height, 14786c93d9c46415cf7746351c502a3513f637e77e4root unsigned char *Y_start, int Y_pitch, 14886c93d9c46415cf7746351c502a3513f637e77e4root unsigned char *U_start, int U_pitch, 14986c93d9c46415cf7746351c502a3513f637e77e4root unsigned char *V_start, int V_pitch, 150409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan unsigned int fourcc, int box_width, int row_shift, 15186c93d9c46415cf7746351c502a3513f637e77e4root int field) 15286c93d9c46415cf7746351c502a3513f637e77e4root{ 153e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan int row, alpha; 154409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan unsigned char uv_value = 0x80; 15586c93d9c46415cf7746351c502a3513f637e77e4root 15686c93d9c46415cf7746351c502a3513f637e77e4root /* copy Y plane */ 157409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan int y_factor = 1; 1582efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan if (fourcc == VA_FOURCC_YUY2) y_factor = 2; 15986c93d9c46415cf7746351c502a3513f637e77e4root for (row=0;row<height;row++) { 16086c93d9c46415cf7746351c502a3513f637e77e4root unsigned char *Y_row = Y_start + row * Y_pitch; 16186c93d9c46415cf7746351c502a3513f637e77e4root int jj, xpos, ypos; 16286c93d9c46415cf7746351c502a3513f637e77e4root 16386c93d9c46415cf7746351c502a3513f637e77e4root ypos = (row / box_width) & 0x1; 16486c93d9c46415cf7746351c502a3513f637e77e4root 16586c93d9c46415cf7746351c502a3513f637e77e4root /* fill garbage data into the other field */ 16686c93d9c46415cf7746351c502a3513f637e77e4root if (((field == VA_TOP_FIELD) && (row &1)) 16786c93d9c46415cf7746351c502a3513f637e77e4root || ((field == VA_BOTTOM_FIELD) && ((row &1)==0))) { 16886c93d9c46415cf7746351c502a3513f637e77e4root memset(Y_row, 0xff, width); 16986c93d9c46415cf7746351c502a3513f637e77e4root continue; 17086c93d9c46415cf7746351c502a3513f637e77e4root } 17186c93d9c46415cf7746351c502a3513f637e77e4root 17286c93d9c46415cf7746351c502a3513f637e77e4root for (jj=0; jj<width; jj++) { 17386c93d9c46415cf7746351c502a3513f637e77e4root xpos = ((row_shift + jj) / box_width) & 0x1; 174409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan if (xpos == ypos) 175409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan Y_row[jj*y_factor] = 0xeb; 176409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan else 177409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan Y_row[jj*y_factor] = 0x10; 178409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 179409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan if (fourcc == VA_FOURCC_YUY2) { 180409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan Y_row[jj*y_factor+1] = uv_value; // it is for UV 1812efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan } 18286c93d9c46415cf7746351c502a3513f637e77e4root } 18386c93d9c46415cf7746351c502a3513f637e77e4root } 18486c93d9c46415cf7746351c502a3513f637e77e4root 18586c93d9c46415cf7746351c502a3513f637e77e4root /* copy UV data */ 18686c93d9c46415cf7746351c502a3513f637e77e4root for( row =0; row < height/2; row++) { 18786c93d9c46415cf7746351c502a3513f637e77e4root 18886c93d9c46415cf7746351c502a3513f637e77e4root /* fill garbage data into the other field */ 18986c93d9c46415cf7746351c502a3513f637e77e4root if (((field == VA_TOP_FIELD) && (row &1)) 19086c93d9c46415cf7746351c502a3513f637e77e4root || ((field == VA_BOTTOM_FIELD) && ((row &1)==0))) { 191409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan uv_value = 0xff; 19286c93d9c46415cf7746351c502a3513f637e77e4root } 19386c93d9c46415cf7746351c502a3513f637e77e4root 194409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan unsigned char *U_row = U_start + row * U_pitch; 195409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan unsigned char *V_row = V_start + row * V_pitch; 196409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan switch (fourcc) { 197409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan case VA_FOURCC_NV12: 198409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan memset(U_row, uv_value, width); 1992efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan break; 200409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan case VA_FOURCC_YV12: 201409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan memset (U_row,uv_value,width/2); 202409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan memset (V_row,uv_value,width/2); 2032efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan break; 204409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan case VA_FOURCC_YUY2: 205409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan // see above. it is set with Y update. 206409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan break; 207409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan default: 208409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan printf("unsupported fourcc in loadsurface.h\n"); 209409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan assert(0); 21086c93d9c46415cf7746351c502a3513f637e77e4root } 21186c93d9c46415cf7746351c502a3513f637e77e4root } 21286c93d9c46415cf7746351c502a3513f637e77e4root 2136044ab9a375eb73b08f45d87966652f98f918668Austin Yuan if (getenv("AUTO_UV") == 0) 214e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan return 0; 215e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 216e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan if (getenv("AUTO_ALPHA")) 217e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan alpha = 0; 218e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan else 219e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan alpha = 70; 220e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 221e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan YUV_blend_with_pic(width,height, 222e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan Y_start, Y_pitch, 223e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan U_start, U_pitch, 224e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan V_start, V_pitch, 225409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan fourcc, alpha); 226e742a3c7d8b89b69f65326582ea549c13a75b350Austin Yuan 22786c93d9c46415cf7746351c502a3513f637e77e4root return 0; 22886c93d9c46415cf7746351c502a3513f637e77e4root} 22986c93d9c46415cf7746351c502a3513f637e77e4root 23086c93d9c46415cf7746351c502a3513f637e77e4rootstatic int upload_surface(VADisplay va_dpy, VASurfaceID surface_id, 23186c93d9c46415cf7746351c502a3513f637e77e4root int box_width, int row_shift, 23286c93d9c46415cf7746351c502a3513f637e77e4root int field) 23386c93d9c46415cf7746351c502a3513f637e77e4root{ 23486c93d9c46415cf7746351c502a3513f637e77e4root VAImage surface_image; 235409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan void *surface_p=NULL, *U_start = NULL,*V_start = NULL; 23686c93d9c46415cf7746351c502a3513f637e77e4root VAStatus va_status; 237409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan unsigned int pitches[3]={0,0,0}; 23886c93d9c46415cf7746351c502a3513f637e77e4root 23986c93d9c46415cf7746351c502a3513f637e77e4root va_status = vaDeriveImage(va_dpy,surface_id,&surface_image); 24086c93d9c46415cf7746351c502a3513f637e77e4root CHECK_VASTATUS(va_status,"vaDeriveImage"); 24186c93d9c46415cf7746351c502a3513f637e77e4root 24286c93d9c46415cf7746351c502a3513f637e77e4root vaMapBuffer(va_dpy,surface_image.buf,&surface_p); 24386c93d9c46415cf7746351c502a3513f637e77e4root assert(VA_STATUS_SUCCESS == va_status); 24486c93d9c46415cf7746351c502a3513f637e77e4root 245409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan pitches[0] = surface_image.pitches[0]; 246409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan switch (surface_image.format.fourcc) { 247409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan case VA_FOURCC_NV12: 248409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan U_start = (char *)surface_p + surface_image.offsets[1]; 249409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan V_start = (char *)U_start + 1; 250409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan pitches[1] = surface_image.pitches[1]; 251409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan pitches[2] = surface_image.pitches[1]; 252409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan break; 253409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan case VA_FOURCC_IYUV: 254409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan U_start = (char *)surface_p + surface_image.offsets[1]; 255409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan V_start = (char *)surface_p + surface_image.offsets[2]; 256409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan pitches[1] = surface_image.pitches[1]; 257409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan pitches[2] = surface_image.pitches[2]; 258409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan break; 259409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan case VA_FOURCC_YV12: 260409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan U_start = (char *)surface_p + surface_image.offsets[2]; 261409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan V_start = (char *)surface_p + surface_image.offsets[1]; 262409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan pitches[1] = surface_image.pitches[2]; 263409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan pitches[2] = surface_image.pitches[1]; 264409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan break; 265409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan case VA_FOURCC_YUY2: 266409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan U_start = (char *)surface_p + 1; 267409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan V_start = (char *)surface_p + 3; 268409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan pitches[1] = surface_image.pitches[0]; 269409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan pitches[2] = surface_image.pitches[0]; 270409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan break; 271409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan default: 272409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan assert(0); 273409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan } 2744b672db6ee89c9846451bbab23cf18e93c4260b2hding 2754b672db6ee89c9846451bbab23cf18e93c4260b2hding /* assume surface is planar format */ 2764b672db6ee89c9846451bbab23cf18e93c4260b2hding yuvgen_planar(surface_image.width, surface_image.height, 277409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan (unsigned char *)surface_p, pitches[0], 278409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan (unsigned char *)U_start, pitches[1], 279409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan (unsigned char *)V_start, pitches[2], 280409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan surface_image.format.fourcc, 2814b672db6ee89c9846451bbab23cf18e93c4260b2hding box_width, row_shift, field); 2824b672db6ee89c9846451bbab23cf18e93c4260b2hding 2834b672db6ee89c9846451bbab23cf18e93c4260b2hding vaUnmapBuffer(va_dpy,surface_image.buf); 2844b672db6ee89c9846451bbab23cf18e93c4260b2hding 2854b672db6ee89c9846451bbab23cf18e93c4260b2hding vaDestroyImage(va_dpy,surface_image.image_id); 2864b672db6ee89c9846451bbab23cf18e93c4260b2hding 2874b672db6ee89c9846451bbab23cf18e93c4260b2hding return 0; 2884b672db6ee89c9846451bbab23cf18e93c4260b2hding} 2892efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan 2902efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan/* 2912efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan * Upload YUV data from memory into a surface 2922efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan * if src_fourcc == NV12, assume the buffer pointed by src_U 2932efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan * is UV interleaved (src_V is ignored) 2942efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan */ 2952efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuanstatic int upload_surface_yuv(VADisplay va_dpy, VASurfaceID surface_id, 2962efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan int src_fourcc, int src_width, int src_height, 2972efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan unsigned char *src_Y, unsigned char *src_U, unsigned char *src_V) 2982efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan{ 2992efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan VAImage surface_image; 3002efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan unsigned char *surface_p=NULL, *Y_start=NULL, *U_start=NULL, *V_start=NULL; 3012efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan int Y_pitch=0, U_pitch=0, V_pitch=0, row; 3022efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan VAStatus va_status; 3032efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan 3042efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan va_status = vaDeriveImage(va_dpy,surface_id, &surface_image); 3052efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan CHECK_VASTATUS(va_status,"vaDeriveImage"); 3062efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan 3072efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan vaMapBuffer(va_dpy,surface_image.buf,(void **)&surface_p); 3082efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan assert(VA_STATUS_SUCCESS == va_status); 3092efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan 3102efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan Y_start = surface_p; 3112efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan Y_pitch = surface_image.pitches[0]; 3122efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan switch (surface_image.format.fourcc) { 3132efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan case VA_FOURCC_NV12: 3142efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan U_start = (unsigned char *)surface_p + surface_image.offsets[1]; 3152efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan V_start = U_start + 1; 3162efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan U_pitch = surface_image.pitches[1]; 3172efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan V_pitch = surface_image.pitches[1]; 3182efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan break; 3192efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan case VA_FOURCC_IYUV: 3202efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan U_start = (unsigned char *)surface_p + surface_image.offsets[1]; 3212efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan V_start = (unsigned char *)surface_p + surface_image.offsets[2]; 3222efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan U_pitch = surface_image.pitches[1]; 3232efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan V_pitch = surface_image.pitches[2]; 3242efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan break; 3252efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan case VA_FOURCC_YV12: 3262efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan U_start = (unsigned char *)surface_p + surface_image.offsets[2]; 3272efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan V_start = (unsigned char *)surface_p + surface_image.offsets[1]; 3282efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan U_pitch = surface_image.pitches[2]; 3292efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan V_pitch = surface_image.pitches[1]; 3302efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan break; 3312efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan case VA_FOURCC_YUY2: 3322efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan U_start = surface_p + 1; 3332efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan V_start = surface_p + 3; 3342efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan U_pitch = surface_image.pitches[0]; 3352efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan V_pitch = surface_image.pitches[0]; 3362efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan break; 3372efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan default: 3382efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan assert(0); 3392efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan } 3402efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan 3412efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan /* copy Y plane */ 3422efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan for (row=0;row<src_height;row++) { 3432efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan unsigned char *Y_row = Y_start + row * Y_pitch; 3442efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan memcpy(Y_row, src_Y + row*src_width, src_width); 3452efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan } 3462efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan 3472efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan for (row =0; row < src_height/2; row++) { 3482efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan unsigned char *U_row = U_start + row * U_pitch; 3492efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan unsigned char *u_ptr = NULL, *v_ptr=NULL; 3502efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan int j; 3512efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan switch (surface_image.format.fourcc) { 3522efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan case VA_FOURCC_NV12: 3532efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan if (src_fourcc == VA_FOURCC_NV12) { 3542efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan memcpy(U_row, src_U + row * src_width, src_width); 3552efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan break; 3562efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan } else if (src_fourcc == VA_FOURCC_IYUV) { 3572efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan u_ptr = src_U + row * (src_width/2); 3582efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan v_ptr = src_V + row * (src_width/2); 3592efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan } else if (src_fourcc == VA_FOURCC_YV12) { 3602efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan v_ptr = src_U + row * (src_width/2); 3612efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan u_ptr = src_V + row * (src_width/2); 3622efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan } 3632efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan for(j = 0; j < src_width/2; j++) { 3642efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan U_row[2*j] = u_ptr[j]; 3652efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan U_row[2*j+1] = v_ptr[j]; 3662efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan } 3672efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan break; 3682efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan case VA_FOURCC_IYUV: 3692efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan case VA_FOURCC_YV12: 3702efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan case VA_FOURCC_YUY2: 3712efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan default: 3722efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan printf("unsupported fourcc in load_surface_yuv\n"); 3732efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan assert(0); 3742efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan } 3752efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan } 3762efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan 3772efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan vaUnmapBuffer(va_dpy,surface_image.buf); 3782efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan 3792efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan vaDestroyImage(va_dpy,surface_image.image_id); 3802efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan 3812efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan return 0; 3822efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan} 3832efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan 3842efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan/* 3852efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan * Download YUV data from a surface into memory 3862efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan * Some hardward doesn't have a aperture for linear access of 3872efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan * tiled surface, thus use vaGetImage to expect the implemnetion 3882efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan * to do tile to linear convert 3892efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan * 3902efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan * if dst_fourcc == NV12, assume the buffer pointed by dst_U 3912efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan * is UV interleaved (src_V is ignored) 3922efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan */ 3932efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuanstatic int download_surface_yuv(VADisplay va_dpy, VASurfaceID surface_id, 3942efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan int dst_fourcc, int dst_width, int dst_height, 3952efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan unsigned char *dst_Y, unsigned char *dst_U, unsigned char *dst_V) 3962efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan{ 3972efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan VAImage surface_image; 3982efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan unsigned char *surface_p=NULL, *Y_start=NULL, *U_start=NULL,*V_start=NULL; 3992efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan int Y_pitch=0, U_pitch=0, V_pitch=0, row; 4002efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan VAStatus va_status; 4012efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan 4022efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan va_status = vaDeriveImage(va_dpy,surface_id, &surface_image); 4032efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan CHECK_VASTATUS(va_status,"vaDeriveImage"); 4042efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan 4052efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan vaMapBuffer(va_dpy,surface_image.buf,(void **)&surface_p); 4062efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan assert(VA_STATUS_SUCCESS == va_status); 4072efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan 4082efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan Y_start = surface_p; 4092efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan Y_pitch = surface_image.pitches[0]; 4102efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan switch (surface_image.format.fourcc) { 4112efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan case VA_FOURCC_NV12: 4122efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan U_start = (unsigned char *)surface_p + surface_image.offsets[1]; 4132efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan V_start = U_start + 1; 4142efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan U_pitch = surface_image.pitches[1]; 4152efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan V_pitch = surface_image.pitches[1]; 4162efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan break; 4172efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan case VA_FOURCC_IYUV: 4182efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan U_start = (unsigned char *)surface_p + surface_image.offsets[1]; 4192efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan V_start = (unsigned char *)surface_p + surface_image.offsets[2]; 4202efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan U_pitch = surface_image.pitches[1]; 4212efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan V_pitch = surface_image.pitches[2]; 4222efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan break; 4232efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan case VA_FOURCC_YV12: 4242efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan U_start = (unsigned char *)surface_p + surface_image.offsets[2]; 4252efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan V_start = (unsigned char *)surface_p + surface_image.offsets[1]; 4262efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan U_pitch = surface_image.pitches[2]; 4272efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan V_pitch = surface_image.pitches[1]; 4282efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan break; 4292efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan case VA_FOURCC_YUY2: 4302efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan U_start = surface_p + 1; 4312efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan V_start = surface_p + 3; 4322efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan U_pitch = surface_image.pitches[0]; 4332efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan V_pitch = surface_image.pitches[0]; 4342efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan break; 4352efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan default: 4362efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan assert(0); 4372efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan } 4382efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan 4392efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan /* copy Y plane */ 4402efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan for (row=0;row<dst_height;row++) { 4412efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan unsigned char *Y_row = Y_start + row * Y_pitch; 4422efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan memcpy(dst_Y + row*dst_width, Y_row, dst_width); 4432efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan } 4442efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan 4452efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan for (row =0; row < dst_height/2; row++) { 4462efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan unsigned char *U_row = U_start + row * U_pitch; 4472efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan unsigned char *u_ptr = NULL, *v_ptr = NULL; 4482efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan int j; 4492efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan switch (surface_image.format.fourcc) { 4502efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan case VA_FOURCC_NV12: 4512efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan if (dst_fourcc == VA_FOURCC_NV12) { 4522efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan memcpy(dst_U + row * dst_width, U_row, dst_width); 4532efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan break; 4542efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan } else if (dst_fourcc == VA_FOURCC_IYUV) { 4552efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan u_ptr = dst_U + row * (dst_width/2); 4562efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan v_ptr = dst_V + row * (dst_width/2); 4572efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan } else if (dst_fourcc == VA_FOURCC_YV12) { 4582efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan v_ptr = dst_U + row * (dst_width/2); 4592efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan u_ptr = dst_V + row * (dst_width/2); 4602efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan } 4612efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan for(j = 0; j < dst_width/2; j++) { 4622efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan u_ptr[j] = U_row[2*j]; 4632efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan v_ptr[j] = U_row[2*j+1]; 4642efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan } 4652efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan break; 4662efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan case VA_FOURCC_IYUV: 4672efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan case VA_FOURCC_YV12: 4682efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan case VA_FOURCC_YUY2: 4692efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan default: 4702efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan printf("unsupported fourcc in load_surface_yuv\n"); 4712efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan assert(0); 4722efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan } 4732efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan } 4742efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan 4752efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan vaUnmapBuffer(va_dpy,surface_image.buf); 4762efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan 4772efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan vaDestroyImage(va_dpy,surface_image.image_id); 4782efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan 4792efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan return 0; 4802efbafef6046e1d9372c58de2b0d7b03377c686cAustin Yuan} 481