psb_output_android.c revision c60d5b7bdb5616ca37e0b912c10725bec4320f33
1437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/*
2f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Copyright (c) 2011 Intel Corporation. All Rights Reserved.
3437b3eda28a4bf098efa80598cab67f190275266Fei 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:
1162eed835ef3be46cbdc2239b73f5b261b72bf1beKun 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.
1562eed835ef3be46cbdc2239b73f5b261b72bf1beKun 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 *    Zhaohan Ren  <zhaohan.ren@intel.com>
26bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *    Shengquan Yuan  <shengquan.yuan@intel.com>
27bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *    Jiang Fei <jiang.fei@intel.com>
28bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *    Binglin Chen <binglin.chen@intel.com>
29bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *
30bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang */
31bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang
32437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <va/va_backend.h>
33437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_output.h"
34437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_surface.h"
35437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_buffer.h"
36437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_overlay.h"
37437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_texture.h"
38437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <stdio.h>
39437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <string.h>
40437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <stdarg.h>
41437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_android_glue.h"
42dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#include "psb_texstreaming.h"
4365174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan#include "psb_output_android.h"
4454752e65b02b1a84c491e3f9c964046faeea306eKun Wang#include "psb_HDMIExtMode.h"
45f91c8768670386683a281cc39141e21bdda9c97fKun Wang#include "pnw_rotate.h"
46c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang#include "psb_drv_debug.h"
47437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <wsbm/wsbm_manager.h>
4854752e65b02b1a84c491e3f9c964046faeea306eKun Wang#include <psb_drm.h>
49f91c8768670386683a281cc39141e21bdda9c97fKun Wang#include <hardware.h>
50437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
512befccec034c13d34746a9e87149889d59ac767bFei Jiang#define INIT_DRIVER_DATA    psb_driver_data_p driver_data = (psb_driver_data_p) ctx->pDriverData;
522befccec034c13d34746a9e87149889d59ac767bFei Jiang#define INIT_OUTPUT_PRIV    psb_android_output_p output = (psb_android_output_p)(((psb_driver_data_p)ctx->pDriverData)->ws_priv)
53437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
542befccec034c13d34746a9e87149889d59ac767bFei Jiang#define SURFACE(id) ((object_surface_p) object_heap_lookup( &driver_data->surface_heap, id ))
55437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define BUFFER(id)  ((object_buffer_p) object_heap_lookup( &driver_data->buffer_heap, id ))
56437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define IMAGE(id)  ((object_image_p) object_heap_lookup( &driver_data->image_heap, id ))
57437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define SUBPIC(id)  ((object_subpic_p) object_heap_lookup( &driver_data->subpic_heap, id ))
58437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define CONTEXT(id) ((object_context_p) object_heap_lookup( &driver_data->context_heap, id ))
59437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
600da1930627209986e8db220799a690f816494401Austin Yuan#define GET_SURFACE_INFO_rotate(psb_surface) ((int) psb_surface->extra_info[5])
610da1930627209986e8db220799a690f816494401Austin Yuan#define GET_SURFACE_INFO_protect(psb_surface) ((int) psb_surface->extra_info[6])
6209998e330bbcbf835798128768e590772f5a5737Shuduo Sang#define MAX_OVERLAY_IDLE_FRAME 4
630da1930627209986e8db220799a690f816494401Austin Yuan
645fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wangenum {
655fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang    eWidiOff             = 1,
665fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang    eWidiClone           = 2,
675fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang    eWidiExtendedVideo   = 3,
685fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang};
6962eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wangextern unsigned int update_forced;
702befccec034c13d34746a9e87149889d59ac767bFei Jiang
71f91c8768670386683a281cc39141e21bdda9c97fKun Wanginline int va2hw_rotation(int va_rotate)
72f91c8768670386683a281cc39141e21bdda9c97fKun Wang{
73f91c8768670386683a281cc39141e21bdda9c97fKun Wang    switch (va_rotate) {
74f91c8768670386683a281cc39141e21bdda9c97fKun Wang    case VA_ROTATION_90:
75f91c8768670386683a281cc39141e21bdda9c97fKun Wang        return HAL_TRANSFORM_ROT_270;
76f91c8768670386683a281cc39141e21bdda9c97fKun Wang    case VA_ROTATION_180:
77f91c8768670386683a281cc39141e21bdda9c97fKun Wang        return HAL_TRANSFORM_ROT_180;
782d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang    case VA_ROTATION_270:
79f91c8768670386683a281cc39141e21bdda9c97fKun Wang        return HAL_TRANSFORM_ROT_90;
8062eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wangdefaut:
81f91c8768670386683a281cc39141e21bdda9c97fKun Wang        return 0;
82f91c8768670386683a281cc39141e21bdda9c97fKun Wang    }
83f91c8768670386683a281cc39141e21bdda9c97fKun Wang
84f91c8768670386683a281cc39141e21bdda9c97fKun Wang    return 0;
85f91c8768670386683a281cc39141e21bdda9c97fKun Wang}
86f91c8768670386683a281cc39141e21bdda9c97fKun Wang
87e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wangunsigned char *psb_android_output_init(VADriverContextP ctx)
88437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
89437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_DRIVER_DATA;
902befccec034c13d34746a9e87149889d59ac767bFei Jiang    char put_surface[1024];
9154752e65b02b1a84c491e3f9c964046faeea306eKun Wang    struct drm_psb_register_rw_arg regs;
922befccec034c13d34746a9e87149889d59ac767bFei Jiang    psb_android_output_p output = calloc(1, sizeof(psb_android_output_s));
93ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    struct fb_var_screeninfo vinfo;
942befccec034c13d34746a9e87149889d59ac767bFei Jiang    int fbfd = -1;
952befccec034c13d34746a9e87149889d59ac767bFei Jiang    int ret;
96437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
972befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (output == NULL) {
98c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "Can't malloc memory\n");
99ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        return NULL;
100437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
1010da1930627209986e8db220799a690f816494401Austin Yuan    memset(output, 0, sizeof(psb_android_output_s));
102437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1032befccec034c13d34746a9e87149889d59ac767bFei Jiang    /* Guess the screen size */
1042befccec034c13d34746a9e87149889d59ac767bFei Jiang    output->screen_width = 800;
1052befccec034c13d34746a9e87149889d59ac767bFei Jiang    output->screen_height = 480;
106437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1072befccec034c13d34746a9e87149889d59ac767bFei Jiang    // Open the frame buffer for reading
1080da1930627209986e8db220799a690f816494401Austin Yuan    memset(&vinfo, 0, sizeof(vinfo));
1092befccec034c13d34746a9e87149889d59ac767bFei Jiang    fbfd = open("/dev/graphics/fb0", O_RDONLY);
1102befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (fbfd) {
111dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo))
112c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "Error reading screen information.\n");
1132befccec034c13d34746a9e87149889d59ac767bFei Jiang    }
1142befccec034c13d34746a9e87149889d59ac767bFei Jiang    close(fbfd);
1152befccec034c13d34746a9e87149889d59ac767bFei Jiang    output->screen_width = vinfo.xres;
1162befccec034c13d34746a9e87149889d59ac767bFei Jiang    output->screen_height = vinfo.yres;
1173ec8b9246e4ac0f5d61b3f884bdc34775d72cd68Jason Hu    output->mInitialized_mdclient = 0;
1182f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
1192f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    /* TS by default */
120751400dde1eac64dd41c7de33fcddf8a939e4ab2hding    driver_data->output_method = PSB_PUTSURFACE_OVERLAY;
12162eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang    driver_data->color_key = 0x000001; /*light blue*/
122437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1238803df709aec9d485d757c681791d708f9a88fe6Austin Yuan    if (psb_parse_config("PSB_VIDEO_CTEXTURES", &put_surface[0]) == 0) {
124c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB_VIDEO_CTEXTURES is enabled for vaPutSurfaceBuf\n");
1258803df709aec9d485d757c681791d708f9a88fe6Austin Yuan        driver_data->ctexture = 1; /* Init CTEXTURE for vaPutSurfaceBuf */
1268803df709aec9d485d757c681791d708f9a88fe6Austin Yuan    }
127dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
128bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    if (psb_parse_config("PSB_VIDEO_COVERLAY", &put_surface[0]) == 0) {
129c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Putsurface use client overlay\n");
1302befccec034c13d34746a9e87149889d59ac767bFei Jiang        driver_data->output_method = PSB_PUTSURFACE_FORCE_COVERLAY;
13154752e65b02b1a84c491e3f9c964046faeea306eKun Wang    }
13254752e65b02b1a84c491e3f9c964046faeea306eKun Wang
1333ec8b9246e4ac0f5d61b3f884bdc34775d72cd68Jason Hu    if (IS_MFLD(driver_data))
134dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        driver_data->coverlay = 1;
135dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
136e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    return (unsigned char *)output;
137437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
138437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1392befccec034c13d34746a9e87149889d59ac767bFei JiangVAStatus psb_android_output_deinit(VADriverContextP ctx)
140437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
14154752e65b02b1a84c491e3f9c964046faeea306eKun Wang    INIT_DRIVER_DATA;
14265174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan    INIT_OUTPUT_PRIV;
1432befccec034c13d34746a9e87149889d59ac767bFei Jiang    //psb_android_output_p output = GET_OUTPUT_DATA(ctx);
1443ec8b9246e4ac0f5d61b3f884bdc34775d72cd68Jason Hu    if (output->mInitialized_mdclient) {
145cfc668eacb1652c56048e5d656f664216ad54132Jason Hu        deinitMDC(output);
1463ec8b9246e4ac0f5d61b3f884bdc34775d72cd68Jason Hu        output->mInitialized_mdclient = 0;
1473ec8b9246e4ac0f5d61b3f884bdc34775d72cd68Jason Hu    }
1482befccec034c13d34746a9e87149889d59ac767bFei Jiang
1492befccec034c13d34746a9e87149889d59ac767bFei Jiang    return VA_STATUS_SUCCESS;
150437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
151437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1522befccec034c13d34746a9e87149889d59ac767bFei Jiangstatic VAStatus psb_putsurface_ctexture(
153437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VADriverContextP ctx,
154437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VASurfaceID surface,
155437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned char* data,
156437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcx,
157437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcy,
158437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short srcw,
159437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short srch,
160437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short destx,
161437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short desty,
162437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short destw,
163437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short desth,
164437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned int flags /* de-interlacing flags */
165437b3eda28a4bf098efa80598cab67f190275266Fei Jiang)
166437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
167437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_DRIVER_DATA;
1682befccec034c13d34746a9e87149889d59ac767bFei Jiang    INIT_OUTPUT_PRIV;
169437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_surface_p obj_surface = SURFACE(surface);
1702befccec034c13d34746a9e87149889d59ac767bFei Jiang    int offset = 0;
1712befccec034c13d34746a9e87149889d59ac767bFei Jiang    psb_surface_p psb_surface;
172437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1732befccec034c13d34746a9e87149889d59ac767bFei Jiang    obj_surface = SURFACE(surface);
1742befccec034c13d34746a9e87149889d59ac767bFei Jiang    psb_surface = obj_surface->psb_surface;
175437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
17654752e65b02b1a84c491e3f9c964046faeea306eKun Wang    //    psb_surface->buf.drm_buf;
17754752e65b02b1a84c491e3f9c964046faeea306eKun Wang    //    psb_surface->buf.pl_flags;
17854752e65b02b1a84c491e3f9c964046faeea306eKun Wang    psb_putsurface_textureblit(ctx, data, surface, srcx, srcy, srcw, srch,
17954752e65b02b1a84c491e3f9c964046faeea306eKun Wang                               destx, desty, destw, desth, 0, /* no subtitle */
180dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               obj_surface->width, obj_surface->height,
181dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               psb_surface->stride, psb_surface->buf.drm_buf,
182bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                               psb_surface->buf.pl_flags, 1 /* need wrap dst */);
1832befccec034c13d34746a9e87149889d59ac767bFei Jiang
1842befccec034c13d34746a9e87149889d59ac767bFei Jiang    psb_android_postBuffer(offset);
18554752e65b02b1a84c491e3f9c964046faeea306eKun Wang
1861f0ceeab52f69a9f6fc8817502fae178117292a7Bruce Beare    return VA_STATUS_SUCCESS;
187437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
188437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1892befccec034c13d34746a9e87149889d59ac767bFei JiangVAStatus psb_putsurface_coverlay(
190437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VADriverContextP ctx,
191437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VASurfaceID surface,
192437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcx,
193437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcy,
194437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short srcw,
195437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short srch,
1962befccec034c13d34746a9e87149889d59ac767bFei Jiang    short destx, /* screen cooridination */
197437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short desty,
198437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short destw,
199437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short desth,
200437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned int flags /* de-interlacing flags */
201437b3eda28a4bf098efa80598cab67f190275266Fei Jiang)
202437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
2032befccec034c13d34746a9e87149889d59ac767bFei Jiang    INIT_OUTPUT_PRIV;
204437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
205dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2062befccec034c13d34746a9e87149889d59ac767bFei Jiang    /* USE_FIT_SCR_SIZE */
2072befccec034c13d34746a9e87149889d59ac767bFei Jiang    /* calculate fit screen size of frame */
2082befccec034c13d34746a9e87149889d59ac767bFei Jiang    unsigned short _scr_x = output->screen_width;
2092befccec034c13d34746a9e87149889d59ac767bFei Jiang    unsigned short _scr_y = output->screen_height;
210dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    float _slope_xy = (float)srch / srcw;
211dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    unsigned short _destw = (short)(_scr_y / _slope_xy);
212dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    unsigned short _desth = (short)(_scr_x * _slope_xy);
2132befccec034c13d34746a9e87149889d59ac767bFei Jiang    short _pos_x, _pos_y;
214dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2152befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (_destw <= _scr_x) {
2162befccec034c13d34746a9e87149889d59ac767bFei Jiang        _desth = _scr_y;
217dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        _pos_x = (_scr_x - _destw) >> 1;
2182befccec034c13d34746a9e87149889d59ac767bFei Jiang        _pos_y = 0;
2192befccec034c13d34746a9e87149889d59ac767bFei Jiang    } else {
2202befccec034c13d34746a9e87149889d59ac767bFei Jiang        _destw = _scr_x;
2212befccec034c13d34746a9e87149889d59ac767bFei Jiang        _pos_x = 0;
222dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        _pos_y = (_scr_y - _desth) >> 1;
223437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
2242befccec034c13d34746a9e87149889d59ac767bFei Jiang    destx += _pos_x;
2252befccec034c13d34746a9e87149889d59ac767bFei Jiang    desty += _pos_y;
2262befccec034c13d34746a9e87149889d59ac767bFei Jiang    destw = _destw;
2272befccec034c13d34746a9e87149889d59ac767bFei Jiang    desth = _desth;
228437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
229c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_putsurface_overlay: src (%d, %d, %d, %d), destx (%d, %d, %d, %d).\n",
23054752e65b02b1a84c491e3f9c964046faeea306eKun Wang                             srcx, srcy, srcw, srch, destx, desty, destw, desth);
2312befccec034c13d34746a9e87149889d59ac767bFei Jiang    /* display by overlay */
2322befccec034c13d34746a9e87149889d59ac767bFei Jiang    vaStatus = psb_putsurface_overlay(
233dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                   ctx, surface, srcx, srcy, srcw, srch,
234dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                   destx, desty, destw, desth, /* screen coordinate */
235dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                   flags, OVERLAY_A, PIPEA);
236437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
2372befccec034c13d34746a9e87149889d59ac767bFei Jiang    return vaStatus;
238437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
239437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
2400da1930627209986e8db220799a690f816494401Austin Yuanstatic int psb_update_destbox(
2410da1930627209986e8db220799a690f816494401Austin Yuan    VADriverContextP ctx
2420da1930627209986e8db220799a690f816494401Austin Yuan)
2430da1930627209986e8db220799a690f816494401Austin Yuan{
2440da1930627209986e8db220799a690f816494401Austin Yuan    INIT_DRIVER_DATA;
2450da1930627209986e8db220799a690f816494401Austin Yuan    INIT_OUTPUT_PRIV;
2460da1930627209986e8db220799a690f816494401Austin Yuan    short destx;
2470da1930627209986e8db220799a690f816494401Austin Yuan    short desty;
2480da1930627209986e8db220799a690f816494401Austin Yuan    unsigned short destw;
2490da1930627209986e8db220799a690f816494401Austin Yuan    unsigned short desth;
2500da1930627209986e8db220799a690f816494401Austin Yuan    VAStatus vaStatus = VA_STATUS_SUCCESS;
2510da1930627209986e8db220799a690f816494401Austin Yuan
2520da1930627209986e8db220799a690f816494401Austin Yuan    psb_android_get_destbox(&destx, &desty, &destw, &desth);
253c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    /*drv_debug_msg(VIDEO_DEBUG_GENERAL, "destbox = (%d,%d,%d,%d)\n", destx, desty, destw, desth);*/
2540da1930627209986e8db220799a690f816494401Austin Yuan    if ((destx >= 0) && (desty >= 0) &&
2553f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        ((destx + destw) <= output->screen_width) &&
2563f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        ((desty + desth) <= output->screen_height) &&
2573f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        (output->destx != destx ||
2583f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang         output->desty != desty ||
2593f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang         output->destw != destw ||
2603f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang         output->desth != desth)) {
2610da1930627209986e8db220799a690f816494401Austin Yuan        output->destx = destx;
2620da1930627209986e8db220799a690f816494401Austin Yuan        output->desty = desty;
2630da1930627209986e8db220799a690f816494401Austin Yuan        output->destw = destw;
2640da1930627209986e8db220799a690f816494401Austin Yuan        output->desth = desth;
2654338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang        output->new_destbox = 1;
2660da1930627209986e8db220799a690f816494401Austin Yuan
2670da1930627209986e8db220799a690f816494401Austin Yuan        LOGD("==========New Destbox=============\n");
2680da1930627209986e8db220799a690f816494401Austin Yuan        LOGD("output->destbox = (%d,%d,%d,%d)\n", output->destx, output->desty, output->destw, output->desth);
2690da1930627209986e8db220799a690f816494401Austin Yuan    }
2700da1930627209986e8db220799a690f816494401Austin Yuan
2710da1930627209986e8db220799a690f816494401Austin Yuan    return vaStatus;
2720da1930627209986e8db220799a690f816494401Austin Yuan}
273ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
274ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuanstatic int psb_check_outputmethod(
275ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    VADriverContextP ctx,
276ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    VASurfaceID surface,
27788c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang    unsigned short srcw,
27888c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang    unsigned short srch,
279ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    void *android_isurface,
2800da1930627209986e8db220799a690f816494401Austin Yuan    psb_hdmi_mode *hdmi_mode
281ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan)
282ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan{
283ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    INIT_DRIVER_DATA;
284ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    INIT_OUTPUT_PRIV;
285ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    psb_HDMIExt_info_p psb_HDMIExt_info = (psb_HDMIExt_info_p)output->psb_HDMIExt_info;
2860da1930627209986e8db220799a690f816494401Austin Yuan    object_surface_p obj_surface;
2875fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang    int rotation = 0, widi = 0;
2882d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang    int delta_rotation = 0;
2892d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang    int srf_rotate; /* primary surface rotation */
2902d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang    psb_surface_p rotate_surface; /* rotate surface */
2912d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang    int rotate_srf_rotate = -1; /* degree of the rotate surface */
292ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
29388c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang    if ((srcw >= 2048) || (srch >= 2048)) {
294c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Clip size extend overlay hw limit, use texstreaming\n");
29588c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang        driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING;
29688c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang        return 0;
29788c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang    }
29888c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang
299ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /* use saved status to avoid per-frame checking */
300ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    if ((driver_data->frame_count % driver_data->outputmethod_checkinterval) != 0) {
301ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        *hdmi_mode = psb_HDMIExt_get_mode(output);
302ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        return 0;
303ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    }
304ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
305ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /* check the status at outputmethod_checkinterval frequency */
306ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /* at first check HDMI status */
307ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    if (psb_HDMIExt_update(ctx, psb_HDMIExt_info)) {
308c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "%s: Failed to update HDMIExt info.\n", __FUNCTION__);
3090da1930627209986e8db220799a690f816494401Austin Yuan        return -1;
310ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    }
311ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
312ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    *hdmi_mode = psb_HDMIExt_get_mode(output);
3130a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang    if ((*hdmi_mode == EXTENDED_VIDEO) || (*hdmi_mode == CLONE)) {
314dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        unsigned short _destw, _desth;
315dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        short _pos_x, _pos_y;
316dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        unsigned short crtc_width = 0, crtc_height = 0;
3170a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang        float _slope_xy;
3180a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang
3190a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang        /* need to handle VA rotation, and set WM rotate to 0
3200a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang         * for Android, MIPI0/HDMI has the same WM rotation always
3210a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang         */
322fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        if (driver_data->mipi0_rotation != 0 || driver_data->rotation_dirty != 0) {
3230a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang            driver_data->mipi0_rotation = 0;
3240a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang            driver_data->hdmi_rotation = 0;
325fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            driver_data->rotation_dirty = 0;
3260a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang            output->new_destbox = 1;
327476f382b52ba06226b1ce473b56c388e6718e5e2Jason Hu            psb_RecalcRotate(ctx, CONTEXT(obj_surface->context_id));
3280a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang        }
329dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang
330dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        psb_HDMIExt_get_prop(output, &crtc_width, &crtc_height);
331dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang
332dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        /*recalculate the render box to fit the ratio of height/width*/
3330a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang        if ((driver_data->extend_rotation == VA_ROTATION_90) ||
3340a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang            (driver_data->extend_rotation == VA_ROTATION_270))
3350a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang            _slope_xy = (float)srcw / srch;
3360a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang        else
3370a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang            _slope_xy = (float)srch / srcw;
3380a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang
339dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        _destw = (short)(crtc_height / _slope_xy);
340dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        _desth = (short)(crtc_width * _slope_xy);
341dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        if (_destw <= crtc_width) {
342dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang            _desth = crtc_height;
343dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang            _pos_x = (crtc_width - _destw) >> 1;
344dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang            _pos_y = 0;
345dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        } else {
346dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang            _destw = crtc_width;
347dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang            _pos_x = 0;
348dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang            _pos_y = (crtc_height - _desth) >> 1;
349dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        }
350dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        driver_data->render_rect.x = _pos_x;
351dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        driver_data->render_rect.y = _pos_y;
352dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        driver_data->render_rect.width = _destw;
353dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        driver_data->render_rect.height = _desth;
354c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "HDMI mode is on (%d), Render Rect: (%d,%d,%d,%d)\n",
3552d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang                                 *hdmi_mode,
356ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                 driver_data->render_rect.x, driver_data->render_rect.y,
357ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                 driver_data->render_rect.width, driver_data->render_rect.height);
3580da1930627209986e8db220799a690f816494401Austin Yuan        return 0;
3595fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang    }
360ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
361fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    /* HDMI is not enabled */
362fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    psb_android_surfaceflinger_status(android_isurface, &output->sf_composition, &rotation, &widi);
3634338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang    /*Update output destbox using layerbuffer's visible region*/
3644338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang    psb_update_destbox(ctx);
3654338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang
3664338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang    if ((driver_data->output_method == PSB_PUTSURFACE_FORCE_COVERLAY)
367f91c8768670386683a281cc39141e21bdda9c97fKun Wang        || (driver_data->output_method == PSB_PUTSURFACE_FORCE_TEXSTREAMING))
3684338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang        return 0;
3694338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang
3704338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang    /*If overlay can not get correct destbox, use texstreaming.*/
371605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang    if (output->destw == 0 || output->desth == 0 ||
372605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang        ((output->destw == srcw) && (output->desth == srch))) {
373c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "No proper destbox, use texstreaming (%dx%d+%d+%d)\n",
3742d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang                                 output->destw, output->desth, output->destx, output->desty);
3754338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang        driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING;
3764338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang        return 0;
3774338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang    }
3784338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang
3790da1930627209986e8db220799a690f816494401Austin Yuan    /* only care local rotation */
3802d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang    delta_rotation = Rotation2Angle(driver_data->mipi0_rotation) - Rotation2Angle(rotation);
3812d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang    if ((((abs(delta_rotation) == 90) || (abs(delta_rotation) == 270)) && output->new_destbox) ||
3822d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang        (abs(delta_rotation) == 180)) {
383c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "New rotation degree %d of MIPI0 WM, Need to recalc rotation\n", rotation);
384f91c8768670386683a281cc39141e21bdda9c97fKun Wang        driver_data->mipi0_rotation = rotation;
385f91c8768670386683a281cc39141e21bdda9c97fKun Wang        driver_data->hdmi_rotation = rotation;
38635405e1aaaefd5bb307ba7f7161e138a86880020Kun Wang        driver_data->rotation_dirty |= PSB_NEW_WM_ROTATION;
38735405e1aaaefd5bb307ba7f7161e138a86880020Kun Wang    }
38835405e1aaaefd5bb307ba7f7161e138a86880020Kun Wang    output->new_destbox = 0;
389f91c8768670386683a281cc39141e21bdda9c97fKun Wang
39035405e1aaaefd5bb307ba7f7161e138a86880020Kun Wang    if (driver_data->rotation_dirty != 0) {
391476f382b52ba06226b1ce473b56c388e6718e5e2Jason Hu        psb_RecalcRotate(ctx, CONTEXT(obj_surface->context_id));
39235405e1aaaefd5bb307ba7f7161e138a86880020Kun Wang        driver_data->rotation_dirty = 0;
3930da1930627209986e8db220799a690f816494401Austin Yuan    }
3940da1930627209986e8db220799a690f816494401Austin Yuan
3950da1930627209986e8db220799a690f816494401Austin Yuan    obj_surface = SURFACE(surface);
3960da1930627209986e8db220799a690f816494401Austin Yuan    if (GET_SURFACE_INFO_protect(obj_surface->psb_surface)) {
397c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Protected surface, use overlay\n");
3980da1930627209986e8db220799a690f816494401Austin Yuan        driver_data->output_method = PSB_PUTSURFACE_COVERLAY;
3990da1930627209986e8db220799a690f816494401Austin Yuan
4000da1930627209986e8db220799a690f816494401Austin Yuan        return 0;
4010da1930627209986e8db220799a690f816494401Austin Yuan    }
4020da1930627209986e8db220799a690f816494401Austin Yuan
403fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    if (widi == eWidiClone) {
404c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "WIDI in clone mode, use texstreaming\n");
405fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING;
406fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        driver_data->msvdx_rotate_want = 0;/* disable msvdx rotae */
407fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
408fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        return 0;
409fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    }
410fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    if (widi == eWidiExtendedVideo) {
411c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "WIDI in extend video mode, disable local displaying\n");
412fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        driver_data->output_method = PSB_PUTSURFACE_NONE;
413fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        driver_data->msvdx_rotate_want = 0;/* disable msvdx rotae */
414fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
415fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        return 0;
416fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    }
417fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
4180da1930627209986e8db220799a690f816494401Austin Yuan    if (output->sf_composition) {
419c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Composition is detected, use texstreaming\n");
4200da1930627209986e8db220799a690f816494401Austin Yuan        driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING;
4210da1930627209986e8db220799a690f816494401Austin Yuan        return 0;
4220da1930627209986e8db220799a690f816494401Austin Yuan    }
4230da1930627209986e8db220799a690f816494401Austin Yuan
4242d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang    srf_rotate = GET_SURFACE_INFO_rotate(obj_surface->psb_surface);
4252d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang    rotate_surface = obj_surface->psb_surface_rotate;
4262d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang    if (rotate_surface != NULL)
4272d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang        rotate_srf_rotate = GET_SURFACE_INFO_rotate(rotate_surface);
4280a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang
429c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "SF rotation %d, VA rotation %d, final MSVDX rotation %d\n",
4302d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang                             rotation, driver_data->va_rotate, driver_data->local_rotation);
431c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Primary surface rotation %d, rotated surface rotation %d\n",
4322d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang                             srf_rotate, rotate_srf_rotate);
4332d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang
4342d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang    /* The surface rotation is not same with the final rotation */
4350a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang    if ((driver_data->local_rotation != 0) &&
4362d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang        ((srf_rotate != driver_data->local_rotation) || (rotate_srf_rotate != driver_data->local_rotation))) {
437c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Use texstreaming due to different VA surface rotation and final rotaion\n",
4382d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang                                 srf_rotate, rotate_srf_rotate);
4392d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang        driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING;
4402d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang        return 0;
441ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    }
442ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
4430da1930627209986e8db220799a690f816494401Austin Yuan    driver_data->output_method = PSB_PUTSURFACE_COVERLAY;
4440da1930627209986e8db220799a690f816494401Austin Yuan
445ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    return 0;
446ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan}
447ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
4482befccec034c13d34746a9e87149889d59ac767bFei JiangVAStatus psb_PutSurface(
449437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VADriverContextP ctx,
450437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VASurfaceID surface,
4512befccec034c13d34746a9e87149889d59ac767bFei Jiang    void *android_isurface,
452437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcx,
453437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcy,
454437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short srcw,
455437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short srch,
456437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short destx,
457437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short desty,
458437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short destw,
459437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short desth,
460437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VARectangle *cliprects, /* client supplied clip list */
461437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned int number_cliprects, /* number of clip rects in the clip list */
462437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned int flags /* de-interlacing flags */
4632befccec034c13d34746a9e87149889d59ac767bFei Jiang)
464437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
465437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_DRIVER_DATA;
4662befccec034c13d34746a9e87149889d59ac767bFei Jiang    INIT_OUTPUT_PRIV;
467437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_surface_p obj_surface;
468437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
46954752e65b02b1a84c491e3f9c964046faeea306eKun Wang    PsbPortPrivPtr pPriv = (PsbPortPrivPtr)(&driver_data->coverlay_priv);
470751400dde1eac64dd41c7de33fcddf8a939e4ab2hding    int sf_composition = 0, i = 0;
4716e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang    int ret = 0;
472437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
473437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    obj_surface = SURFACE(surface);
474751400dde1eac64dd41c7de33fcddf8a939e4ab2hding
475751400dde1eac64dd41c7de33fcddf8a939e4ab2hding//    psb__dump_NV_buffers(obj_surface,srcx,srcy,srcw,srch);
476dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == obj_surface) {
477437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        vaStatus = VA_STATUS_ERROR_INVALID_SURFACE;
478437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        DEBUG_FAILURE;
479437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return vaStatus;
480437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
48154752e65b02b1a84c491e3f9c964046faeea306eKun Wang
482fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
4835fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang    if ((NULL == cliprects) && (0 != number_cliprects)) {
48488c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang        vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
48588c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang        DEBUG_FAILURE;
48688c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang        return vaStatus;
48788c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang    }
48888c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang
48954752e65b02b1a84c491e3f9c964046faeea306eKun Wang    if ((srcx < 0) || (srcx > obj_surface->width) || (srcw > (obj_surface->width - srcx)) ||
4903f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        (srcy < 0) || (srcy > obj_surface->height_origin) || (srch > (obj_surface->height_origin - srcy))) {
491c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "vaPutSurface: source rectangle passed from upper layer is not correct.\n");
49254752e65b02b1a84c491e3f9c964046faeea306eKun Wang        return VA_STATUS_ERROR_UNKNOWN;
49354752e65b02b1a84c491e3f9c964046faeea306eKun Wang    }
49454752e65b02b1a84c491e3f9c964046faeea306eKun Wang    if ((destx < 0) || (desty < 0)) {
495c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "vaPutSurface: dest rectangle passed from upper layer is not correct.\n");
4963f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan        return VA_STATUS_ERROR_UNKNOWN;
4973f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan    }
49854752e65b02b1a84c491e3f9c964046faeea306eKun Wang
4992befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (driver_data->dummy_putsurface) {
500c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "vaPutSurface: dummy mode, return directly\n");
5012befccec034c13d34746a9e87149889d59ac767bFei Jiang        return VA_STATUS_SUCCESS;
5022befccec034c13d34746a9e87149889d59ac767bFei Jiang    }
5032befccec034c13d34746a9e87149889d59ac767bFei Jiang
5046e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang    /* init overlay */
505751400dde1eac64dd41c7de33fcddf8a939e4ab2hding    if (!driver_data->coverlay_init) {
5066e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang        ret = psb_coverlay_init(ctx);
5076e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang        if (ret != 0) {
508c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "vaPutSurface: psb_coverlay_init failed. Fallback to texture streaming.\n");
5096e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang            driver_data->coverlay_init = 0;
5103f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        } else
5116e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang            driver_data->coverlay_init = 1;
51262eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang    }
51362eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang
5145b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang    /* set the current displaying video frame into kernel */
5156e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang    psb_surface_set_displaying(driver_data, obj_surface->width,
5166e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang                               obj_surface->height_origin,
5176e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang                               obj_surface->psb_surface);
5186e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang
519ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /* exit MRST path at first */
520ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    if (IS_MRST(driver_data)) {
521c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Force overlay to display\n");
522751400dde1eac64dd41c7de33fcddf8a939e4ab2hding        vaStatus = psb_putsurface_coverlay(ctx, surface,
523751400dde1eac64dd41c7de33fcddf8a939e4ab2hding                                           srcx, srcy, srcw, srch,
524751400dde1eac64dd41c7de33fcddf8a939e4ab2hding                                           destx, desty, destw, desth,
525751400dde1eac64dd41c7de33fcddf8a939e4ab2hding                                           flags);
526ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        return vaStatus;
52754752e65b02b1a84c491e3f9c964046faeea306eKun Wang    }
528ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
529b6b9c482c9c72f4e2bc90260813cc00b454e011dShuduo Sang    driver_data->ts_source_created = 1;
5300da1930627209986e8db220799a690f816494401Austin Yuan
5310da1930627209986e8db220799a690f816494401Austin Yuan    /* local video playback */
532c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "MIPI: Use overlay to display.\n");
53354752e65b02b1a84c491e3f9c964046faeea306eKun Wang
534751400dde1eac64dd41c7de33fcddf8a939e4ab2hding    /*initialize output destbox using default destbox if it has not been initialized until here.*/
535751400dde1eac64dd41c7de33fcddf8a939e4ab2hding    if (output->destw == 0 || output->desth == 0) {
536751400dde1eac64dd41c7de33fcddf8a939e4ab2hding        output->destx = (destx > 0) ? destx : 0;
537751400dde1eac64dd41c7de33fcddf8a939e4ab2hding        output->desty = (desty > 0) ? desty : 0;
538751400dde1eac64dd41c7de33fcddf8a939e4ab2hding        output->destw = ((output->destx + destw) > output->screen_width) ? (output->screen_width - output->destx) : destw;
539751400dde1eac64dd41c7de33fcddf8a939e4ab2hding        output->desth = ((output->desty + desth) > output->screen_height) ? (output->screen_height - output->desty) : desth;
5402befccec034c13d34746a9e87149889d59ac767bFei Jiang    }
541bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang
542c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Overlay position = (%d,%d,%d,%d)\n", output->destx, output->desty, output->destw, output->desth);
543751400dde1eac64dd41c7de33fcddf8a939e4ab2hding    vaStatus = psb_putsurface_overlay(ctx, surface,
544751400dde1eac64dd41c7de33fcddf8a939e4ab2hding                                      srcx, srcy, srcw, srch,
545751400dde1eac64dd41c7de33fcddf8a939e4ab2hding                                      output->destx, output->desty, output->destw, output->desth,
546751400dde1eac64dd41c7de33fcddf8a939e4ab2hding                                      flags, OVERLAY_A, PIPEA);
547cafec1db7e3fab84fe6908d9b4398e1867978e23Austin Yuan
548ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    driver_data->frame_count++;
549ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
5502f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    return vaStatus;
551437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
552