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> 5494ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding#include <math.h> 552befccec034c13d34746a9e87149889d59ac767bFei Jiang 56bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#define INIT_DRIVER_DATA psb_driver_data_p driver_data = (psb_driver_data_p) ctx->pDriverData; 577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 58bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#define SURFACE(id) ((object_surface_p) object_heap_lookup( &driver_data->surface_heap, id )) 597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define BUFFER(id) ((object_buffer_p) object_heap_lookup( &driver_data->buffer_heap, id )) 607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define IMAGE(id) ((object_image_p) object_heap_lookup( &driver_data->image_heap, id )) 617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define SUBPIC(id) ((object_subpic_p) object_heap_lookup( &driver_data->subpic_heap, id )) 627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define CONTEXT(id) ((object_context_p) object_heap_lookup( &driver_data->context_heap, id )) 637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 642befccec034c13d34746a9e87149889d59ac767bFei Jiang 652befccec034c13d34746a9e87149889d59ac767bFei Jiang/* surfaces link list associated with a subpicture */ 662befccec034c13d34746a9e87149889d59ac767bFei Jiangtypedef struct _subpic_surface { 672befccec034c13d34746a9e87149889d59ac767bFei Jiang VASurfaceID surface_id; 682befccec034c13d34746a9e87149889d59ac767bFei Jiang struct _subpic_surface *next; 692befccec034c13d34746a9e87149889d59ac767bFei Jiang} subpic_surface_s, *subpic_surface_p; 702befccec034c13d34746a9e87149889d59ac767bFei Jiang 712befccec034c13d34746a9e87149889d59ac767bFei Jiang 727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAImageFormat psb__SubpicFormat[] = { 737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__ImageRGBA, 74bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang //psb__ImageAYUV, 75bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang //psb__ImageAI44 767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}; 777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAImageFormat psb__CreateImageFormat[] = { 797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__ImageNV12, 807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__ImageRGBA, 81bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang //psb__ImageAYUV, 82bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang //psb__ImageAI44, 83f31d5416a60f83e184b0906a7ec77ba021840531hding psb__ImageYV16, 84f31d5416a60f83e184b0906a7ec77ba021840531hding psb__ImageYV32 857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}; 86437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 87e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wangunsigned char *psb_x11_output_init(VADriverContextP ctx); 882befccec034c13d34746a9e87149889d59ac767bFei JiangVAStatus psb_x11_output_deinit(VADriverContextP ctx); 89e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wangunsigned char *psb_android_output_init(VADriverContextP ctx); 902befccec034c13d34746a9e87149889d59ac767bFei JiangVAStatus psb_android_output_deinit(VADriverContextP ctx); 912befccec034c13d34746a9e87149889d59ac767bFei Jiang 922befccec034c13d34746a9e87149889d59ac767bFei Jiangint psb_coverlay_init(VADriverContextP ctx); 932befccec034c13d34746a9e87149889d59ac767bFei Jiangint psb_coverlay_deinit(VADriverContextP ctx); 942befccec034c13d34746a9e87149889d59ac767bFei Jiang 952befccec034c13d34746a9e87149889d59ac767bFei JiangVAStatus psb_initOutput(VADriverContextP ctx) 967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 98e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned char *ws_priv = NULL; 99ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan char env_value[1024]; 100dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1012befccec034c13d34746a9e87149889d59ac767bFei Jiang pthread_mutex_init(&driver_data->output_mutex, NULL); 1027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1030da1930627209986e8db220799a690f816494401Austin Yuan if (psb_parse_config("PSB_VIDEO_PUTSURFACE_DUMMY", &env_value[0]) == 0) { 104c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "vaPutSurface: dummy mode, return directly\n"); 1052befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->dummy_putsurface = 0; 106dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 1087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1100da1930627209986e8db220799a690f816494401Austin Yuan if (psb_parse_config("PSB_VIDEO_FPS", &env_value[0]) == 0) { 1110da1930627209986e8db220799a690f816494401Austin Yuan driver_data->fixed_fps = atoi(env_value); 112c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Throttling at FPS=%d\n", driver_data->fixed_fps); 113437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } else 1142befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->fixed_fps = 0; 115437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 116ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan driver_data->outputmethod_checkinterval = 1; 117ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan if (psb_parse_config("PSB_VIDEO_INTERVAL", &env_value[0]) == 0) { 118ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan driver_data->outputmethod_checkinterval = atoi(env_value); 119c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Check output method at %d frames interval\n", 120ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan driver_data->outputmethod_checkinterval); 121ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan } 122ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan 1232befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->cur_displaying_surface = VA_INVALID_SURFACE; 1242befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->last_displaying_surface = VA_INVALID_SURFACE; 125dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1264d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng psb_InitOutLoop(ctx); 1273f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 1282befccec034c13d34746a9e87149889d59ac767bFei Jiang#ifdef ANDROID 1292befccec034c13d34746a9e87149889d59ac767bFei Jiang ws_priv = psb_android_output_init(ctx); 1303f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan driver_data->is_android = 1; 131437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#else 1322befccec034c13d34746a9e87149889d59ac767bFei Jiang ws_priv = psb_x11_output_init(ctx); 1333f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan driver_data->is_android = 0; 134437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#endif 1352befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->ws_priv = ws_priv; 136437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 138275f077b4bd66802efdbd5bc666b6938751fa03dLin Xie#if 0 1392befccec034c13d34746a9e87149889d59ac767bFei Jiang //use client textureblit 1408803df709aec9d485d757c681791d708f9a88fe6Austin Yuan if (driver_data->ctexture == 1) { 1418803df709aec9d485d757c681791d708f9a88fe6Austin Yuan int ret = psb_ctexture_init(ctx); 1428803df709aec9d485d757c681791d708f9a88fe6Austin Yuan if (ret != 0) 1438803df709aec9d485d757c681791d708f9a88fe6Austin Yuan driver_data->ctexture = 0; 1448803df709aec9d485d757c681791d708f9a88fe6Austin Yuan } 145275f077b4bd66802efdbd5bc666b6938751fa03dLin Xie#endif 146437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1472befccec034c13d34746a9e87149889d59ac767bFei Jiang /* 1482befccec034c13d34746a9e87149889d59ac767bFei Jiang //use texture streaming 1492befccec034c13d34746a9e87149889d59ac767bFei Jiang if (driver_data->ctexstreaming == 1) 1502befccec034c13d34746a9e87149889d59ac767bFei Jiang psb_ctexstreaing_init(ctx); 1512befccec034c13d34746a9e87149889d59ac767bFei Jiang */ 1523f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 1537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 1547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_deinitOutput( 1577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VADriverContextP ctx 1582befccec034c13d34746a9e87149889d59ac767bFei Jiang) 1597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 1614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 162275f077b4bd66802efdbd5bc666b6938751fa03dLin Xie#if 0 1632f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang //use client textureblit 164bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang if (driver_data->ctexture == 1) 165dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_ctexture_deinit(ctx); 166275f077b4bd66802efdbd5bc666b6938751fa03dLin Xie#endif 167dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1686e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang if (driver_data->coverlay_init) { 169bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang psb_coverlay_deinit(ctx); 1706e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang driver_data->coverlay_init = 0; 1716e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang } 1723f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 173bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#ifndef ANDROID 1742befccec034c13d34746a9e87149889d59ac767bFei Jiang psb_x11_output_deinit(ctx); 175dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#else 176dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_android_output_deinit(ctx); 1777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 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( 251cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan VADriverContextP __maybe_unused 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) { 4809f7aeab1f05d50f140ad3f32d9c7caafa6b873fdRen Zhaohan if (getenv("PSB_VIDEO_IGNORE_TILED_FORMAT")) { 4819f7aeab1f05d50f140ad3f32d9c7caafa6b873fdRen Zhaohan drv_debug_msg(VIDEO_DEBUG_GENERAL, "Ignore tiled memory format" \ 4829f7aeab1f05d50f140ad3f32d9c7caafa6b873fdRen Zhaohan "of rec-frames\n"); 4839f7aeab1f05d50f140ad3f32d9c7caafa6b873fdRen Zhaohan } else { 4849f7aeab1f05d50f140ad3f32d9c7caafa6b873fdRen Zhaohan drv_debug_msg(VIDEO_DEBUG_ERROR, "Can't derive reference surface" \ 4859f7aeab1f05d50f140ad3f32d9c7caafa6b873fdRen Zhaohan "which is tiled format\n"); 4869f7aeab1f05d50f140ad3f32d9c7caafa6b873fdRen Zhaohan return VA_STATUS_ERROR_OPERATION_FAILED; 4879f7aeab1f05d50f140ad3f32d9c7caafa6b873fdRen Zhaohan } 4887fe83028016237543fd7ffb31036023398dd62b6pingshix } 4897fe83028016237543fd7ffb31036023398dd62b6pingshix 490c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang if (IS_MFLD(driver_data) && (psb_CheckIEDStatus(ctx) == 1)) { 491c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang vaStatus = VA_STATUS_ERROR_INVALID_SURFACE; 492c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang return vaStatus; 493c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang } 494c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang 4957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fourcc = obj_surface->psb_surface->extra_info[4]; 496bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang for (i = 0; i < PSB_MAX_IMAGE_FORMATS; i++) { 4977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (psb__CreateImageFormat[i].fourcc == fourcc) { 4987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fourcc_index = i; 4997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 5007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 502dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (i == PSB_MAX_IMAGE_FORMATS) { 503c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "Can't support the Fourcc\n"); 5047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = VA_STATUS_ERROR_OPERATION_FAILED; 5057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 5067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* create the image */ 509dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun imageID = object_heap_allocate(&driver_data->image_heap); 5107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image = IMAGE(imageID); 5116d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_ALLOCATION(obj_image); 5127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5132befccec034c13d34746a9e87149889d59ac767bFei Jiang MEMSET_OBJECT(obj_image, struct object_image_s); 5142befccec034c13d34746a9e87149889d59ac767bFei Jiang 5157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* create a buffer to represent surface buffer */ 516dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun bufferID = object_heap_allocate(&driver_data->buffer_heap); 5177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_buffer = BUFFER(bufferID); 5187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (NULL == obj_buffer) { 519dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun object_heap_free(&driver_data->image_heap, (object_base_p) obj_image); 5207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 5217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBUG_FAILURE; 5227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 5237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5242befccec034c13d34746a9e87149889d59ac767bFei Jiang MEMSET_OBJECT(obj_buffer, struct object_buffer_s); 5252befccec034c13d34746a9e87149889d59ac767bFei Jiang 5267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_buffer->type = VAImageBufferType; 5277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_buffer->buffer_data = NULL; 5287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_buffer->psb_buffer = &obj_surface->psb_surface->buf; 5297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_buffer->size = obj_surface->psb_surface->size; 5307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_buffer->max_num_elements = 0; 5317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_buffer->alloc_size = obj_buffer->size; 5327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* fill obj_image data structure */ 5347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image->image.image_id = imageID; 5357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image->image.format = psb__CreateImageFormat[fourcc_index]; 5367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image->subpic_ref = 0; 5377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image->image.buf = bufferID; 5397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image->image.width = obj_surface->width; 5407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image->image.height = obj_surface->height; 5417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image->image.data_size = obj_surface->psb_surface->size; 5427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang srf_buf_ofs = obj_surface->psb_surface->buf.buffer_ofs; 544dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang switch (fourcc) { 546dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VA_FOURCC_NV12: { 5472befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.num_planes = 2; 5482befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.pitches[0] = obj_surface->psb_surface->stride; 5492befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.pitches[1] = obj_surface->psb_surface->stride; 550dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5512befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.offsets[0] = srf_buf_ofs; 5522befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.offsets[1] = srf_buf_ofs + obj_surface->height * obj_surface->psb_surface->stride; 5532befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.num_palette_entries = 0; 5542befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.entry_bytes = 0; 5552befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.component_order[0] = 'Y'; 5562befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.component_order[1] = 'U';/* fixed me: packed UV packed here! */ 5572befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.component_order[2] = 'V'; 5582befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.component_order[3] = '\0'; 5592befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 5602befccec034c13d34746a9e87149889d59ac767bFei Jiang } 561dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VA_FOURCC_YV16: { 562dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun obj_image->image.num_planes = 3; 5632f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang obj_image->image.pitches[0] = obj_surface->psb_surface->stride; 5642f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang obj_image->image.pitches[1] = obj_surface->psb_surface->stride / 2; 5652f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang obj_image->image.pitches[2] = obj_surface->psb_surface->stride / 2; 566dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5672f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang obj_image->image.offsets[0] = srf_buf_ofs; 5682f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang obj_image->image.offsets[1] = srf_buf_ofs + obj_surface->height * obj_surface->psb_surface->stride; 5692f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang obj_image->image.offsets[2] = srf_buf_ofs + obj_surface->height * obj_surface->psb_surface->stride * 3 / 2; 5702f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang obj_image->image.num_palette_entries = 0; 5712f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang obj_image->image.entry_bytes = 0; 5722f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang obj_image->image.component_order[0] = 'Y'; 5732f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang obj_image->image.component_order[1] = 'V';/* fixed me: packed UV packed here! */ 5742f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang obj_image->image.component_order[2] = 'U'; 5752f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang obj_image->image.component_order[3] = '\0'; 5762f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang break; 5772f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang } 578d4a5d239a42bebe6ce4394d690b4402135610db2Nana GUo case VA_FOURCC_YV32: { 579d4a5d239a42bebe6ce4394d690b4402135610db2Nana GUo obj_image->image.num_planes = 3; 580d4a5d239a42bebe6ce4394d690b4402135610db2Nana GUo obj_image->image.pitches[0] = obj_surface->psb_surface->stride; 581d4a5d239a42bebe6ce4394d690b4402135610db2Nana GUo obj_image->image.pitches[1] = obj_surface->psb_surface->stride; 582d4a5d239a42bebe6ce4394d690b4402135610db2Nana GUo obj_image->image.pitches[2] = obj_surface->psb_surface->stride; 583d4a5d239a42bebe6ce4394d690b4402135610db2Nana GUo 584d4a5d239a42bebe6ce4394d690b4402135610db2Nana GUo obj_image->image.offsets[0] = srf_buf_ofs; 585d4a5d239a42bebe6ce4394d690b4402135610db2Nana GUo obj_image->image.offsets[1] = srf_buf_ofs + obj_surface->height * obj_surface->psb_surface->stride; 586d4a5d239a42bebe6ce4394d690b4402135610db2Nana GUo obj_image->image.offsets[2] = srf_buf_ofs + obj_surface->height * obj_surface->psb_surface->stride * 2; 587d4a5d239a42bebe6ce4394d690b4402135610db2Nana GUo obj_image->image.num_palette_entries = 0; 588d4a5d239a42bebe6ce4394d690b4402135610db2Nana GUo obj_image->image.entry_bytes = 0; 589d4a5d239a42bebe6ce4394d690b4402135610db2Nana GUo obj_image->image.component_order[0] = 'Y'; 590d4a5d239a42bebe6ce4394d690b4402135610db2Nana GUo obj_image->image.component_order[1] = 'U';/* fixed me: packed UV packed here! */ 591d4a5d239a42bebe6ce4394d690b4402135610db2Nana GUo obj_image->image.component_order[2] = 'V'; 592d4a5d239a42bebe6ce4394d690b4402135610db2Nana GUo obj_image->image.component_order[3] = '\0'; 593d4a5d239a42bebe6ce4394d690b4402135610db2Nana GUo break; 594d4a5d239a42bebe6ce4394d690b4402135610db2Nana GUo } 5952befccec034c13d34746a9e87149889d59ac767bFei Jiang default: 5962befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 5977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 598dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image->derived_surface = surface; /* this image is derived from a surface */ 6007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_surface->derived_imgcnt++; 601dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 6027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang memcpy(image, &obj_image->image, sizeof(VAImage)); 603dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 6047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 6057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 6067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb__destroy_image(psb_driver_data_p driver_data, object_image_p obj_image) 6087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 6097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 610dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 6117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_image->subpic_ref > 0) { 6127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = VA_STATUS_ERROR_OPERATION_FAILED; 6137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 6147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_surface_p obj_surface = SURFACE(obj_image->derived_surface); 617dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 6187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_surface == NULL) { /* destroy the buffer */ 6197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_buffer_p obj_buffer = BUFFER(obj_image->image.buf); 6206d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_BUFFER(obj_buffer); 6217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__suspend_buffer(driver_data, obj_buffer); 6227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else { 6237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_buffer_p obj_buffer = BUFFER(obj_image->image.buf); 624dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun object_heap_free(&driver_data->buffer_heap, &obj_buffer->base); 6257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_surface->derived_imgcnt--; 6267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 627dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun object_heap_free(&driver_data->image_heap, (object_base_p) obj_image); 6287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 6307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 6317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_DestroyImage( 6332befccec034c13d34746a9e87149889d59ac767bFei Jiang VADriverContextP ctx, 6342befccec034c13d34746a9e87149889d59ac767bFei Jiang VAImageID image 6357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 6367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 6377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA 638dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun VAStatus vaStatus = VA_STATUS_SUCCESS; 6397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_image_p obj_image; 640dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 6417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image = IMAGE(image); 6426d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_IMAGE(obj_image); 6437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return psb__destroy_image(driver_data, obj_image); 6447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 6457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 646dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunVAStatus psb_SetImagePalette( 6472befccec034c13d34746a9e87149889d59ac767bFei Jiang VADriverContextP ctx, 6482befccec034c13d34746a9e87149889d59ac767bFei Jiang VAImageID image, 649dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* 6502befccec034c13d34746a9e87149889d59ac767bFei Jiang * pointer to an array holding the palette data. The size of the array is 651dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * num_palette_entries * entry_bytes in size. The order of the components 6522befccec034c13d34746a9e87149889d59ac767bFei Jiang * in the palette is described by the component_order in VAImage struct 6532befccec034c13d34746a9e87149889d59ac767bFei Jiang */ 654dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned char *palette 6557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 6567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 6577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 6587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 659dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 6607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_image_p obj_image = IMAGE(image); 6616d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_IMAGE(obj_image); 6627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_image->image.format.fourcc != VA_FOURCC_AI44) { 6647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* only support AI44 palette */ 6657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = VA_STATUS_ERROR_OPERATION_FAILED; 6667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 6677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 669dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (obj_image->image.num_palette_entries > 16) { 670c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "image.num_palette_entries(%d) is too big\n", obj_image->image.num_palette_entries); 671dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun memcpy(obj_image->palette, palette, 16); 672dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else 673437b3eda28a4bf098efa80598cab67f190275266Fei Jiang memcpy(obj_image->palette, palette, obj_image->image.num_palette_entries * sizeof(unsigned int)); 674437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 6757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 6767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 6777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 678dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunstatic VAStatus lnc_unpack_topaz_rec(int src_width, int src_height, 679dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned char *p_srcY, unsigned char *p_srcUV, 680dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned char *p_dstY, unsigned char *p_dstU, unsigned char *p_dstV, 681dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int dstY_stride, int dstU_stride, int dstV_stride, 6822befccec034c13d34746a9e87149889d59ac767bFei Jiang int surface_height) 6837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 684dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned char *tmp_dstY = NULL; 685dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned char *tmp_dstUV = NULL; 6867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 687dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int n, i, index; 6887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 689c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Unpack reconstructed frame to image\n"); 690dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 6917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* do this one column at a time. */ 692dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun tmp_dstY = (unsigned char *)calloc(1, 16 * src_height); 693dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (tmp_dstY == NULL) 6947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_ALLOCATION_FAILED; 695dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 696dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun tmp_dstUV = (unsigned char*)calloc(1, 16 * src_height / 2); 6977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (tmp_dstUV == NULL) { 6987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang free(tmp_dstY); 6997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_ALLOCATION_FAILED; 7007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 701dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 7027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Copy Y data */ 703bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang for (n = 0; n < src_width / 16; n++) { 704bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang memcpy((void*)tmp_dstY, p_srcY, 16 * src_height); 705dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_srcY += (16 * surface_height); 706bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang for (i = 0; i < src_height; i++) { 707bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang memcpy(p_dstY + dstY_stride * i + n * 16, tmp_dstY + 16 * i, 16); 7087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Copy U/V data */ 712bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang for (n = 0; n < src_width / 16; n++) { 713bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang memcpy((void*)tmp_dstUV, p_srcUV, 16 * src_height / 2); 714dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_srcUV += (16 * surface_height / 2); 715bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang for (i = 0; i < src_height / 2; i++) { 716bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang for (index = 0; index < 8; index++) { 717dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_dstU[i*dstU_stride + n*8 + index] = tmp_dstUV[index*2 + i*16]; 718dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p_dstV[i*dstV_stride + n*8 + index] = tmp_dstUV[index*2 + i*16+1]; 7197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (tmp_dstY) 7237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang free(tmp_dstY); 7247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (tmp_dstUV) 7257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang free(tmp_dstUV); 7267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 7287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 7297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7307fe83028016237543fd7ffb31036023398dd62b6pingshix/* 7317fe83028016237543fd7ffb31036023398dd62b6pingshix* Convert the memroy format from tiled to linear 7327fe83028016237543fd7ffb31036023398dd62b6pingshix*/ 733115592518cc10686777609f874b567201a108d06zhangzhastatic VAStatus tng_unpack_vsp_rec( 734115592518cc10686777609f874b567201a108d06zhangzha int src_width, int src_height, 735115592518cc10686777609f874b567201a108d06zhangzha unsigned char *p_srcY, unsigned char *p_srcUV, 736115592518cc10686777609f874b567201a108d06zhangzha unsigned char *p_dstY, unsigned char *p_dstU, 737cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan int dstY_stride, int dstU_stride, int __maybe_unused dstV_stride, 738cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan int __maybe_unused surface_height) 739115592518cc10686777609f874b567201a108d06zhangzha{ 740115592518cc10686777609f874b567201a108d06zhangzha unsigned char *tmp_dstY = p_dstY; 741115592518cc10686777609f874b567201a108d06zhangzha unsigned char *tmp_dstU = p_dstU; 742115592518cc10686777609f874b567201a108d06zhangzha 743115592518cc10686777609f874b567201a108d06zhangzha int n, t,x,y; 744115592518cc10686777609f874b567201a108d06zhangzha 745115592518cc10686777609f874b567201a108d06zhangzha //" Y_address(x,y) = Y_base + (((H +64+63)/64) * (x/64) + (y/64))*4096 + (y%64)*64 + (x%64) 746115592518cc10686777609f874b567201a108d06zhangzha //" U_address(x,y) = UV_base + ((((H+1)/2+32+63)/64) * (x/32) + (y/64))*4096 + (y%64)*64 + (x%32)*2 747115592518cc10686777609f874b567201a108d06zhangzha //" V_address(x,y) = UV_base + ((((H+1)/2+32+63)/64) * (x/32) + (y/64))*4096 + (y%64)*64 + (x%32)*2 + 1 748115592518cc10686777609f874b567201a108d06zhangzha 749115592518cc10686777609f874b567201a108d06zhangzha /* Copy Y data */ 7501e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo for (y = 32; y < src_height + 32; y++) { 7511e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo for (x= 32;x < src_width + 32; x++) { 7521e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo * tmp_dstY++ = *(p_srcY + (((src_height+64+63)/64) * (x/64) + (y/64))*4096 + (y%64)*64 + (x%64)); 753115592518cc10686777609f874b567201a108d06zhangzha } 754115592518cc10686777609f874b567201a108d06zhangzha tmp_dstY += dstY_stride - src_width; 755115592518cc10686777609f874b567201a108d06zhangzha } 756115592518cc10686777609f874b567201a108d06zhangzha 757115592518cc10686777609f874b567201a108d06zhangzha /* Copy UV data */ 7581e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo for (y = 16; y < 16 + ((src_height+1)>>1) ; y++) { 7591e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo for (x= 16;x < 16 + ( (src_width+1)>>1); x++) { 7601e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo * tmp_dstU++ = * (p_srcUV + ((((src_height+1)/2+32+63)/64) * (x/32) + (y/64))*4096 + (y%64)*64 + (x%32)*2); 7611e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo * tmp_dstU++ = * (p_srcUV + ((((src_height+1)/2+32+63)/64) * (x/32) + (y/64))*4096 + (y%64)*64 + (x%32)*2 +1); 762115592518cc10686777609f874b567201a108d06zhangzha } 763115592518cc10686777609f874b567201a108d06zhangzha tmp_dstU += dstU_stride - ((src_width)); 764115592518cc10686777609f874b567201a108d06zhangzha } 765115592518cc10686777609f874b567201a108d06zhangzha 766115592518cc10686777609f874b567201a108d06zhangzha return VA_STATUS_SUCCESS; 767115592518cc10686777609f874b567201a108d06zhangzha} 768115592518cc10686777609f874b567201a108d06zhangzha/* 769115592518cc10686777609f874b567201a108d06zhangzha* Convert the memroy format from tiled to linear 770115592518cc10686777609f874b567201a108d06zhangzha*/ 7717fe83028016237543fd7ffb31036023398dd62b6pingshixstatic VAStatus tng_unpack_topaz_rec( 7727fe83028016237543fd7ffb31036023398dd62b6pingshix int src_width, int src_height, 7737fe83028016237543fd7ffb31036023398dd62b6pingshix unsigned char *p_srcY, unsigned char *p_srcUV, 7747fe83028016237543fd7ffb31036023398dd62b6pingshix unsigned char *p_dstY, unsigned char *p_dstU, unsigned char *p_dstV, 775cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan int dstY_stride, int __maybe_unused dstU_stride, int __maybe_unused dstV_stride, 776cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan int __maybe_unused surface_height) 7777fe83028016237543fd7ffb31036023398dd62b6pingshix{ 7787fe83028016237543fd7ffb31036023398dd62b6pingshix unsigned char *tmp_dstY = p_dstY; 7797fe83028016237543fd7ffb31036023398dd62b6pingshix unsigned char *tmp_dstU = p_dstU; 7807fe83028016237543fd7ffb31036023398dd62b6pingshix unsigned char *tmp_dstV = p_dstV; 7817fe83028016237543fd7ffb31036023398dd62b6pingshix unsigned char *tmp_srcY = p_srcY; 7827fe83028016237543fd7ffb31036023398dd62b6pingshix unsigned char *tmp_srcX = p_srcUV; 7837fe83028016237543fd7ffb31036023398dd62b6pingshix 7847fe83028016237543fd7ffb31036023398dd62b6pingshix int i, j, n, t; 7857fe83028016237543fd7ffb31036023398dd62b6pingshix int mb_src_y_w = src_width >> 4; 7867fe83028016237543fd7ffb31036023398dd62b6pingshix int mb_src_y_h = src_height >> 5; 7877fe83028016237543fd7ffb31036023398dd62b6pingshix int mb_src_y_p = src_height - (mb_src_y_h << 5); 7887fe83028016237543fd7ffb31036023398dd62b6pingshix 7897fe83028016237543fd7ffb31036023398dd62b6pingshix /* Copy Y data */ 7907fe83028016237543fd7ffb31036023398dd62b6pingshix for (j = 0; j < mb_src_y_h; j++) { 7917fe83028016237543fd7ffb31036023398dd62b6pingshix tmp_dstY = p_dstY + j * dstY_stride * 32; 7927fe83028016237543fd7ffb31036023398dd62b6pingshix for (i = 0; i < mb_src_y_w; i++) { 7937fe83028016237543fd7ffb31036023398dd62b6pingshix for (n = 0; n < 32; n++) { 7947fe83028016237543fd7ffb31036023398dd62b6pingshix memcpy(tmp_dstY + dstY_stride * n, tmp_srcY,16); 7957fe83028016237543fd7ffb31036023398dd62b6pingshix tmp_srcY += 16; 7967fe83028016237543fd7ffb31036023398dd62b6pingshix } 7977fe83028016237543fd7ffb31036023398dd62b6pingshix tmp_dstY += 16; 7987fe83028016237543fd7ffb31036023398dd62b6pingshix } 7997fe83028016237543fd7ffb31036023398dd62b6pingshix } 8007fe83028016237543fd7ffb31036023398dd62b6pingshix 8017fe83028016237543fd7ffb31036023398dd62b6pingshix if(mb_src_y_p != 0) { 8027fe83028016237543fd7ffb31036023398dd62b6pingshix tmp_dstY = p_dstY + j * dstY_stride * 32; 8037fe83028016237543fd7ffb31036023398dd62b6pingshix for (i = 0; i < mb_src_y_w; i++) { 8047fe83028016237543fd7ffb31036023398dd62b6pingshix for (n = 0; n < mb_src_y_p; n++) { 8057fe83028016237543fd7ffb31036023398dd62b6pingshix memcpy(tmp_dstY + dstY_stride * n, tmp_srcY,16); 8067fe83028016237543fd7ffb31036023398dd62b6pingshix tmp_srcY += 16; 8077fe83028016237543fd7ffb31036023398dd62b6pingshix } 8087fe83028016237543fd7ffb31036023398dd62b6pingshix for (; n < 32; n++) { 8097fe83028016237543fd7ffb31036023398dd62b6pingshix tmp_srcY += 16; 8107fe83028016237543fd7ffb31036023398dd62b6pingshix } 8117fe83028016237543fd7ffb31036023398dd62b6pingshix tmp_dstY += 16; 8127fe83028016237543fd7ffb31036023398dd62b6pingshix } 8137fe83028016237543fd7ffb31036023398dd62b6pingshix } 8147fe83028016237543fd7ffb31036023398dd62b6pingshix 8157fe83028016237543fd7ffb31036023398dd62b6pingshix for (j = 0; j < mb_src_y_h; j++) { 8167fe83028016237543fd7ffb31036023398dd62b6pingshix tmp_dstU = p_dstU + j * dstY_stride * 16; 8177fe83028016237543fd7ffb31036023398dd62b6pingshix for (i = 0; i < mb_src_y_w; i++) { 8187fe83028016237543fd7ffb31036023398dd62b6pingshix for (n = 0; n < 16; n++) { 8197fe83028016237543fd7ffb31036023398dd62b6pingshix for (t = 0; t < 16; t++) { 8207fe83028016237543fd7ffb31036023398dd62b6pingshix tmp_dstU[(n * dstY_stride) + t] = tmp_srcX[t]; 8217fe83028016237543fd7ffb31036023398dd62b6pingshix } 8227fe83028016237543fd7ffb31036023398dd62b6pingshix tmp_srcX += 16; 8237fe83028016237543fd7ffb31036023398dd62b6pingshix } 8247fe83028016237543fd7ffb31036023398dd62b6pingshix tmp_dstU += 16; 8257fe83028016237543fd7ffb31036023398dd62b6pingshix } 8267fe83028016237543fd7ffb31036023398dd62b6pingshix } 8277fe83028016237543fd7ffb31036023398dd62b6pingshix mb_src_y_p >>= 1; 8287fe83028016237543fd7ffb31036023398dd62b6pingshix if(mb_src_y_p != 0) { 8297fe83028016237543fd7ffb31036023398dd62b6pingshix tmp_dstU = p_dstU + j * dstY_stride * 16; 8307fe83028016237543fd7ffb31036023398dd62b6pingshix for (i = 0; i < mb_src_y_w; i++) { 8317fe83028016237543fd7ffb31036023398dd62b6pingshix for (n = 0; n < mb_src_y_p; n++) { 8327fe83028016237543fd7ffb31036023398dd62b6pingshix for (t = 0; t < 16; t++) { 8337fe83028016237543fd7ffb31036023398dd62b6pingshix tmp_dstU[(n * dstY_stride) + t] = tmp_srcX[t]; 8347fe83028016237543fd7ffb31036023398dd62b6pingshix } 8357fe83028016237543fd7ffb31036023398dd62b6pingshix tmp_srcX += 16; 8367fe83028016237543fd7ffb31036023398dd62b6pingshix } 8377fe83028016237543fd7ffb31036023398dd62b6pingshix 8387fe83028016237543fd7ffb31036023398dd62b6pingshix for (; n < 16; n++) { 8397fe83028016237543fd7ffb31036023398dd62b6pingshix tmp_srcX += 16; 8407fe83028016237543fd7ffb31036023398dd62b6pingshix } 8417fe83028016237543fd7ffb31036023398dd62b6pingshix 8427fe83028016237543fd7ffb31036023398dd62b6pingshix tmp_dstU += 16; 8437fe83028016237543fd7ffb31036023398dd62b6pingshix } 8447fe83028016237543fd7ffb31036023398dd62b6pingshix } 8457fe83028016237543fd7ffb31036023398dd62b6pingshix 8467fe83028016237543fd7ffb31036023398dd62b6pingshix return VA_STATUS_SUCCESS; 8477fe83028016237543fd7ffb31036023398dd62b6pingshix} 8487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_GetImage( 8507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VADriverContextP ctx, 8517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VASurfaceID surface, 8527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int x, /* coordinates of the upper left source pixel */ 8537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int y, 8547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int width, /* width and height of the region */ 8557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int height, 8567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAImageID image_id 8577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 8587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 8597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 8607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 861dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int ret, src_x = 0, src_y = 0, dest_x = 0, dest_y = 0; 862dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 8637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (void)driver_data; 8647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (void)lnc_unpack_topaz_rec; 865dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 8667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_image_p obj_image = IMAGE(image_id); 8676d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_IMAGE(obj_image); 8687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 869c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang if (IS_MFLD(driver_data) && (psb_CheckIEDStatus(ctx) == 1)) { 870c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang vaStatus = VA_STATUS_ERROR_INVALID_SURFACE; 871c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang return vaStatus; 872c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang } 873c86e88eac82cf97e0361339a1ec2a292dc7cfc57Fei Jiang 8747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_image->image.format.fourcc != VA_FOURCC_NV12) { 875c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "target VAImage fourcc should be NV12 or IYUV\n"); 8767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = VA_STATUS_ERROR_OPERATION_FAILED; 8777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 8787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 879dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 8807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_surface_p obj_surface = SURFACE(surface); 8816d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_SURFACE(obj_surface); 882dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 883e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang psb__VAImageCheckRegion(obj_surface, &obj_image->image, &src_x, &src_y, &dest_x, &dest_y, 884e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang (int *)&width, (int *)&height); 8857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_surface_p psb_surface = obj_surface->psb_surface; 887e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned char *surface_data; 8887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = psb_buffer_map(&psb_surface->buf, &surface_data); 8897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret) { 8907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_UNKNOWN; 8917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 8927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_buffer_p obj_buffer = BUFFER(obj_image->image.buf); 8946d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_BUFFER(obj_buffer); 8957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 896e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned char *image_data; 8977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = psb_buffer_map(obj_buffer->psb_buffer, &image_data); 8987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret) { 899c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "Map buffer failed\n"); 900dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 9017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_unmap(&psb_surface->buf); 9027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_UNKNOWN; 9037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 9047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 905115592518cc10686777609f874b567201a108d06zhangzha 9067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang image_data += obj_surface->psb_surface->buf.buffer_ofs; 907dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 908115592518cc10686777609f874b567201a108d06zhangzha 9097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang switch (obj_image->image.format.fourcc) { 910dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VA_FOURCC_NV12: { 9117fe83028016237543fd7ffb31036023398dd62b6pingshix unsigned char *src_y, *src_uv, *dst_y, *dst_uv; 9127fe83028016237543fd7ffb31036023398dd62b6pingshix unsigned char *dst_u, *dst_v; 913e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned int i; 914dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 9157fe83028016237543fd7ffb31036023398dd62b6pingshix /* 9167fe83028016237543fd7ffb31036023398dd62b6pingshix * For reconstructed frame, tiled to linear conversion 9177fe83028016237543fd7ffb31036023398dd62b6pingshix * must be done. 9187fe83028016237543fd7ffb31036023398dd62b6pingshix */ 9197fe83028016237543fd7ffb31036023398dd62b6pingshix if (obj_surface->is_ref_surface == 1) { 9207fe83028016237543fd7ffb31036023398dd62b6pingshix src_y = surface_data + y * psb_surface->stride + x; 921115592518cc10686777609f874b567201a108d06zhangzha src_uv = surface_data + ((height + 0x1f) & (~0x1f)) * width; 9227fe83028016237543fd7ffb31036023398dd62b6pingshix 9237fe83028016237543fd7ffb31036023398dd62b6pingshix dst_y = image_data; 9247fe83028016237543fd7ffb31036023398dd62b6pingshix dst_u = image_data + obj_image->image.offsets[1], 9257fe83028016237543fd7ffb31036023398dd62b6pingshix dst_v = dst_u + (height * width) / 4; 9267fe83028016237543fd7ffb31036023398dd62b6pingshix 9277fe83028016237543fd7ffb31036023398dd62b6pingshix tng_unpack_topaz_rec(width, height, \ 9287fe83028016237543fd7ffb31036023398dd62b6pingshix src_y, src_uv, \ 9297fe83028016237543fd7ffb31036023398dd62b6pingshix dst_y, dst_u, dst_v, \ 9307fe83028016237543fd7ffb31036023398dd62b6pingshix obj_image->image.pitches[0], \ 9317fe83028016237543fd7ffb31036023398dd62b6pingshix obj_image->image.width / 2, \ 9327fe83028016237543fd7ffb31036023398dd62b6pingshix obj_image->image.width / 2, \ 9337fe83028016237543fd7ffb31036023398dd62b6pingshix obj_surface->height); 934115592518cc10686777609f874b567201a108d06zhangzha } else if (obj_surface->is_ref_surface == 2) { 935115592518cc10686777609f874b567201a108d06zhangzha src_y = surface_data + y * psb_surface->stride + x; 936115592518cc10686777609f874b567201a108d06zhangzha src_uv = surface_data + ((height + 2*32 + 63)/64*64) * ((width + 2*32 + 63)/64*64); 937115592518cc10686777609f874b567201a108d06zhangzha dst_y = image_data; 938115592518cc10686777609f874b567201a108d06zhangzha dst_u = image_data + obj_image->image.offsets[1]; 939115592518cc10686777609f874b567201a108d06zhangzha 940115592518cc10686777609f874b567201a108d06zhangzha tng_unpack_vsp_rec(width, height, \ 941115592518cc10686777609f874b567201a108d06zhangzha src_y, src_uv, \ 942115592518cc10686777609f874b567201a108d06zhangzha dst_y, dst_u, \ 943115592518cc10686777609f874b567201a108d06zhangzha obj_image->image.pitches[0], \ 944115592518cc10686777609f874b567201a108d06zhangzha obj_image->image.pitches[1], \ 945115592518cc10686777609f874b567201a108d06zhangzha obj_image->image.pitches[1], \ 946115592518cc10686777609f874b567201a108d06zhangzha obj_surface->height); 947115592518cc10686777609f874b567201a108d06zhangzha } else{ 9487fe83028016237543fd7ffb31036023398dd62b6pingshix /* copy Y plane */ 9497fe83028016237543fd7ffb31036023398dd62b6pingshix dst_y = image_data; 9507fe83028016237543fd7ffb31036023398dd62b6pingshix src_y = surface_data + y * psb_surface->stride + x; 9517fe83028016237543fd7ffb31036023398dd62b6pingshix for (i = 0; i < height; i++) { 9527fe83028016237543fd7ffb31036023398dd62b6pingshix memcpy(dst_y, src_y, width); 9537fe83028016237543fd7ffb31036023398dd62b6pingshix dst_y += obj_image->image.pitches[0]; 9547fe83028016237543fd7ffb31036023398dd62b6pingshix src_y += psb_surface->stride; 9557fe83028016237543fd7ffb31036023398dd62b6pingshix } 9567fe83028016237543fd7ffb31036023398dd62b6pingshix 9577fe83028016237543fd7ffb31036023398dd62b6pingshix /* copy UV plane */ 9587fe83028016237543fd7ffb31036023398dd62b6pingshix dst_uv = image_data + obj_image->image.offsets[1]; 9597fe83028016237543fd7ffb31036023398dd62b6pingshix src_uv = surface_data + psb_surface->stride * obj_surface->height + (y / 2) * psb_surface->stride + x;; 9607fe83028016237543fd7ffb31036023398dd62b6pingshix for (i = 0; i < obj_image->image.height / 2; i++) { 9617fe83028016237543fd7ffb31036023398dd62b6pingshix memcpy(dst_uv, src_uv, width); 9627fe83028016237543fd7ffb31036023398dd62b6pingshix dst_uv += obj_image->image.pitches[1]; 9637fe83028016237543fd7ffb31036023398dd62b6pingshix src_uv += psb_surface->stride; 9647fe83028016237543fd7ffb31036023398dd62b6pingshix } 9657fe83028016237543fd7ffb31036023398dd62b6pingshix } 9662befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 9672befccec034c13d34746a9e87149889d59ac767bFei Jiang } 968dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#if 0 969dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VA_FOURCC_IYUV: { 970dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned char *source_y, *dst_y; 9712befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned char *source_uv, *source_u, *source_v, *dst_u, *dst_v; 9722befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned int i; 9732befccec034c13d34746a9e87149889d59ac767bFei Jiang 9742befccec034c13d34746a9e87149889d59ac767bFei Jiang if (psb_surface->extra_info[4] == VA_FOURCC_IREC) { 9752befccec034c13d34746a9e87149889d59ac767bFei Jiang /* copy Y plane */ 9762befccec034c13d34746a9e87149889d59ac767bFei Jiang dst_y = image_data + obj_image->image.offsets[0] + src_y * obj_image->image.pitches[0] + src_x; 9772befccec034c13d34746a9e87149889d59ac767bFei Jiang dst_u = image_data + obj_image->image.offsets[1] + src_y * obj_image->image.pitches[1] + src_x; 9782befccec034c13d34746a9e87149889d59ac767bFei Jiang dst_v = image_data + obj_image->image.offsets[2] + src_y * obj_image->image.pitches[2] + src_x; 9792befccec034c13d34746a9e87149889d59ac767bFei Jiang 980dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun source_y = surface_data + dest_y * psb_surface->stride + dest_x; 9812befccec034c13d34746a9e87149889d59ac767bFei Jiang source_uv = surface_data + obj_surface->height * psb_surface->stride 982dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun + dest_y * (psb_surface->stride / 2) + dest_x; 9832befccec034c13d34746a9e87149889d59ac767bFei Jiang 9842befccec034c13d34746a9e87149889d59ac767bFei Jiang vaStatus = lnc_unpack_topaz_rec(width, height, source_y, source_uv, 9852befccec034c13d34746a9e87149889d59ac767bFei Jiang dst_y, dst_u, dst_v, 9862befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.pitches[0], 9872befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_image->image.pitches[1], 988dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun obj_image->image.pitches[2], 9892befccec034c13d34746a9e87149889d59ac767bFei Jiang obj_surface->height); 9907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 991dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 9922befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 9932befccec034c13d34746a9e87149889d59ac767bFei Jiang } 994dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#endif 9952befccec034c13d34746a9e87149889d59ac767bFei Jiang default: 9962befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 9977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 9987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_unmap(obj_buffer->psb_buffer); 9997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_unmap(&psb_surface->buf); 1000dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 10017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 10027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 10037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus psb_PutImage2( 10057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VADriverContextP ctx, 10067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VASurfaceID surface, 10077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAImageID image_id, 10087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int src_x, 10097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int src_y, 10107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int width, 10117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int height, 10127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int dest_x, 1013dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int dest_y 10147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 10157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 10167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 10177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 10187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret; 10197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_image_p obj_image = IMAGE(image_id); 10216d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_IMAGE(obj_image); 10227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_surface_p obj_surface = SURFACE(surface); 10246d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_SURFACE(obj_surface); 10257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_image->image.format.fourcc != VA_FOURCC_NV12) { 1027c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "target VAImage fourcc should be NV12 or IYUV\n"); 10287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = VA_STATUS_ERROR_OPERATION_FAILED; 10297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 10307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 10317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1032e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang psb__VAImageCheckRegion(obj_surface, &obj_image->image, &src_x, &src_y, &dest_x, &dest_y, 1033e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang (int *)&width, (int *)&height); 10347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_surface_p psb_surface = obj_surface->psb_surface; 1036e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned char *surface_data; 10377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = psb_buffer_map(&psb_surface->buf, &surface_data); 10387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret) { 10397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_UNKNOWN; 10407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 10417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_buffer_p obj_buffer = BUFFER(obj_image->image.buf); 10436d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_BUFFER(obj_buffer); 10447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1045e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned char *image_data; 10467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = psb_buffer_map(obj_buffer->psb_buffer, &image_data); 10477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret) { 10487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_unmap(&psb_surface->buf); 10497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_UNKNOWN; 10507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 10517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang image_data += obj_surface->psb_surface->buf.buffer_ofs; 1053dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 10547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang switch (obj_image->image.format.fourcc) { 1055dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VA_FOURCC_NV12: { 1056e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned char *source_y, *src_uv, *dst_y, *dst_uv; 10572befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned int i; 1058dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 10592befccec034c13d34746a9e87149889d59ac767bFei Jiang /* copy Y plane */ 10602befccec034c13d34746a9e87149889d59ac767bFei Jiang source_y = image_data + obj_image->image.offsets[0] + src_y * obj_image->image.pitches[0] + src_x; 1061dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dst_y = surface_data + dest_y * psb_surface->stride + dest_x; 1062bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang for (i = 0; i < height; i++) { 1063dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun memcpy(dst_y, source_y, width); 10642befccec034c13d34746a9e87149889d59ac767bFei Jiang source_y += obj_image->image.pitches[0]; 10652befccec034c13d34746a9e87149889d59ac767bFei Jiang dst_y += psb_surface->stride; 10662befccec034c13d34746a9e87149889d59ac767bFei Jiang } 1067dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 10682befccec034c13d34746a9e87149889d59ac767bFei Jiang /* copy UV plane */ 1069dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun src_uv = image_data + obj_image->image.offsets[1] + (src_y / 2) * obj_image->image.pitches[1] + src_x; 1070dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dst_uv = surface_data + psb_surface->stride * obj_surface->height + (dest_y / 2) * psb_surface->stride + dest_x; 1071dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < obj_image->image.height / 2; i++) { 10722befccec034c13d34746a9e87149889d59ac767bFei Jiang memcpy(dst_uv, src_uv, width); 10732befccec034c13d34746a9e87149889d59ac767bFei Jiang src_uv += obj_image->image.pitches[1]; 10742befccec034c13d34746a9e87149889d59ac767bFei Jiang dst_uv += psb_surface->stride; 10757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 10762befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 10772befccec034c13d34746a9e87149889d59ac767bFei Jiang } 1078dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#if 0 1079dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VA_FOURCC_IYUV: { 1080dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun char *source_y, *dst_y; 10812befccec034c13d34746a9e87149889d59ac767bFei Jiang char *source_u, *source_v, *dst_u, *dst_v; 10822befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned int i; 1083dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 10842befccec034c13d34746a9e87149889d59ac767bFei Jiang /* copy Y plane */ 10852befccec034c13d34746a9e87149889d59ac767bFei Jiang source_y = image_data + obj_image->image.offsets[0] + src_y * obj_image->image.pitches[0] + src_x; 10862befccec034c13d34746a9e87149889d59ac767bFei Jiang source_u = image_data + obj_image->image.offsets[1] + src_y * obj_image->image.pitches[1] + src_x; 10872befccec034c13d34746a9e87149889d59ac767bFei Jiang source_v = image_data + obj_image->image.offsets[2] + src_y * obj_image->image.pitches[2] + src_x; 10882befccec034c13d34746a9e87149889d59ac767bFei Jiang 1089dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dst_y = surface_data + dest_y * psb_surface->stride + dest_x; 10902befccec034c13d34746a9e87149889d59ac767bFei Jiang dst_u = surface_data + obj_surface->height * psb_surface->stride 1091dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun + dest_y * (psb_surface->stride / 2) + dest_x; 10922befccec034c13d34746a9e87149889d59ac767bFei Jiang dst_v = surface_data + obj_surface->height * psb_surface->stride 1093dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun + (obj_surface->height / 2) * (psb_surface->stride / 2) 1094dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun + dest_y * (psb_surface->stride / 2) + dest_x; 1095dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1096bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang for (i = 0; i < height; i++) { 1097dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun memcpy(dst_y, source_y, width); 10982befccec034c13d34746a9e87149889d59ac767bFei Jiang source_y += obj_image->image.pitches[0]; 10992befccec034c13d34746a9e87149889d59ac767bFei Jiang dst_y += psb_surface->stride; 11002befccec034c13d34746a9e87149889d59ac767bFei Jiang } 1101dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 11022befccec034c13d34746a9e87149889d59ac767bFei Jiang /* copy UV plane */ 1103dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < obj_image->image.height / 2; i++) { 11042befccec034c13d34746a9e87149889d59ac767bFei Jiang memcpy(dst_u, source_u, width); 11052befccec034c13d34746a9e87149889d59ac767bFei Jiang memcpy(dst_v, source_v, width); 1106dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 11072befccec034c13d34746a9e87149889d59ac767bFei Jiang source_u += obj_image->image.pitches[1]; 11082befccec034c13d34746a9e87149889d59ac767bFei Jiang source_v += obj_image->image.pitches[2]; 1109dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1110dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dst_u += psb_surface->stride / 2; 1111dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dst_v += psb_surface->stride / 2; 11127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 11132befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 11142befccec034c13d34746a9e87149889d59ac767bFei Jiang } 1115dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#endif 11162befccec034c13d34746a9e87149889d59ac767bFei Jiang default: 11172befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 11187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1119dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 11207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_unmap(obj_buffer->psb_buffer); 11217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_unmap(&psb_surface->buf); 1122dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 11237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 11247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 11257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb__VAImageCheckRegion2( 11287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_surface_p surface, 11297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAImage *image, 11307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int *src_x, 11317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int *src_y, 11327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int *src_width, 11337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int *src_height, 11347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int *dest_x, 11357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int *dest_y, 1136e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang int *dest_width, 1137e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang int *dest_height 11387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 11397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 11407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* check for image */ 11417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (*src_x < 0) *src_x = 0; 11427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (*src_x > image->width) *src_x = image->width - 1; 11437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (*src_y < 0) *src_y = 0; 11447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (*src_y > image->height) *src_y = image->height - 1; 1145dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 11467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (((*src_width) + (*src_x)) > image->width) *src_width = image->width - *src_x; 11477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (((*src_height) + (*src_y)) > image->height) *src_height = image->height - *src_x; 11487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* check for surface */ 11507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (*dest_x < 0) *dest_x = 0; 11517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (*dest_x > surface->width) *dest_x = surface->width - 1; 11527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (*dest_y < 0) *dest_y = 0; 11537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (*dest_y > surface->height) *dest_y = surface->height - 1; 11547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1155e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang if (((*dest_width) + (*dest_x)) > (int)surface->width) *dest_width = surface->width - *dest_x; 1156e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang if (((*dest_height) + (*dest_y)) > (int)surface->height) *dest_height = surface->height - *dest_x; 11577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 11587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_PutImage( 11607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VADriverContextP ctx, 11617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VASurfaceID surface, 11627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAImageID image_id, 11637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int src_x, 11647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int src_y, 11657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int src_width, 11667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int src_height, 11677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int dest_x, 11687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int dest_y, 11697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int dest_width, 11707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int dest_height 11717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 11727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 11737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 11747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 11757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret; 1176cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan CHECK_INVALID_PARAM(((int)src_width == -1) || 1177cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan ((int)src_height == -1) || 1178cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan ((int)dest_width == ~0) || 1179cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan ((int)dest_height == ~0)); 1180dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1181dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((src_width == dest_width) && (src_height == dest_height)) { 11827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Shortcut if scaling is not required */ 11837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return psb_PutImage2(ctx, surface, image_id, src_x, src_y, src_width, src_height, dest_x, dest_y); 11847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 11857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_image_p obj_image = IMAGE(image_id); 11876d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_IMAGE(obj_image); 11887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_image->image.format.fourcc != VA_FOURCC_NV12) { 11907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* only support NV12 getImage/putImage */ 11917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = VA_STATUS_ERROR_OPERATION_FAILED; 11927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 11937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 11947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_surface_p obj_surface = SURFACE(surface); 11966d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_SURFACE(obj_surface); 11977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1198dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__VAImageCheckRegion2(obj_surface, &obj_image->image, 1199dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun &src_x, &src_y, &src_width, &src_height, 1200e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang &dest_x, &dest_y, (int *)&dest_width, (int *)&dest_height); 1201dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 12027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_surface_p psb_surface = obj_surface->psb_surface; 1203e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned char *surface_data; 12047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = psb_buffer_map(&psb_surface->buf, &surface_data); 12057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret) { 12067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_UNKNOWN; 12077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 12087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 12097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_buffer_p obj_buffer = BUFFER(obj_image->image.buf); 12106d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_BUFFER(obj_buffer); 12117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1212e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned char *image_data; 12137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = psb_buffer_map(obj_buffer->psb_buffer, &image_data); 12147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret) { 12157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_unmap(&psb_surface->buf); 12167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_UNKNOWN; 12177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 12187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 12197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* just a prototype, the algorithm is ugly and not optimized */ 12207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang switch (obj_image->image.format.fourcc) { 1221dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VA_FOURCC_NV12: { 1222dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned char *source_y, *dst_y; 1223dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned short *source_uv, *dst_uv; 1224dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned int i, j; 12252befccec034c13d34746a9e87149889d59ac767bFei Jiang float xratio = (float) src_width / dest_width; 12262befccec034c13d34746a9e87149889d59ac767bFei Jiang float yratio = (float) src_height / dest_height; 1227dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 12282befccec034c13d34746a9e87149889d59ac767bFei Jiang /* dst_y/dst_uv: Y/UV plane of destination */ 1229e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang dst_y = (unsigned char *)(surface_data + dest_y * psb_surface->stride + dest_x); 1230e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang dst_uv = (unsigned short *)(surface_data + psb_surface->stride * obj_surface->height 1231e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang + (dest_y / 2) * psb_surface->stride + dest_x); 1232dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1233bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang for (j = 0; j < dest_height; j++) { 12342befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned char *dst_y_tmp = dst_y; 12352befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned short *dst_uv_tmp = dst_uv; 1236dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1237bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang for (i = 0; i < dest_width; i++) { 12382befccec034c13d34746a9e87149889d59ac767bFei Jiang int x = (int)(i * xratio); 12392befccec034c13d34746a9e87149889d59ac767bFei Jiang int y = (int)(j * yratio); 12402befccec034c13d34746a9e87149889d59ac767bFei Jiang 12412befccec034c13d34746a9e87149889d59ac767bFei Jiang source_y = image_data + obj_image->image.offsets[0] 1242dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun + (src_y + y) * obj_image->image.pitches[0] 1243dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun + (src_x + x); 12442befccec034c13d34746a9e87149889d59ac767bFei Jiang *dst_y_tmp = *source_y; 12452befccec034c13d34746a9e87149889d59ac767bFei Jiang dst_y_tmp++; 1246dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1247bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang if (((i & 1) == 0)) { 12482befccec034c13d34746a9e87149889d59ac767bFei Jiang source_uv = (unsigned short *)(image_data + obj_image->image.offsets[1] 1249dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun + ((src_y + y) / 2) * obj_image->image.pitches[1]) 1250dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun + ((src_x + x) / 2); 12512befccec034c13d34746a9e87149889d59ac767bFei Jiang *dst_uv_tmp = *source_uv; 1252dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dst_uv_tmp++; 12537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 12547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 12552befccec034c13d34746a9e87149889d59ac767bFei Jiang dst_y += psb_surface->stride; 1256dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1257bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang if (j & 1) 1258e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang dst_uv = (unsigned short *)((unsigned char *)dst_uv + psb_surface->stride); 12597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1260dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 12612befccec034c13d34746a9e87149889d59ac767bFei Jiang } 12622befccec034c13d34746a9e87149889d59ac767bFei Jiang default:/* will not reach here */ 12632befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 12647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1265dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 12667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_unmap(obj_buffer->psb_buffer); 12677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_unmap(&psb_surface->buf); 1268dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 12697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 12707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 12717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 12727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 12737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Link supbicture into one surface, when update is zero, not need to 12747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * update the location information 12757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * The image informatio and its BO of subpicture will copied to surface 12767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * so need to update it when a vaSetSubpictureImage is called 12777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 12787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus psb__LinkSubpictIntoSurface( 12797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_driver_data_p driver_data, 12807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_surface_p obj_surface, 12817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_subpic_p obj_subpic, 12827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang short src_x, 12837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang short src_y, 12847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned short src_w, 12857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned short src_h, 12867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang short dest_x, 12877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang short dest_y, 12887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned short dest_w, 12897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned short dest_h, 12907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int update /* update subpicture location */ 12917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 12927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 12937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang PsbVASurfaceRec *surface_subpic; 1294dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun object_image_p obj_image = IMAGE(obj_subpic->image_id); 1295dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == obj_image) { 12967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_INVALID_IMAGE; 12977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 12987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1299dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun VAImage *image = &obj_image->image; 13007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_buffer_p obj_buffer = BUFFER(image->buf); 1301dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == obj_buffer) { 13027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_INVALID_BUFFER; 13037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 13047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int found = 0; 1306dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 13077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_surface->subpictures != NULL) { 13082befccec034c13d34746a9e87149889d59ac767bFei Jiang surface_subpic = (PsbVASurfaceRec *)obj_surface->subpictures; 13097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang do { 13107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (surface_subpic->subpic_id == obj_subpic->subpic_id) { 13117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang found = 1; 13127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 13137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else 13147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surface_subpic = surface_subpic->next; 13157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } while (surface_subpic); 13167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 13177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (found == 0) { /* new node */ 13197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_surface->subpic_count >= PSB_SUBPIC_MAX_NUM) { 1320c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "can't support so many sub-pictures for the surface\n"); 13217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_UNKNOWN; 13227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1323dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 13242befccec034c13d34746a9e87149889d59ac767bFei Jiang surface_subpic = (PsbVASurfaceRec *)calloc(1, sizeof(*surface_subpic)); 13257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (NULL == surface_subpic) 13267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_ALLOCATION_FAILED; 13277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1328dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 13297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surface_subpic->subpic_id = obj_subpic->subpic_id; 13307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surface_subpic->fourcc = image->format.fourcc; 13312f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang surface_subpic->size = image->data_size; 13327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surface_subpic->bo = obj_buffer->psb_buffer->drm_buf; 13337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surface_subpic->bufid = wsbmKBufHandle(wsbmKBuf(obj_buffer->psb_buffer->drm_buf)); 13347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surface_subpic->pl_flags = obj_buffer->psb_buffer->pl_flags; 1335dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun surface_subpic->subpic_flags = obj_subpic->flags; 1336dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 13377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surface_subpic->width = image->width; 13387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surface_subpic->height = image->height; 13397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang switch (surface_subpic->fourcc) { 13402befccec034c13d34746a9e87149889d59ac767bFei Jiang case VA_FOURCC_AYUV: 1341dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun surface_subpic->stride = image->pitches[0] / 4; 13422befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 13432befccec034c13d34746a9e87149889d59ac767bFei Jiang case VA_FOURCC_RGBA: 1344dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun surface_subpic->stride = image->pitches[0] / 4; 13452befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 13462befccec034c13d34746a9e87149889d59ac767bFei Jiang case VA_FOURCC_AI44: 13472befccec034c13d34746a9e87149889d59ac767bFei Jiang surface_subpic->stride = image->pitches[0]; 13482befccec034c13d34746a9e87149889d59ac767bFei Jiang /* point to Image palette */ 1349dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun surface_subpic->palette_ptr = (PsbAYUVSample8 *) & obj_image->palette[0]; 13502befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 13517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1352dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 13537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (update) { 13547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surface_subpic->subpic_srcx = src_x; 13557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surface_subpic->subpic_srcy = src_y; 13567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surface_subpic->subpic_dstx = dest_x; 13577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surface_subpic->subpic_dsty = dest_y; 13587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surface_subpic->subpic_srcw = src_w; 13597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surface_subpic->subpic_srch = src_h; 13607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surface_subpic->subpic_dstw = dest_w; 13617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surface_subpic->subpic_dsth = dest_h; 13627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1363dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 13647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (found == 0) { /* new node, link into the list */ 13657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (NULL == obj_surface->subpictures) { 1366e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang obj_surface->subpictures = (void *)surface_subpic; 13677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else { /* insert as the head */ 1368e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang surface_subpic->next = (PsbVASurfacePtr)obj_surface->subpictures; 1369e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang obj_surface->subpictures = (void *)surface_subpic; 13707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 13717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_surface->subpic_count++; 13727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1373dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 13747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 13757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 13767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus psb__LinkSurfaceIntoSubpict( 13797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_subpic_p obj_subpic, 13807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VASurfaceID surface_id 13817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 13827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 13837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang subpic_surface_s *subpic_surface; 13847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int found = 0; 1385dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 13867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_subpic->surfaces != NULL) { 13877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang subpic_surface = (subpic_surface_s *)obj_subpic->surfaces; 13887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang do { 13897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (subpic_surface->surface_id == surface_id) { 13907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang found = 1; 13917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; /* reture directly */ 13927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else 13937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang subpic_surface = subpic_surface->next; 13947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } while (subpic_surface); 13957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 13967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* not found */ 13982befccec034c13d34746a9e87149889d59ac767bFei Jiang subpic_surface = (subpic_surface_s *)calloc(1, sizeof(*subpic_surface)); 13997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (NULL == subpic_surface) 14007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_ALLOCATION_FAILED; 14017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang subpic_surface->surface_id = surface_id; 14037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang subpic_surface->next = NULL; 1404dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 14057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (NULL == obj_subpic->surfaces) { 1406e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang obj_subpic->surfaces = (void *)subpic_surface; 14077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else { /* insert as the head */ 1408e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang subpic_surface->next = (subpic_surface_p)obj_subpic->surfaces; 1409e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang obj_subpic->surfaces = (void *)subpic_surface; 14107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1411dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 14127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 14137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 14147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus psb__DelinkSubpictFromSurface( 14167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_surface_p obj_surface, 14177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VASubpictureID subpic_id 14187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 14197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1420dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun PsbVASurfaceRec *surface_subpic, *pre_surface_subpic = NULL; 14217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int found = 0; 1422dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 14237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_surface->subpictures != NULL) { 1424dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun surface_subpic = (PsbVASurfaceRec *)obj_surface->subpictures; 14257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang do { 14267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (surface_subpic->subpic_id == subpic_id) { 14277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang found = 1; 14287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 14297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else { 14307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pre_surface_subpic = surface_subpic; 14317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surface_subpic = surface_subpic->next; 14327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 14337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } while (surface_subpic); 14347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 14357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (found == 1) { 14377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (pre_surface_subpic == NULL) { /* remove the first node */ 1438e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang obj_surface->subpictures = (void *)surface_subpic->next; 14397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else { 14407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pre_surface_subpic->next = surface_subpic->next; 14417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 14427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang free(surface_subpic); 14437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_surface->subpic_count--; 14447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1445dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 14467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 14477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 14487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus psb__DelinkSurfaceFromSubpict( 14517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_subpic_p obj_subpic, 14527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VASurfaceID surface_id 14537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 14547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1455dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun subpic_surface_s *subpic_surface, *pre_subpic_surface = NULL; 14567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int found = 0; 1457dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 14587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_subpic->surfaces != NULL) { 14597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang subpic_surface = (subpic_surface_s *)obj_subpic->surfaces; 14607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang do { 14617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (subpic_surface->surface_id == surface_id) { 14627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang found = 1; 14637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 14647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else { 14657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pre_subpic_surface = subpic_surface; 14667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang subpic_surface = subpic_surface->next; 14677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 14687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } while (subpic_surface); 14697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 14707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (found == 1) { 14727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (pre_subpic_surface == NULL) { /* remove the first node */ 1473e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang obj_subpic->surfaces = (void *)subpic_surface->next; 14747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else { 14757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pre_subpic_surface->next = subpic_surface->next; 14767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 14777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang free(subpic_surface); 14787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1479dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 14807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 14817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 14827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_QuerySubpictureFormats( 1485cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan VADriverContextP __maybe_unused ctx, 14862befccec034c13d34746a9e87149889d59ac767bFei Jiang VAImageFormat *format_list, /* out */ 14872befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned int *flags, /* out */ 14882befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned int *num_formats /* out */ 14897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 14907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 14917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 1492dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 14936d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_INVALID_PARAM(format_list == NULL); 14946d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_INVALID_PARAM(flags == NULL); 14956d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_INVALID_PARAM(num_formats == NULL); 14966d37ae34fcae80f2e898b61e2506ed8e887bd16anguo 1497dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun memcpy(format_list, psb__SubpicFormat, sizeof(psb__SubpicFormat)); 14987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *num_formats = PSB_MAX_SUBPIC_FORMATS; 14997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *flags = PSB_SUPPORTED_SUBPIC_FLAGS; 15007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 15027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 15037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_CreateSubpicture( 15062befccec034c13d34746a9e87149889d59ac767bFei Jiang VADriverContextP ctx, 15072befccec034c13d34746a9e87149889d59ac767bFei Jiang VAImageID image, 15082befccec034c13d34746a9e87149889d59ac767bFei Jiang VASubpictureID *subpicture /* out */ 15097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 15107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 15117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 15127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VASubpictureID subpicID; 15137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_subpic_p obj_subpic; 15147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_image_p obj_image; 15157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 15167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAImageFormat *img_fmt; 15177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image = IMAGE(image); 15196d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_IMAGE(obj_image); 15206d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_SUBPICTURE(subpicture); 15217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang img_fmt = psb__VAImageCheckFourCC(&obj_image->image.format, psb__SubpicFormat, 1523dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun sizeof(psb__SubpicFormat) / sizeof(VAImageFormat)); 15247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (img_fmt == NULL) 15257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_UNKNOWN; 1526dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1527dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun subpicID = object_heap_allocate(&driver_data->subpic_heap); 15287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_subpic = SUBPIC(subpicID); 15296d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_ALLOCATION(obj_subpic); 15306d37ae34fcae80f2e898b61e2506ed8e887bd16anguo 15312befccec034c13d34746a9e87149889d59ac767bFei Jiang MEMSET_OBJECT(obj_subpic, struct object_subpic_s); 15322befccec034c13d34746a9e87149889d59ac767bFei Jiang 15337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_subpic->subpic_id = subpicID; 15347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_subpic->image_id = obj_image->image.image_id; 15357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_subpic->surfaces = NULL; 1536ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan obj_subpic->global_alpha = 255; 15377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image->subpic_ref ++; 1539dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 15407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *subpicture = subpicID; 1541dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 15427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 15437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 15447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb__destroy_subpicture(psb_driver_data_p driver_data, object_subpic_p obj_subpic) 15487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 15497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang subpic_surface_s *subpic_surface = (subpic_surface_s *)obj_subpic->surfaces; 15507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VASubpictureID subpicture = obj_subpic->subpic_id; 15517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (subpic_surface) { 15537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang do { 15547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang subpic_surface_s *tmp = subpic_surface; 15557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_surface_p obj_surface = SURFACE(subpic_surface->surface_id); 1556dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 15577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_surface) { /* remove subpict from surface */ 1558dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__DelinkSubpictFromSurface(obj_surface, subpicture); 15597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 15607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang subpic_surface = subpic_surface->next; 15617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang free(tmp); 15627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } while (subpic_surface); 15637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 15647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1565dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun object_heap_free(&driver_data->subpic_heap, (object_base_p) obj_subpic); 15667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 15677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 15687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_DestroySubpicture( 15712befccec034c13d34746a9e87149889d59ac767bFei Jiang VADriverContextP ctx, 15722befccec034c13d34746a9e87149889d59ac767bFei Jiang VASubpictureID subpicture 15737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 15747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 15757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 15767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_subpic_p obj_subpic; 15777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 1578dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 15797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_subpic = SUBPIC(subpicture); 15806d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_SUBPICTURE(obj_subpic); 1581dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 15827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return psb__destroy_subpicture(driver_data, obj_subpic); 15837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 15847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1585dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunVAStatus psb_SetSubpictureImage( 15862befccec034c13d34746a9e87149889d59ac767bFei Jiang VADriverContextP ctx, 15872befccec034c13d34746a9e87149889d59ac767bFei Jiang VASubpictureID subpicture, 15882befccec034c13d34746a9e87149889d59ac767bFei Jiang VAImageID image 15897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 15907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 15912befccec034c13d34746a9e87149889d59ac767bFei Jiang INIT_DRIVER_DATA; 15927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_subpic_p obj_subpic; 15937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_image_p obj_image; 15947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 15957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang subpic_surface_s *subpic_surface; 15967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAImageFormat *img_fmt; 15977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image = IMAGE(image); 15996d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_IMAGE(obj_image); 16007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang img_fmt = psb__VAImageCheckFourCC(&obj_image->image.format, 16027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__SubpicFormat, 1603dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun sizeof(psb__SubpicFormat) / sizeof(VAImageFormat)); 16046d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_IMAGE(img_fmt); 1605dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 16067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_subpic = SUBPIC(subpicture); 16076d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_SUBPICTURE(obj_subpic); 16087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_image_p old_obj_image = IMAGE(obj_subpic->image_id); 16107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (old_obj_image) { 16117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang old_obj_image->subpic_ref--;/* decrease reference count */ 16127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 16137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* reset the image */ 16157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_subpic->image_id = obj_image->image.image_id; 16167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image->subpic_ref ++; 1617dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 16187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* relink again */ 16197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_subpic->surfaces != NULL) { 16207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* the subpicture already linked into surfaces 16217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * so not check the return value of psb__LinkSubpictIntoSurface 16227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 16237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang subpic_surface = (subpic_surface_s *)obj_subpic->surfaces; 16247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang do { 16257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_surface_p obj_surface = SURFACE(subpic_surface->surface_id); 16266d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_SURFACE(obj_surface); 16277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1628dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__LinkSubpictIntoSurface(driver_data, obj_surface, obj_subpic, 1629dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 0, 0, 0, 0, 0, 0, 0, 0, 16307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 0 /* not update location */ 1631dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ); 16327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang subpic_surface = subpic_surface->next; 16337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } while (subpic_surface); 16347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 16357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1636dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 16377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 16387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 16397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_SetSubpictureChromakey( 16422befccec034c13d34746a9e87149889d59ac767bFei Jiang VADriverContextP ctx, 16432befccec034c13d34746a9e87149889d59ac767bFei Jiang VASubpictureID subpicture, 16442befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned int chromakey_min, 16452befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned int chromakey_max, 16462befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned int chromakey_mask 16477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 16487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 16497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 1650dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (void)driver_data; 16517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* TODO */ 16523f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang if ((chromakey_mask < chromakey_min) || (chromakey_mask > chromakey_max)) { 1653c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "Invalid chromakey value %d, chromakey value should between min and max\n", chromakey_mask); 16543f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang return VA_STATUS_ERROR_INVALID_PARAMETER; 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; 16600da1930627209986e8db220799a690f816494401Austin Yuan } 16610da1930627209986e8db220799a690f816494401Austin Yuan 16620da1930627209986e8db220799a690f816494401Austin Yuan return VA_STATUS_SUCCESS; 16637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 16647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_SetSubpictureGlobalAlpha( 16662befccec034c13d34746a9e87149889d59ac767bFei Jiang VADriverContextP ctx, 16672befccec034c13d34746a9e87149889d59ac767bFei Jiang VASubpictureID subpicture, 1668dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun float global_alpha 16697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 16707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 16717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 16720da1930627209986e8db220799a690f816494401Austin Yuan 1673bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang if (global_alpha < 0 || global_alpha > 1) { 1674c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "Invalid global alpha value %07f, global alpha value should between 0 and 1\n", global_alpha); 16753f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang return VA_STATUS_ERROR_INVALID_PARAMETER; 16760da1930627209986e8db220799a690f816494401Austin Yuan } 16770da1930627209986e8db220799a690f816494401Austin Yuan 1678e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang object_subpic_p obj_subpic = SUBPIC(subpicture); 16793f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang if (NULL == obj_subpic) { 1680c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "Invalid subpicture value %d\n", subpicture); 16813f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang return VA_STATUS_ERROR_INVALID_SUBPICTURE; 1682bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang } 1683bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang 1684bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang obj_subpic->global_alpha = global_alpha * 255; 1685bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang 1686bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang return VA_STATUS_SUCCESS; 16877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 16887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb__AssociateSubpicture( 16912befccec034c13d34746a9e87149889d59ac767bFei Jiang VADriverContextP ctx, 16922befccec034c13d34746a9e87149889d59ac767bFei Jiang VASubpictureID subpicture, 16932befccec034c13d34746a9e87149889d59ac767bFei Jiang VASurfaceID *target_surfaces, 16942befccec034c13d34746a9e87149889d59ac767bFei Jiang int num_surfaces, 16952befccec034c13d34746a9e87149889d59ac767bFei Jiang short src_x, /* upper left offset in subpicture */ 16962befccec034c13d34746a9e87149889d59ac767bFei Jiang short src_y, 16972befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned short src_w, 16982befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned short src_h, 16992befccec034c13d34746a9e87149889d59ac767bFei Jiang short dest_x, /* upper left offset in surface */ 17002befccec034c13d34746a9e87149889d59ac767bFei Jiang short dest_y, 17012befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned short dest_w, 17022befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned short dest_h, 17032befccec034c13d34746a9e87149889d59ac767bFei Jiang /* 17042befccec034c13d34746a9e87149889d59ac767bFei Jiang * whether to enable chroma-keying or global-alpha 17052befccec034c13d34746a9e87149889d59ac767bFei Jiang * see VA_SUBPICTURE_XXX values 17062befccec034c13d34746a9e87149889d59ac767bFei Jiang */ 17072befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned int flags 17087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 17097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 17107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 17117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_subpic_p obj_subpic; 17137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 17147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int i; 17157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17166d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_INVALID_PARAM(num_surfaces <= 0); 17177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_subpic = SUBPIC(subpicture); 17196d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_SUBPICTURE(obj_subpic); 17206d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_SURFACE(target_surfaces); 1721dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1722dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (flags & ~PSB_SUPPORTED_SUBPIC_FLAGS) { 17237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef VA_STATUS_ERROR_FLAG_NOT_SUPPORTED 17247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = VA_STATUS_ERROR_FLAG_NOT_SUPPORTED; 17257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else 17267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = VA_STATUS_ERROR_UNKNOWN; 1727dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#endif 17287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBUG_FAILURE; 17297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 1730dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 1731dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1732dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* If flags are ok, copy them to the subpicture object */ 1733dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun obj_subpic->flags = flags; 1734dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 17357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 17367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Validate input params */ 1738bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang for (i = 0; i < num_surfaces; i++) { 17397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_surface_p obj_surface = SURFACE(target_surfaces[i]); 17406d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_SURFACE(obj_surface); 17417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 17427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1743dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun VASurfaceID *surfaces = target_surfaces; 1744bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang for (i = 0; i < num_surfaces; i++) { 17457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_surface_p obj_surface = SURFACE(*surfaces); 17467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_surface) { 1747dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun vaStatus = psb__LinkSubpictIntoSurface(driver_data, obj_surface, obj_subpic, 1748dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun src_x, src_y, src_w, src_h, 1749dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dest_x, dest_y, dest_w, dest_h, 1); 1750dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (VA_STATUS_SUCCESS == vaStatus) { 1751dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun vaStatus = psb__LinkSurfaceIntoSubpict(obj_subpic, *surfaces); 17527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 17536d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_VASTATUS();/* failed with malloc */ 17547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else { 17557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Should never get here */ 1756c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "Invalid surfaces,SurfaceID=0x%x\n", *surfaces); 17577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1758dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 17597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surfaces++; 17607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1761dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 17627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 17637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 17647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_AssociateSubpicture( 17672befccec034c13d34746a9e87149889d59ac767bFei Jiang VADriverContextP ctx, 17682befccec034c13d34746a9e87149889d59ac767bFei Jiang VASubpictureID subpicture, 17692befccec034c13d34746a9e87149889d59ac767bFei Jiang VASurfaceID *target_surfaces, 17702befccec034c13d34746a9e87149889d59ac767bFei Jiang int num_surfaces, 17712befccec034c13d34746a9e87149889d59ac767bFei Jiang short src_x, /* upper left offset in subpicture */ 17722befccec034c13d34746a9e87149889d59ac767bFei Jiang short src_y, 17732befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned short src_width, 17742befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned short src_height, 17752befccec034c13d34746a9e87149889d59ac767bFei Jiang short dest_x, /* upper left offset in surface */ 17762befccec034c13d34746a9e87149889d59ac767bFei Jiang short dest_y, 17772befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned short dest_width, 17782befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned short dest_height, 17792befccec034c13d34746a9e87149889d59ac767bFei Jiang /* 17802befccec034c13d34746a9e87149889d59ac767bFei Jiang * whether to enable chroma-keying or global-alpha 17812befccec034c13d34746a9e87149889d59ac767bFei Jiang * see VA_SUBPICTURE_XXX values 17822befccec034c13d34746a9e87149889d59ac767bFei Jiang */ 17832befccec034c13d34746a9e87149889d59ac767bFei Jiang unsigned int flags 17847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 17857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1786dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return psb__AssociateSubpicture(ctx, subpicture, target_surfaces, num_surfaces, 1787dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun src_x, src_y, src_width, src_height, 1788dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dest_x, dest_y, dest_width, dest_height, 17897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang flags 1790dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ); 17917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 17927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_DeassociateSubpicture( 17952befccec034c13d34746a9e87149889d59ac767bFei Jiang VADriverContextP ctx, 17962befccec034c13d34746a9e87149889d59ac767bFei Jiang VASubpictureID subpicture, 17972befccec034c13d34746a9e87149889d59ac767bFei Jiang VASurfaceID *target_surfaces, 17982befccec034c13d34746a9e87149889d59ac767bFei Jiang int num_surfaces 17997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 18007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 18017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang INIT_DRIVER_DATA; 18027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_subpic_p obj_subpic; 18047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 18057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_image_p obj_image; 18067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int i; 18077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18086d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_INVALID_PARAM(num_surfaces <= 0); 1809dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 18107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_subpic = SUBPIC(subpicture); 18116d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_SUBPICTURE(obj_subpic); 18126d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_SURFACE(target_surfaces); 18137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1814dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun VASurfaceID *surfaces = target_surfaces; 1815bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang for (i = 0; i < num_surfaces; i++) { 18167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_surface_p obj_surface = SURFACE(*surfaces); 1817dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 18187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_surface) { 1819dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__DelinkSubpictFromSurface(obj_surface, subpicture); 1820dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__DelinkSurfaceFromSubpict(obj_subpic, obj_surface->surface_id); 18217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else { 1822c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "vaDeassociateSubpicture: Invalid surface, VASurfaceID=0x%08x\n", *surfaces); 18237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1824dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 18257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surfaces++; 18267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 18277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image = IMAGE(obj_subpic->image_id); 18297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_image) 18307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_image->subpic_ref--;/* decrease reference count */ 1831dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 18327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 18337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 18347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_SurfaceDeassociateSubpict( 18377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_driver_data_p driver_data, 18382befccec034c13d34746a9e87149889d59ac767bFei Jiang object_surface_p obj_surface 18392befccec034c13d34746a9e87149889d59ac767bFei Jiang) 18407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1841dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun PsbVASurfaceRec *surface_subpic = (PsbVASurfaceRec *)obj_surface->subpictures; 18427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (surface_subpic != NULL) { 18447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang do { 18457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang PsbVASurfaceRec *tmp = surface_subpic; 18467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang object_subpic_p obj_subpic = SUBPIC(surface_subpic->subpic_id); 18477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_subpic) 1848dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__DelinkSurfaceFromSubpict(obj_subpic, obj_surface->surface_id); 18497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang surface_subpic = surface_subpic->next; 18507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang free(tmp); 18517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } while (surface_subpic); 18527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 18537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 18547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1855dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 18567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VADisplayAttribute psb__DisplayAttribute[] = { 18577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 18587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VADisplayAttribBrightness, 18597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang BRIGHTNESS_MIN, 18607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang BRIGHTNESS_MAX, 18617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang BRIGHTNESS_DEFAULT_VALUE, 186294ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE, 186394ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding NULL 18647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang }, 18657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 18677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VADisplayAttribContrast, 18687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang CONTRAST_MIN, 18697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang CONTRAST_MAX, 18707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang CONTRAST_DEFAULT_VALUE, 187194ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE, 187294ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding NULL 18737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang }, 18747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 18767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VADisplayAttribHue, 18777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang HUE_MIN, 18787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang HUE_MAX, 18797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang HUE_DEFAULT_VALUE, 188094ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE, 188194ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding NULL 18827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang }, 18837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 18857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VADisplayAttribSaturation, 18867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang SATURATION_MIN, 18877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang SATURATION_MAX, 18887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang SATURATION_DEFAULT_VALUE, 188994ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE, 189094ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding NULL 18917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang }, 18927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 18937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VADisplayAttribBackgroundColor, 18947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 0x00000000, 18957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 0xffffffff, 18967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 0x00000000, 189794ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE, 189894ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding NULL 18997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang }, 1900242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang { 1901242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang VADisplayAttribRotation, 19023f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang VA_ROTATION_NONE, 19033f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang VA_ROTATION_270, 19043f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang VA_ROTATION_NONE, 190594ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE, 190694ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding NULL 19073f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang }, 1908242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang { 1909242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang VADisplayAttribOutofLoopDeblock, 19103f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang VA_OOL_DEBLOCKING_FALSE, 1911242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang VA_OOL_DEBLOCKING_TRUE, 1912242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang VA_OOL_DEBLOCKING_FALSE, 191394ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE, 191494ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding NULL 19153f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang }, 19163f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang { 19173f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang VADisplayAttribBlendColor, 19183f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0x00000000, 19193f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0xffffffff, 19203f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0x00000000, 192194ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE, 192294ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding NULL 1923242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang }, 1924242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang { 19253f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang VADisplayAttribOverlayColorKey, 19263f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0x00000000, 19273f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0xffffffff, 19283f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0x00000000, 192994ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE, 193094ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding NULL 19313f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang }, 1932242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang { 19333f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang VADisplayAttribOverlayAutoPaintColorKey, 19343f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0x00000000, 19353f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0xffffffff, 19363f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0x00000000, 193794ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE, 193894ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding NULL 19393f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang }, 1940242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang { 19413f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang VADisplayAttribCSCMatrix, 19423f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0x00000000, 19433f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0xffffffff, 19443f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0x00000000, 194594ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE, 194694ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding NULL 19473f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang }, 1948242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang { 19493f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang VADisplayAttribRenderDevice, 19503f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0x00000000, 19513f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0xffffffff, 19523f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0x00000000, 195394ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE, 195494ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding NULL 19553f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang }, 19563f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang { 19573f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang VADisplayAttribRenderMode, 19583f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0x00000000, 19593f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0xffffffff, 19603f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0x00000000, 196194ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE, 196294ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding NULL 19633f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang }, 19643f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang { 19653f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang VADisplayAttribRenderRect, 19663f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0x00000000, 19673f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0xffffffff, 19683f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 0x00000000, 196994ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding VA_DISPLAY_ATTRIB_GETTABLE | VA_DISPLAY_ATTRIB_SETTABLE, 197094ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding NULL 19713f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang } 19727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}; 19737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1974dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun/* 1975dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * Query display attributes 19767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * The caller must provide a "attr_list" array that can hold at 19777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * least vaMaxNumDisplayAttributes() entries. The actual number of attributes 19787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * returned in "attr_list" is returned in "num_attributes". 19797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 1980dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunVAStatus psb_QueryDisplayAttributes( 1981cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan VADriverContextP __maybe_unused ctx, 1982bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang VADisplayAttribute *attr_list, /* out */ 1983bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang int *num_attributes /* out */ 19842befccec034c13d34746a9e87149889d59ac767bFei Jiang) 19857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 19867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 19877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 19886d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_INVALID_PARAM(attr_list == NULL); 19896d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_INVALID_PARAM(num_attributes == NULL); 19906d37ae34fcae80f2e898b61e2506ed8e887bd16anguo 1991dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *num_attributes = min(*num_attributes, PSB_MAX_DISPLAY_ATTRIBUTES); 1992242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang memcpy(attr_list, psb__DisplayAttribute, (*num_attributes)*sizeof(VADisplayAttribute)); 19937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 19947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 19957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1996dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun/* 1997dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * Get display attributes 19987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * This function returns the current attribute values in "attr_list". 19997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Only attributes returned with VA_DISPLAY_ATTRIB_GETTABLE set in the "flags" field 2000dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * from vaQueryDisplayAttributes() can have their values retrieved. 20017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 2002dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunVAStatus psb_GetDisplayAttributes( 20032befccec034c13d34746a9e87149889d59ac767bFei Jiang VADriverContextP ctx, 2004bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang VADisplayAttribute *attr_list, /* in/out */ 20052befccec034c13d34746a9e87149889d59ac767bFei Jiang int num_attributes 20067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang) 20077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 20082befccec034c13d34746a9e87149889d59ac767bFei Jiang INIT_DRIVER_DATA; 2009dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun VADisplayAttribute *p = attr_list; 20107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int i; 20117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 2012dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 20136d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_INVALID_PARAM(attr_list == NULL); 20146d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_INVALID_PARAM(num_attributes <= 0); 20157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2016bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang for (i = 0; i < num_attributes; i++) { 20177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang switch (p->type) { 20182befccec034c13d34746a9e87149889d59ac767bFei Jiang case VADisplayAttribBrightness: 2019dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* -50*(1<<10) ~ 50*(1<<10) ==> 0~100*/ 2020dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->value = (driver_data->brightness.value / (1 << 10)) + 50; 2021dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->min_value = 0; 2022dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->max_value = 100; 20232befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 20242befccec034c13d34746a9e87149889d59ac767bFei Jiang case VADisplayAttribContrast: 2025dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* 0 ~ 2*(1<<25) ==> 0~100 */ 2026dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->value = (driver_data->contrast.value / (1 << 25)) * 50; 2027dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->min_value = 0; 2028dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->max_value = 100; 20292befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 20302befccec034c13d34746a9e87149889d59ac767bFei Jiang case VADisplayAttribHue: 2031dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* -30*(1<<25) ~ 30*(1<<25) ==> 0~100*/ 2032dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->value = ((driver_data->hue.value / (1 << 25)) + 30) * 10 / 6; 2033dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->min_value = 0; 2034dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->max_value = 100; 20352befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 20362befccec034c13d34746a9e87149889d59ac767bFei Jiang case VADisplayAttribSaturation: 2037dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* 0 ~ 2*(1<<25) ==> 0~100 */ 2038dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->value = (driver_data->saturation.value / (1 << 25)) * 50; 2039dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->min_value = 0; 2040dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->max_value = 100; 20412befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 20422befccec034c13d34746a9e87149889d59ac767bFei Jiang case VADisplayAttribBackgroundColor: 20432befccec034c13d34746a9e87149889d59ac767bFei Jiang p->value = driver_data->clear_color; 20442befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 20454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo case VADisplayAttribBlendColor: 20464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo p->value = driver_data->blend_color; 20474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo break; 2048bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang case VADisplayAttribOverlayColorKey: 2049bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang p->value = driver_data->color_key; 2050bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang p->min_value = 0; 2051bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang p->max_value = 0xFFFFFF; 2052bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang break; 2053bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang case VADisplayAttribOverlayAutoPaintColorKey: 2054bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang p->value = driver_data->overlay_auto_paint_color_key; 2055bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang p->min_value = 0; 2056bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang p->max_value = 1; 2057bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang break; 20583f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang case VADisplayAttribRotation: 20593f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang p->value = driver_data->va_rotate = p->value; 20603f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang p->min_value = VA_ROTATION_NONE; 20613f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang p->max_value = VA_ROTATION_270; 20623f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang break; 20633f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang case VADisplayAttribOutofLoopDeblock: 20643f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang p->value = driver_data->is_oold = p->value; 20653f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang p->min_value = VA_OOL_DEBLOCKING_FALSE; 20663f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang p->max_value = VA_OOL_DEBLOCKING_TRUE; 20673f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang break; 2068242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang case VADisplayAttribCSCMatrix: 2069242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang p->value = driver_data->load_csc_matrix = p->value; 2070242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang p->min_value = 0; 2071242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang p->max_value = 255; 2072242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang break; 2073242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang case VADisplayAttribRenderDevice: 2074242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang p->value = driver_data->render_device = p->value; 2075242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang p->min_value = 0; 2076242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang p->max_value = 255; 2077242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang break; 2078242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang case VADisplayAttribRenderMode: 2079242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang p->value = driver_data->render_mode = p->value; 2080242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang p->min_value = 0; 2081242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang p->max_value = 255; 2082242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang break; 2083242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang case VADisplayAttribRenderRect: 2084242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang ((VARectangle *)(p->value))->x = driver_data->render_rect.x = ((VARectangle *)(p->value))->x; 2085242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang ((VARectangle *)(p->value))->y = driver_data->render_rect.y = ((VARectangle *)(p->value))->y; 2086242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang ((VARectangle *)(p->value))->width = driver_data->render_rect.width = ((VARectangle *)(p->value))->width; 2087242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang ((VARectangle *)(p->value))->height = driver_data->render_rect.height = ((VARectangle *)(p->value))->height; 2088242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang p->min_value = 0; 2089242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang p->max_value = 255; 2090242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang break; 2091242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang 20922befccec034c13d34746a9e87149889d59ac767bFei Jiang default: 20932befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 20947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 20957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang p++; 20967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 20977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 20987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 20997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 21007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2101dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun/* 2102dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * Set display attributes 21037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Only attributes returned with VA_DISPLAY_ATTRIB_SETTABLE set in the "flags" field 2104dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * from vaQueryDisplayAttributes() can be set. If the attribute is not settable or 21057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * the value is out of range, the function returns VA_STATUS_ERROR_ATTR_NOT_SUPPORTED 21067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 21077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define CLAMP_ATTR(a,max,min) (a>max?max:(a<min?min:a)) 2108dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunVAStatus psb_SetDisplayAttributes( 21092befccec034c13d34746a9e87149889d59ac767bFei Jiang VADriverContextP ctx, 21102befccec034c13d34746a9e87149889d59ac767bFei Jiang VADisplayAttribute *attr_list, 21112befccec034c13d34746a9e87149889d59ac767bFei Jiang int num_attributes 21122befccec034c13d34746a9e87149889d59ac767bFei Jiang) 21137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 21142befccec034c13d34746a9e87149889d59ac767bFei Jiang INIT_DRIVER_DATA; 21157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 2116dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun struct psb_texture_s *texture_priv = &driver_data->ctexture_priv; 2117dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun PsbPortPrivPtr overlay_priv = (PsbPortPrivPtr)(&driver_data->coverlay_priv); 211867612a448651896b2557796ff98d46c5e0dbbdc6hding int j, k; 21192befccec034c13d34746a9e87149889d59ac767bFei Jiang 21206d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_INVALID_PARAM(attr_list == NULL); 21217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2122dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun VADisplayAttribute *p = attr_list; 2123dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int i, update_coeffs = 0; 212494ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding float *p_tmp; 2125dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2126dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (num_attributes <= 0) { 21277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_INVALID_PARAMETER; 21287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 21297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2130bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang for (i = 0; i < num_attributes; i++) { 21317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang switch (p->type) { 21322befccec034c13d34746a9e87149889d59ac767bFei Jiang case VADisplayAttribBrightness: 2133dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* 0~100 ==> -50*(1<<10) ~ 50*(1<<10)*/ 2134dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun driver_data->brightness.value = (p->value - 50) * (1 << 10); 2135dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* 0~100 ==> -50~50 */ 2136dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay_priv->brightness.Value = texture_priv->brightness.Value = p->value - 50; 21372befccec034c13d34746a9e87149889d59ac767bFei Jiang update_coeffs = 1; 21382befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 21392befccec034c13d34746a9e87149889d59ac767bFei Jiang case VADisplayAttribContrast: 2140dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* 0~100 ==> 0 ~ 2*(1<<25) */ 2141dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun driver_data->contrast.value = (p->value / 50) * (1 << 25); 2142dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* 0~100 ==> -100~100 */ 2143dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay_priv->contrast.Value = texture_priv->contrast.Value = p->value * 2 - 100; 21442befccec034c13d34746a9e87149889d59ac767bFei Jiang update_coeffs = 1; 21452befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 21462befccec034c13d34746a9e87149889d59ac767bFei Jiang case VADisplayAttribHue: 2147dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* 0~100 ==> -30*(1<<25) ~ 30*(1<<25) */ 2148dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun driver_data->hue.value = ((p->value * 2 - 100) * 3 / 10) * (1 << 25); 2149dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* 0~100 ==> -30~30 */ 2150dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay_priv->hue.Value = texture_priv->hue.Value = (p->value * 2 - 100) * 3 / 10; 21512befccec034c13d34746a9e87149889d59ac767bFei Jiang update_coeffs = 1; 21522befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 21532befccec034c13d34746a9e87149889d59ac767bFei Jiang case VADisplayAttribSaturation: 2154dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* 0~100 ==> 0 ~ 2*(1<<25) */ 2155dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun driver_data->contrast.value = (p->value / 50) * (1 << 25); 2156dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* 0~100 ==> 100~200 */ 2157dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun overlay_priv->saturation.Value = texture_priv->saturation.Value = p->value + 100; 21582befccec034c13d34746a9e87149889d59ac767bFei Jiang update_coeffs = 1; 21592befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 21602befccec034c13d34746a9e87149889d59ac767bFei Jiang case VADisplayAttribBackgroundColor: 21612befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->clear_color = p->value; 21622befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 21632befccec034c13d34746a9e87149889d59ac767bFei Jiang case VADisplayAttribOutofLoopDeblock: 21642befccec034c13d34746a9e87149889d59ac767bFei Jiang driver_data->is_oold = p->value; 21652befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 21662befccec034c13d34746a9e87149889d59ac767bFei Jiang case VADisplayAttribRotation: 2167ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan driver_data->va_rotate = p->value; 216835405e1aaaefd5bb307ba7f7161e138a86880020Kun Wang driver_data->rotation_dirty |= PSB_NEW_VA_ROTATION; 21694b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo break; 2170242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang 2171dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VADisplayAttribCSCMatrix: 2172dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun driver_data->load_csc_matrix = 1; 217394ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding p_tmp = (float *)(p->attrib_ptr); 217467612a448651896b2557796ff98d46c5e0dbbdc6hding for (j = 0; j < CSC_MATRIX_Y; j++) 217567612a448651896b2557796ff98d46c5e0dbbdc6hding for (k = 0; k < CSC_MATRIX_X; k++) { 217667612a448651896b2557796ff98d46c5e0dbbdc6hding if (p_tmp) 217767612a448651896b2557796ff98d46c5e0dbbdc6hding driver_data->csc_matrix[j][k] = *p_tmp; 217867612a448651896b2557796ff98d46c5e0dbbdc6hding p_tmp++; 217967612a448651896b2557796ff98d46c5e0dbbdc6hding } 218094ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding 218194ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding for (j = 0; j < CSC_MATRIX_Y; j++) 218294ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding for (k = 0; k < CSC_MATRIX_X; k++) { 218394ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding if (fabs(s601[j*CSC_MATRIX_X+k] - driver_data->csc_matrix[j][k]) > 1e-6) { 218494ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding break; 218594ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding } 218694ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding if (k < CSC_MATRIX_X) { 218794ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding break; 218894ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding } 218994ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding } 219094ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding 219194ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding if (j == CSC_MATRIX_Y && k == CSC_MATRIX_X) { 219294ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding driver_data->is_BT601 = 1; 219394ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding } 219494ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding break; 219594ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding 219694ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding case VADisplayAttribColorRange: 219794ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding driver_data->set_video_range = 1; 219894ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding driver_data->video_range = (p->value == VA_SOURCE_RANGE_FULL); 2199dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 2200242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang 22014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo case VADisplayAttribBlendColor: 22024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo driver_data->blend_color = p->value; 22034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo break; 2204bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang case VADisplayAttribOverlayColorKey: 2205bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang overlay_priv->colorKey = driver_data->color_key = p->value; 2206bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang break; 2207bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang case VADisplayAttribOverlayAutoPaintColorKey: 2208bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang driver_data->overlay_auto_paint_color_key = p->value; 2209bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang break; 2210242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang 2211bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang case VADisplayAttribRenderDevice: 2212bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang driver_data->render_device = p->value & VA_RENDER_DEVICE_MASK; 2213bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang case VADisplayAttribRenderMode: 22140f58bd9727497db363668fb74af8b09a404283b0Fei Jiang#ifndef ANDROID 2215bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang if (p->value & VA_RENDER_MODE_EXTERNAL_GPU) { 2216c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "%s:Invalid parameter.VARenderModeExternalGPU is not supported.\n", __FUNCTION__); 2217bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang return VA_STATUS_ERROR_INVALID_PARAMETER; 2218bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang } 2219bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang if (((p->value & VA_RENDER_MODE_LOCAL_OVERLAY) && (p->value & VA_RENDER_MODE_LOCAL_GPU)) || 22203f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang ((p->value & VA_RENDER_MODE_EXTERNAL_OVERLAY) && (p->value & VA_RENDER_MODE_EXTERNAL_GPU))) { 2221c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "%s:Invalid parameter. Conflict setting for VADisplayAttribRenderMode.\n", __FUNCTION__); 2222bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang return VA_STATUS_ERROR_INVALID_PARAMETER; 2223bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang } 22240f58bd9727497db363668fb74af8b09a404283b0Fei Jiang#endif 2225bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang driver_data->render_mode = p->value & VA_RENDER_MODE_MASK; 2226bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang break; 2227bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang case VADisplayAttribRenderRect: 222894ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding driver_data->render_rect.x = ((VARectangle *)(p->attrib_ptr))->x; 222994ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding driver_data->render_rect.y = ((VARectangle *)(p->attrib_ptr))->y; 223094ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding driver_data->render_rect.width = ((VARectangle *)(p->attrib_ptr))->width; 223194ef7ebe0b0f58b76bf652ce74d09673c8918936Haitao Ding driver_data->render_rect.height = ((VARectangle *)(p->attrib_ptr))->height; 2232bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang break; 2233242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang 22342befccec034c13d34746a9e87149889d59ac767bFei Jiang default: 22352befccec034c13d34746a9e87149889d59ac767bFei Jiang break; 22367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 22377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang p++; 22387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 22397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 22407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (update_coeffs) { 22417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* TODO */ 2242dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#ifndef ANDROID 2243dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun texture_priv->update_coeffs = 1; 2244dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#endif 22457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 22467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 22477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 22487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 22492befccec034c13d34746a9e87149889d59ac767bFei Jiang 2250