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