psb_output_android.c revision 88c877ee20e8d71ac211a44103e4a9e80083de83
1437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/*
22befccec034c13d34746a9e87149889d59ac767bFei Jiang * INTEL CONFIDENTIAL
32befccec034c13d34746a9e87149889d59ac767bFei Jiang * Copyright 2007 Intel Corporation. All Rights Reserved.
4437b3eda28a4bf098efa80598cab67f190275266Fei Jiang *
52befccec034c13d34746a9e87149889d59ac767bFei Jiang * The source code contained or described herein and all documents related to
62befccec034c13d34746a9e87149889d59ac767bFei Jiang * the source code ("Material") are owned by Intel Corporation or its suppliers
72befccec034c13d34746a9e87149889d59ac767bFei Jiang * or licensors. Title to the Material remains with Intel Corporation or its
82befccec034c13d34746a9e87149889d59ac767bFei Jiang * suppliers and licensors. The Material may contain trade secrets and
92befccec034c13d34746a9e87149889d59ac767bFei Jiang * proprietary and confidential information of Intel Corporation and its
102befccec034c13d34746a9e87149889d59ac767bFei Jiang * suppliers and licensors, and is protected by worldwide copyright and trade
112befccec034c13d34746a9e87149889d59ac767bFei Jiang * secret laws and treaty provisions. No part of the Material may be used,
122befccec034c13d34746a9e87149889d59ac767bFei Jiang * copied, reproduced, modified, published, uploaded, posted, transmitted,
132befccec034c13d34746a9e87149889d59ac767bFei Jiang * distributed, or disclosed in any way without Intel's prior express written
14dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * permission.
15dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *
162befccec034c13d34746a9e87149889d59ac767bFei Jiang * No license under any patent, copyright, trade secret or other intellectual
172befccec034c13d34746a9e87149889d59ac767bFei Jiang * property right is granted to or conferred upon you by disclosure or delivery
182befccec034c13d34746a9e87149889d59ac767bFei Jiang * of the Materials, either expressly, by implication, inducement, estoppel or
192befccec034c13d34746a9e87149889d59ac767bFei Jiang * otherwise. Any license under such intellectual property rights must be
202befccec034c13d34746a9e87149889d59ac767bFei Jiang * express and approved by Intel in writing.
21437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */
22437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
23bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang/*
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"
45437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <wsbm/wsbm_manager.h>
4654752e65b02b1a84c491e3f9c964046faeea306eKun Wang#include <psb_drm.h>
47437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
482befccec034c13d34746a9e87149889d59ac767bFei Jiang#define INIT_DRIVER_DATA    psb_driver_data_p driver_data = (psb_driver_data_p) ctx->pDriverData;
492befccec034c13d34746a9e87149889d59ac767bFei Jiang#define INIT_OUTPUT_PRIV    psb_android_output_p output = (psb_android_output_p)(((psb_driver_data_p)ctx->pDriverData)->ws_priv)
50437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
512befccec034c13d34746a9e87149889d59ac767bFei Jiang#define SURFACE(id) ((object_surface_p) object_heap_lookup( &driver_data->surface_heap, id ))
52437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define BUFFER(id)  ((object_buffer_p) object_heap_lookup( &driver_data->buffer_heap, id ))
53437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define IMAGE(id)  ((object_image_p) object_heap_lookup( &driver_data->image_heap, id ))
54437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define SUBPIC(id)  ((object_subpic_p) object_heap_lookup( &driver_data->subpic_heap, id ))
55437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define CONTEXT(id) ((object_context_p) object_heap_lookup( &driver_data->context_heap, id ))
56437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
570da1930627209986e8db220799a690f816494401Austin Yuan#define GET_SURFACE_INFO_rotate(psb_surface) ((int) psb_surface->extra_info[5])
580da1930627209986e8db220799a690f816494401Austin Yuan#define GET_SURFACE_INFO_protect(psb_surface) ((int) psb_surface->extra_info[6])
590da1930627209986e8db220799a690f816494401Austin Yuan
602befccec034c13d34746a9e87149889d59ac767bFei Jiang
612befccec034c13d34746a9e87149889d59ac767bFei Jiangvoid *psb_android_output_init(VADriverContextP ctx)
62437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
63437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_DRIVER_DATA;
642befccec034c13d34746a9e87149889d59ac767bFei Jiang    char put_surface[1024];
6554752e65b02b1a84c491e3f9c964046faeea306eKun Wang    struct drm_psb_register_rw_arg regs;
662befccec034c13d34746a9e87149889d59ac767bFei Jiang    psb_android_output_p output = calloc(1, sizeof(psb_android_output_s));
67ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    struct fb_var_screeninfo vinfo;
682befccec034c13d34746a9e87149889d59ac767bFei Jiang    int fbfd = -1;
692befccec034c13d34746a9e87149889d59ac767bFei Jiang    int ret;
70437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
712befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (output == NULL) {
722befccec034c13d34746a9e87149889d59ac767bFei Jiang        psb__error_message("Can't malloc memory\n");
73ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        return NULL;
74437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
750da1930627209986e8db220799a690f816494401Austin Yuan    memset(output, 0, sizeof(psb_android_output_s));
76437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
772befccec034c13d34746a9e87149889d59ac767bFei Jiang    /* Guess the screen size */
782befccec034c13d34746a9e87149889d59ac767bFei Jiang    output->screen_width = 800;
792befccec034c13d34746a9e87149889d59ac767bFei Jiang    output->screen_height = 480;
80437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
812befccec034c13d34746a9e87149889d59ac767bFei Jiang    // Open the frame buffer for reading
820da1930627209986e8db220799a690f816494401Austin Yuan    memset(&vinfo, 0, sizeof(vinfo));
832befccec034c13d34746a9e87149889d59ac767bFei Jiang    fbfd = open("/dev/graphics/fb0", O_RDONLY);
842befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (fbfd) {
85dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo))
86dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb__information_message("Error reading screen information.\n");
872befccec034c13d34746a9e87149889d59ac767bFei Jiang    }
882befccec034c13d34746a9e87149889d59ac767bFei Jiang    close(fbfd);
892befccec034c13d34746a9e87149889d59ac767bFei Jiang    output->screen_width = vinfo.xres;
902befccec034c13d34746a9e87149889d59ac767bFei Jiang    output->screen_height = vinfo.yres;
912f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
922f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    /* TS by default */
932f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING;
944b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    driver_data->color_key = 0x0; /*black*/
95437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
968803df709aec9d485d757c681791d708f9a88fe6Austin Yuan    if (psb_parse_config("PSB_VIDEO_CTEXTURES", &put_surface[0]) == 0) {
978803df709aec9d485d757c681791d708f9a88fe6Austin Yuan        psb__information_message("PSB_VIDEO_CTEXTURES is enabled for vaPutSurfaceBuf\n");
988803df709aec9d485d757c681791d708f9a88fe6Austin Yuan        driver_data->ctexture = 1; /* Init CTEXTURE for vaPutSurfaceBuf */
998803df709aec9d485d757c681791d708f9a88fe6Austin Yuan    }
100dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
10154752e65b02b1a84c491e3f9c964046faeea306eKun Wang    if (psb_parse_config("PSB_VIDEO_TS", &put_surface[0]) == 0) {
10254752e65b02b1a84c491e3f9c964046faeea306eKun Wang        psb__information_message("Putsurface use texstreaming\n");
10354752e65b02b1a84c491e3f9c964046faeea306eKun Wang        driver_data->output_method = PSB_PUTSURFACE_FORCE_TEXSTREAMING;
10454752e65b02b1a84c491e3f9c964046faeea306eKun Wang    }
10554752e65b02b1a84c491e3f9c964046faeea306eKun Wang
106bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    if (psb_parse_config("PSB_VIDEO_COVERLAY", &put_surface[0]) == 0) {
1072befccec034c13d34746a9e87149889d59ac767bFei Jiang        psb__information_message("Putsurface use client overlay\n");
1082befccec034c13d34746a9e87149889d59ac767bFei Jiang        driver_data->output_method = PSB_PUTSURFACE_FORCE_COVERLAY;
10954752e65b02b1a84c491e3f9c964046faeea306eKun Wang    }
11054752e65b02b1a84c491e3f9c964046faeea306eKun Wang
11154752e65b02b1a84c491e3f9c964046faeea306eKun Wang    if (IS_MFLD(driver_data)) {
112dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        driver_data->coverlay = 1;
11365174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan        output->psb_HDMIExt_info = psb_HDMIExt_init(ctx, output);
11465174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan        if (!output->psb_HDMIExt_info) {
11554752e65b02b1a84c491e3f9c964046faeea306eKun Wang            psb__error_message("Failed to init psb_HDMIExt.\n");
116ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan            free(output);
117ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan            return NULL;
11854752e65b02b1a84c491e3f9c964046faeea306eKun Wang        }
119dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
120dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1212befccec034c13d34746a9e87149889d59ac767bFei Jiang    return output;
122437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
123437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1242befccec034c13d34746a9e87149889d59ac767bFei JiangVAStatus psb_android_output_deinit(VADriverContextP ctx)
125437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
12654752e65b02b1a84c491e3f9c964046faeea306eKun Wang    INIT_DRIVER_DATA;
12765174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan    INIT_OUTPUT_PRIV;
1282befccec034c13d34746a9e87149889d59ac767bFei Jiang    //psb_android_output_p output = GET_OUTPUT_DATA(ctx);
12965174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan    if (IS_MFLD(driver_data)) {
13065174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan        psb_HDMIExt_deinit(output);
13165174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan    }
1322befccec034c13d34746a9e87149889d59ac767bFei Jiang
1332befccec034c13d34746a9e87149889d59ac767bFei Jiang    return VA_STATUS_SUCCESS;
134437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
135437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1362befccec034c13d34746a9e87149889d59ac767bFei Jiangstatic VAStatus psb_putsurface_ctexture(
137437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VADriverContextP ctx,
138437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VASurfaceID surface,
139437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned char* data,
140437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcx,
141437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcy,
142437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short srcw,
143437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short srch,
144437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short destx,
145437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short desty,
146437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short destw,
147437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short desth,
148437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned int flags /* de-interlacing flags */
149437b3eda28a4bf098efa80598cab67f190275266Fei Jiang)
150437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
151437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_DRIVER_DATA;
1522befccec034c13d34746a9e87149889d59ac767bFei Jiang    INIT_OUTPUT_PRIV;
153437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_surface_p obj_surface = SURFACE(surface);
1542befccec034c13d34746a9e87149889d59ac767bFei Jiang    int offset = 0;
1552befccec034c13d34746a9e87149889d59ac767bFei Jiang    psb_surface_p psb_surface;
156437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1572befccec034c13d34746a9e87149889d59ac767bFei Jiang    obj_surface = SURFACE(surface);
1582befccec034c13d34746a9e87149889d59ac767bFei Jiang    psb_surface = obj_surface->psb_surface;
159437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
16054752e65b02b1a84c491e3f9c964046faeea306eKun Wang    //    psb_surface->buf.drm_buf;
16154752e65b02b1a84c491e3f9c964046faeea306eKun Wang    //    psb_surface->buf.pl_flags;
16254752e65b02b1a84c491e3f9c964046faeea306eKun Wang    psb_putsurface_textureblit(ctx, data, surface, srcx, srcy, srcw, srch,
16354752e65b02b1a84c491e3f9c964046faeea306eKun Wang                               destx, desty, destw, desth, 0, /* no subtitle */
164dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               obj_surface->width, obj_surface->height,
165dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               psb_surface->stride, psb_surface->buf.drm_buf,
166bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                               psb_surface->buf.pl_flags, 1 /* need wrap dst */);
1672befccec034c13d34746a9e87149889d59ac767bFei Jiang
1682befccec034c13d34746a9e87149889d59ac767bFei Jiang    psb_android_postBuffer(offset);
16954752e65b02b1a84c491e3f9c964046faeea306eKun Wang
1701f0ceeab52f69a9f6fc8817502fae178117292a7Bruce Beare    return VA_STATUS_SUCCESS;
171437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
172437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1732befccec034c13d34746a9e87149889d59ac767bFei JiangVAStatus psb_putsurface_coverlay(
174437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VADriverContextP ctx,
175437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VASurfaceID surface,
176437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcx,
177437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcy,
178437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short srcw,
179437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short srch,
1802befccec034c13d34746a9e87149889d59ac767bFei Jiang    short destx, /* screen cooridination */
181437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short desty,
182437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short destw,
183437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short desth,
184437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned int flags /* de-interlacing flags */
185437b3eda28a4bf098efa80598cab67f190275266Fei Jiang)
186437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
1872befccec034c13d34746a9e87149889d59ac767bFei Jiang    INIT_OUTPUT_PRIV;
188437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
189dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1902befccec034c13d34746a9e87149889d59ac767bFei Jiang    /* USE_FIT_SCR_SIZE */
1912befccec034c13d34746a9e87149889d59ac767bFei Jiang    /* calculate fit screen size of frame */
1922befccec034c13d34746a9e87149889d59ac767bFei Jiang    unsigned short _scr_x = output->screen_width;
1932befccec034c13d34746a9e87149889d59ac767bFei Jiang    unsigned short _scr_y = output->screen_height;
194dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    float _slope_xy = (float)srch / srcw;
195dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    unsigned short _destw = (short)(_scr_y / _slope_xy);
196dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    unsigned short _desth = (short)(_scr_x * _slope_xy);
1972befccec034c13d34746a9e87149889d59ac767bFei Jiang    short _pos_x, _pos_y;
198dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1992befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (_destw <= _scr_x) {
2002befccec034c13d34746a9e87149889d59ac767bFei Jiang        _desth = _scr_y;
201dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        _pos_x = (_scr_x - _destw) >> 1;
2022befccec034c13d34746a9e87149889d59ac767bFei Jiang        _pos_y = 0;
2032befccec034c13d34746a9e87149889d59ac767bFei Jiang    } else {
2042befccec034c13d34746a9e87149889d59ac767bFei Jiang        _destw = _scr_x;
2052befccec034c13d34746a9e87149889d59ac767bFei Jiang        _pos_x = 0;
206dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        _pos_y = (_scr_y - _desth) >> 1;
207437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
2082befccec034c13d34746a9e87149889d59ac767bFei Jiang    destx += _pos_x;
2092befccec034c13d34746a9e87149889d59ac767bFei Jiang    desty += _pos_y;
2102befccec034c13d34746a9e87149889d59ac767bFei Jiang    destw = _destw;
2112befccec034c13d34746a9e87149889d59ac767bFei Jiang    desth = _desth;
212437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
213ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    psb__information_message("psb_putsurface_overlay: src (%d, %d, %d, %d), destx (%d, %d, %d, %d).\n",
21454752e65b02b1a84c491e3f9c964046faeea306eKun Wang                             srcx, srcy, srcw, srch, destx, desty, destw, desth);
2152befccec034c13d34746a9e87149889d59ac767bFei Jiang    /* display by overlay */
2162befccec034c13d34746a9e87149889d59ac767bFei Jiang    vaStatus = psb_putsurface_overlay(
217dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                   ctx, surface, srcx, srcy, srcw, srch,
218dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                   destx, desty, destw, desth, /* screen coordinate */
219dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                   flags, OVERLAY_A, PIPEA);
220437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
2212befccec034c13d34746a9e87149889d59ac767bFei Jiang    return vaStatus;
222437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
223437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
224ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
225ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin YuanVAStatus psb_putsurface_ts(
226ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    VADriverContextP ctx,
227ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    VASurfaceID surface,
228ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    void *android_isurface,
229ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    short srcx,
230ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    short srcy,
231ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    unsigned short srcw,
232ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    unsigned short srch,
233ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    short destx,
234ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    short desty,
235ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    unsigned short destw,
236ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    unsigned short desth,
237ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    VARectangle *cliprects, /* client supplied clip list */
238ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    unsigned int number_cliprects, /* number of clip rects in the clip list */
239ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    unsigned int flags /* de-interlacing flags */
240ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan)
241ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan{
242ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    INIT_DRIVER_DATA;
243ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    INIT_OUTPUT_PRIV;
244ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    object_surface_p obj_surface = SURFACE(surface);
245ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    uint32_t ttm_handle, i;
246ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    psb_surface_p psb_surface;
247ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
248ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /* blend/positioning setting can be called by app directly, or enable VA_ENABLE_BLEND flag to let driver call */
249ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    if (flags & VA_ENABLE_BLEND)
250ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        psb_android_texture_streaming_set_blend(destx, desty, destw, desth,
251ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                                driver_data->clear_color,
252ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                                driver_data->blend_color,
253ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                                driver_data->blend_mode);
254ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /*cropping can be also used for dynamic resolution change feature, only high to low resolution*/
255ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /*by default, srcw and srch is set to video width and height*/
256ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    if ((0 == srcw) || (0 == srch)) {
257ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        srcw = obj_surface->width;
258ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        srch = obj_surface->height_origin;
259ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    }
260ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    psb_android_texture_streaming_set_texture_dim(srcw, srch);
261ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
262ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan#if 0
263ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /* use cliprect for crop */
264ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    if (cliprects && (number_cliprects == 1))
265ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        psb_android_texture_streaming_set_crop(cliprects->x, cliprects->y, cliprects->width, cliprects->height);
266ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan#endif
267ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
268ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    psb_surface = obj_surface->psb_surface;
269ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    ttm_handle = (uint32_t)(wsbmKBufHandle(wsbmKBuf(psb_surface->buf.drm_buf)));
270ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
271ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    for (i = 0; i < driver_data->bcd_buffer_num; i++) {
272ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        if (driver_data->bcd_ttm_handles[i] == ttm_handle)
273ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan            break;
274ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    }
275ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    if (i == driver_data->bcd_buffer_num) {
276ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        psb__error_message("Failed to get buffer index.\n");
277ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        return VA_STATUS_ERROR_UNKNOWN;
278ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    }
279ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
280ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    psb_android_texture_streaming_display(i);
2810da1930627209986e8db220799a690f816494401Austin Yuan    output->colorkey_dirty = 1;
282ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
283ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    return VA_STATUS_SUCCESS;
284ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan}
285ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
2860da1930627209986e8db220799a690f816494401Austin Yuanstatic int psb_update_destbox(
2870da1930627209986e8db220799a690f816494401Austin Yuan    VADriverContextP ctx
2880da1930627209986e8db220799a690f816494401Austin Yuan)
2890da1930627209986e8db220799a690f816494401Austin Yuan{
2900da1930627209986e8db220799a690f816494401Austin Yuan    INIT_DRIVER_DATA;
2910da1930627209986e8db220799a690f816494401Austin Yuan    INIT_OUTPUT_PRIV;
2920da1930627209986e8db220799a690f816494401Austin Yuan    short destx;
2930da1930627209986e8db220799a690f816494401Austin Yuan    short desty;
2940da1930627209986e8db220799a690f816494401Austin Yuan    unsigned short destw;
2950da1930627209986e8db220799a690f816494401Austin Yuan    unsigned short desth;
2960da1930627209986e8db220799a690f816494401Austin Yuan    VAStatus vaStatus = VA_STATUS_SUCCESS;
2970da1930627209986e8db220799a690f816494401Austin Yuan
2980da1930627209986e8db220799a690f816494401Austin Yuan    psb_android_get_destbox(&destx, &desty, &destw, &desth);
2990da1930627209986e8db220799a690f816494401Austin Yuan    psb__information_message("destbox = (%d,%d,%d,%d)\n", destx, desty, destw, desth);
3000da1930627209986e8db220799a690f816494401Austin Yuan    if ((destx >= 0) && (desty >= 0) &&
3010da1930627209986e8db220799a690f816494401Austin Yuan            ((destx + destw) <= output->screen_width) &&
3020da1930627209986e8db220799a690f816494401Austin Yuan            ((desty + desth) <= output->screen_height) &&
3030da1930627209986e8db220799a690f816494401Austin Yuan            (output->destx != destx ||
3040da1930627209986e8db220799a690f816494401Austin Yuan             output->desty != desty ||
3050da1930627209986e8db220799a690f816494401Austin Yuan             output->destw != destw ||
3060da1930627209986e8db220799a690f816494401Austin Yuan             output->desth != desth)) {
3070da1930627209986e8db220799a690f816494401Austin Yuan        output->destx = destx;
3080da1930627209986e8db220799a690f816494401Austin Yuan        output->desty = desty;
3090da1930627209986e8db220799a690f816494401Austin Yuan        output->destw = destw;
3100da1930627209986e8db220799a690f816494401Austin Yuan        output->desth = desth;
3110da1930627209986e8db220799a690f816494401Austin Yuan
3120da1930627209986e8db220799a690f816494401Austin Yuan        /*destbox is ready. Set the new rotation for overlay*/
3130da1930627209986e8db220799a690f816494401Austin Yuan        driver_data->local_rotation = driver_data->msvdx_rotate_want;
3140da1930627209986e8db220799a690f816494401Austin Yuan        if (driver_data->local_rotation == 3)
3150da1930627209986e8db220799a690f816494401Austin Yuan            driver_data->local_rotation = VA_ROTATION_270;
3160da1930627209986e8db220799a690f816494401Austin Yuan
3170da1930627209986e8db220799a690f816494401Austin Yuan        LOGD("==========New Destbox=============\n");
3180da1930627209986e8db220799a690f816494401Austin Yuan        LOGD("output->destbox = (%d,%d,%d,%d)\n", output->destx, output->desty, output->destw, output->desth);
3190da1930627209986e8db220799a690f816494401Austin Yuan    }
3200da1930627209986e8db220799a690f816494401Austin Yuan
3210da1930627209986e8db220799a690f816494401Austin Yuan    /*Use default destbox if can't get destbox from surfaceflinger.*/
3220da1930627209986e8db220799a690f816494401Austin Yuan    if (output->destw == 0 || output->desth == 0) {
3230da1930627209986e8db220799a690f816494401Austin Yuan        output->destx = destx;
3240da1930627209986e8db220799a690f816494401Austin Yuan        output->desty = desty;
3250da1930627209986e8db220799a690f816494401Austin Yuan        output->destw = (destw > output->screen_width) ? output->screen_width : destw;
3260da1930627209986e8db220799a690f816494401Austin Yuan        output->desth = (desth > output->screen_height) ? output->screen_height : desth;
3270da1930627209986e8db220799a690f816494401Austin Yuan    }
3280da1930627209986e8db220799a690f816494401Austin Yuan    return vaStatus;
3290da1930627209986e8db220799a690f816494401Austin Yuan}
330ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
331ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuanstatic int psb_check_outputmethod(
332ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    VADriverContextP ctx,
333ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    VASurfaceID surface,
33488c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang    unsigned short srcw,
33588c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang    unsigned short srch,
336ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    void *android_isurface,
3370da1930627209986e8db220799a690f816494401Austin Yuan    psb_hdmi_mode *hdmi_mode
338ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan)
339ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan{
340ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    INIT_DRIVER_DATA;
341ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    INIT_OUTPUT_PRIV;
342ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    psb_HDMIExt_info_p psb_HDMIExt_info = (psb_HDMIExt_info_p)output->psb_HDMIExt_info;
3430da1930627209986e8db220799a690f816494401Austin Yuan    object_surface_p obj_surface;
3440da1930627209986e8db220799a690f816494401Austin Yuan    int rotation;
345ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
34688c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang    if ((srcw >= 2048) || (srch >= 2048)) {
34788c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang        psb__information_message("Clip size extend overlay hw limit, use texstreaming\n");
34888c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang        driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING;
34988c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang        return 0;
35088c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang    }
35188c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang
352ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /* use saved status to avoid per-frame checking */
353ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    if ((driver_data->frame_count % driver_data->outputmethod_checkinterval) != 0) {
354ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        *hdmi_mode = psb_HDMIExt_get_mode(output);
355ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        return 0;
356ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    }
357ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
358ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /* check the status at outputmethod_checkinterval frequency */
359ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /* at first check HDMI status */
360ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    if (psb_HDMIExt_update(ctx, psb_HDMIExt_info)) {
361ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        psb__error_message("%s: Failed to update HDMIExt info.\n", __FUNCTION__);
3620da1930627209986e8db220799a690f816494401Austin Yuan        return -1;
363ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    }
364ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
365ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    *hdmi_mode = psb_HDMIExt_get_mode(output);
366ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    psb__information_message("hdmi_mode = %d\n", *hdmi_mode);
367ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    if (*hdmi_mode != OFF) {
368ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        psb_HDMIExt_get_prop(output, &driver_data->render_rect.width, &driver_data->render_rect.height,
369ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                             &driver_data->render_rect.x, &driver_data->render_rect.y);
370ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        psb__information_message("Render Rect: (%d,%d,%d,%d)\n",
371ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                 driver_data->render_rect.x, driver_data->render_rect.y,
372ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                 driver_data->render_rect.width, driver_data->render_rect.height);
373ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    }
374ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
37588c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang    if ((*hdmi_mode == EXTENDED_VIDEO) || (*hdmi_mode == CLONE)
37688c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang            || (driver_data->output_method == PSB_PUTSURFACE_FORCE_TEXSTREAMING)
37788c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang            || (driver_data->output_method == PSB_PUTSURFACE_FORCE_COVERLAY))
3780da1930627209986e8db220799a690f816494401Austin Yuan        return 0;
379ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
3800da1930627209986e8db220799a690f816494401Austin Yuan    /* HDMI is not enabled */
3810da1930627209986e8db220799a690f816494401Austin Yuan    psb_android_surfaceflinger_status(android_isurface, &output->sf_composition, &rotation);
382ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
3830da1930627209986e8db220799a690f816494401Austin Yuan    /* only care local rotation */
3840da1930627209986e8db220799a690f816494401Austin Yuan    if (driver_data->msvdx_rotate_want != rotation) {
3850da1930627209986e8db220799a690f816494401Austin Yuan        psb__information_message("New rotation degree %d\n", rotation);
3860da1930627209986e8db220799a690f816494401Austin Yuan        driver_data->msvdx_rotate_want = rotation;
3870da1930627209986e8db220799a690f816494401Austin Yuan    }
3880da1930627209986e8db220799a690f816494401Austin Yuan
3890da1930627209986e8db220799a690f816494401Austin Yuan    obj_surface = SURFACE(surface);
3900da1930627209986e8db220799a690f816494401Austin Yuan    if (GET_SURFACE_INFO_protect(obj_surface->psb_surface)) {
3910da1930627209986e8db220799a690f816494401Austin Yuan        psb__information_message("Protected surface, use overlay\n");
3920da1930627209986e8db220799a690f816494401Austin Yuan        driver_data->output_method = PSB_PUTSURFACE_COVERLAY;
3930da1930627209986e8db220799a690f816494401Austin Yuan
3940da1930627209986e8db220799a690f816494401Austin Yuan        return 0;
3950da1930627209986e8db220799a690f816494401Austin Yuan    }
3960da1930627209986e8db220799a690f816494401Austin Yuan
3970da1930627209986e8db220799a690f816494401Austin Yuan    if (output->sf_composition) {
3980da1930627209986e8db220799a690f816494401Austin Yuan        psb__information_message("Composition is detected, use texstreaming\n");
3990da1930627209986e8db220799a690f816494401Austin Yuan        driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING;
4000da1930627209986e8db220799a690f816494401Austin Yuan        return 0;
4010da1930627209986e8db220799a690f816494401Austin Yuan    }
4020da1930627209986e8db220799a690f816494401Austin Yuan
4030da1930627209986e8db220799a690f816494401Austin Yuan    if (rotation != 0) {
4040da1930627209986e8db220799a690f816494401Austin Yuan        int srf_rotate = GET_SURFACE_INFO_rotate(obj_surface->psb_surface);
4050da1930627209986e8db220799a690f816494401Austin Yuan        if (srf_rotate == 0) { /* no rotated surface */
4060da1930627209986e8db220799a690f816494401Austin Yuan            psb__information_message("Rotation degree %d, but no MSVDX rotate\n", rotation);
4070da1930627209986e8db220799a690f816494401Austin Yuan            driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING;
4080da1930627209986e8db220799a690f816494401Austin Yuan            return 0;
409ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        }
410ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    }
411ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
4120da1930627209986e8db220799a690f816494401Austin Yuan    psb__information_message("Rotation degree %d, use overlay\n", rotation);
4130da1930627209986e8db220799a690f816494401Austin Yuan    driver_data->output_method = PSB_PUTSURFACE_COVERLAY;
4140da1930627209986e8db220799a690f816494401Austin Yuan
415ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    return 0;
416ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan}
417ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
4182befccec034c13d34746a9e87149889d59ac767bFei JiangVAStatus psb_PutSurface(
419437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VADriverContextP ctx,
420437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VASurfaceID surface,
4212befccec034c13d34746a9e87149889d59ac767bFei Jiang    void *android_isurface,
422437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcx,
423437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcy,
424437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short srcw,
425437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short srch,
426437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short destx,
427437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short desty,
428437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short destw,
429437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short desth,
430437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VARectangle *cliprects, /* client supplied clip list */
431437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned int number_cliprects, /* number of clip rects in the clip list */
432437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned int flags /* de-interlacing flags */
4332befccec034c13d34746a9e87149889d59ac767bFei Jiang)
434437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
435437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_DRIVER_DATA;
4362befccec034c13d34746a9e87149889d59ac767bFei Jiang    INIT_OUTPUT_PRIV;
437437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_surface_p obj_surface;
438437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
43954752e65b02b1a84c491e3f9c964046faeea306eKun Wang    PsbPortPrivPtr pPriv = (PsbPortPrivPtr)(&driver_data->coverlay_priv);
44054752e65b02b1a84c491e3f9c964046faeea306eKun Wang    psb_hdmi_mode hdmi_mode = OFF;
441ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    int sf_composition = 0;
442437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
443437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    obj_surface = SURFACE(surface);
444dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == obj_surface) {
445437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        vaStatus = VA_STATUS_ERROR_INVALID_SURFACE;
446437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        DEBUG_FAILURE;
447437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return vaStatus;
448437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
44954752e65b02b1a84c491e3f9c964046faeea306eKun Wang
45088c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang    if((NULL == cliprects) && (0 != number_cliprects)){
45188c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang        vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
45288c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang        DEBUG_FAILURE;
45388c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang        return vaStatus;
45488c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang    }
45588c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang
45654752e65b02b1a84c491e3f9c964046faeea306eKun Wang    if ((srcx < 0) || (srcx > obj_surface->width) || (srcw > (obj_surface->width - srcx)) ||
4570da1930627209986e8db220799a690f816494401Austin Yuan            (srcy < 0) || (srcy > obj_surface->height_origin) || (srch > (obj_surface->height_origin - srcy))) {
45854752e65b02b1a84c491e3f9c964046faeea306eKun Wang        psb__error_message("vaPutSurface: source rectangle passed from upper layer is not correct.\n");
45954752e65b02b1a84c491e3f9c964046faeea306eKun Wang        return VA_STATUS_ERROR_UNKNOWN;
46054752e65b02b1a84c491e3f9c964046faeea306eKun Wang    }
46154752e65b02b1a84c491e3f9c964046faeea306eKun Wang    if ((destx < 0) || (desty < 0)) {
46254752e65b02b1a84c491e3f9c964046faeea306eKun Wang        psb__error_message("vaPutSurface: dest rectangle passed from upper layer is not correct.\n");
4633f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan        return VA_STATUS_ERROR_UNKNOWN;
4643f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan    }
46554752e65b02b1a84c491e3f9c964046faeea306eKun Wang
4662befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (driver_data->dummy_putsurface) {
4673f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan        psb__information_message("vaPutSurface: dummy mode, return directly\n");
4682befccec034c13d34746a9e87149889d59ac767bFei Jiang        return VA_STATUS_SUCCESS;
4692befccec034c13d34746a9e87149889d59ac767bFei Jiang    }
4702befccec034c13d34746a9e87149889d59ac767bFei Jiang
471ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /* exit MRST path at first */
472ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    if (IS_MRST(driver_data)) {
473ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        if (driver_data->output_method == PSB_PUTSURFACE_FORCE_COVERLAY) { /* overlay is for testing, not POR */
474ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan            psb__information_message("Force overlay to display\n");
475ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan            vaStatus = psb_putsurface_coverlay(ctx, surface,
476ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                               srcx, srcy, srcw, srch,
477ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                               destx, desty, destw, desth,
478ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                               flags);
479ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        } else {
480ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan            psb__information_message("Use texstreaming to display.\n");
481ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan            vaStatus = psb_putsurface_ts(ctx, surface, android_isurface,
482ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                         srcx, srcy, srcw, srch,
483ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                         destx, desty, destw, desth,
484ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                         cliprects, number_cliprects, /* number of clip rects in the clip list */
485ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                         flags);
48665174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan        }
48754752e65b02b1a84c491e3f9c964046faeea306eKun Wang
488ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        return vaStatus;
48954752e65b02b1a84c491e3f9c964046faeea306eKun Wang    }
490ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
4910da1930627209986e8db220799a690f816494401Austin Yuan    if (psb_android_register_isurface(android_isurface, driver_data->bcd_id, srcw, srch)) {
4920da1930627209986e8db220799a690f816494401Austin Yuan        psb__error_message("In psb_PutSurface, android_isurface is not a valid isurface object.\n");
4930da1930627209986e8db220799a690f816494401Austin Yuan        return VA_STATUS_ERROR_UNKNOWN;
4940da1930627209986e8db220799a690f816494401Austin Yuan    }
4950da1930627209986e8db220799a690f816494401Austin Yuan
496ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /* time for MFLD platform */
49788c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang    psb_check_outputmethod(ctx, surface, srcw, srch, android_isurface, &hdmi_mode);
498ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
499ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /* Extvideo: Use overlay to render external HDMI display */
500ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    if (hdmi_mode == EXTENDED_VIDEO) {
501ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        psb__information_message("HDMI: ExtVideo mode enabled, use overlay to render external HDMI display.\n");
5020da1930627209986e8db220799a690f816494401Austin Yuan        /*we also need to clear local display if colorkey dirty.*/
5030da1930627209986e8db220799a690f816494401Austin Yuan        if (output->colorkey_dirty) {
5040da1930627209986e8db220799a690f816494401Austin Yuan            psb_android_texture_streaming_display(-1);
5050da1930627209986e8db220799a690f816494401Austin Yuan            output->colorkey_dirty = 0;
5060da1930627209986e8db220799a690f816494401Austin Yuan        }
507bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        vaStatus = psb_putsurface_overlay(ctx, surface,
508bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                          srcx, srcy, srcw, srch,
509bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                          driver_data->render_rect.x, driver_data->render_rect.y,
510bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                          driver_data->render_rect.width, driver_data->render_rect.height,
511bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                          flags, OVERLAY_A, PIPEB);
512ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
513ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        return vaStatus;
514ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    }
515ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
516ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /* Clone mode: Use TS to render both MIPI and HDMI display */
517ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    if (hdmi_mode == CLONE) {
518ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        psb__information_message("HDMI: Clone mode enabled, use texsteaming for both devices\n");
519ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        vaStatus = psb_putsurface_ts(ctx, surface, android_isurface,
520ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                     srcx, srcy, srcw, srch,
521ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                     destx, desty, destw, desth,
522ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                     cliprects, number_cliprects, /* number of clip rects in the clip list */
523ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                     flags);
524ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        return vaStatus;
525ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    }
526ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
5270da1930627209986e8db220799a690f816494401Austin Yuan    /* local video playback */
5280da1930627209986e8db220799a690f816494401Austin Yuan    if ((driver_data->output_method == PSB_PUTSURFACE_TEXSTREAMING) ||
5290da1930627209986e8db220799a690f816494401Austin Yuan            (driver_data->output_method == PSB_PUTSURFACE_FORCE_TEXSTREAMING)) {
530ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        psb__information_message("MIPI: Use texstreaming to display.\n");
531ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
532ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        vaStatus = psb_putsurface_ts(ctx, surface, android_isurface,
533ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                     srcx, srcy, srcw, srch,
534ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                     destx, desty, destw, desth,
535ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                     cliprects, number_cliprects, /* number of clip rects in the clip list */
536ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                     flags);
537ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    } else {
538ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        psb__information_message("MIPI: Use overlay to display.\n");
5390da1930627209986e8db220799a690f816494401Austin Yuan        psb_update_destbox(ctx);
540ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
541ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        /* Hack for repaint color key to black(0,0,0). */
5420da1930627209986e8db220799a690f816494401Austin Yuan        if (output->colorkey_dirty) {
54354752e65b02b1a84c491e3f9c964046faeea306eKun Wang            psb_android_texture_streaming_display(-1);
5440da1930627209986e8db220799a690f816494401Austin Yuan            output->colorkey_dirty = 0;
545ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan            psb__information_message("Hack for repainting color key for overlay.Ignore the error message \"Texture Streaming Fails...\".\n");
54654752e65b02b1a84c491e3f9c964046faeea306eKun Wang        }
54754752e65b02b1a84c491e3f9c964046faeea306eKun Wang
548ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        /* Use overlay to render local display*/
549bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        if (destw > output->screen_width)
550bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            destw = output->screen_width;
551bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        if (desth > output->screen_height)
552bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            desth = output->screen_height;
553ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
5540da1930627209986e8db220799a690f816494401Austin Yuan        vaStatus = psb_putsurface_overlay(ctx, surface,
5550da1930627209986e8db220799a690f816494401Austin Yuan                                          srcx, srcy, srcw, srch,
5560da1930627209986e8db220799a690f816494401Austin Yuan                                          output->destx, output->desty, output->destw, output->desth,
5570da1930627209986e8db220799a690f816494401Austin Yuan                                          flags, OVERLAY_A, PIPEA);
5582befccec034c13d34746a9e87149889d59ac767bFei Jiang    }
559bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang
560ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    driver_data->frame_count++;
561ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
5622f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    return vaStatus;
563437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
564