psb_output.c revision 115592518cc10686777609f874b567201a108d06
17e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 2f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Copyright (c) 2011 Intel Corporation. All Rights Reserved. 37e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 4f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Permission is hereby granted, free of charge, to any person obtaining a 5f91c8768670386683a281cc39141e21bdda9c97fKun Wang * copy of this software and associated documentation files (the 6f91c8768670386683a281cc39141e21bdda9c97fKun Wang * "Software"), to deal in the Software without restriction, including 7f91c8768670386683a281cc39141e21bdda9c97fKun Wang * without limitation the rights to use, copy, modify, merge, publish, 8f91c8768670386683a281cc39141e21bdda9c97fKun Wang * distribute, sub license, and/or sell copies of the Software, and to 9f91c8768670386683a281cc39141e21bdda9c97fKun Wang * permit persons to whom the Software is furnished to do so, subject to 10f91c8768670386683a281cc39141e21bdda9c97fKun Wang * the following conditions: 113f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang * 12f91c8768670386683a281cc39141e21bdda9c97fKun Wang * The above copyright notice and this permission notice (including the 13f91c8768670386683a281cc39141e21bdda9c97fKun Wang * next paragraph) shall be included in all copies or substantial portions 14f91c8768670386683a281cc39141e21bdda9c97fKun Wang * of the Software. 153f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang * 16f91c8768670386683a281cc39141e21bdda9c97fKun Wang * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 17f91c8768670386683a281cc39141e21bdda9c97fKun Wang * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18f91c8768670386683a281cc39141e21bdda9c97fKun Wang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 19f91c8768670386683a281cc39141e21bdda9c97fKun Wang * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR 20f91c8768670386683a281cc39141e21bdda9c97fKun Wang * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 21f91c8768670386683a281cc39141e21bdda9c97fKun Wang * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 22f91c8768670386683a281cc39141e21bdda9c97fKun Wang * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * 24bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Authors: 25bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Shengquan Yuan <shengquan.yuan@intel.com> 26bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Zhaohan Ren <zhaohan.ren@intel.com> 27bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Jason Hu <jason.hu@intel.com> 28bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * 29bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang */ 30bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang 317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifndef ANDROID 327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <X11/Xutil.h> 337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <X11/extensions/Xrandr.h> 3465174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan#include <va/va_dricommon.h> 35dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#include "x11/psb_x11.h" 36dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#include "x11/psb_xrandr.h" 377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <va/va_backend.h> 39437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <dlfcn.h> 40437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <stdlib.h> 417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_output.h" 427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_surface.h" 437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_buffer.h" 442befccec034c13d34746a9e87149889d59ac767bFei Jiang#include "psb_surface_ext.h" 45f91c8768670386683a281cc39141e21bdda9c97fKun Wang#include "pnw_rotate.h" 467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdio.h> 477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <string.h> 487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdarg.h> 497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_manager.h> 50c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang#include "psb_drv_debug.h" 51dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#include <string.h> 522befccec034c13d34746a9e87149889d59ac767bFei Jiang#include <unistd.h> 532befccec034c13d34746a9e87149889d59ac767bFei Jiang#include <sys/ioctl.h> 542befccec034c13d34746a9e87149889d59ac767bFei Jiang 55bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#define INIT_DRIVER_DATA psb_driver_data_p driver_data = (psb_driver_data_p) ctx->pDriverData; 567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 57bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#define SURFACE(id) ((object_surface_p) object_heap_lookup( &driver_data->surface_heap, id )) 587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define BUFFER(id) ((object_buffer_p) object_heap_lookup( &driver_data->buffer_heap, id )) 597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define IMAGE(id) ((object_image_p) object_heap_lookup( &driver_data->image_heap, id )) 607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define SUBPIC(id) ((object_subpic_p) object_heap_lookup( &driver_data->subpic_heap, id )) 617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define CONTEXT(id) ((object_context_p) object_heap_lookup( &driver_data->context_heap, id )) 627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 632befccec034c13d34746a9e87149889d59ac767bFei Jiang 642befccec034c13d34746a9e87149889d59ac767bFei Jiang/* surfaces link list associated with a subpicture */ 652befccec034c13d34746a9e87149889d59ac767bFei Jiangtypedef struct _subpic_surface { 662befccec034c13d34746a9e87149889d59ac767bFei Jiang VASurfaceID surface_id; 672befccec034c13d34746a9e87149889d59ac767bFei Jiang struct _subpic_surface *next; 682befccec034c13d34746a9e87149889d59ac767bFei Jiang} subpic_surface_s, *subpic_surface_p; 692befccec034c13d34746a9e87149889d59ac767bFei Jiang 702befccec034c13d34746a9e87149889d59ac767bFei Jiang 717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAImageFormat psb__SubpicFormat[] = { 727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__ImageRGBA, 73bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang //psb__ImageAYUV, 74bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang //psb__ImageAI44 757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}; 767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAImageFormat psb__CreateImageFormat[] = { 787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__ImageNV12, 797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__ImageRGBA, 80bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang //psb__ImageAYUV, 81bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang //psb__ImageAI44, 82f31d5416a60f83e184b0906a7ec77ba021840531hding psb__ImageYV16, 83f31d5416a60f83e184b0906a7ec77ba021840531hding psb__ImageYV32 847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}; 85437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 86e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wangunsigned char *psb_x11_output_init(VADriverContextP ctx); 872befccec034c13d34746a9e87149889d59ac767bFei JiangVAStatus psb_x11_output_deinit(VADriverContextP ctx); 88e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wangunsigned char *psb_android_output_init(VADriverContextP ctx); 892befccec034c13d34746a9e87149889d59ac767bFei JiangVAStatus psb_android_output_deinit(VADriverContextP ctx); 902befccec034c13d34746a9e87149889d59ac767bFei Jiang 912befccec034c13d34746a9e87149889d59ac767bFei Jiangint psb_coverlay_init(VADriverContextP ctx); 922befccec034c13d34746a9e87149889d59ac767bFei Jiangint psb_coverlay_deinit(VADriverContextP ctx); 932befccec034c13d34746a9e87149889d59ac767bFei Jiang 942befccec034c13d34746a9e87149889d59ac767bFei JiangVAStatus psb_initOutput(VADriverContextP ctx) 957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 97e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned char *ws_priv = NULL; 98ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan char env_value[1024]; 99dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1002befccec034c13d34746a9e87149889d59ac767bFei Jiang pthread_mutex_init(&driver_data->output_mutex, NULL); 1017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1020da1930627209986e8db220799a690f816494401Austin Yuan if (psb_parse_config("PSB_VIDEO_PUTSURFACE_DUMMY", &env_value[0]) == 0) { 103c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "vaPutSurface: dummy mode, return directly\n"); 1042befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->dummy_putsurface = 0; 105dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 1077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1090da1930627209986e8db220799a690f816494401Austin Yuan if (psb_parse_config("PSB_VIDEO_FPS", &env_value[0]) == 0) { 1100da1930627209986e8db220799a690f816494401Austin Yuan driver_data->fixed_fps = atoi(env_value); 111c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Throttling at FPS=%d\n", driver_data->fixed_fps); 112437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } else 1132befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->fixed_fps = 0; 114437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 115ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan driver_data->outputmethod_checkinterval = 1; 116ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan if (psb_parse_config("PSB_VIDEO_INTERVAL", &env_value[0]) == 0) { 117ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan driver_data->outputmethod_checkinterval = atoi(env_value); 118c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Check output method at %d frames interval\n", 119ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan driver_data->outputmethod_checkinterval); 120ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan } 121ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 1222befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->cur_displaying_surface = VA_INVALID_SURFACE; 1232befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->last_displaying_surface = VA_INVALID_SURFACE; 124dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1250da1930627209986e8db220799a690f816494401Austin Yuan psb_InitRotate(ctx); 1263f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 1272befccec034c13d34746a9e87149889d59ac767bFei Jiang#ifdef ANDROID 1282befccec034c13d34746a9e87149889d59ac767bFei Jiang ws_priv = psb_android_output_init(ctx); 1293f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan driver_data->is_android = 1; 130437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#else 1312befccec034c13d34746a9e87149889d59ac767bFei Jiang ws_priv = psb_x11_output_init(ctx); 1323f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan driver_data->is_android = 0; 133437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#endif 1342befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->ws_priv = ws_priv; 135437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 137275f077b4bd66802efdbd5bc666b6938751fa03dLin Xie#if 0 1382befccec034c13d34746a9e87149889d59ac767bFei Jiang //use client textureblit 1398803df709aec9d485d757c681791d708f9a88fe6Austin Yuan if (driver_data->ctexture == 1) { 1408803df709aec9d485d757c681791d708f9a88fe6Austin Yuan int ret = psb_ctexture_init(ctx); 1418803df709aec9d485d757c681791d708f9a88fe6Austin Yuan if (ret != 0) 1428803df709aec9d485d757c681791d708f9a88fe6Austin Yuan driver_data->ctexture = 0; 1438803df709aec9d485d757c681791d708f9a88fe6Austin Yuan } 144275f077b4bd66802efdbd5bc666b6938751fa03dLin Xie#endif 145437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1462befccec034c13d34746a9e87149889d59ac767bFei Jiang /* 1472befccec034c13d34746a9e87149889d59ac767bFei Jiang //use texture streaming 1482befccec034c13d34746a9e87149889d59ac767bFei Jiang if (driver_data->ctexstreaming == 1) 1492befccec034c13d34746a9e87149889d59ac767bFei Jiang psb_ctexstreaing_init(ctx); 1502befccec034c13d34746a9e87149889d59ac767bFei Jiang */ 1513f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 1527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 1537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_deinitOutput( 1567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VADriverContextP ctx 1572befccec034c13d34746a9e87149889d59ac767bFei Jiang) 1587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 1604b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 161275f077b4bd66802efdbd5bc666b6938751fa03dLin Xie#if 0 1622f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang //use client textureblit 163bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang if (driver_data->ctexture == 1) 164dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_ctexture_deinit(ctx); 165275f077b4bd66802efdbd5bc666b6938751fa03dLin Xie#endif 166dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1676e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang if (driver_data->coverlay_init) { 168bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang psb_coverlay_deinit(ctx); 1696e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang driver_data->coverlay_init = 0; 1706e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang } 1713f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 172bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#ifndef ANDROID 1732befccec034c13d34746a9e87149889d59ac767bFei Jiang psb_x11_output_deinit(ctx); 174dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#else 175dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_android_output_deinit(ctx); 1767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 1777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1782befccec034c13d34746a9e87149889d59ac767bFei Jiang /* free here, but allocate in window system specific */ 179dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun free(driver_data->ws_priv); 1802befccec034c13d34746a9e87149889d59ac767bFei Jiang /* 1812befccec034c13d34746a9e87149889d59ac767bFei Jiang //use texture streaming 1822befccec034c13d34746a9e87149889d59ac767bFei Jiang if (driver_data->ctexstreaming == 1) 183dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_ctexstreaing_deinit(ctx); 1842befccec034c13d34746a9e87149889d59ac767bFei Jiang */ 1855b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang /* clean the displaying surface information in kernel */ 186f31d5416a60f83e184b0906a7ec77ba021840531hding#ifndef _FOR_FPGA_ 1875b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang psb_surface_set_displaying(driver_data, 0, 0, NULL); 188f31d5416a60f83e184b0906a7ec77ba021840531hding#endif 1892befccec034c13d34746a9e87149889d59ac767bFei Jiang pthread_mutex_destroy(&driver_data->output_mutex); 1903f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 1917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 1927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifndef VA_STATUS_ERROR_INVALID_IMAGE_FORMAT 1957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define VA_STATUS_ERROR_INVALID_IMAGE_FORMAT VA_STATUS_ERROR_UNKNOWN 1967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 1977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAImageFormat *psb__VAImageCheckFourCC( 199bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang VAImageFormat *src_format, 200bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang VAImageFormat *dst_format, 201bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang int dst_num 2027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 2037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 2047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int i; 205dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == src_format || dst_format == NULL) { 2067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return NULL; 2077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 2087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* check VAImage at first */ 210dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < dst_num; i++) { 2117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (dst_format[i].fourcc == src_format->fourcc) 2127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return &dst_format[i]; 2137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 214dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 215c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "Unsupport fourcc 0x%x\n", src_format->fourcc); 2167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return NULL; 2177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 2187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb__VAImageCheckRegion( 2207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_surface_p surface, 2217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAImage *image, 2227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int *src_x, 2237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int *src_y, 2247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int *dest_x, 225dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int *dest_y, 226e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang int *width, 227e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang int *height 2287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 2297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 2307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* check for image */ 2317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (*src_x < 0) *src_x = 0; 2327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (*src_x > image->width) *src_x = image->width - 1; 2337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (*src_y < 0) *src_y = 0; 2347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (*src_y > image->height) *src_y = image->height - 1; 235dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (((*width) + (*src_x)) > image->width) *width = image->width - *src_x; 2377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (((*height) + (*src_y)) > image->height) *height = image->height - *src_x; 2387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* check for surface */ 2407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (*dest_x < 0) *dest_x = 0; 2417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (*dest_x > surface->width) *dest_x = surface->width - 1; 2427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (*dest_y < 0) *dest_y = 0; 2437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (*dest_y > surface->height) *dest_y = surface->height - 1; 2447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (((*width) + (*dest_x)) > surface->width) *width = surface->width - *dest_x; 2467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (((*height) + (*dest_y)) > surface->height) *height = surface->height - *dest_x; 2477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 2487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_QueryImageFormats( 2512befccec034c13d34746a9e87149889d59ac767bFei Jiang VADriverContextP ctx, 2522befccec034c13d34746a9e87149889d59ac767bFei Jiang VAImageFormat *format_list, /* out */ 2532befccec034c13d34746a9e87149889d59ac767bFei Jiang int *num_formats /* out */ 2547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 2557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 2562befccec034c13d34746a9e87149889d59ac767bFei Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 257dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2586d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_INVALID_PARAM(format_list == NULL); 2596d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_INVALID_PARAM(num_formats == NULL); 2606d37ae34fcae80f2e898b61e2506ed8e887bd16anguo 261dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun memcpy(format_list, psb__CreateImageFormat, sizeof(psb__CreateImageFormat)); 2627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *num_formats = PSB_MAX_IMAGE_FORMATS; 263dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 2657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 2667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianginline int min_POT(int n) 2687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 269dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((n & (n - 1)) == 0) /* already POT */ 2707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return n; 2717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 272dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return n |= n >> 16, n |= n >> 8, n |= n >> 4, n |= n >> 2, n |= n >> 1, n + 1; 2737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* return ((((n |= n>>16) |= n>>8) |= n>>4) |= n>>2) |= n>>1, n + 1; */ 2747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 2757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_CreateImage( 2772befccec034c13d34746a9e87149889d59ac767bFei Jiang VADriverContextP ctx, 2782befccec034c13d34746a9e87149889d59ac767bFei Jiang VAImageFormat *format, 2792befccec034c13d34746a9e87149889d59ac767bFei Jiang int width, 2802befccec034c13d34746a9e87149889d59ac767bFei Jiang int height, 2812befccec034c13d34746a9e87149889d59ac767bFei Jiang VAImage *image /* out */ 2827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 2837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 2847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 2857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAImageID imageID; 2867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_image_p obj_image; 2877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 2887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAImageFormat *img_fmt; 2897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int pitch_pot; 290dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (void)driver_data; 2927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang img_fmt = psb__VAImageCheckFourCC(format, psb__CreateImageFormat, 294dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun sizeof(psb__CreateImageFormat) / sizeof(VAImageFormat)); 2957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (img_fmt == NULL) 2967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_UNKNOWN; 2977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2986d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_INVALID_PARAM(image == NULL); 2995fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang 300dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun imageID = object_heap_allocate(&driver_data->image_heap); 3017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image = IMAGE(imageID); 3026d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_ALLOCATION(obj_image); 3037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3042befccec034c13d34746a9e87149889d59ac767bFei Jiang MEMSET_OBJECT(obj_image, struct object_image_s); 3052befccec034c13d34746a9e87149889d59ac767bFei Jiang 3067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image->image.image_id = imageID; 3077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image->image.format = *img_fmt; 3087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image->subpic_ref = 0; 3097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pitch_pot = min_POT(width); 311dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 3127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang switch (format->fourcc) { 313dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VA_FOURCC_NV12: { 3142befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.width = width; 3152befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.height = height; 316dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun obj_image->image.data_size = pitch_pot * height /*Y*/ + 2 * (pitch_pot / 2) * (height / 2);/*UV*/ 3172befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.num_planes = 2; 3182befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.pitches[0] = pitch_pot; 3192befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.pitches[1] = pitch_pot; 3202befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.offsets[0] = 0; 321dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun obj_image->image.offsets[1] = pitch_pot * height; 3222befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.num_palette_entries = 0; 3232befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.entry_bytes = 0; 3242befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.component_order[0] = 'Y'; 3252befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.component_order[1] = 'U';/* fixed me: packed UV packed here! */ 3262befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.component_order[2] = 'V'; 3272befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.component_order[3] = '\0'; 3282befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 3292befccec034c13d34746a9e87149889d59ac767bFei Jiang } 330dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VA_FOURCC_AYUV: { 3312befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.width = width; 3322befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.height = height; 333dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun obj_image->image.data_size = 4 * pitch_pot * height; 3342befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.num_planes = 1; 335dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun obj_image->image.pitches[0] = 4 * pitch_pot; 3362befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.num_palette_entries = 0; 3372befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.entry_bytes = 0; 3382befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.component_order[0] = 'V'; 3392befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.component_order[1] = 'U'; 3402befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.component_order[2] = 'Y'; 3412befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.component_order[3] = 'A'; 3422befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 3432befccec034c13d34746a9e87149889d59ac767bFei Jiang } 344dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VA_FOURCC_RGBA: { 3452befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.width = width; 3462befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.height = height; 347dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun obj_image->image.data_size = 4 * pitch_pot * height; 3482befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.num_planes = 1; 349dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun obj_image->image.pitches[0] = 4 * pitch_pot; 3502befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.num_palette_entries = 0; 3512befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.entry_bytes = 0; 3522befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.component_order[0] = 'R'; 3532befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.component_order[1] = 'G'; 3542befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.component_order[2] = 'B'; 3552befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.component_order[3] = 'A'; 3562befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 3572befccec034c13d34746a9e87149889d59ac767bFei Jiang } 358dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VA_FOURCC_AI44: { 3592befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.width = width; 3602befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.height = height; 361dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun obj_image->image.data_size = pitch_pot * height;/* one byte one element */ 3622befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.num_planes = 1; 3632befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.pitches[0] = pitch_pot; 3642befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.num_palette_entries = 16; 3652befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.entry_bytes = 4; /* AYUV */ 3662befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.component_order[0] = 'I'; 3672befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.component_order[1] = 'A'; 3682befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.component_order[2] = '\0'; 3692befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.component_order[3] = '\0'; 3702befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 3712befccec034c13d34746a9e87149889d59ac767bFei Jiang } 372dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VA_FOURCC_IYUV: { 3732befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.width = width; 3742befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.height = height; 375dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun obj_image->image.data_size = pitch_pot * height /*Y*/ + 2 * (pitch_pot / 2) * (height / 2);/*UV*/ 3762befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.num_planes = 3; 3772befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.pitches[0] = pitch_pot; 378dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun obj_image->image.pitches[1] = pitch_pot / 2; 379dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun obj_image->image.pitches[2] = pitch_pot / 2; 3802befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.offsets[0] = 0; 381dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun obj_image->image.offsets[1] = pitch_pot * height; 382dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun obj_image->image.offsets[2] = pitch_pot * height + (pitch_pot / 2) * (height / 2); 3832befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.num_palette_entries = 0; 3842befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.entry_bytes = 0; 3852befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.component_order[0] = 'Y'; 3862befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.component_order[1] = 'U'; 3872befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.component_order[2] = 'V'; 3882befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.component_order[3] = '\0'; 3892befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 3902befccec034c13d34746a9e87149889d59ac767bFei Jiang } 391f31d5416a60f83e184b0906a7ec77ba021840531hding case VA_FOURCC_YV32: { 392f31d5416a60f83e184b0906a7ec77ba021840531hding obj_image->image.width = width; 393f31d5416a60f83e184b0906a7ec77ba021840531hding obj_image->image.height = height; 394f31d5416a60f83e184b0906a7ec77ba021840531hding obj_image->image.data_size = 4 * pitch_pot * height; 395f31d5416a60f83e184b0906a7ec77ba021840531hding obj_image->image.num_planes = 4; 396f31d5416a60f83e184b0906a7ec77ba021840531hding obj_image->image.pitches[0] = pitch_pot; 397f31d5416a60f83e184b0906a7ec77ba021840531hding obj_image->image.pitches[1] = pitch_pot; 398f31d5416a60f83e184b0906a7ec77ba021840531hding obj_image->image.pitches[2] = pitch_pot; 3995ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding obj_image->image.extra_pitch = pitch_pot; 400f31d5416a60f83e184b0906a7ec77ba021840531hding obj_image->image.offsets[0] = 0; 401f31d5416a60f83e184b0906a7ec77ba021840531hding obj_image->image.offsets[1] = pitch_pot * height; 402f31d5416a60f83e184b0906a7ec77ba021840531hding obj_image->image.offsets[2] = pitch_pot * height * 2; 4035ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding obj_image->image.extra_offset = pitch_pot * height * 3; 404f31d5416a60f83e184b0906a7ec77ba021840531hding obj_image->image.num_palette_entries = 0; 405f31d5416a60f83e184b0906a7ec77ba021840531hding obj_image->image.entry_bytes = 0; 406f31d5416a60f83e184b0906a7ec77ba021840531hding obj_image->image.component_order[0] = 'V'; 407f31d5416a60f83e184b0906a7ec77ba021840531hding obj_image->image.component_order[1] = 'U'; 408f31d5416a60f83e184b0906a7ec77ba021840531hding obj_image->image.component_order[2] = 'Y'; 409f31d5416a60f83e184b0906a7ec77ba021840531hding obj_image->image.component_order[3] = 'A'; 410f31d5416a60f83e184b0906a7ec77ba021840531hding break; 411f31d5416a60f83e184b0906a7ec77ba021840531hding } 412dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun default: { 4132befccec034c13d34746a9e87149889d59ac767bFei Jiang vaStatus = VA_STATUS_ERROR_INVALID_IMAGE_FORMAT; 4142befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 4152befccec034c13d34746a9e87149889d59ac767bFei Jiang } 4167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 417dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (VA_STATUS_SUCCESS == vaStatus) { 4197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* create the buffer */ 4207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = psb__CreateBuffer(driver_data, NULL, VAImageBufferType, 4217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image->image.data_size, 1, NULL, &obj_image->image.buf); 4227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 4237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image->derived_surface = 0; 425dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 426dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (VA_STATUS_SUCCESS != vaStatus) { 427dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun object_heap_free(&driver_data->image_heap, (object_base_p) obj_image); 428dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 4297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang memcpy(image, &obj_image->image, sizeof(VAImage)); 4307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 431dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 4337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 4347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 435c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiangstatic int psb_CheckIEDStatus(VADriverContextP ctx) 436c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang{ 437c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang INIT_DRIVER_DATA; 438c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang struct drm_lnc_video_getparam_arg arg; 439c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang unsigned long temp; 440c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang int ret = 0; 441c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang 442c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang /* not settled, we get it from current HW FRAMESKIP flag */ 443c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang arg.key = IMG_VIDEO_IED_STATE; 444c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang arg.value = (uint64_t)((unsigned long) & temp); 445c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang ret = drmCommandWriteRead(driver_data->drm_fd, driver_data->getParamIoctlOffset, 446c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang &arg, sizeof(arg)); 447c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang if (ret == 0) { 448c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang if (temp == 1) { 449c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "IED is enabled, image is encrypted.\n"); 450c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang return 1; 451c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang } else { 452c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang return 0; 453c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang } 454c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang } else { 455c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to call IMG_VIDEO_IED_STATE.\n"); 456c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang return -1; 457c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang } 458c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang} 459c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang 4607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_DeriveImage( 4612befccec034c13d34746a9e87149889d59ac767bFei Jiang VADriverContextP ctx, 4622befccec034c13d34746a9e87149889d59ac767bFei Jiang VASurfaceID surface, 4632befccec034c13d34746a9e87149889d59ac767bFei Jiang VAImage *image /* out */ 4647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 4657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 4667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 4677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 4687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VABufferID bufferID; 4697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_buffer_p obj_buffer; 4707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAImageID imageID; 4717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_image_p obj_image; 4727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_surface_p obj_surface = SURFACE(surface); 473dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned int fourcc, fourcc_index = ~0, i; 4747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t srf_buf_ofs = 0; 475dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4766d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_SURFACE(obj_surface); 4776d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_INVALID_PARAM(image == NULL); 4787fe83028016237543fd7ffb31036023398dd62b6pingshix /* Can't derive image from reconstrued frame which is in tiled format */ 479115592518cc10686777609f874b567201a108d06zhangzha if (obj_surface->is_ref_surface == 1 || obj_surface->is_ref_surface == 2) { 4807fe83028016237543fd7ffb31036023398dd62b6pingshix drv_debug_msg(VIDEO_DEBUG_ERROR, "Can't derive reference surface" \ 4817fe83028016237543fd7ffb31036023398dd62b6pingshix "which is tiled format\n"); 4827fe83028016237543fd7ffb31036023398dd62b6pingshix return VA_STATUS_ERROR_OPERATION_FAILED; 4837fe83028016237543fd7ffb31036023398dd62b6pingshix } 4847fe83028016237543fd7ffb31036023398dd62b6pingshix 485c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang if (IS_MFLD(driver_data) && (psb_CheckIEDStatus(ctx) == 1)) { 486c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang vaStatus = VA_STATUS_ERROR_INVALID_SURFACE; 487c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang return vaStatus; 488c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang } 489c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang 4907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fourcc = obj_surface->psb_surface->extra_info[4]; 491bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang for (i = 0; i < PSB_MAX_IMAGE_FORMATS; i++) { 4927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (psb__CreateImageFormat[i].fourcc == fourcc) { 4937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fourcc_index = i; 4947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 4957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 4967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 497dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (i == PSB_MAX_IMAGE_FORMATS) { 498c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "Can't support the Fourcc\n"); 4997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = VA_STATUS_ERROR_OPERATION_FAILED; 5007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 5017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* create the image */ 504dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun imageID = object_heap_allocate(&driver_data->image_heap); 5057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image = IMAGE(imageID); 5066d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_ALLOCATION(obj_image); 5077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5082befccec034c13d34746a9e87149889d59ac767bFei Jiang MEMSET_OBJECT(obj_image, struct object_image_s); 5092befccec034c13d34746a9e87149889d59ac767bFei Jiang 5107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* create a buffer to represent surface buffer */ 511dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun bufferID = object_heap_allocate(&driver_data->buffer_heap); 5127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_buffer = BUFFER(bufferID); 5137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (NULL == obj_buffer) { 514dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun object_heap_free(&driver_data->image_heap, (object_base_p) obj_image); 5157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 5167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBUG_FAILURE; 5177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 5187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5192befccec034c13d34746a9e87149889d59ac767bFei Jiang MEMSET_OBJECT(obj_buffer, struct object_buffer_s); 5202befccec034c13d34746a9e87149889d59ac767bFei Jiang 5217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_buffer->type = VAImageBufferType; 5227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_buffer->buffer_data = NULL; 5237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_buffer->psb_buffer = &obj_surface->psb_surface->buf; 5247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_buffer->size = obj_surface->psb_surface->size; 5257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_buffer->max_num_elements = 0; 5267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_buffer->alloc_size = obj_buffer->size; 5277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* fill obj_image data structure */ 5297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image->image.image_id = imageID; 5307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image->image.format = psb__CreateImageFormat[fourcc_index]; 5317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image->subpic_ref = 0; 5327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image->image.buf = bufferID; 5347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image->image.width = obj_surface->width; 5357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image->image.height = obj_surface->height; 5367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image->image.data_size = obj_surface->psb_surface->size; 5377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang srf_buf_ofs = obj_surface->psb_surface->buf.buffer_ofs; 539dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang switch (fourcc) { 541dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VA_FOURCC_NV12: { 5422befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.num_planes = 2; 5432befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.pitches[0] = obj_surface->psb_surface->stride; 5442befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.pitches[1] = obj_surface->psb_surface->stride; 545dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5462befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.offsets[0] = srf_buf_ofs; 5472befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.offsets[1] = srf_buf_ofs + obj_surface->height * obj_surface->psb_surface->stride; 5482befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.num_palette_entries = 0; 5492befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.entry_bytes = 0; 5502befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.component_order[0] = 'Y'; 5512befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.component_order[1] = 'U';/* fixed me: packed UV packed here! */ 5522befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.component_order[2] = 'V'; 5532befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.component_order[3] = '\0'; 5542befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 5552befccec034c13d34746a9e87149889d59ac767bFei Jiang } 556dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VA_FOURCC_YV16: { 557dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun obj_image->image.num_planes = 3; 5582f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang obj_image->image.pitches[0] = obj_surface->psb_surface->stride; 5592f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang obj_image->image.pitches[1] = obj_surface->psb_surface->stride / 2; 5602f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang obj_image->image.pitches[2] = obj_surface->psb_surface->stride / 2; 561dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5622f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang obj_image->image.offsets[0] = srf_buf_ofs; 5632f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang obj_image->image.offsets[1] = srf_buf_ofs + obj_surface->height * obj_surface->psb_surface->stride; 5642f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang obj_image->image.offsets[2] = srf_buf_ofs + obj_surface->height * obj_surface->psb_surface->stride * 3 / 2; 5652f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang obj_image->image.num_palette_entries = 0; 5662f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang obj_image->image.entry_bytes = 0; 5672f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang obj_image->image.component_order[0] = 'Y'; 5682f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang obj_image->image.component_order[1] = 'V';/* fixed me: packed UV packed here! */ 5692f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang obj_image->image.component_order[2] = 'U'; 5702f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang obj_image->image.component_order[3] = '\0'; 5712f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang break; 5722f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 5732befccec034c13d34746a9e87149889d59ac767bFei Jiang default: 5742befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 5757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 576dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image->derived_surface = surface; /* this image is derived from a surface */ 5787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_surface->derived_imgcnt++; 579dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang memcpy(image, &obj_image->image, sizeof(VAImage)); 581dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 5837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 5847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb__destroy_image(psb_driver_data_p driver_data, object_image_p obj_image) 5867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 5877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 588dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_image->subpic_ref > 0) { 5907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = VA_STATUS_ERROR_OPERATION_FAILED; 5917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 5927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_surface_p obj_surface = SURFACE(obj_image->derived_surface); 595dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_surface == NULL) { /* destroy the buffer */ 5977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_buffer_p obj_buffer = BUFFER(obj_image->image.buf); 5986d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_BUFFER(obj_buffer); 5997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__suspend_buffer(driver_data, obj_buffer); 6007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else { 6017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_buffer_p obj_buffer = BUFFER(obj_image->image.buf); 602dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun object_heap_free(&driver_data->buffer_heap, &obj_buffer->base); 6037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_surface->derived_imgcnt--; 6047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 605dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun object_heap_free(&driver_data->image_heap, (object_base_p) obj_image); 6067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 6087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 6097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_DestroyImage( 6112befccec034c13d34746a9e87149889d59ac767bFei Jiang VADriverContextP ctx, 6122befccec034c13d34746a9e87149889d59ac767bFei Jiang VAImageID image 6137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 6147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 6157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA 616dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun VAStatus vaStatus = VA_STATUS_SUCCESS; 6177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_image_p obj_image; 618dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 6197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image = IMAGE(image); 6206d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_IMAGE(obj_image); 6217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return psb__destroy_image(driver_data, obj_image); 6227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 6237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 624dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunVAStatus psb_SetImagePalette( 6252befccec034c13d34746a9e87149889d59ac767bFei Jiang VADriverContextP ctx, 6262befccec034c13d34746a9e87149889d59ac767bFei Jiang VAImageID image, 627dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* 6282befccec034c13d34746a9e87149889d59ac767bFei Jiang * pointer to an array holding the palette data. The size of the array is 629dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * num_palette_entries * entry_bytes in size. The order of the components 6302befccec034c13d34746a9e87149889d59ac767bFei Jiang * in the palette is described by the component_order in VAImage struct 6312befccec034c13d34746a9e87149889d59ac767bFei Jiang */ 632dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned char *palette 6337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 6347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 6357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 6367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 637dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 6387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_image_p obj_image = IMAGE(image); 6396d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_IMAGE(obj_image); 6407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_image->image.format.fourcc != VA_FOURCC_AI44) { 6427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* only support AI44 palette */ 6437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = VA_STATUS_ERROR_OPERATION_FAILED; 6447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 6457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 647dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (obj_image->image.num_palette_entries > 16) { 648c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "image.num_palette_entries(%d) is too big\n", obj_image->image.num_palette_entries); 649dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun memcpy(obj_image->palette, palette, 16); 650dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else 651437b3eda28a4bf098efa80598cab67f190275266Fei Jiang memcpy(obj_image->palette, palette, obj_image->image.num_palette_entries * sizeof(unsigned int)); 652437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 6537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 6547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 6557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 656dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunstatic VAStatus lnc_unpack_topaz_rec(int src_width, int src_height, 657dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned char *p_srcY, unsigned char *p_srcUV, 658dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned char *p_dstY, unsigned char *p_dstU, unsigned char *p_dstV, 659dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int dstY_stride, int dstU_stride, int dstV_stride, 6602befccec034c13d34746a9e87149889d59ac767bFei Jiang int surface_height) 6617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 662dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned char *tmp_dstY = NULL; 663dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned char *tmp_dstUV = NULL; 6647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 665dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int n, i, index; 6667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 667c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Unpack reconstructed frame to image\n"); 668dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 6697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* do this one column at a time. */ 670dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun tmp_dstY = (unsigned char *)calloc(1, 16 * src_height); 671dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (tmp_dstY == NULL) 6727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_ALLOCATION_FAILED; 673dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 674dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun tmp_dstUV = (unsigned char*)calloc(1, 16 * src_height / 2); 6757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (tmp_dstUV == NULL) { 6767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang free(tmp_dstY); 6777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_ALLOCATION_FAILED; 6787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 679dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 6807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Copy Y data */ 681bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang for (n = 0; n < src_width / 16; n++) { 682bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang memcpy((void*)tmp_dstY, p_srcY, 16 * src_height); 683dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_srcY += (16 * surface_height); 684bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang for (i = 0; i < src_height; i++) { 685bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang memcpy(p_dstY + dstY_stride * i + n * 16, tmp_dstY + 16 * i, 16); 6867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Copy U/V data */ 690bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang for (n = 0; n < src_width / 16; n++) { 691bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang memcpy((void*)tmp_dstUV, p_srcUV, 16 * src_height / 2); 692dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_srcUV += (16 * surface_height / 2); 693bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang for (i = 0; i < src_height / 2; i++) { 694bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang for (index = 0; index < 8; index++) { 695dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_dstU[i*dstU_stride + n*8 + index] = tmp_dstUV[index*2 + i*16]; 696dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_dstV[i*dstV_stride + n*8 + index] = tmp_dstUV[index*2 + i*16+1]; 6977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (tmp_dstY) 7017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang free(tmp_dstY); 7027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (tmp_dstUV) 7037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang free(tmp_dstUV); 7047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 7067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 7077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7087fe83028016237543fd7ffb31036023398dd62b6pingshix/* 7097fe83028016237543fd7ffb31036023398dd62b6pingshix* Convert the memroy format from tiled to linear 7107fe83028016237543fd7ffb31036023398dd62b6pingshix*/ 711115592518cc10686777609f874b567201a108d06zhangzhastatic VAStatus tng_unpack_vsp_rec( 712115592518cc10686777609f874b567201a108d06zhangzha int src_width, int src_height, 713115592518cc10686777609f874b567201a108d06zhangzha unsigned char *p_srcY, unsigned char *p_srcUV, 714115592518cc10686777609f874b567201a108d06zhangzha unsigned char *p_dstY, unsigned char *p_dstU, 715115592518cc10686777609f874b567201a108d06zhangzha int dstY_stride, int dstU_stride, int dstV_stride, 716115592518cc10686777609f874b567201a108d06zhangzha int surface_height) 717115592518cc10686777609f874b567201a108d06zhangzha{ 718115592518cc10686777609f874b567201a108d06zhangzha unsigned char *tmp_dstY = p_dstY; 719115592518cc10686777609f874b567201a108d06zhangzha unsigned char *tmp_dstU = p_dstU; 720115592518cc10686777609f874b567201a108d06zhangzha 721115592518cc10686777609f874b567201a108d06zhangzha int n, t,x,y; 722115592518cc10686777609f874b567201a108d06zhangzha 723115592518cc10686777609f874b567201a108d06zhangzha //" Y_address(x,y) = Y_base + (((H +64+63)/64) * (x/64) + (y/64))*4096 + (y%64)*64 + (x%64) 724115592518cc10686777609f874b567201a108d06zhangzha //" U_address(x,y) = UV_base + ((((H+1)/2+32+63)/64) * (x/32) + (y/64))*4096 + (y%64)*64 + (x%32)*2 725115592518cc10686777609f874b567201a108d06zhangzha //" V_address(x,y) = UV_base + ((((H+1)/2+32+63)/64) * (x/32) + (y/64))*4096 + (y%64)*64 + (x%32)*2 + 1 726115592518cc10686777609f874b567201a108d06zhangzha 727115592518cc10686777609f874b567201a108d06zhangzha /* Copy Y data */ 728115592518cc10686777609f874b567201a108d06zhangzha for (y = 36; y < src_height +36; y++) { 729115592518cc10686777609f874b567201a108d06zhangzha for (x= 32;x < src_width+32; x++) { 730115592518cc10686777609f874b567201a108d06zhangzha * tmp_dstY++ = *( p_srcY + (((src_height+64+63)/64) * (x/64) + (y/64))*4096 + (y%64)*64 + (x%64)); 731115592518cc10686777609f874b567201a108d06zhangzha } 732115592518cc10686777609f874b567201a108d06zhangzha tmp_dstY += dstY_stride - src_width; 733115592518cc10686777609f874b567201a108d06zhangzha } 734115592518cc10686777609f874b567201a108d06zhangzha 735115592518cc10686777609f874b567201a108d06zhangzha /* Copy UV data */ 736115592518cc10686777609f874b567201a108d06zhangzha for (y = 18; y < 18+ ((src_height+1)>>1) ; y++) { 737115592518cc10686777609f874b567201a108d06zhangzha for (x= 16;x < 16+( (src_width+1)>>1); x++) { 738115592518cc10686777609f874b567201a108d06zhangzha * tmp_dstU++ = * ( p_srcUV + ((((src_height+1)/2+32+63)/64) * (x/32) + (y/64))*4096 + (y%64)*64 + (x%32)*2); 739115592518cc10686777609f874b567201a108d06zhangzha * tmp_dstU++ = * ( p_srcUV + ((((src_height+1)/2+32+63)/64) * (x/32) + (y/64))*4096 + (y%64)*64 + (x%32)*2 +1); 740115592518cc10686777609f874b567201a108d06zhangzha } 741115592518cc10686777609f874b567201a108d06zhangzha tmp_dstU += dstU_stride - ((src_width)); 742115592518cc10686777609f874b567201a108d06zhangzha } 743115592518cc10686777609f874b567201a108d06zhangzha 744115592518cc10686777609f874b567201a108d06zhangzha return VA_STATUS_SUCCESS; 745115592518cc10686777609f874b567201a108d06zhangzha} 746115592518cc10686777609f874b567201a108d06zhangzha/* 747115592518cc10686777609f874b567201a108d06zhangzha* Convert the memroy format from tiled to linear 748115592518cc10686777609f874b567201a108d06zhangzha*/ 7497fe83028016237543fd7ffb31036023398dd62b6pingshixstatic VAStatus tng_unpack_topaz_rec( 7507fe83028016237543fd7ffb31036023398dd62b6pingshix int src_width, int src_height, 7517fe83028016237543fd7ffb31036023398dd62b6pingshix unsigned char *p_srcY, unsigned char *p_srcUV, 7527fe83028016237543fd7ffb31036023398dd62b6pingshix unsigned char *p_dstY, unsigned char *p_dstU, unsigned char *p_dstV, 7537fe83028016237543fd7ffb31036023398dd62b6pingshix int dstY_stride, int dstU_stride, int dstV_stride, 7547fe83028016237543fd7ffb31036023398dd62b6pingshix int surface_height) 7557fe83028016237543fd7ffb31036023398dd62b6pingshix{ 7567fe83028016237543fd7ffb31036023398dd62b6pingshix unsigned char *tmp_dstY = p_dstY; 7577fe83028016237543fd7ffb31036023398dd62b6pingshix unsigned char *tmp_dstU = p_dstU; 7587fe83028016237543fd7ffb31036023398dd62b6pingshix unsigned char *tmp_dstV = p_dstV; 7597fe83028016237543fd7ffb31036023398dd62b6pingshix unsigned char *tmp_srcY = p_srcY; 7607fe83028016237543fd7ffb31036023398dd62b6pingshix unsigned char *tmp_srcX = p_srcUV; 7617fe83028016237543fd7ffb31036023398dd62b6pingshix 7627fe83028016237543fd7ffb31036023398dd62b6pingshix int i, j, n, t; 7637fe83028016237543fd7ffb31036023398dd62b6pingshix int mb_src_y_w = src_width >> 4; 7647fe83028016237543fd7ffb31036023398dd62b6pingshix int mb_src_y_h = src_height >> 5; 7657fe83028016237543fd7ffb31036023398dd62b6pingshix int mb_src_y_p = src_height - (mb_src_y_h << 5); 7667fe83028016237543fd7ffb31036023398dd62b6pingshix 7677fe83028016237543fd7ffb31036023398dd62b6pingshix /* Copy Y data */ 7687fe83028016237543fd7ffb31036023398dd62b6pingshix for (j = 0; j < mb_src_y_h; j++) { 7697fe83028016237543fd7ffb31036023398dd62b6pingshix tmp_dstY = p_dstY + j * dstY_stride * 32; 7707fe83028016237543fd7ffb31036023398dd62b6pingshix for (i = 0; i < mb_src_y_w; i++) { 7717fe83028016237543fd7ffb31036023398dd62b6pingshix for (n = 0; n < 32; n++) { 7727fe83028016237543fd7ffb31036023398dd62b6pingshix memcpy(tmp_dstY + dstY_stride * n, tmp_srcY,16); 7737fe83028016237543fd7ffb31036023398dd62b6pingshix tmp_srcY += 16; 7747fe83028016237543fd7ffb31036023398dd62b6pingshix } 7757fe83028016237543fd7ffb31036023398dd62b6pingshix tmp_dstY += 16; 7767fe83028016237543fd7ffb31036023398dd62b6pingshix } 7777fe83028016237543fd7ffb31036023398dd62b6pingshix } 7787fe83028016237543fd7ffb31036023398dd62b6pingshix 7797fe83028016237543fd7ffb31036023398dd62b6pingshix if(mb_src_y_p != 0) { 7807fe83028016237543fd7ffb31036023398dd62b6pingshix tmp_dstY = p_dstY + j * dstY_stride * 32; 7817fe83028016237543fd7ffb31036023398dd62b6pingshix for (i = 0; i < mb_src_y_w; i++) { 7827fe83028016237543fd7ffb31036023398dd62b6pingshix for (n = 0; n < mb_src_y_p; n++) { 7837fe83028016237543fd7ffb31036023398dd62b6pingshix memcpy(tmp_dstY + dstY_stride * n, tmp_srcY,16); 7847fe83028016237543fd7ffb31036023398dd62b6pingshix tmp_srcY += 16; 7857fe83028016237543fd7ffb31036023398dd62b6pingshix } 7867fe83028016237543fd7ffb31036023398dd62b6pingshix for (; n < 32; n++) { 7877fe83028016237543fd7ffb31036023398dd62b6pingshix tmp_srcY += 16; 7887fe83028016237543fd7ffb31036023398dd62b6pingshix } 7897fe83028016237543fd7ffb31036023398dd62b6pingshix tmp_dstY += 16; 7907fe83028016237543fd7ffb31036023398dd62b6pingshix } 7917fe83028016237543fd7ffb31036023398dd62b6pingshix } 7927fe83028016237543fd7ffb31036023398dd62b6pingshix 7937fe83028016237543fd7ffb31036023398dd62b6pingshix for (j = 0; j < mb_src_y_h; j++) { 7947fe83028016237543fd7ffb31036023398dd62b6pingshix tmp_dstU = p_dstU + j * dstY_stride * 16; 7957fe83028016237543fd7ffb31036023398dd62b6pingshix for (i = 0; i < mb_src_y_w; i++) { 7967fe83028016237543fd7ffb31036023398dd62b6pingshix for (n = 0; n < 16; n++) { 7977fe83028016237543fd7ffb31036023398dd62b6pingshix for (t = 0; t < 16; t++) { 7987fe83028016237543fd7ffb31036023398dd62b6pingshix tmp_dstU[(n * dstY_stride) + t] = tmp_srcX[t]; 7997fe83028016237543fd7ffb31036023398dd62b6pingshix } 8007fe83028016237543fd7ffb31036023398dd62b6pingshix tmp_srcX += 16; 8017fe83028016237543fd7ffb31036023398dd62b6pingshix } 8027fe83028016237543fd7ffb31036023398dd62b6pingshix tmp_dstU += 16; 8037fe83028016237543fd7ffb31036023398dd62b6pingshix } 8047fe83028016237543fd7ffb31036023398dd62b6pingshix } 8057fe83028016237543fd7ffb31036023398dd62b6pingshix mb_src_y_p >>= 1; 8067fe83028016237543fd7ffb31036023398dd62b6pingshix if(mb_src_y_p != 0) { 8077fe83028016237543fd7ffb31036023398dd62b6pingshix tmp_dstU = p_dstU + j * dstY_stride * 16; 8087fe83028016237543fd7ffb31036023398dd62b6pingshix for (i = 0; i < mb_src_y_w; i++) { 8097fe83028016237543fd7ffb31036023398dd62b6pingshix for (n = 0; n < mb_src_y_p; n++) { 8107fe83028016237543fd7ffb31036023398dd62b6pingshix for (t = 0; t < 16; t++) { 8117fe83028016237543fd7ffb31036023398dd62b6pingshix tmp_dstU[(n * dstY_stride) + t] = tmp_srcX[t]; 8127fe83028016237543fd7ffb31036023398dd62b6pingshix } 8137fe83028016237543fd7ffb31036023398dd62b6pingshix tmp_srcX += 16; 8147fe83028016237543fd7ffb31036023398dd62b6pingshix } 8157fe83028016237543fd7ffb31036023398dd62b6pingshix 8167fe83028016237543fd7ffb31036023398dd62b6pingshix for (; n < 16; n++) { 8177fe83028016237543fd7ffb31036023398dd62b6pingshix tmp_srcX += 16; 8187fe83028016237543fd7ffb31036023398dd62b6pingshix } 8197fe83028016237543fd7ffb31036023398dd62b6pingshix 8207fe83028016237543fd7ffb31036023398dd62b6pingshix tmp_dstU += 16; 8217fe83028016237543fd7ffb31036023398dd62b6pingshix } 8227fe83028016237543fd7ffb31036023398dd62b6pingshix } 8237fe83028016237543fd7ffb31036023398dd62b6pingshix 8247fe83028016237543fd7ffb31036023398dd62b6pingshix return VA_STATUS_SUCCESS; 8257fe83028016237543fd7ffb31036023398dd62b6pingshix} 8267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_GetImage( 8287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VADriverContextP ctx, 8297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VASurfaceID surface, 8307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int x, /* coordinates of the upper left source pixel */ 8317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int y, 8327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int width, /* width and height of the region */ 8337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int height, 8347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAImageID image_id 8357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 8367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 8377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 8387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 839dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int ret, src_x = 0, src_y = 0, dest_x = 0, dest_y = 0; 840dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 8417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (void)driver_data; 8427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (void)lnc_unpack_topaz_rec; 843dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 8447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_image_p obj_image = IMAGE(image_id); 8456d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_IMAGE(obj_image); 8467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 847c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang if (IS_MFLD(driver_data) && (psb_CheckIEDStatus(ctx) == 1)) { 848c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang vaStatus = VA_STATUS_ERROR_INVALID_SURFACE; 849c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang return vaStatus; 850c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang } 851c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang 8527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_image->image.format.fourcc != VA_FOURCC_NV12) { 853c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "target VAImage fourcc should be NV12 or IYUV\n"); 8547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = VA_STATUS_ERROR_OPERATION_FAILED; 8557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 8567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 857dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 8587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_surface_p obj_surface = SURFACE(surface); 8596d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_SURFACE(obj_surface); 860dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 861e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang psb__VAImageCheckRegion(obj_surface, &obj_image->image, &src_x, &src_y, &dest_x, &dest_y, 862e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang (int *)&width, (int *)&height); 8637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_surface_p psb_surface = obj_surface->psb_surface; 865e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned char *surface_data; 8667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = psb_buffer_map(&psb_surface->buf, &surface_data); 8677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret) { 8687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_UNKNOWN; 8697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 8707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_buffer_p obj_buffer = BUFFER(obj_image->image.buf); 8726d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_BUFFER(obj_buffer); 8737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 874e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned char *image_data; 8757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = psb_buffer_map(obj_buffer->psb_buffer, &image_data); 8767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret) { 877c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "Map buffer failed\n"); 878dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 8797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_unmap(&psb_surface->buf); 8807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_UNKNOWN; 8817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 8827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 883115592518cc10686777609f874b567201a108d06zhangzha 8847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang image_data += obj_surface->psb_surface->buf.buffer_ofs; 885dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 886115592518cc10686777609f874b567201a108d06zhangzha 8877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang switch (obj_image->image.format.fourcc) { 888dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VA_FOURCC_NV12: { 8897fe83028016237543fd7ffb31036023398dd62b6pingshix unsigned char *src_y, *src_uv, *dst_y, *dst_uv; 8907fe83028016237543fd7ffb31036023398dd62b6pingshix unsigned char *dst_u, *dst_v; 891e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned int i; 892dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 8937fe83028016237543fd7ffb31036023398dd62b6pingshix /* 8947fe83028016237543fd7ffb31036023398dd62b6pingshix * For reconstructed frame, tiled to linear conversion 8957fe83028016237543fd7ffb31036023398dd62b6pingshix * must be done. 8967fe83028016237543fd7ffb31036023398dd62b6pingshix */ 8977fe83028016237543fd7ffb31036023398dd62b6pingshix if (obj_surface->is_ref_surface == 1) { 8987fe83028016237543fd7ffb31036023398dd62b6pingshix src_y = surface_data + y * psb_surface->stride + x; 899115592518cc10686777609f874b567201a108d06zhangzha src_uv = surface_data + ((height + 0x1f) & (~0x1f)) * width; 9007fe83028016237543fd7ffb31036023398dd62b6pingshix 9017fe83028016237543fd7ffb31036023398dd62b6pingshix dst_y = image_data; 9027fe83028016237543fd7ffb31036023398dd62b6pingshix dst_u = image_data + obj_image->image.offsets[1], 9037fe83028016237543fd7ffb31036023398dd62b6pingshix dst_v = dst_u + (height * width) / 4; 9047fe83028016237543fd7ffb31036023398dd62b6pingshix 9057fe83028016237543fd7ffb31036023398dd62b6pingshix tng_unpack_topaz_rec(width, height, \ 9067fe83028016237543fd7ffb31036023398dd62b6pingshix src_y, src_uv, \ 9077fe83028016237543fd7ffb31036023398dd62b6pingshix dst_y, dst_u, dst_v, \ 9087fe83028016237543fd7ffb31036023398dd62b6pingshix obj_image->image.pitches[0], \ 9097fe83028016237543fd7ffb31036023398dd62b6pingshix obj_image->image.width / 2, \ 9107fe83028016237543fd7ffb31036023398dd62b6pingshix obj_image->image.width / 2, \ 9117fe83028016237543fd7ffb31036023398dd62b6pingshix obj_surface->height); 912115592518cc10686777609f874b567201a108d06zhangzha } else if (obj_surface->is_ref_surface == 2) { 913115592518cc10686777609f874b567201a108d06zhangzha src_y = surface_data + y * psb_surface->stride + x; 914115592518cc10686777609f874b567201a108d06zhangzha src_uv = surface_data + ((height + 2*32 + 63)/64*64) * ((width + 2*32 + 63)/64*64); 915115592518cc10686777609f874b567201a108d06zhangzha dst_y = image_data; 916115592518cc10686777609f874b567201a108d06zhangzha dst_u = image_data + obj_image->image.offsets[1]; 917115592518cc10686777609f874b567201a108d06zhangzha 918115592518cc10686777609f874b567201a108d06zhangzha tng_unpack_vsp_rec(width, height, \ 919115592518cc10686777609f874b567201a108d06zhangzha src_y, src_uv, \ 920115592518cc10686777609f874b567201a108d06zhangzha dst_y, dst_u, \ 921115592518cc10686777609f874b567201a108d06zhangzha obj_image->image.pitches[0], \ 922115592518cc10686777609f874b567201a108d06zhangzha obj_image->image.pitches[1], \ 923115592518cc10686777609f874b567201a108d06zhangzha obj_image->image.pitches[1], \ 924115592518cc10686777609f874b567201a108d06zhangzha obj_surface->height); 925115592518cc10686777609f874b567201a108d06zhangzha } else{ 9267fe83028016237543fd7ffb31036023398dd62b6pingshix /* copy Y plane */ 9277fe83028016237543fd7ffb31036023398dd62b6pingshix dst_y = image_data; 9287fe83028016237543fd7ffb31036023398dd62b6pingshix src_y = surface_data + y * psb_surface->stride + x; 9297fe83028016237543fd7ffb31036023398dd62b6pingshix for (i = 0; i < height; i++) { 9307fe83028016237543fd7ffb31036023398dd62b6pingshix memcpy(dst_y, src_y, width); 9317fe83028016237543fd7ffb31036023398dd62b6pingshix dst_y += obj_image->image.pitches[0]; 9327fe83028016237543fd7ffb31036023398dd62b6pingshix src_y += psb_surface->stride; 9337fe83028016237543fd7ffb31036023398dd62b6pingshix } 9347fe83028016237543fd7ffb31036023398dd62b6pingshix 9357fe83028016237543fd7ffb31036023398dd62b6pingshix /* copy UV plane */ 9367fe83028016237543fd7ffb31036023398dd62b6pingshix dst_uv = image_data + obj_image->image.offsets[1]; 9377fe83028016237543fd7ffb31036023398dd62b6pingshix src_uv = surface_data + psb_surface->stride * obj_surface->height + (y / 2) * psb_surface->stride + x;; 9387fe83028016237543fd7ffb31036023398dd62b6pingshix for (i = 0; i < obj_image->image.height / 2; i++) { 9397fe83028016237543fd7ffb31036023398dd62b6pingshix memcpy(dst_uv, src_uv, width); 9407fe83028016237543fd7ffb31036023398dd62b6pingshix dst_uv += obj_image->image.pitches[1]; 9417fe83028016237543fd7ffb31036023398dd62b6pingshix src_uv += psb_surface->stride; 9427fe83028016237543fd7ffb31036023398dd62b6pingshix } 9437fe83028016237543fd7ffb31036023398dd62b6pingshix } 9442befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 9452befccec034c13d34746a9e87149889d59ac767bFei Jiang } 946dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#if 0 947dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VA_FOURCC_IYUV: { 948dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned char *source_y, *dst_y; 9492befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned char *source_uv, *source_u, *source_v, *dst_u, *dst_v; 9502befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned int i; 9512befccec034c13d34746a9e87149889d59ac767bFei Jiang 9522befccec034c13d34746a9e87149889d59ac767bFei Jiang if (psb_surface->extra_info[4] == VA_FOURCC_IREC) { 9532befccec034c13d34746a9e87149889d59ac767bFei Jiang /* copy Y plane */ 9542befccec034c13d34746a9e87149889d59ac767bFei Jiang dst_y = image_data + obj_image->image.offsets[0] + src_y * obj_image->image.pitches[0] + src_x; 9552befccec034c13d34746a9e87149889d59ac767bFei Jiang dst_u = image_data + obj_image->image.offsets[1] + src_y * obj_image->image.pitches[1] + src_x; 9562befccec034c13d34746a9e87149889d59ac767bFei Jiang dst_v = image_data + obj_image->image.offsets[2] + src_y * obj_image->image.pitches[2] + src_x; 9572befccec034c13d34746a9e87149889d59ac767bFei Jiang 958dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun source_y = surface_data + dest_y * psb_surface->stride + dest_x; 9592befccec034c13d34746a9e87149889d59ac767bFei Jiang source_uv = surface_data + obj_surface->height * psb_surface->stride 960dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun + dest_y * (psb_surface->stride / 2) + dest_x; 9612befccec034c13d34746a9e87149889d59ac767bFei Jiang 9622befccec034c13d34746a9e87149889d59ac767bFei Jiang vaStatus = lnc_unpack_topaz_rec(width, height, source_y, source_uv, 9632befccec034c13d34746a9e87149889d59ac767bFei Jiang dst_y, dst_u, dst_v, 9642befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.pitches[0], 9652befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.pitches[1], 966dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun obj_image->image.pitches[2], 9672befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_surface->height); 9687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 969dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 9702befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 9712befccec034c13d34746a9e87149889d59ac767bFei Jiang } 972dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#endif 9732befccec034c13d34746a9e87149889d59ac767bFei Jiang default: 9742befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 9757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 9767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_unmap(obj_buffer->psb_buffer); 9777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_unmap(&psb_surface->buf); 978dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 9797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 9807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 9817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus psb_PutImage2( 9837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VADriverContextP ctx, 9847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VASurfaceID surface, 9857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAImageID image_id, 9867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int src_x, 9877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int src_y, 9887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int width, 9897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int height, 9907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int dest_x, 991dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int dest_y 9927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 9937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 9947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 9957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 9967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret; 9977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_image_p obj_image = IMAGE(image_id); 9996d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_IMAGE(obj_image); 10007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_surface_p obj_surface = SURFACE(surface); 10026d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_SURFACE(obj_surface); 10037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_image->image.format.fourcc != VA_FOURCC_NV12) { 1005c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "target VAImage fourcc should be NV12 or IYUV\n"); 10067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = VA_STATUS_ERROR_OPERATION_FAILED; 10077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 10087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 10097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1010e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang psb__VAImageCheckRegion(obj_surface, &obj_image->image, &src_x, &src_y, &dest_x, &dest_y, 1011e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang (int *)&width, (int *)&height); 10127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_surface_p psb_surface = obj_surface->psb_surface; 1014e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned char *surface_data; 10157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = psb_buffer_map(&psb_surface->buf, &surface_data); 10167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret) { 10177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_UNKNOWN; 10187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 10197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_buffer_p obj_buffer = BUFFER(obj_image->image.buf); 10216d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_BUFFER(obj_buffer); 10227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1023e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned char *image_data; 10247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = psb_buffer_map(obj_buffer->psb_buffer, &image_data); 10257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret) { 10267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_unmap(&psb_surface->buf); 10277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_UNKNOWN; 10287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 10297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang image_data += obj_surface->psb_surface->buf.buffer_ofs; 1031dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 10327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang switch (obj_image->image.format.fourcc) { 1033dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VA_FOURCC_NV12: { 1034e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned char *source_y, *src_uv, *dst_y, *dst_uv; 10352befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned int i; 1036dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 10372befccec034c13d34746a9e87149889d59ac767bFei Jiang /* copy Y plane */ 10382befccec034c13d34746a9e87149889d59ac767bFei Jiang source_y = image_data + obj_image->image.offsets[0] + src_y * obj_image->image.pitches[0] + src_x; 1039dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dst_y = surface_data + dest_y * psb_surface->stride + dest_x; 1040bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang for (i = 0; i < height; i++) { 1041dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun memcpy(dst_y, source_y, width); 10422befccec034c13d34746a9e87149889d59ac767bFei Jiang source_y += obj_image->image.pitches[0]; 10432befccec034c13d34746a9e87149889d59ac767bFei Jiang dst_y += psb_surface->stride; 10442befccec034c13d34746a9e87149889d59ac767bFei Jiang } 1045dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 10462befccec034c13d34746a9e87149889d59ac767bFei Jiang /* copy UV plane */ 1047dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun src_uv = image_data + obj_image->image.offsets[1] + (src_y / 2) * obj_image->image.pitches[1] + src_x; 1048dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dst_uv = surface_data + psb_surface->stride * obj_surface->height + (dest_y / 2) * psb_surface->stride + dest_x; 1049dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < obj_image->image.height / 2; i++) { 10502befccec034c13d34746a9e87149889d59ac767bFei Jiang memcpy(dst_uv, src_uv, width); 10512befccec034c13d34746a9e87149889d59ac767bFei Jiang src_uv += obj_image->image.pitches[1]; 10522befccec034c13d34746a9e87149889d59ac767bFei Jiang dst_uv += psb_surface->stride; 10537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 10542befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 10552befccec034c13d34746a9e87149889d59ac767bFei Jiang } 1056dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#if 0 1057dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VA_FOURCC_IYUV: { 1058dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun char *source_y, *dst_y; 10592befccec034c13d34746a9e87149889d59ac767bFei Jiang char *source_u, *source_v, *dst_u, *dst_v; 10602befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned int i; 1061dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 10622befccec034c13d34746a9e87149889d59ac767bFei Jiang /* copy Y plane */ 10632befccec034c13d34746a9e87149889d59ac767bFei Jiang source_y = image_data + obj_image->image.offsets[0] + src_y * obj_image->image.pitches[0] + src_x; 10642befccec034c13d34746a9e87149889d59ac767bFei Jiang source_u = image_data + obj_image->image.offsets[1] + src_y * obj_image->image.pitches[1] + src_x; 10652befccec034c13d34746a9e87149889d59ac767bFei Jiang source_v = image_data + obj_image->image.offsets[2] + src_y * obj_image->image.pitches[2] + src_x; 10662befccec034c13d34746a9e87149889d59ac767bFei Jiang 1067dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dst_y = surface_data + dest_y * psb_surface->stride + dest_x; 10682befccec034c13d34746a9e87149889d59ac767bFei Jiang dst_u = surface_data + obj_surface->height * psb_surface->stride 1069dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun + dest_y * (psb_surface->stride / 2) + dest_x; 10702befccec034c13d34746a9e87149889d59ac767bFei Jiang dst_v = surface_data + obj_surface->height * psb_surface->stride 1071dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun + (obj_surface->height / 2) * (psb_surface->stride / 2) 1072dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun + dest_y * (psb_surface->stride / 2) + dest_x; 1073dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1074bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang for (i = 0; i < height; i++) { 1075dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun memcpy(dst_y, source_y, width); 10762befccec034c13d34746a9e87149889d59ac767bFei Jiang source_y += obj_image->image.pitches[0]; 10772befccec034c13d34746a9e87149889d59ac767bFei Jiang dst_y += psb_surface->stride; 10782befccec034c13d34746a9e87149889d59ac767bFei Jiang } 1079dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 10802befccec034c13d34746a9e87149889d59ac767bFei Jiang /* copy UV plane */ 1081dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < obj_image->image.height / 2; i++) { 10822befccec034c13d34746a9e87149889d59ac767bFei Jiang memcpy(dst_u, source_u, width); 10832befccec034c13d34746a9e87149889d59ac767bFei Jiang memcpy(dst_v, source_v, width); 1084dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 10852befccec034c13d34746a9e87149889d59ac767bFei Jiang source_u += obj_image->image.pitches[1]; 10862befccec034c13d34746a9e87149889d59ac767bFei Jiang source_v += obj_image->image.pitches[2]; 1087dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1088dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dst_u += psb_surface->stride / 2; 1089dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dst_v += psb_surface->stride / 2; 10907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 10912befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 10922befccec034c13d34746a9e87149889d59ac767bFei Jiang } 1093dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#endif 10942befccec034c13d34746a9e87149889d59ac767bFei Jiang default: 10952befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 10967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1097dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 10987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_unmap(obj_buffer->psb_buffer); 10997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_unmap(&psb_surface->buf); 1100dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 11017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 11027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 11037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb__VAImageCheckRegion2( 11067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_surface_p surface, 11077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAImage *image, 11087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int *src_x, 11097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int *src_y, 11107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int *src_width, 11117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int *src_height, 11127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int *dest_x, 11137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int *dest_y, 1114e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang int *dest_width, 1115e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang int *dest_height 11167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 11177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 11187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* check for image */ 11197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (*src_x < 0) *src_x = 0; 11207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (*src_x > image->width) *src_x = image->width - 1; 11217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (*src_y < 0) *src_y = 0; 11227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (*src_y > image->height) *src_y = image->height - 1; 1123dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 11247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (((*src_width) + (*src_x)) > image->width) *src_width = image->width - *src_x; 11257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (((*src_height) + (*src_y)) > image->height) *src_height = image->height - *src_x; 11267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* check for surface */ 11287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (*dest_x < 0) *dest_x = 0; 11297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (*dest_x > surface->width) *dest_x = surface->width - 1; 11307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (*dest_y < 0) *dest_y = 0; 11317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (*dest_y > surface->height) *dest_y = surface->height - 1; 11327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1133e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang if (((*dest_width) + (*dest_x)) > (int)surface->width) *dest_width = surface->width - *dest_x; 1134e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang if (((*dest_height) + (*dest_y)) > (int)surface->height) *dest_height = surface->height - *dest_x; 11357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 11367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_PutImage( 11387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VADriverContextP ctx, 11397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VASurfaceID surface, 11407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAImageID image_id, 11417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int src_x, 11427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int src_y, 11437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int src_width, 11447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int src_height, 11457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int dest_x, 11467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int dest_y, 11477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int dest_width, 11487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int dest_height 11497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 11507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 11517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 11527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 11537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret; 115494d9df223ac4c604d6ce73c47c4199623a36766dliubolun CHECK_INVALID_PARAM((src_width == -1) || 115594d9df223ac4c604d6ce73c47c4199623a36766dliubolun (src_height == -1) || 115694d9df223ac4c604d6ce73c47c4199623a36766dliubolun (dest_width == ~0) || 115794d9df223ac4c604d6ce73c47c4199623a36766dliubolun (dest_height == ~0)); 1158dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1159dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((src_width == dest_width) && (src_height == dest_height)) { 11607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Shortcut if scaling is not required */ 11617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return psb_PutImage2(ctx, surface, image_id, src_x, src_y, src_width, src_height, dest_x, dest_y); 11627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 11637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_image_p obj_image = IMAGE(image_id); 11656d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_IMAGE(obj_image); 11667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_image->image.format.fourcc != VA_FOURCC_NV12) { 11687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* only support NV12 getImage/putImage */ 11697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = VA_STATUS_ERROR_OPERATION_FAILED; 11707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 11717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 11727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_surface_p obj_surface = SURFACE(surface); 11746d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_SURFACE(obj_surface); 11757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1176dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__VAImageCheckRegion2(obj_surface, &obj_image->image, 1177dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun &src_x, &src_y, &src_width, &src_height, 1178e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang &dest_x, &dest_y, (int *)&dest_width, (int *)&dest_height); 1179dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 11807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_surface_p psb_surface = obj_surface->psb_surface; 1181e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned char *surface_data; 11827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = psb_buffer_map(&psb_surface->buf, &surface_data); 11837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret) { 11847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_UNKNOWN; 11857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 11867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_buffer_p obj_buffer = BUFFER(obj_image->image.buf); 11886d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_BUFFER(obj_buffer); 11897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1190e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned char *image_data; 11917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = psb_buffer_map(obj_buffer->psb_buffer, &image_data); 11927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret) { 11937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_unmap(&psb_surface->buf); 11947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_UNKNOWN; 11957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 11967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* just a prototype, the algorithm is ugly and not optimized */ 11987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang switch (obj_image->image.format.fourcc) { 1199dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VA_FOURCC_NV12: { 1200dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned char *source_y, *dst_y; 1201dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned short *source_uv, *dst_uv; 1202dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned int i, j; 12032befccec034c13d34746a9e87149889d59ac767bFei Jiang float xratio = (float) src_width / dest_width; 12042befccec034c13d34746a9e87149889d59ac767bFei Jiang float yratio = (float) src_height / dest_height; 1205dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 12062befccec034c13d34746a9e87149889d59ac767bFei Jiang /* dst_y/dst_uv: Y/UV plane of destination */ 1207e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang dst_y = (unsigned char *)(surface_data + dest_y * psb_surface->stride + dest_x); 1208e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang dst_uv = (unsigned short *)(surface_data + psb_surface->stride * obj_surface->height 1209e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang + (dest_y / 2) * psb_surface->stride + dest_x); 1210dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1211bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang for (j = 0; j < dest_height; j++) { 12122befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned char *dst_y_tmp = dst_y; 12132befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned short *dst_uv_tmp = dst_uv; 1214dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1215bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang for (i = 0; i < dest_width; i++) { 12162befccec034c13d34746a9e87149889d59ac767bFei Jiang int x = (int)(i * xratio); 12172befccec034c13d34746a9e87149889d59ac767bFei Jiang int y = (int)(j * yratio); 12182befccec034c13d34746a9e87149889d59ac767bFei Jiang 12192befccec034c13d34746a9e87149889d59ac767bFei Jiang source_y = image_data + obj_image->image.offsets[0] 1220dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun + (src_y + y) * obj_image->image.pitches[0] 1221dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun + (src_x + x); 12222befccec034c13d34746a9e87149889d59ac767bFei Jiang *dst_y_tmp = *source_y; 12232befccec034c13d34746a9e87149889d59ac767bFei Jiang dst_y_tmp++; 1224dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1225bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang if (((i & 1) == 0)) { 12262befccec034c13d34746a9e87149889d59ac767bFei Jiang source_uv = (unsigned short *)(image_data + obj_image->image.offsets[1] 1227dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun + ((src_y + y) / 2) * obj_image->image.pitches[1]) 1228dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun + ((src_x + x) / 2); 12292befccec034c13d34746a9e87149889d59ac767bFei Jiang *dst_uv_tmp = *source_uv; 1230dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dst_uv_tmp++; 12317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 12327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 12332befccec034c13d34746a9e87149889d59ac767bFei Jiang dst_y += psb_surface->stride; 1234dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1235bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang if (j & 1) 1236e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang dst_uv = (unsigned short *)((unsigned char *)dst_uv + psb_surface->stride); 12377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1238dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 12392befccec034c13d34746a9e87149889d59ac767bFei Jiang } 12402befccec034c13d34746a9e87149889d59ac767bFei Jiang default:/* will not reach here */ 12412befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 12427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1243dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 12447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_unmap(obj_buffer->psb_buffer); 12457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_unmap(&psb_surface->buf); 1246dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 12477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 12487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 12497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 12507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 12517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Link supbicture into one surface, when update is zero, not need to 12527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * update the location information 12537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * The image informatio and its BO of subpicture will copied to surface 12547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * so need to update it when a vaSetSubpictureImage is called 12557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 12567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus psb__LinkSubpictIntoSurface( 12577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_driver_data_p driver_data, 12587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_surface_p obj_surface, 12597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_subpic_p obj_subpic, 12607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang short src_x, 12617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang short src_y, 12627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned short src_w, 12637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned short src_h, 12647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang short dest_x, 12657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang short dest_y, 12667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned short dest_w, 12677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned short dest_h, 12687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int update /* update subpicture location */ 12697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 12707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 12717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang PsbVASurfaceRec *surface_subpic; 1272dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun object_image_p obj_image = IMAGE(obj_subpic->image_id); 1273dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == obj_image) { 12747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_INVALID_IMAGE; 12757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 12767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1277dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun VAImage *image = &obj_image->image; 12787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_buffer_p obj_buffer = BUFFER(image->buf); 1279dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == obj_buffer) { 12807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_INVALID_BUFFER; 12817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 12827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 12837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int found = 0; 1284dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 12857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_surface->subpictures != NULL) { 12862befccec034c13d34746a9e87149889d59ac767bFei Jiang surface_subpic = (PsbVASurfaceRec *)obj_surface->subpictures; 12877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang do { 12887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (surface_subpic->subpic_id == obj_subpic->subpic_id) { 12897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang found = 1; 12907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 12917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else 12927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surface_subpic = surface_subpic->next; 12937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } while (surface_subpic); 12947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 12957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 12967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (found == 0) { /* new node */ 12977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_surface->subpic_count >= PSB_SUBPIC_MAX_NUM) { 1298c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "can't support so many sub-pictures for the surface\n"); 12997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_UNKNOWN; 13007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1301dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 13022befccec034c13d34746a9e87149889d59ac767bFei Jiang surface_subpic = (PsbVASurfaceRec *)calloc(1, sizeof(*surface_subpic)); 13037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (NULL == surface_subpic) 13047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_ALLOCATION_FAILED; 13057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1306dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 13077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surface_subpic->subpic_id = obj_subpic->subpic_id; 13087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surface_subpic->fourcc = image->format.fourcc; 13092f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang surface_subpic->size = image->data_size; 13107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surface_subpic->bo = obj_buffer->psb_buffer->drm_buf; 13117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surface_subpic->bufid = wsbmKBufHandle(wsbmKBuf(obj_buffer->psb_buffer->drm_buf)); 13127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surface_subpic->pl_flags = obj_buffer->psb_buffer->pl_flags; 1313dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun surface_subpic->subpic_flags = obj_subpic->flags; 1314dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 13157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surface_subpic->width = image->width; 13167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surface_subpic->height = image->height; 13177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang switch (surface_subpic->fourcc) { 13182befccec034c13d34746a9e87149889d59ac767bFei Jiang case VA_FOURCC_AYUV: 1319dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun surface_subpic->stride = image->pitches[0] / 4; 13202befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 13212befccec034c13d34746a9e87149889d59ac767bFei Jiang case VA_FOURCC_RGBA: 1322dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun surface_subpic->stride = image->pitches[0] / 4; 13232befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 13242befccec034c13d34746a9e87149889d59ac767bFei Jiang case VA_FOURCC_AI44: 13252befccec034c13d34746a9e87149889d59ac767bFei Jiang surface_subpic->stride = image->pitches[0]; 13262befccec034c13d34746a9e87149889d59ac767bFei Jiang /* point to Image palette */ 1327dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun surface_subpic->palette_ptr = (PsbAYUVSample8 *) & obj_image->palette[0]; 13282befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 13297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1330dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 13317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (update) { 13327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surface_subpic->subpic_srcx = src_x; 13337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surface_subpic->subpic_srcy = src_y; 13347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surface_subpic->subpic_dstx = dest_x; 13357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surface_subpic->subpic_dsty = dest_y; 13367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surface_subpic->subpic_srcw = src_w; 13377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surface_subpic->subpic_srch = src_h; 13387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surface_subpic->subpic_dstw = dest_w; 13397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surface_subpic->subpic_dsth = dest_h; 13407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1341dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 13427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (found == 0) { /* new node, link into the list */ 13437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (NULL == obj_surface->subpictures) { 1344e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang obj_surface->subpictures = (void *)surface_subpic; 13457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else { /* insert as the head */ 1346e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang surface_subpic->next = (PsbVASurfacePtr)obj_surface->subpictures; 1347e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang obj_surface->subpictures = (void *)surface_subpic; 13487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 13497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_surface->subpic_count++; 13507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1351dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 13527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 13537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 13547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus psb__LinkSurfaceIntoSubpict( 13577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_subpic_p obj_subpic, 13587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VASurfaceID surface_id 13597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 13607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 13617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang subpic_surface_s *subpic_surface; 13627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int found = 0; 1363dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 13647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_subpic->surfaces != NULL) { 13657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang subpic_surface = (subpic_surface_s *)obj_subpic->surfaces; 13667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang do { 13677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (subpic_surface->surface_id == surface_id) { 13687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang found = 1; 13697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; /* reture directly */ 13707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else 13717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang subpic_surface = subpic_surface->next; 13727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } while (subpic_surface); 13737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 13747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* not found */ 13762befccec034c13d34746a9e87149889d59ac767bFei Jiang subpic_surface = (subpic_surface_s *)calloc(1, sizeof(*subpic_surface)); 13777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (NULL == subpic_surface) 13787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_ALLOCATION_FAILED; 13797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang subpic_surface->surface_id = surface_id; 13817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang subpic_surface->next = NULL; 1382dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 13837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (NULL == obj_subpic->surfaces) { 1384e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang obj_subpic->surfaces = (void *)subpic_surface; 13857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else { /* insert as the head */ 1386e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang subpic_surface->next = (subpic_surface_p)obj_subpic->surfaces; 1387e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang obj_subpic->surfaces = (void *)subpic_surface; 13887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1389dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 13907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 13917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 13927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus psb__DelinkSubpictFromSurface( 13947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_surface_p obj_surface, 13957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VASubpictureID subpic_id 13967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 13977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1398dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun PsbVASurfaceRec *surface_subpic, *pre_surface_subpic = NULL; 13997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int found = 0; 1400dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 14017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_surface->subpictures != NULL) { 1402dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun surface_subpic = (PsbVASurfaceRec *)obj_surface->subpictures; 14037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang do { 14047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (surface_subpic->subpic_id == subpic_id) { 14057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang found = 1; 14067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 14077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else { 14087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pre_surface_subpic = surface_subpic; 14097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surface_subpic = surface_subpic->next; 14107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 14117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } while (surface_subpic); 14127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 14137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (found == 1) { 14157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (pre_surface_subpic == NULL) { /* remove the first node */ 1416e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang obj_surface->subpictures = (void *)surface_subpic->next; 14177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else { 14187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pre_surface_subpic->next = surface_subpic->next; 14197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 14207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang free(surface_subpic); 14217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_surface->subpic_count--; 14227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1423dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 14247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 14257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 14267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus psb__DelinkSurfaceFromSubpict( 14297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_subpic_p obj_subpic, 14307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VASurfaceID surface_id 14317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 14327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1433dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun subpic_surface_s *subpic_surface, *pre_subpic_surface = NULL; 14347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int found = 0; 1435dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 14367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_subpic->surfaces != NULL) { 14377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang subpic_surface = (subpic_surface_s *)obj_subpic->surfaces; 14387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang do { 14397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (subpic_surface->surface_id == surface_id) { 14407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang found = 1; 14417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 14427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else { 14437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pre_subpic_surface = subpic_surface; 14447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang subpic_surface = subpic_surface->next; 14457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 14467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } while (subpic_surface); 14477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 14487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (found == 1) { 14507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (pre_subpic_surface == NULL) { /* remove the first node */ 1451e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang obj_subpic->surfaces = (void *)subpic_surface->next; 14527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else { 14537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pre_subpic_surface->next = subpic_surface->next; 14547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 14557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang free(subpic_surface); 14567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1457dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 14587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 14597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 14607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_QuerySubpictureFormats( 14632befccec034c13d34746a9e87149889d59ac767bFei Jiang VADriverContextP ctx, 14642befccec034c13d34746a9e87149889d59ac767bFei Jiang VAImageFormat *format_list, /* out */ 14652befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned int *flags, /* out */ 14662befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned int *num_formats /* out */ 14677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 14687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 14697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 1470dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 14716d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_INVALID_PARAM(format_list == NULL); 14726d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_INVALID_PARAM(flags == NULL); 14736d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_INVALID_PARAM(num_formats == NULL); 14746d37ae34fcae80f2e898b61e2506ed8e887bd16anguo 1475dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun memcpy(format_list, psb__SubpicFormat, sizeof(psb__SubpicFormat)); 14767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *num_formats = PSB_MAX_SUBPIC_FORMATS; 14777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *flags = PSB_SUPPORTED_SUBPIC_FLAGS; 14787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 14807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 14817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_CreateSubpicture( 14842befccec034c13d34746a9e87149889d59ac767bFei Jiang VADriverContextP ctx, 14852befccec034c13d34746a9e87149889d59ac767bFei Jiang VAImageID image, 14862befccec034c13d34746a9e87149889d59ac767bFei Jiang VASubpictureID *subpicture /* out */ 14877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 14887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 14897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 14907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VASubpictureID subpicID; 14917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_subpic_p obj_subpic; 14927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_image_p obj_image; 14937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 14947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAImageFormat *img_fmt; 14957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image = IMAGE(image); 14976d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_IMAGE(obj_image); 14986d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_SUBPICTURE(subpicture); 14997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang img_fmt = psb__VAImageCheckFourCC(&obj_image->image.format, psb__SubpicFormat, 1501dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun sizeof(psb__SubpicFormat) / sizeof(VAImageFormat)); 15027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (img_fmt == NULL) 15037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_UNKNOWN; 1504dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1505dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun subpicID = object_heap_allocate(&driver_data->subpic_heap); 15067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_subpic = SUBPIC(subpicID); 15076d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_ALLOCATION(obj_subpic); 15086d37ae34fcae80f2e898b61e2506ed8e887bd16anguo 15092befccec034c13d34746a9e87149889d59ac767bFei Jiang MEMSET_OBJECT(obj_subpic, struct object_subpic_s); 15102befccec034c13d34746a9e87149889d59ac767bFei Jiang 15117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_subpic->subpic_id = subpicID; 15127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_subpic->image_id = obj_image->image.image_id; 15137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_subpic->surfaces = NULL; 1514ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan obj_subpic->global_alpha = 255; 15157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image->subpic_ref ++; 1517dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 15187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *subpicture = subpicID; 1519dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 15207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 15217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 15227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb__destroy_subpicture(psb_driver_data_p driver_data, object_subpic_p obj_subpic) 15267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 15277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang subpic_surface_s *subpic_surface = (subpic_surface_s *)obj_subpic->surfaces; 15287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VASubpictureID subpicture = obj_subpic->subpic_id; 15297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (subpic_surface) { 15317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang do { 15327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang subpic_surface_s *tmp = subpic_surface; 15337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_surface_p obj_surface = SURFACE(subpic_surface->surface_id); 1534dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 15357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_surface) { /* remove subpict from surface */ 1536dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__DelinkSubpictFromSurface(obj_surface, subpicture); 15377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 15387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang subpic_surface = subpic_surface->next; 15397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang free(tmp); 15407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } while (subpic_surface); 15417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 15427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1543dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun object_heap_free(&driver_data->subpic_heap, (object_base_p) obj_subpic); 15447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 15457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 15467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_DestroySubpicture( 15492befccec034c13d34746a9e87149889d59ac767bFei Jiang VADriverContextP ctx, 15502befccec034c13d34746a9e87149889d59ac767bFei Jiang VASubpictureID subpicture 15517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 15527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 15537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 15547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_subpic_p obj_subpic; 15557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 1556dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 15577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_subpic = SUBPIC(subpicture); 15586d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_SUBPICTURE(obj_subpic); 1559dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 15607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return psb__destroy_subpicture(driver_data, obj_subpic); 15617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 15627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1563dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunVAStatus psb_SetSubpictureImage( 15642befccec034c13d34746a9e87149889d59ac767bFei Jiang VADriverContextP ctx, 15652befccec034c13d34746a9e87149889d59ac767bFei Jiang VASubpictureID subpicture, 15662befccec034c13d34746a9e87149889d59ac767bFei Jiang VAImageID image 15677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 15687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 15692befccec034c13d34746a9e87149889d59ac767bFei Jiang INIT_DRIVER_DATA; 15707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_subpic_p obj_subpic; 15717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_image_p obj_image; 15727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 15737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang subpic_surface_s *subpic_surface; 15747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAImageFormat *img_fmt; 15757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image = IMAGE(image); 15776d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_IMAGE(obj_image); 15787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang img_fmt = psb__VAImageCheckFourCC(&obj_image->image.format, 15807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__SubpicFormat, 1581dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun sizeof(psb__SubpicFormat) / sizeof(VAImageFormat)); 15826d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_IMAGE(img_fmt); 1583dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 15847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_subpic = SUBPIC(subpicture); 15856d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_SUBPICTURE(obj_subpic); 15867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_image_p old_obj_image = IMAGE(obj_subpic->image_id); 15887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (old_obj_image) { 15897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang old_obj_image->subpic_ref--;/* decrease reference count */ 15907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 15917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* reset the image */ 15937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_subpic->image_id = obj_image->image.image_id; 15947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image->subpic_ref ++; 1595dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 15967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* relink again */ 15977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_subpic->surfaces != NULL) { 15987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* the subpicture already linked into surfaces 15997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * so not check the return value of psb__LinkSubpictIntoSurface 16007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 16017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang subpic_surface = (subpic_surface_s *)obj_subpic->surfaces; 16027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang do { 16037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_surface_p obj_surface = SURFACE(subpic_surface->surface_id); 16046d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_SURFACE(obj_surface); 16057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1606dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__LinkSubpictIntoSurface(driver_data, obj_surface, obj_subpic, 1607dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 0, 0, 0, 0, 0, 0, 0, 0, 16087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 0 /* not update location */ 1609dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ); 16107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang subpic_surface = subpic_surface->next; 16117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } while (subpic_surface); 16127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 16137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1614dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 16157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 16167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 16177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_SetSubpictureChromakey( 16202befccec034c13d34746a9e87149889d59ac767bFei Jiang VADriverContextP ctx, 16212befccec034c13d34746a9e87149889d59ac767bFei Jiang VASubpictureID subpicture, 16222befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned int chromakey_min, 16232befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned int chromakey_max, 16242befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned int chromakey_mask 16257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 16267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 16277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 1628dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (void)driver_data; 16297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* TODO */ 16303f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang if ((chromakey_mask < chromakey_min) || (chromakey_mask > chromakey_max)) { 1631c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "Invalid chromakey value %d, chromakey value should between min and max\n", chromakey_mask); 16323f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang return VA_STATUS_ERROR_INVALID_PARAMETER; 16330da1930627209986e8db220799a690f816494401Austin Yuan } 1634e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang object_subpic_p obj_subpic = SUBPIC(subpicture); 16353f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang if (NULL == obj_subpic) { 1636c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "Invalid subpicture value %d\n", subpicture); 16373f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang return VA_STATUS_ERROR_INVALID_SUBPICTURE; 16380da1930627209986e8db220799a690f816494401Austin Yuan } 16390da1930627209986e8db220799a690f816494401Austin Yuan 16400da1930627209986e8db220799a690f816494401Austin Yuan return VA_STATUS_SUCCESS; 16417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 16427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_SetSubpictureGlobalAlpha( 16442befccec034c13d34746a9e87149889d59ac767bFei Jiang VADriverContextP ctx, 16452befccec034c13d34746a9e87149889d59ac767bFei Jiang VASubpictureID subpicture, 1646dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun float global_alpha 16477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 16487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 16497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 16500da1930627209986e8db220799a690f816494401Austin Yuan 1651bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang if (global_alpha < 0 || global_alpha > 1) { 1652c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "Invalid global alpha value %07f, global alpha value should between 0 and 1\n", global_alpha); 16533f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang return VA_STATUS_ERROR_INVALID_PARAMETER; 16540da1930627209986e8db220799a690f816494401Austin Yuan } 16550da1930627209986e8db220799a690f816494401Austin Yuan 1656e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang object_subpic_p obj_subpic = SUBPIC(subpicture); 16573f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang if (NULL == obj_subpic) { 1658c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "Invalid subpicture value %d\n", subpicture); 16593f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang return VA_STATUS_ERROR_INVALID_SUBPICTURE; 1660bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang } 1661bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang 1662bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang obj_subpic->global_alpha = global_alpha * 255; 1663bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang 1664bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang return VA_STATUS_SUCCESS; 16657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 16667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb__AssociateSubpicture( 16692befccec034c13d34746a9e87149889d59ac767bFei Jiang VADriverContextP ctx, 16702befccec034c13d34746a9e87149889d59ac767bFei Jiang VASubpictureID subpicture, 16712befccec034c13d34746a9e87149889d59ac767bFei Jiang VASurfaceID *target_surfaces, 16722befccec034c13d34746a9e87149889d59ac767bFei Jiang int num_surfaces, 16732befccec034c13d34746a9e87149889d59ac767bFei Jiang short src_x, /* upper left offset in subpicture */ 16742befccec034c13d34746a9e87149889d59ac767bFei Jiang short src_y, 16752befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned short src_w, 16762befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned short src_h, 16772befccec034c13d34746a9e87149889d59ac767bFei Jiang short dest_x, /* upper left offset in surface */ 16782befccec034c13d34746a9e87149889d59ac767bFei Jiang short dest_y, 16792befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned short dest_w, 16802befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned short dest_h, 16812befccec034c13d34746a9e87149889d59ac767bFei Jiang /* 16822befccec034c13d34746a9e87149889d59ac767bFei Jiang * whether to enable chroma-keying or global-alpha 16832befccec034c13d34746a9e87149889d59ac767bFei Jiang * see VA_SUBPICTURE_XXX values 16842befccec034c13d34746a9e87149889d59ac767bFei Jiang */ 16852befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned int flags 16867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 16877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 16887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 16897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_subpic_p obj_subpic; 16917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 16927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int i; 16937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16946d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_INVALID_PARAM(num_surfaces <= 0); 16957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_subpic = SUBPIC(subpicture); 16976d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_SUBPICTURE(obj_subpic); 16986d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_SURFACE(target_surfaces); 1699dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1700dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (flags & ~PSB_SUPPORTED_SUBPIC_FLAGS) { 17017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef VA_STATUS_ERROR_FLAG_NOT_SUPPORTED 17027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = VA_STATUS_ERROR_FLAG_NOT_SUPPORTED; 17037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else 17047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = VA_STATUS_ERROR_UNKNOWN; 1705dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#endif 17067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBUG_FAILURE; 17077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 1708dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 1709dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1710dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* If flags are ok, copy them to the subpicture object */ 1711dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun obj_subpic->flags = flags; 1712dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 17137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 17147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Validate input params */ 1716bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang for (i = 0; i < num_surfaces; i++) { 17177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_surface_p obj_surface = SURFACE(target_surfaces[i]); 17186d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_SURFACE(obj_surface); 17197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 17207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1721dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun VASurfaceID *surfaces = target_surfaces; 1722bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang for (i = 0; i < num_surfaces; i++) { 17237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_surface_p obj_surface = SURFACE(*surfaces); 17247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_surface) { 1725dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun vaStatus = psb__LinkSubpictIntoSurface(driver_data, obj_surface, obj_subpic, 1726dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun src_x, src_y, src_w, src_h, 1727dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dest_x, dest_y, dest_w, dest_h, 1); 1728dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (VA_STATUS_SUCCESS == vaStatus) { 1729dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun vaStatus = psb__LinkSurfaceIntoSubpict(obj_subpic, *surfaces); 17307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 17316d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_VASTATUS();/* failed with malloc */ 17327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else { 17337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Should never get here */ 1734c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "Invalid surfaces,SurfaceID=0x%x\n", *surfaces); 17357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1736dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 17377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surfaces++; 17387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1739dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 17407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 17417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 17427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_AssociateSubpicture( 17452befccec034c13d34746a9e87149889d59ac767bFei Jiang VADriverContextP ctx, 17462befccec034c13d34746a9e87149889d59ac767bFei Jiang VASubpictureID subpicture, 17472befccec034c13d34746a9e87149889d59ac767bFei Jiang VASurfaceID *target_surfaces, 17482befccec034c13d34746a9e87149889d59ac767bFei Jiang int num_surfaces, 17492befccec034c13d34746a9e87149889d59ac767bFei Jiang short src_x, /* upper left offset in subpicture */ 17502befccec034c13d34746a9e87149889d59ac767bFei Jiang short src_y, 17512befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned short src_width, 17522befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned short src_height, 17532befccec034c13d34746a9e87149889d59ac767bFei Jiang short dest_x, /* upper left offset in surface */ 17542befccec034c13d34746a9e87149889d59ac767bFei Jiang short dest_y, 17552befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned short dest_width, 17562befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned short dest_height, 17572befccec034c13d34746a9e87149889d59ac767bFei Jiang /* 17582befccec034c13d34746a9e87149889d59ac767bFei Jiang * whether to enable chroma-keying or global-alpha 17592befccec034c13d34746a9e87149889d59ac767bFei Jiang * see VA_SUBPICTURE_XXX values 17602befccec034c13d34746a9e87149889d59ac767bFei Jiang */ 17612befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned int flags 17627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 17637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1764dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return psb__AssociateSubpicture(ctx, subpicture, target_surfaces, num_surfaces, 1765dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun src_x, src_y, src_width, src_height, 1766dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dest_x, dest_y, dest_width, dest_height, 17677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang flags 1768dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ); 17697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 17707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_DeassociateSubpicture( 17732befccec034c13d34746a9e87149889d59ac767bFei Jiang VADriverContextP ctx, 17742befccec034c13d34746a9e87149889d59ac767bFei Jiang VASubpictureID subpicture, 17752befccec034c13d34746a9e87149889d59ac767bFei Jiang VASurfaceID *target_surfaces, 17762befccec034c13d34746a9e87149889d59ac767bFei Jiang int num_surfaces 17777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 17787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 17797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 17807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_subpic_p obj_subpic; 17827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 17837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_image_p obj_image; 17847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int i; 17857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17866d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_INVALID_PARAM(num_surfaces <= 0); 1787dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 17887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_subpic = SUBPIC(subpicture); 17896d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_SUBPICTURE(obj_subpic); 17906d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_SURFACE(target_surfaces); 17917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1792dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun VASurfaceID *surfaces = target_surfaces; 1793bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang for (i = 0; i < num_surfaces; i++) { 17947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_surface_p obj_surface = SURFACE(*surfaces); 1795dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 17967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_surface) { 1797dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__DelinkSubpictFromSurface(obj_surface, subpicture); 1798dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__DelinkSurfaceFromSubpict(obj_subpic, obj_surface->surface_id); 17997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else { 1800c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "vaDeassociateSubpicture: Invalid surface, VASurfaceID=0x%08x\n", *surfaces); 18017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1802dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 18037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surfaces++; 18047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 18057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image = IMAGE(obj_subpic->image_id); 18077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_image) 18087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image->subpic_ref--;/* decrease reference count */ 1809dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 18107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 18117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 18127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_SurfaceDeassociateSubpict( 18157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_driver_data_p driver_data, 18162befccec034c13d34746a9e87149889d59ac767bFei Jiang object_surface_p obj_surface 18172befccec034c13d34746a9e87149889d59ac767bFei Jiang) 18187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1819dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun PsbVASurfaceRec *surface_subpic = (PsbVASurfaceRec *)obj_surface->subpictures; 18207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (surface_subpic != NULL) { 18227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang do { 18237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang PsbVASurfaceRec *tmp = surface_subpic; 18247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_subpic_p obj_subpic = SUBPIC(surface_subpic->subpic_id); 18257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_subpic) 1826dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__DelinkSurfaceFromSubpict(obj_subpic, obj_surface->surface_id); 18277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surface_subpic = surface_subpic->next; 18287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang free(tmp); 18297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } while (surface_subpic); 18307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 18317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 18327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1833dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 18347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VADisplayAttribute psb__DisplayAttribute[] = { 18357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 18367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VADisplayAttribBrightness, 18377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang BRIGHTNESS_MIN, 18387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang BRIGHTNESS_MAX, 18397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang BRIGHTNESS_DEFAULT_VALUE, 1840dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE 18417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang }, 18427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 18447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VADisplayAttribContrast, 18457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang CONTRAST_MIN, 18467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang CONTRAST_MAX, 18477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang CONTRAST_DEFAULT_VALUE, 1848dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE 18497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang }, 18507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 18527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VADisplayAttribHue, 18537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang HUE_MIN, 18547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang HUE_MAX, 18557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang HUE_DEFAULT_VALUE, 1856dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE 18577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang }, 18587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 18607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VADisplayAttribSaturation, 18617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang SATURATION_MIN, 18627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang SATURATION_MAX, 18637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang SATURATION_DEFAULT_VALUE, 1864dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE 18657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang }, 18667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 18677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VADisplayAttribBackgroundColor, 18687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 0x00000000, 18697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 0xffffffff, 18707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 0x00000000, 1871dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE 18727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang }, 1873242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang { 1874242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang VADisplayAttribRotation, 18753f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang VA_ROTATION_NONE, 18763f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang VA_ROTATION_270, 18773f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang VA_ROTATION_NONE, 18783f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE 18793f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang }, 1880242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang { 1881242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang VADisplayAttribOutofLoopDeblock, 18823f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang VA_OOL_DEBLOCKING_FALSE, 1883242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang VA_OOL_DEBLOCKING_TRUE, 1884242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang VA_OOL_DEBLOCKING_FALSE, 18853f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE 18863f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang }, 18873f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang { 18883f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang VADisplayAttribBlendColor, 18893f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0x00000000, 18903f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0xffffffff, 18913f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0x00000000, 18923f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE 1893242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang }, 1894242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang { 18953f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang VADisplayAttribOverlayColorKey, 18963f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0x00000000, 18973f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0xffffffff, 18983f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0x00000000, 18993f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE 19003f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang }, 1901242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang { 19023f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang VADisplayAttribOverlayAutoPaintColorKey, 19033f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0x00000000, 19043f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0xffffffff, 19053f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0x00000000, 19063f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE 19073f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang }, 1908242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang { 19093f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang VADisplayAttribCSCMatrix, 19103f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0x00000000, 19113f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0xffffffff, 19123f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0x00000000, 19133f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE 19143f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang }, 1915242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang { 19163f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang VADisplayAttribRenderDevice, 19173f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0x00000000, 19183f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0xffffffff, 19193f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0x00000000, 19203f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE 19213f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang }, 19223f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang { 19233f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang VADisplayAttribRenderMode, 19243f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0x00000000, 19253f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0xffffffff, 19263f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0x00000000, 19273f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE 19283f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang }, 19293f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang { 19303f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang VADisplayAttribRenderRect, 19313f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0x00000000, 19323f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0xffffffff, 19333f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0x00000000, 19343f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE 19353f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang } 19367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}; 19377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1938dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun/* 1939dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * Query display attributes 19407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * The caller must provide a "attr_list" array that can hold at 19417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * least vaMaxNumDisplayAttributes() entries. The actual number of attributes 19427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * returned in "attr_list" is returned in "num_attributes". 19437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 1944dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunVAStatus psb_QueryDisplayAttributes( 19452befccec034c13d34746a9e87149889d59ac767bFei Jiang VADriverContextP ctx, 1946bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang VADisplayAttribute *attr_list, /* out */ 1947bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang int *num_attributes /* out */ 19482befccec034c13d34746a9e87149889d59ac767bFei Jiang) 19497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 19507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 19517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 19526d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_INVALID_PARAM(attr_list == NULL); 19536d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_INVALID_PARAM(num_attributes == NULL); 19546d37ae34fcae80f2e898b61e2506ed8e887bd16anguo 1955dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *num_attributes = min(*num_attributes, PSB_MAX_DISPLAY_ATTRIBUTES); 1956242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang memcpy(attr_list, psb__DisplayAttribute, (*num_attributes)*sizeof(VADisplayAttribute)); 19577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 19587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 19597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1960dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun/* 1961dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * Get display attributes 19627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * This function returns the current attribute values in "attr_list". 19637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Only attributes returned with VA_DISPLAY_ATTRIB_GETTABLE set in the "flags" field 1964dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * from vaQueryDisplayAttributes() can have their values retrieved. 19657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 1966dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunVAStatus psb_GetDisplayAttributes( 19672befccec034c13d34746a9e87149889d59ac767bFei Jiang VADriverContextP ctx, 1968bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang VADisplayAttribute *attr_list, /* in/out */ 19692befccec034c13d34746a9e87149889d59ac767bFei Jiang int num_attributes 19707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 19717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 19722befccec034c13d34746a9e87149889d59ac767bFei Jiang INIT_DRIVER_DATA; 1973dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun VADisplayAttribute *p = attr_list; 19747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int i; 19757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 1976dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 19776d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_INVALID_PARAM(attr_list == NULL); 19786d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_INVALID_PARAM(num_attributes <= 0); 19797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1980bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang for (i = 0; i < num_attributes; i++) { 19817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang switch (p->type) { 19822befccec034c13d34746a9e87149889d59ac767bFei Jiang case VADisplayAttribBrightness: 1983dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* -50*(1<<10) ~ 50*(1<<10) ==> 0~100*/ 1984dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->value = (driver_data->brightness.value / (1 << 10)) + 50; 1985dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->min_value = 0; 1986dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->max_value = 100; 19872befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 19882befccec034c13d34746a9e87149889d59ac767bFei Jiang case VADisplayAttribContrast: 1989dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* 0 ~ 2*(1<<25) ==> 0~100 */ 1990dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->value = (driver_data->contrast.value / (1 << 25)) * 50; 1991dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->min_value = 0; 1992dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->max_value = 100; 19932befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 19942befccec034c13d34746a9e87149889d59ac767bFei Jiang case VADisplayAttribHue: 1995dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* -30*(1<<25) ~ 30*(1<<25) ==> 0~100*/ 1996dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->value = ((driver_data->hue.value / (1 << 25)) + 30) * 10 / 6; 1997dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->min_value = 0; 1998dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->max_value = 100; 19992befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 20002befccec034c13d34746a9e87149889d59ac767bFei Jiang case VADisplayAttribSaturation: 2001dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* 0 ~ 2*(1<<25) ==> 0~100 */ 2002dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->value = (driver_data->saturation.value / (1 << 25)) * 50; 2003dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->min_value = 0; 2004dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->max_value = 100; 20052befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 20062befccec034c13d34746a9e87149889d59ac767bFei Jiang case VADisplayAttribBackgroundColor: 20072befccec034c13d34746a9e87149889d59ac767bFei Jiang p->value = driver_data->clear_color; 20082befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 20094b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo case VADisplayAttribBlendColor: 20104b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo p->value = driver_data->blend_color; 20114b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo break; 2012bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang case VADisplayAttribOverlayColorKey: 2013bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang p->value = driver_data->color_key; 2014bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang p->min_value = 0; 2015bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang p->max_value = 0xFFFFFF; 2016bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang break; 2017bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang case VADisplayAttribOverlayAutoPaintColorKey: 2018bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang p->value = driver_data->overlay_auto_paint_color_key; 2019bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang p->min_value = 0; 2020bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang p->max_value = 1; 2021bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang break; 20223f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang case VADisplayAttribRotation: 20233f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang p->value = driver_data->va_rotate = p->value; 20243f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang p->min_value = VA_ROTATION_NONE; 20253f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang p->max_value = VA_ROTATION_270; 20263f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang break; 20273f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang case VADisplayAttribOutofLoopDeblock: 20283f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang p->value = driver_data->is_oold = p->value; 20293f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang p->min_value = VA_OOL_DEBLOCKING_FALSE; 20303f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang p->max_value = VA_OOL_DEBLOCKING_TRUE; 20313f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang break; 2032242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang case VADisplayAttribCSCMatrix: 2033242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang p->value = driver_data->load_csc_matrix = p->value; 2034242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang p->min_value = 0; 2035242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang p->max_value = 255; 2036242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang break; 2037242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang case VADisplayAttribRenderDevice: 2038242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang p->value = driver_data->render_device = p->value; 2039242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang p->min_value = 0; 2040242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang p->max_value = 255; 2041242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang break; 2042242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang case VADisplayAttribRenderMode: 2043242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang p->value = driver_data->render_mode = p->value; 2044242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang p->min_value = 0; 2045242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang p->max_value = 255; 2046242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang break; 2047242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang case VADisplayAttribRenderRect: 2048242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang ((VARectangle *)(p->value))->x = driver_data->render_rect.x = ((VARectangle *)(p->value))->x; 2049242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang ((VARectangle *)(p->value))->y = driver_data->render_rect.y = ((VARectangle *)(p->value))->y; 2050242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang ((VARectangle *)(p->value))->width = driver_data->render_rect.width = ((VARectangle *)(p->value))->width; 2051242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang ((VARectangle *)(p->value))->height = driver_data->render_rect.height = ((VARectangle *)(p->value))->height; 2052242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang p->min_value = 0; 2053242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang p->max_value = 255; 2054242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang break; 2055242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang 20562befccec034c13d34746a9e87149889d59ac767bFei Jiang default: 20572befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 20587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 20597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang p++; 20607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 20617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 20627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 20637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 20647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2065dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun/* 2066dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * Set display attributes 20677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Only attributes returned with VA_DISPLAY_ATTRIB_SETTABLE set in the "flags" field 2068dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * from vaQueryDisplayAttributes() can be set. If the attribute is not settable or 20697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * the value is out of range, the function returns VA_STATUS_ERROR_ATTR_NOT_SUPPORTED 20707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 20717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define CLAMP_ATTR(a,max,min) (a>max?max:(a<min?min:a)) 2072dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunVAStatus psb_SetDisplayAttributes( 20732befccec034c13d34746a9e87149889d59ac767bFei Jiang VADriverContextP ctx, 20742befccec034c13d34746a9e87149889d59ac767bFei Jiang VADisplayAttribute *attr_list, 20752befccec034c13d34746a9e87149889d59ac767bFei Jiang int num_attributes 20762befccec034c13d34746a9e87149889d59ac767bFei Jiang) 20777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 20782befccec034c13d34746a9e87149889d59ac767bFei Jiang INIT_DRIVER_DATA; 20797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 2080dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun struct psb_texture_s *texture_priv = &driver_data->ctexture_priv; 2081dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun PsbPortPrivPtr overlay_priv = (PsbPortPrivPtr)(&driver_data->coverlay_priv); 208267612a448651896b2557796ff98d46c5e0dbbdc6hding int j, k; 20832befccec034c13d34746a9e87149889d59ac767bFei Jiang 20846d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_INVALID_PARAM(attr_list == NULL); 20857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2086dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun VADisplayAttribute *p = attr_list; 2087dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int i, update_coeffs = 0; 208867612a448651896b2557796ff98d46c5e0dbbdc6hding unsigned int *p_tmp; 2089dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2090dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (num_attributes <= 0) { 20917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_INVALID_PARAMETER; 20927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 20937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2094bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang for (i = 0; i < num_attributes; i++) { 20957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang switch (p->type) { 20962befccec034c13d34746a9e87149889d59ac767bFei Jiang case VADisplayAttribBrightness: 2097dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* 0~100 ==> -50*(1<<10) ~ 50*(1<<10)*/ 2098dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun driver_data->brightness.value = (p->value - 50) * (1 << 10); 2099dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* 0~100 ==> -50~50 */ 2100dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay_priv->brightness.Value = texture_priv->brightness.Value = p->value - 50; 21012befccec034c13d34746a9e87149889d59ac767bFei Jiang update_coeffs = 1; 21022befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 21032befccec034c13d34746a9e87149889d59ac767bFei Jiang case VADisplayAttribContrast: 2104dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* 0~100 ==> 0 ~ 2*(1<<25) */ 2105dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun driver_data->contrast.value = (p->value / 50) * (1 << 25); 2106dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* 0~100 ==> -100~100 */ 2107dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay_priv->contrast.Value = texture_priv->contrast.Value = p->value * 2 - 100; 21082befccec034c13d34746a9e87149889d59ac767bFei Jiang update_coeffs = 1; 21092befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 21102befccec034c13d34746a9e87149889d59ac767bFei Jiang case VADisplayAttribHue: 2111dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* 0~100 ==> -30*(1<<25) ~ 30*(1<<25) */ 2112dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun driver_data->hue.value = ((p->value * 2 - 100) * 3 / 10) * (1 << 25); 2113dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* 0~100 ==> -30~30 */ 2114dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay_priv->hue.Value = texture_priv->hue.Value = (p->value * 2 - 100) * 3 / 10; 21152befccec034c13d34746a9e87149889d59ac767bFei Jiang update_coeffs = 1; 21162befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 21172befccec034c13d34746a9e87149889d59ac767bFei Jiang case VADisplayAttribSaturation: 2118dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* 0~100 ==> 0 ~ 2*(1<<25) */ 2119dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun driver_data->contrast.value = (p->value / 50) * (1 << 25); 2120dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* 0~100 ==> 100~200 */ 2121dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay_priv->saturation.Value = texture_priv->saturation.Value = p->value + 100; 21222befccec034c13d34746a9e87149889d59ac767bFei Jiang update_coeffs = 1; 21232befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 21242befccec034c13d34746a9e87149889d59ac767bFei Jiang case VADisplayAttribBackgroundColor: 21252befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->clear_color = p->value; 21262befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 21272befccec034c13d34746a9e87149889d59ac767bFei Jiang case VADisplayAttribOutofLoopDeblock: 21282befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->is_oold = p->value; 21292befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 21302befccec034c13d34746a9e87149889d59ac767bFei Jiang case VADisplayAttribRotation: 2131ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan driver_data->va_rotate = p->value; 213235405e1aaaefd5bb307ba7f7161e138a86880020Kun Wang driver_data->rotation_dirty |= PSB_NEW_VA_ROTATION; 21334b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo break; 2134242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang 2135dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VADisplayAttribCSCMatrix: 2136dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun driver_data->load_csc_matrix = 1; 213767612a448651896b2557796ff98d46c5e0dbbdc6hding p_tmp = (unsigned int *)p->value; 213867612a448651896b2557796ff98d46c5e0dbbdc6hding for (j = 0; j < CSC_MATRIX_Y; j++) 213967612a448651896b2557796ff98d46c5e0dbbdc6hding for (k = 0; k < CSC_MATRIX_X; k++) { 214067612a448651896b2557796ff98d46c5e0dbbdc6hding if (p_tmp) 214167612a448651896b2557796ff98d46c5e0dbbdc6hding driver_data->csc_matrix[j][k] = *p_tmp; 214267612a448651896b2557796ff98d46c5e0dbbdc6hding p_tmp++; 214367612a448651896b2557796ff98d46c5e0dbbdc6hding } 2144dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 2145242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang 21464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo case VADisplayAttribBlendColor: 21474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo driver_data->blend_color = p->value; 21484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo break; 2149bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang case VADisplayAttribOverlayColorKey: 2150bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang overlay_priv->colorKey = driver_data->color_key = p->value; 2151bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang break; 2152bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang case VADisplayAttribOverlayAutoPaintColorKey: 2153bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang driver_data->overlay_auto_paint_color_key = p->value; 2154bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang break; 2155242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang 2156bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang case VADisplayAttribRenderDevice: 2157bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang driver_data->render_device = p->value & VA_RENDER_DEVICE_MASK; 2158bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang case VADisplayAttribRenderMode: 21590f58bd9727497db363668fb74af8b09a404283b0Fei Jiang#ifndef ANDROID 2160bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang if (p->value & VA_RENDER_MODE_EXTERNAL_GPU) { 2161c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "%s:Invalid parameter.VARenderModeExternalGPU is not supported.\n", __FUNCTION__); 2162bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang return VA_STATUS_ERROR_INVALID_PARAMETER; 2163bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang } 2164bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang if (((p->value & VA_RENDER_MODE_LOCAL_OVERLAY) && (p->value & VA_RENDER_MODE_LOCAL_GPU)) || 21653f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang ((p->value & VA_RENDER_MODE_EXTERNAL_OVERLAY) && (p->value & VA_RENDER_MODE_EXTERNAL_GPU))) { 2166c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "%s:Invalid parameter. Conflict setting for VADisplayAttribRenderMode.\n", __FUNCTION__); 2167bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang return VA_STATUS_ERROR_INVALID_PARAMETER; 2168bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang } 21690f58bd9727497db363668fb74af8b09a404283b0Fei Jiang#endif 2170bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang driver_data->render_mode = p->value & VA_RENDER_MODE_MASK; 2171bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang break; 2172bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang case VADisplayAttribRenderRect: 2173bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang driver_data->render_rect.x = ((VARectangle *)(p->value))->x; 2174bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang driver_data->render_rect.y = ((VARectangle *)(p->value))->y; 2175bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang driver_data->render_rect.width = ((VARectangle *)(p->value))->width; 2176bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang driver_data->render_rect.height = ((VARectangle *)(p->value))->height; 2177bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang break; 2178242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang 21792befccec034c13d34746a9e87149889d59ac767bFei Jiang default: 21802befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 21817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 21827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang p++; 21837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 21847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 21857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (update_coeffs) { 21867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* TODO */ 2187dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#ifndef ANDROID 2188dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun texture_priv->update_coeffs = 1; 2189dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#endif 21907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 21917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 21927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 21937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 21942befccec034c13d34746a9e87149889d59ac767bFei Jiang 2195