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