psb_output_android.c revision fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4
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"
46437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <wsbm/wsbm_manager.h>
4754752e65b02b1a84c491e3f9c964046faeea306eKun Wang#include <psb_drm.h>
48f91c8768670386683a281cc39141e21bdda9c97fKun Wang#include <hardware.h>
49437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
502befccec034c13d34746a9e87149889d59ac767bFei Jiang#define INIT_DRIVER_DATA    psb_driver_data_p driver_data = (psb_driver_data_p) ctx->pDriverData;
512befccec034c13d34746a9e87149889d59ac767bFei Jiang#define INIT_OUTPUT_PRIV    psb_android_output_p output = (psb_android_output_p)(((psb_driver_data_p)ctx->pDriverData)->ws_priv)
52437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
532befccec034c13d34746a9e87149889d59ac767bFei Jiang#define SURFACE(id) ((object_surface_p) object_heap_lookup( &driver_data->surface_heap, id ))
54437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define BUFFER(id)  ((object_buffer_p) object_heap_lookup( &driver_data->buffer_heap, id ))
55437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define IMAGE(id)  ((object_image_p) object_heap_lookup( &driver_data->image_heap, id ))
56437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define SUBPIC(id)  ((object_subpic_p) object_heap_lookup( &driver_data->subpic_heap, id ))
57437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define CONTEXT(id) ((object_context_p) object_heap_lookup( &driver_data->context_heap, id ))
58437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
590da1930627209986e8db220799a690f816494401Austin Yuan#define GET_SURFACE_INFO_rotate(psb_surface) ((int) psb_surface->extra_info[5])
600da1930627209986e8db220799a690f816494401Austin Yuan#define GET_SURFACE_INFO_protect(psb_surface) ((int) psb_surface->extra_info[6])
6109998e330bbcbf835798128768e590772f5a5737Shuduo Sang#define MAX_OVERLAY_IDLE_FRAME 4
620da1930627209986e8db220799a690f816494401Austin Yuan
635fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wangenum {
645fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang    eWidiOff             = 1,
655fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang    eWidiClone           = 2,
665fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang    eWidiExtendedVideo   = 3,
675fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang};
6862eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wangextern unsigned int update_forced;
692befccec034c13d34746a9e87149889d59ac767bFei Jiang
70f91c8768670386683a281cc39141e21bdda9c97fKun Wanginline int va2hw_rotation(int va_rotate)
71f91c8768670386683a281cc39141e21bdda9c97fKun Wang{
72f91c8768670386683a281cc39141e21bdda9c97fKun Wang    switch (va_rotate) {
73f91c8768670386683a281cc39141e21bdda9c97fKun Wang    case VA_ROTATION_90:
74f91c8768670386683a281cc39141e21bdda9c97fKun Wang        return HAL_TRANSFORM_ROT_270;
75f91c8768670386683a281cc39141e21bdda9c97fKun Wang    case VA_ROTATION_180:
76f91c8768670386683a281cc39141e21bdda9c97fKun Wang        return HAL_TRANSFORM_ROT_180;
772d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang    case VA_ROTATION_270:
78f91c8768670386683a281cc39141e21bdda9c97fKun Wang        return HAL_TRANSFORM_ROT_90;
7962eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wangdefaut:
80f91c8768670386683a281cc39141e21bdda9c97fKun Wang        return 0;
81f91c8768670386683a281cc39141e21bdda9c97fKun Wang    }
82f91c8768670386683a281cc39141e21bdda9c97fKun Wang
83f91c8768670386683a281cc39141e21bdda9c97fKun Wang    return 0;
84f91c8768670386683a281cc39141e21bdda9c97fKun Wang}
85f91c8768670386683a281cc39141e21bdda9c97fKun Wang
86e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wangunsigned char *psb_android_output_init(VADriverContextP ctx)
87437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
88437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_DRIVER_DATA;
892befccec034c13d34746a9e87149889d59ac767bFei Jiang    char put_surface[1024];
9054752e65b02b1a84c491e3f9c964046faeea306eKun Wang    struct drm_psb_register_rw_arg regs;
912befccec034c13d34746a9e87149889d59ac767bFei Jiang    psb_android_output_p output = calloc(1, sizeof(psb_android_output_s));
92ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    struct fb_var_screeninfo vinfo;
932befccec034c13d34746a9e87149889d59ac767bFei Jiang    int fbfd = -1;
942befccec034c13d34746a9e87149889d59ac767bFei Jiang    int ret;
95437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
962befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (output == NULL) {
972befccec034c13d34746a9e87149889d59ac767bFei Jiang        psb__error_message("Can't malloc memory\n");
98ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        return NULL;
99437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
1000da1930627209986e8db220799a690f816494401Austin Yuan    memset(output, 0, sizeof(psb_android_output_s));
101437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1022befccec034c13d34746a9e87149889d59ac767bFei Jiang    /* Guess the screen size */
1032befccec034c13d34746a9e87149889d59ac767bFei Jiang    output->screen_width = 800;
1042befccec034c13d34746a9e87149889d59ac767bFei Jiang    output->screen_height = 480;
105437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1062befccec034c13d34746a9e87149889d59ac767bFei Jiang    // Open the frame buffer for reading
1070da1930627209986e8db220799a690f816494401Austin Yuan    memset(&vinfo, 0, sizeof(vinfo));
1082befccec034c13d34746a9e87149889d59ac767bFei Jiang    fbfd = open("/dev/graphics/fb0", O_RDONLY);
1092befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (fbfd) {
110dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo))
111dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb__information_message("Error reading screen information.\n");
1122befccec034c13d34746a9e87149889d59ac767bFei Jiang    }
1132befccec034c13d34746a9e87149889d59ac767bFei Jiang    close(fbfd);
1142befccec034c13d34746a9e87149889d59ac767bFei Jiang    output->screen_width = vinfo.xres;
1152befccec034c13d34746a9e87149889d59ac767bFei Jiang    output->screen_height = vinfo.yres;
1162f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
1172f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    /* TS by default */
1182f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING;
11962eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang    driver_data->color_key = 0x000001; /*light blue*/
12062eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang    driver_data->overlay_idle_frame = 1;
121437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1228803df709aec9d485d757c681791d708f9a88fe6Austin Yuan    if (psb_parse_config("PSB_VIDEO_CTEXTURES", &put_surface[0]) == 0) {
1238803df709aec9d485d757c681791d708f9a88fe6Austin Yuan        psb__information_message("PSB_VIDEO_CTEXTURES is enabled for vaPutSurfaceBuf\n");
1248803df709aec9d485d757c681791d708f9a88fe6Austin Yuan        driver_data->ctexture = 1; /* Init CTEXTURE for vaPutSurfaceBuf */
1258803df709aec9d485d757c681791d708f9a88fe6Austin Yuan    }
126dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
12754752e65b02b1a84c491e3f9c964046faeea306eKun Wang    if (psb_parse_config("PSB_VIDEO_TS", &put_surface[0]) == 0) {
12854752e65b02b1a84c491e3f9c964046faeea306eKun Wang        psb__information_message("Putsurface use texstreaming\n");
12954752e65b02b1a84c491e3f9c964046faeea306eKun Wang        driver_data->output_method = PSB_PUTSURFACE_FORCE_TEXSTREAMING;
13054752e65b02b1a84c491e3f9c964046faeea306eKun Wang    }
13154752e65b02b1a84c491e3f9c964046faeea306eKun Wang
132bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    if (psb_parse_config("PSB_VIDEO_COVERLAY", &put_surface[0]) == 0) {
1332befccec034c13d34746a9e87149889d59ac767bFei Jiang        psb__information_message("Putsurface use client overlay\n");
1342befccec034c13d34746a9e87149889d59ac767bFei Jiang        driver_data->output_method = PSB_PUTSURFACE_FORCE_COVERLAY;
13554752e65b02b1a84c491e3f9c964046faeea306eKun Wang    }
13654752e65b02b1a84c491e3f9c964046faeea306eKun Wang
13754752e65b02b1a84c491e3f9c964046faeea306eKun Wang    if (IS_MFLD(driver_data)) {
138dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        driver_data->coverlay = 1;
13965174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan        output->psb_HDMIExt_info = psb_HDMIExt_init(ctx, output);
14065174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan        if (!output->psb_HDMIExt_info) {
14154752e65b02b1a84c491e3f9c964046faeea306eKun Wang            psb__error_message("Failed to init psb_HDMIExt.\n");
142ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan            free(output);
143ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan            return NULL;
14454752e65b02b1a84c491e3f9c964046faeea306eKun Wang        }
145dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
146dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
147e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    return (unsigned char *)output;
148437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
149437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1502befccec034c13d34746a9e87149889d59ac767bFei JiangVAStatus psb_android_output_deinit(VADriverContextP ctx)
151437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
15254752e65b02b1a84c491e3f9c964046faeea306eKun Wang    INIT_DRIVER_DATA;
15365174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan    INIT_OUTPUT_PRIV;
1542befccec034c13d34746a9e87149889d59ac767bFei Jiang    //psb_android_output_p output = GET_OUTPUT_DATA(ctx);
15565174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan    if (IS_MFLD(driver_data)) {
15665174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan        psb_HDMIExt_deinit(output);
15765174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan    }
1582befccec034c13d34746a9e87149889d59ac767bFei Jiang
1592befccec034c13d34746a9e87149889d59ac767bFei Jiang    return VA_STATUS_SUCCESS;
160437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
161437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1622befccec034c13d34746a9e87149889d59ac767bFei Jiangstatic VAStatus psb_putsurface_ctexture(
163437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VADriverContextP ctx,
164437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VASurfaceID surface,
165437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned char* data,
166437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcx,
167437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcy,
168437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short srcw,
169437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short srch,
170437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short destx,
171437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short desty,
172437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short destw,
173437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short desth,
174437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned int flags /* de-interlacing flags */
175437b3eda28a4bf098efa80598cab67f190275266Fei Jiang)
176437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
177437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_DRIVER_DATA;
1782befccec034c13d34746a9e87149889d59ac767bFei Jiang    INIT_OUTPUT_PRIV;
179437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_surface_p obj_surface = SURFACE(surface);
1802befccec034c13d34746a9e87149889d59ac767bFei Jiang    int offset = 0;
1812befccec034c13d34746a9e87149889d59ac767bFei Jiang    psb_surface_p psb_surface;
182437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1832befccec034c13d34746a9e87149889d59ac767bFei Jiang    obj_surface = SURFACE(surface);
1842befccec034c13d34746a9e87149889d59ac767bFei Jiang    psb_surface = obj_surface->psb_surface;
185437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
18654752e65b02b1a84c491e3f9c964046faeea306eKun Wang    //    psb_surface->buf.drm_buf;
18754752e65b02b1a84c491e3f9c964046faeea306eKun Wang    //    psb_surface->buf.pl_flags;
18854752e65b02b1a84c491e3f9c964046faeea306eKun Wang    psb_putsurface_textureblit(ctx, data, surface, srcx, srcy, srcw, srch,
18954752e65b02b1a84c491e3f9c964046faeea306eKun Wang                               destx, desty, destw, desth, 0, /* no subtitle */
190dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               obj_surface->width, obj_surface->height,
191dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               psb_surface->stride, psb_surface->buf.drm_buf,
192bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                               psb_surface->buf.pl_flags, 1 /* need wrap dst */);
1932befccec034c13d34746a9e87149889d59ac767bFei Jiang
1942befccec034c13d34746a9e87149889d59ac767bFei Jiang    psb_android_postBuffer(offset);
19554752e65b02b1a84c491e3f9c964046faeea306eKun Wang
1961f0ceeab52f69a9f6fc8817502fae178117292a7Bruce Beare    return VA_STATUS_SUCCESS;
197437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
198437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1992befccec034c13d34746a9e87149889d59ac767bFei JiangVAStatus psb_putsurface_coverlay(
200437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VADriverContextP ctx,
201437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VASurfaceID surface,
202437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcx,
203437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcy,
204437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short srcw,
205437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short srch,
2062befccec034c13d34746a9e87149889d59ac767bFei Jiang    short destx, /* screen cooridination */
207437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short desty,
208437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short destw,
209437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short desth,
210437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned int flags /* de-interlacing flags */
211437b3eda28a4bf098efa80598cab67f190275266Fei Jiang)
212437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
2132befccec034c13d34746a9e87149889d59ac767bFei Jiang    INIT_OUTPUT_PRIV;
214437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
215dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2162befccec034c13d34746a9e87149889d59ac767bFei Jiang    /* USE_FIT_SCR_SIZE */
2172befccec034c13d34746a9e87149889d59ac767bFei Jiang    /* calculate fit screen size of frame */
2182befccec034c13d34746a9e87149889d59ac767bFei Jiang    unsigned short _scr_x = output->screen_width;
2192befccec034c13d34746a9e87149889d59ac767bFei Jiang    unsigned short _scr_y = output->screen_height;
220dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    float _slope_xy = (float)srch / srcw;
221dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    unsigned short _destw = (short)(_scr_y / _slope_xy);
222dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    unsigned short _desth = (short)(_scr_x * _slope_xy);
2232befccec034c13d34746a9e87149889d59ac767bFei Jiang    short _pos_x, _pos_y;
224dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2252befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (_destw <= _scr_x) {
2262befccec034c13d34746a9e87149889d59ac767bFei Jiang        _desth = _scr_y;
227dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        _pos_x = (_scr_x - _destw) >> 1;
2282befccec034c13d34746a9e87149889d59ac767bFei Jiang        _pos_y = 0;
2292befccec034c13d34746a9e87149889d59ac767bFei Jiang    } else {
2302befccec034c13d34746a9e87149889d59ac767bFei Jiang        _destw = _scr_x;
2312befccec034c13d34746a9e87149889d59ac767bFei Jiang        _pos_x = 0;
232dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        _pos_y = (_scr_y - _desth) >> 1;
233437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
2342befccec034c13d34746a9e87149889d59ac767bFei Jiang    destx += _pos_x;
2352befccec034c13d34746a9e87149889d59ac767bFei Jiang    desty += _pos_y;
2362befccec034c13d34746a9e87149889d59ac767bFei Jiang    destw = _destw;
2372befccec034c13d34746a9e87149889d59ac767bFei Jiang    desth = _desth;
238437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
239ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    psb__information_message("psb_putsurface_overlay: src (%d, %d, %d, %d), destx (%d, %d, %d, %d).\n",
24054752e65b02b1a84c491e3f9c964046faeea306eKun Wang                             srcx, srcy, srcw, srch, destx, desty, destw, desth);
2412befccec034c13d34746a9e87149889d59ac767bFei Jiang    /* display by overlay */
2422befccec034c13d34746a9e87149889d59ac767bFei Jiang    vaStatus = psb_putsurface_overlay(
243dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                   ctx, surface, srcx, srcy, srcw, srch,
244dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                   destx, desty, destw, desth, /* screen coordinate */
245dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                   flags, OVERLAY_A, PIPEA);
246437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
2472befccec034c13d34746a9e87149889d59ac767bFei Jiang    return vaStatus;
248437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
249437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
250ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
251ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin YuanVAStatus psb_putsurface_ts(
252ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    VADriverContextP ctx,
253ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    VASurfaceID surface,
254e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    unsigned char *android_isurface,
25562eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang    int buffer_index,
256ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    short srcx,
257ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    short srcy,
258ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    unsigned short srcw,
259ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    unsigned short srch,
260ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    short destx,
261ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    short desty,
262ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    unsigned short destw,
263ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    unsigned short desth,
264ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    VARectangle *cliprects, /* client supplied clip list */
265ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    unsigned int number_cliprects, /* number of clip rects in the clip list */
266ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    unsigned int flags /* de-interlacing flags */
267ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan)
268ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan{
269ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    INIT_DRIVER_DATA;
270ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    INIT_OUTPUT_PRIV;
271ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    object_surface_p obj_surface = SURFACE(surface);
27262eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang
27362eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang    if (driver_data->overlay_idle_frame == 0) {
27462eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang        psb_android_texture_streaming_resetParams();
27562eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang        update_forced = 1;
27662eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang    }
277ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
278ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /* blend/positioning setting can be called by app directly, or enable VA_ENABLE_BLEND flag to let driver call */
279ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    if (flags & VA_ENABLE_BLEND)
280ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        psb_android_texture_streaming_set_blend(destx, desty, destw, desth,
281ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                                driver_data->clear_color,
282ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                                driver_data->blend_color,
283ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                                driver_data->blend_mode);
284ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /*cropping can be also used for dynamic resolution change feature, only high to low resolution*/
285ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /*by default, srcw and srch is set to video width and height*/
286ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    if ((0 == srcw) || (0 == srch)) {
287ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        srcw = obj_surface->width;
288ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        srch = obj_surface->height_origin;
289ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    }
290ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    psb_android_texture_streaming_set_texture_dim(srcw, srch);
291f91c8768670386683a281cc39141e21bdda9c97fKun Wang    if (driver_data->va_rotate)
292f91c8768670386683a281cc39141e21bdda9c97fKun Wang        psb_android_texture_streaming_set_rotate(va2hw_rotation(driver_data->va_rotate));
29362eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang
294ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan#if 0
295ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /* use cliprect for crop */
296ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    if (cliprects && (number_cliprects == 1))
297ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        psb_android_texture_streaming_set_crop(cliprects->x, cliprects->y, cliprects->width, cliprects->height);
298ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan#endif
299ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
30062eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang    psb_android_texture_streaming_display(buffer_index);
301cafec1db7e3fab84fe6908d9b4398e1867978e23Austin Yuan
302cafec1db7e3fab84fe6908d9b4398e1867978e23Austin Yuan    driver_data->overlay_idle_frame++;
30362eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang    update_forced = 0;
304ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
305c3077df94073dd4c035f86e5f1428e4611a0cf73Shuduo Sang    /* current surface is being displayed */
306c3077df94073dd4c035f86e5f1428e4611a0cf73Shuduo Sang    if (driver_data->cur_displaying_surface != VA_INVALID_SURFACE)
307c3077df94073dd4c035f86e5f1428e4611a0cf73Shuduo Sang        driver_data->last_displaying_surface = driver_data->cur_displaying_surface;
308c3077df94073dd4c035f86e5f1428e4611a0cf73Shuduo Sang
309c3077df94073dd4c035f86e5f1428e4611a0cf73Shuduo Sang    obj_surface->display_timestamp = GetTickCount();
310c3077df94073dd4c035f86e5f1428e4611a0cf73Shuduo Sang    driver_data->cur_displaying_surface = surface;
311c3077df94073dd4c035f86e5f1428e4611a0cf73Shuduo Sang
312ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    return VA_STATUS_SUCCESS;
313ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan}
314ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
3155fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang
3160da1930627209986e8db220799a690f816494401Austin Yuanstatic int psb_update_destbox(
3170da1930627209986e8db220799a690f816494401Austin Yuan    VADriverContextP ctx
3180da1930627209986e8db220799a690f816494401Austin Yuan)
3190da1930627209986e8db220799a690f816494401Austin Yuan{
3200da1930627209986e8db220799a690f816494401Austin Yuan    INIT_DRIVER_DATA;
3210da1930627209986e8db220799a690f816494401Austin Yuan    INIT_OUTPUT_PRIV;
3220da1930627209986e8db220799a690f816494401Austin Yuan    short destx;
3230da1930627209986e8db220799a690f816494401Austin Yuan    short desty;
3240da1930627209986e8db220799a690f816494401Austin Yuan    unsigned short destw;
3250da1930627209986e8db220799a690f816494401Austin Yuan    unsigned short desth;
3260da1930627209986e8db220799a690f816494401Austin Yuan    VAStatus vaStatus = VA_STATUS_SUCCESS;
3270da1930627209986e8db220799a690f816494401Austin Yuan
3280da1930627209986e8db220799a690f816494401Austin Yuan    psb_android_get_destbox(&destx, &desty, &destw, &desth);
329f91c8768670386683a281cc39141e21bdda9c97fKun Wang    /*psb__information_message("destbox = (%d,%d,%d,%d)\n", destx, desty, destw, desth);*/
3300da1930627209986e8db220799a690f816494401Austin Yuan    if ((destx >= 0) && (desty >= 0) &&
3313f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        ((destx + destw) <= output->screen_width) &&
3323f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        ((desty + desth) <= output->screen_height) &&
3333f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        (output->destx != destx ||
3343f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang         output->desty != desty ||
3353f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang         output->destw != destw ||
3363f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang         output->desth != desth)) {
3370da1930627209986e8db220799a690f816494401Austin Yuan        output->destx = destx;
3380da1930627209986e8db220799a690f816494401Austin Yuan        output->desty = desty;
3390da1930627209986e8db220799a690f816494401Austin Yuan        output->destw = destw;
3400da1930627209986e8db220799a690f816494401Austin Yuan        output->desth = desth;
3414338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang        output->new_destbox = 1;
3420da1930627209986e8db220799a690f816494401Austin Yuan
3430da1930627209986e8db220799a690f816494401Austin Yuan        LOGD("==========New Destbox=============\n");
3440da1930627209986e8db220799a690f816494401Austin Yuan        LOGD("output->destbox = (%d,%d,%d,%d)\n", output->destx, output->desty, output->destw, output->desth);
3450da1930627209986e8db220799a690f816494401Austin Yuan    }
3460da1930627209986e8db220799a690f816494401Austin Yuan
3470da1930627209986e8db220799a690f816494401Austin Yuan    return vaStatus;
3480da1930627209986e8db220799a690f816494401Austin Yuan}
349ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
350ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuanstatic int psb_check_outputmethod(
351ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    VADriverContextP ctx,
352ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    VASurfaceID surface,
35388c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang    unsigned short srcw,
35488c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang    unsigned short srch,
355ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    void *android_isurface,
3560da1930627209986e8db220799a690f816494401Austin Yuan    psb_hdmi_mode *hdmi_mode
357ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan)
358ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan{
359ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    INIT_DRIVER_DATA;
360ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    INIT_OUTPUT_PRIV;
361ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    psb_HDMIExt_info_p psb_HDMIExt_info = (psb_HDMIExt_info_p)output->psb_HDMIExt_info;
3620da1930627209986e8db220799a690f816494401Austin Yuan    object_surface_p obj_surface;
3635fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang    int rotation = 0, widi = 0;
3642d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang    int delta_rotation = 0;
3652d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang    int srf_rotate; /* primary surface rotation */
3662d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang    psb_surface_p rotate_surface; /* rotate surface */
3672d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang    int rotate_srf_rotate = -1; /* degree of the rotate surface */
368ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
36988c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang    if ((srcw >= 2048) || (srch >= 2048)) {
37088c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang        psb__information_message("Clip size extend overlay hw limit, use texstreaming\n");
37188c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang        driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING;
37288c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang        return 0;
37388c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang    }
37488c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang
375ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /* use saved status to avoid per-frame checking */
376ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    if ((driver_data->frame_count % driver_data->outputmethod_checkinterval) != 0) {
377ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        *hdmi_mode = psb_HDMIExt_get_mode(output);
378ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        return 0;
379ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    }
380ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
381ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /* check the status at outputmethod_checkinterval frequency */
382ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /* at first check HDMI status */
383ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    if (psb_HDMIExt_update(ctx, psb_HDMIExt_info)) {
384ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        psb__error_message("%s: Failed to update HDMIExt info.\n", __FUNCTION__);
3850da1930627209986e8db220799a690f816494401Austin Yuan        return -1;
386ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    }
387ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
388ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    *hdmi_mode = psb_HDMIExt_get_mode(output);
3890a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang    if ((*hdmi_mode == EXTENDED_VIDEO) || (*hdmi_mode == CLONE)) {
390dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        unsigned short _destw, _desth;
391dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        short _pos_x, _pos_y;
392dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        unsigned short crtc_width = 0, crtc_height = 0;
3930a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang        float _slope_xy;
3940a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang
3950a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang        /* need to handle VA rotation, and set WM rotate to 0
3960a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang         * for Android, MIPI0/HDMI has the same WM rotation always
3970a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang         */
398fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        if (driver_data->mipi0_rotation != 0 || driver_data->rotation_dirty != 0) {
3990a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang            driver_data->mipi0_rotation = 0;
4000a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang            driver_data->hdmi_rotation = 0;
401fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            driver_data->rotation_dirty = 0;
4020a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang            output->new_destbox = 1;
4030a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang            psb_RecalcRotate(ctx);
4040a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang        }
405dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang
406dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        psb_HDMIExt_get_prop(output, &crtc_width, &crtc_height);
407dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang
408dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        /*recalculate the render box to fit the ratio of height/width*/
4090a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang        if ((driver_data->extend_rotation == VA_ROTATION_90) ||
4100a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang            (driver_data->extend_rotation == VA_ROTATION_270))
4110a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang            _slope_xy = (float)srcw / srch;
4120a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang        else
4130a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang            _slope_xy = (float)srch / srcw;
4140a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang
415dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        _destw = (short)(crtc_height / _slope_xy);
416dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        _desth = (short)(crtc_width * _slope_xy);
417dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        if (_destw <= crtc_width) {
418dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang            _desth = crtc_height;
419dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang            _pos_x = (crtc_width - _destw) >> 1;
420dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang            _pos_y = 0;
421dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        } else {
422dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang            _destw = crtc_width;
423dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang            _pos_x = 0;
424dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang            _pos_y = (crtc_height - _desth) >> 1;
425dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        }
426dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        driver_data->render_rect.x = _pos_x;
427dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        driver_data->render_rect.y = _pos_y;
428dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        driver_data->render_rect.width = _destw;
429dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        driver_data->render_rect.height = _desth;
4302d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang        psb__information_message("HDMI mode is on (%d), Render Rect: (%d,%d,%d,%d)\n",
4312d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang                                 *hdmi_mode,
432ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                 driver_data->render_rect.x, driver_data->render_rect.y,
433ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                 driver_data->render_rect.width, driver_data->render_rect.height);
4340da1930627209986e8db220799a690f816494401Austin Yuan        return 0;
4355fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang    }
436ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
437fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    /* HDMI is not enabled */
438fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    psb_android_surfaceflinger_status(android_isurface, &output->sf_composition, &rotation, &widi);
4394338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang    /*Update output destbox using layerbuffer's visible region*/
4404338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang    psb_update_destbox(ctx);
4414338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang
4424338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang    if ((driver_data->output_method == PSB_PUTSURFACE_FORCE_COVERLAY)
443f91c8768670386683a281cc39141e21bdda9c97fKun Wang        || (driver_data->output_method == PSB_PUTSURFACE_FORCE_TEXSTREAMING))
4444338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang        return 0;
4454338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang
4464338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang    /*If overlay can not get correct destbox, use texstreaming.*/
447605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang    if (output->destw == 0 || output->desth == 0 ||
448605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang        ((output->destw == srcw) && (output->desth == srch))) {
4492d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang        psb__information_message("No proper destbox, use texstreaming (%dx%d+%d+%d)\n",
4502d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang                                 output->destw, output->desth, output->destx, output->desty);
4514338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang        driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING;
4524338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang        return 0;
4534338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang    }
4544338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang
4550da1930627209986e8db220799a690f816494401Austin Yuan    /* only care local rotation */
4562d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang    delta_rotation = Rotation2Angle(driver_data->mipi0_rotation) - Rotation2Angle(rotation);
4572d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang    if ((((abs(delta_rotation) == 90) || (abs(delta_rotation) == 270)) && output->new_destbox) ||
4582d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang        (abs(delta_rotation) == 180)) {
45935405e1aaaefd5bb307ba7f7161e138a86880020Kun Wang        psb__information_message("New rotation degree %d of MIPI0 WM, Need to recalc rotation\n", rotation);
460f91c8768670386683a281cc39141e21bdda9c97fKun Wang        driver_data->mipi0_rotation = rotation;
461f91c8768670386683a281cc39141e21bdda9c97fKun Wang        driver_data->hdmi_rotation = rotation;
46235405e1aaaefd5bb307ba7f7161e138a86880020Kun Wang        driver_data->rotation_dirty |= PSB_NEW_WM_ROTATION;
46335405e1aaaefd5bb307ba7f7161e138a86880020Kun Wang    }
46435405e1aaaefd5bb307ba7f7161e138a86880020Kun Wang    output->new_destbox = 0;
465f91c8768670386683a281cc39141e21bdda9c97fKun Wang
46635405e1aaaefd5bb307ba7f7161e138a86880020Kun Wang    if (driver_data->rotation_dirty != 0) {
467f91c8768670386683a281cc39141e21bdda9c97fKun Wang        psb_RecalcRotate(ctx);
46835405e1aaaefd5bb307ba7f7161e138a86880020Kun Wang        driver_data->rotation_dirty = 0;
4690da1930627209986e8db220799a690f816494401Austin Yuan    }
4700da1930627209986e8db220799a690f816494401Austin Yuan
4710da1930627209986e8db220799a690f816494401Austin Yuan    obj_surface = SURFACE(surface);
4720da1930627209986e8db220799a690f816494401Austin Yuan    if (GET_SURFACE_INFO_protect(obj_surface->psb_surface)) {
4730da1930627209986e8db220799a690f816494401Austin Yuan        psb__information_message("Protected surface, use overlay\n");
4740da1930627209986e8db220799a690f816494401Austin Yuan        driver_data->output_method = PSB_PUTSURFACE_COVERLAY;
4750da1930627209986e8db220799a690f816494401Austin Yuan
4760da1930627209986e8db220799a690f816494401Austin Yuan        return 0;
4770da1930627209986e8db220799a690f816494401Austin Yuan    }
4780da1930627209986e8db220799a690f816494401Austin Yuan
479fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    if (widi == eWidiClone) {
480fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        psb__information_message("WIDI in clone mode, use texstreaming\n");
481fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING;
482fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        driver_data->msvdx_rotate_want = 0;/* disable msvdx rotae */
483fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
484fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        return 0;
485fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    }
486fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    if (widi == eWidiExtendedVideo) {
487fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        psb__information_message("WIDI in extend video mode, disable local displaying\n");
488fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        driver_data->output_method = PSB_PUTSURFACE_NONE;
489fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        driver_data->msvdx_rotate_want = 0;/* disable msvdx rotae */
490fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
491fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        return 0;
492fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    }
493fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
4940da1930627209986e8db220799a690f816494401Austin Yuan    if (output->sf_composition) {
4950da1930627209986e8db220799a690f816494401Austin Yuan        psb__information_message("Composition is detected, use texstreaming\n");
4960da1930627209986e8db220799a690f816494401Austin Yuan        driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING;
4970da1930627209986e8db220799a690f816494401Austin Yuan        return 0;
4980da1930627209986e8db220799a690f816494401Austin Yuan    }
4990da1930627209986e8db220799a690f816494401Austin Yuan
5002d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang    srf_rotate = GET_SURFACE_INFO_rotate(obj_surface->psb_surface);
5012d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang    rotate_surface = obj_surface->psb_surface_rotate;
5022d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang    if (rotate_surface != NULL)
5032d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang        rotate_srf_rotate = GET_SURFACE_INFO_rotate(rotate_surface);
5040a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang
5052d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang    psb__information_message("SF rotation %d, VA rotation %d, final MSVDX rotation %d\n",
5062d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang                             rotation, driver_data->va_rotate, driver_data->local_rotation);
5072d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang    psb__information_message("Primary surface rotation %d, rotated surface rotation %d\n",
5082d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang                             srf_rotate, rotate_srf_rotate);
5092d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang
5102d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang    /* The surface rotation is not same with the final rotation */
5110a86723905982451dd72a9cad792b8cb8e8528aeShuduo Sang    if ((driver_data->local_rotation != 0) &&
5122d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang        ((srf_rotate != driver_data->local_rotation) || (rotate_srf_rotate != driver_data->local_rotation))) {
5132d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang        psb__information_message("Use texstreaming due to different VA surface rotation and final rotaion\n",
5142d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang                                 srf_rotate, rotate_srf_rotate);
5152d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang        driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING;
5162d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang        return 0;
517ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    }
518ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
5190da1930627209986e8db220799a690f816494401Austin Yuan    driver_data->output_method = PSB_PUTSURFACE_COVERLAY;
5200da1930627209986e8db220799a690f816494401Austin Yuan
521ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    return 0;
522ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan}
523ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
5242befccec034c13d34746a9e87149889d59ac767bFei JiangVAStatus psb_PutSurface(
525437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VADriverContextP ctx,
526437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VASurfaceID surface,
5272befccec034c13d34746a9e87149889d59ac767bFei Jiang    void *android_isurface,
528437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcx,
529437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcy,
530437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short srcw,
531437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short srch,
532437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short destx,
533437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short desty,
534437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short destw,
535437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short desth,
536437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VARectangle *cliprects, /* client supplied clip list */
537437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned int number_cliprects, /* number of clip rects in the clip list */
538437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned int flags /* de-interlacing flags */
5392befccec034c13d34746a9e87149889d59ac767bFei Jiang)
540437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
541437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_DRIVER_DATA;
5422befccec034c13d34746a9e87149889d59ac767bFei Jiang    INIT_OUTPUT_PRIV;
543437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_surface_p obj_surface;
544437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
54554752e65b02b1a84c491e3f9c964046faeea306eKun Wang    PsbPortPrivPtr pPriv = (PsbPortPrivPtr)(&driver_data->coverlay_priv);
54654752e65b02b1a84c491e3f9c964046faeea306eKun Wang    psb_hdmi_mode hdmi_mode = OFF;
5476e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang    int sf_composition = 0, buffer_index, i = 0;
5486e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang    int ret = 0;
549437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
550437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    obj_surface = SURFACE(surface);
551dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == obj_surface) {
552437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        vaStatus = VA_STATUS_ERROR_INVALID_SURFACE;
553437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        DEBUG_FAILURE;
554437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return vaStatus;
555437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
55654752e65b02b1a84c491e3f9c964046faeea306eKun Wang
557fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang	//psb__dump_NV_buffers(obj_surface,0,0,srcw,srch);
558fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
5595fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang    if ((NULL == cliprects) && (0 != number_cliprects)) {
56088c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang        vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
56188c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang        DEBUG_FAILURE;
56288c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang        return vaStatus;
56388c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang    }
56488c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang
56554752e65b02b1a84c491e3f9c964046faeea306eKun Wang    if ((srcx < 0) || (srcx > obj_surface->width) || (srcw > (obj_surface->width - srcx)) ||
5663f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        (srcy < 0) || (srcy > obj_surface->height_origin) || (srch > (obj_surface->height_origin - srcy))) {
56754752e65b02b1a84c491e3f9c964046faeea306eKun Wang        psb__error_message("vaPutSurface: source rectangle passed from upper layer is not correct.\n");
56854752e65b02b1a84c491e3f9c964046faeea306eKun Wang        return VA_STATUS_ERROR_UNKNOWN;
56954752e65b02b1a84c491e3f9c964046faeea306eKun Wang    }
57054752e65b02b1a84c491e3f9c964046faeea306eKun Wang    if ((destx < 0) || (desty < 0)) {
57154752e65b02b1a84c491e3f9c964046faeea306eKun Wang        psb__error_message("vaPutSurface: dest rectangle passed from upper layer is not correct.\n");
5723f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan        return VA_STATUS_ERROR_UNKNOWN;
5733f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan    }
57454752e65b02b1a84c491e3f9c964046faeea306eKun Wang
5752befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (driver_data->dummy_putsurface) {
5763f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan        psb__information_message("vaPutSurface: dummy mode, return directly\n");
5772befccec034c13d34746a9e87149889d59ac767bFei Jiang        return VA_STATUS_SUCCESS;
5782befccec034c13d34746a9e87149889d59ac767bFei Jiang    }
5792befccec034c13d34746a9e87149889d59ac767bFei Jiang
5806e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang    /* init overlay */
5816e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang    if (!driver_data->coverlay_init &&
5826e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang        (driver_data->output_method != PSB_PUTSURFACE_FORCE_TEXSTREAMING)) {
5836e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang        ret = psb_coverlay_init(ctx);
5846e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang        if (ret != 0) {
5856e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang            psb__information_message("vaPutSurface: psb_coverlay_init failed. Fallback to texture streaming.\n");
5866e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang            driver_data->output_method = PSB_PUTSURFACE_FORCE_TEXSTREAMING;
5876e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang            driver_data->coverlay_init = 0;
5883f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        } else
5896e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang            driver_data->coverlay_init = 1;
59062eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang    }
59162eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang
5925b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang    /* set the current displaying video frame into kernel */
5936e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang    psb_surface_set_displaying(driver_data, obj_surface->width,
5946e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang                               obj_surface->height_origin,
5956e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang                               obj_surface->psb_surface);
5966e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang
5976e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang    /* get the BCD index of current surface */
5986e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang    buffer_index = psb_get_video_bcd(ctx, surface);
5996e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang    if (buffer_index == -1)
6006e19dd0fd3388e704d0ee5d180bcb9c356aacc44Shuduo Sang        psb__error_message("The surface is not registered in BCD, shoud use overlay\n");
60162eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang
602ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /* exit MRST path at first */
603ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    if (IS_MRST(driver_data)) {
604ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        if (driver_data->output_method == PSB_PUTSURFACE_FORCE_COVERLAY) { /* overlay is for testing, not POR */
605ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan            psb__information_message("Force overlay to display\n");
606ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan            vaStatus = psb_putsurface_coverlay(ctx, surface,
607ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                               srcx, srcy, srcw, srch,
608ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                               destx, desty, destw, desth,
609ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                               flags);
610ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        } else {
611ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan            psb__information_message("Use texstreaming to display.\n");
61262eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang            vaStatus = psb_putsurface_ts(ctx, surface, android_isurface, buffer_index,
613ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                         srcx, srcy, srcw, srch,
614ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                         destx, desty, destw, desth,
615ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                         cliprects, number_cliprects, /* number of clip rects in the clip list */
616ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                         flags);
61765174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan        }
61854752e65b02b1a84c491e3f9c964046faeea306eKun Wang
619ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        return vaStatus;
62054752e65b02b1a84c491e3f9c964046faeea306eKun Wang    }
621ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
6220da1930627209986e8db220799a690f816494401Austin Yuan    if (psb_android_register_isurface(android_isurface, driver_data->bcd_id, srcw, srch)) {
6230da1930627209986e8db220799a690f816494401Austin Yuan        psb__error_message("In psb_PutSurface, android_isurface is not a valid isurface object.\n");
6240da1930627209986e8db220799a690f816494401Austin Yuan        return VA_STATUS_ERROR_UNKNOWN;
6250da1930627209986e8db220799a690f816494401Austin Yuan    }
626b6b9c482c9c72f4e2bc90260813cc00b454e011dShuduo Sang    driver_data->ts_source_created = 1;
6270da1930627209986e8db220799a690f816494401Austin Yuan
628ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /* time for MFLD platform */
62988c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang    psb_check_outputmethod(ctx, surface, srcw, srch, android_isurface, &hdmi_mode);
630fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    if (driver_data->output_method == PSB_PUTSURFACE_NONE) {
631fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        /*if overlay still enabled, stop it.*/
632fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        psb_coverlay_stop(ctx);
633fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        /*check if we need to clear fb.*/
634fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        if (driver_data->overlay_idle_frame != 0) {
635fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            psb_android_texture_streaming_set_background_color(driver_data->color_key | 0xff000000);
636fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            psb_android_texture_streaming_display(buffer_index);
637fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            driver_data->overlay_idle_frame = 0;
638fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        }
639e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang        return VA_STATUS_SUCCESS;
640fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    }
641ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
642dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang    if (hdmi_mode == UNDEFINED) {
643dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        psb__information_message("HDMI: Undefined mode, drop the frame.\n");
644dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang        return vaStatus;
645dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang    }
646dd4b7893a4762e97aab7d10fbe32c16da494cbddShuduo Sang
647ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /* Extvideo: Use overlay to render external HDMI display */
648ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    if (hdmi_mode == EXTENDED_VIDEO) {
649ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        psb__information_message("HDMI: ExtVideo mode enabled, use overlay to render external HDMI display.\n");
6500da1930627209986e8db220799a690f816494401Austin Yuan        /*we also need to clear local display if colorkey dirty.*/
65162eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang        if (driver_data->overlay_idle_frame != 0) {
65262eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang            psb_android_texture_streaming_set_background_color(driver_data->color_key | 0xff000000);
65362eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang            psb_android_texture_streaming_display(buffer_index);
65462eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang            driver_data->overlay_idle_frame = 0;
6550da1930627209986e8db220799a690f816494401Austin Yuan        }
656bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        vaStatus = psb_putsurface_overlay(ctx, surface,
657bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                          srcx, srcy, srcw, srch,
658bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                          driver_data->render_rect.x, driver_data->render_rect.y,
659bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                          driver_data->render_rect.width, driver_data->render_rect.height,
660bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                          flags, OVERLAY_A, PIPEB);
661ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
662ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        return vaStatus;
663ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    }
664ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
665ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /* Clone mode: Use TS to render both MIPI and HDMI display */
666ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    if (hdmi_mode == CLONE) {
667ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        psb__information_message("HDMI: Clone mode enabled, use texsteaming for both devices\n");
66862eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang        vaStatus = psb_putsurface_ts(ctx, surface, android_isurface, buffer_index,
669ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                     srcx, srcy, srcw, srch,
670ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                     destx, desty, destw, desth,
671ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                     cliprects, number_cliprects, /* number of clip rects in the clip list */
672ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                     flags);
673ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        return vaStatus;
674ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    }
675ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
6760da1930627209986e8db220799a690f816494401Austin Yuan    /* local video playback */
6770da1930627209986e8db220799a690f816494401Austin Yuan    if ((driver_data->output_method == PSB_PUTSURFACE_TEXSTREAMING) ||
678f91c8768670386683a281cc39141e21bdda9c97fKun Wang        (driver_data->output_method == PSB_PUTSURFACE_FORCE_TEXSTREAMING)) {
679ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        psb__information_message("MIPI: Use texstreaming to display.\n");
680ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
68162eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang        vaStatus = psb_putsurface_ts(ctx, surface, android_isurface, buffer_index,
682ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                     srcx, srcy, srcw, srch,
683ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                     destx, desty, destw, desth,
684ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                     cliprects, number_cliprects, /* number of clip rects in the clip list */
685ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                     flags);
686ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    } else {
687ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        psb__information_message("MIPI: Use overlay to display.\n");
688ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
6894338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang        /*initialize output destbox using default destbox if it has not been initialized until here.*/
6904338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang        if (output->destw == 0 || output->desth == 0) {
6914338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang            output->destx = (destx > 0) ? destx : 0;
6924338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang            output->desty = (desty > 0) ? desty : 0;
6934338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang            output->destw = ((output->destx + destw) > output->screen_width) ? (output->screen_width - output->destx) : destw;
6944338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang            output->desth = ((output->desty + desth) > output->screen_height) ? (output->screen_height - output->desty) : desth;
6954338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang        }
6964338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang
697ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        /* Hack for repaint color key to black(0,0,0). */
69862eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang        if (driver_data->overlay_idle_frame != 0) {
69962eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang            psb__information_message("Paint color key to 0x%x\n", driver_data->color_key);
70062eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang            psb_android_texture_streaming_set_background_color(driver_data->color_key | 0xff000000);
70162eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang            psb_android_texture_streaming_display(buffer_index);
70262eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang            driver_data->overlay_idle_frame = 0;
70354752e65b02b1a84c491e3f9c964046faeea306eKun Wang        }
70454752e65b02b1a84c491e3f9c964046faeea306eKun Wang
7055fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang        psb__information_message("Overlay position = (%d,%d,%d,%d)\n", output->destx, output->desty, output->destw, output->desth);
7060da1930627209986e8db220799a690f816494401Austin Yuan        vaStatus = psb_putsurface_overlay(ctx, surface,
7070da1930627209986e8db220799a690f816494401Austin Yuan                                          srcx, srcy, srcw, srch,
7080da1930627209986e8db220799a690f816494401Austin Yuan                                          output->destx, output->desty, output->destw, output->desth,
7090da1930627209986e8db220799a690f816494401Austin Yuan                                          flags, OVERLAY_A, PIPEA);
7102befccec034c13d34746a9e87149889d59ac767bFei Jiang    }
711bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang
71209998e330bbcbf835798128768e590772f5a5737Shuduo Sang    if (driver_data->overlay_idle_frame == MAX_OVERLAY_IDLE_FRAME)
713cafec1db7e3fab84fe6908d9b4398e1867978e23Austin Yuan        psb_coverlay_stop(ctx);
714cafec1db7e3fab84fe6908d9b4398e1867978e23Austin Yuan
715ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    driver_data->frame_count++;
716ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
71762eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang
7182f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    return vaStatus;
719437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
720