psb_output_android.c revision 54752e65b02b1a84c491e3f9c964046faeea306e
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"
4354752e65b02b1a84c491e3f9c964046faeea306eKun Wang#include "psb_HDMIExtMode.h"
44437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <wsbm/wsbm_manager.h>
4554752e65b02b1a84c491e3f9c964046faeea306eKun Wang#include <psb_drm.h>
46437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
472befccec034c13d34746a9e87149889d59ac767bFei Jiang#define INIT_DRIVER_DATA    psb_driver_data_p driver_data = (psb_driver_data_p) ctx->pDriverData;
482befccec034c13d34746a9e87149889d59ac767bFei Jiang#define INIT_OUTPUT_PRIV    psb_android_output_p output = (psb_android_output_p)(((psb_driver_data_p)ctx->pDriverData)->ws_priv)
49437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
502befccec034c13d34746a9e87149889d59ac767bFei Jiang#define SURFACE(id) ((object_surface_p) object_heap_lookup( &driver_data->surface_heap, id ))
51437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define BUFFER(id)  ((object_buffer_p) object_heap_lookup( &driver_data->buffer_heap, id ))
52437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define IMAGE(id)  ((object_image_p) object_heap_lookup( &driver_data->image_heap, id ))
53437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define SUBPIC(id)  ((object_subpic_p) object_heap_lookup( &driver_data->subpic_heap, id ))
54437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define CONTEXT(id) ((object_context_p) object_heap_lookup( &driver_data->context_heap, id ))
55437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
562befccec034c13d34746a9e87149889d59ac767bFei Jiang
572f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiangtypedef struct _psb_android_output_s {
582f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    /* information of output display */
592f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    unsigned short screen_width;
602f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    unsigned short screen_height;
612f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
622f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    /* for memory heap base used by putsurface */
632f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    unsigned char* heap_addr;
642f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang} psb_android_output_s, *psb_android_output_p;
652f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
662f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
672befccec034c13d34746a9e87149889d59ac767bFei Jiangvoid *psb_android_output_init(VADriverContextP ctx)
68437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
69437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_DRIVER_DATA;
702befccec034c13d34746a9e87149889d59ac767bFei Jiang    char put_surface[1024];
7154752e65b02b1a84c491e3f9c964046faeea306eKun Wang    struct drm_psb_register_rw_arg regs;
722befccec034c13d34746a9e87149889d59ac767bFei Jiang    psb_android_output_p output = calloc(1, sizeof(psb_android_output_s));
73dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
742befccec034c13d34746a9e87149889d59ac767bFei Jiang    struct fb_var_screeninfo vinfo = {0};
752befccec034c13d34746a9e87149889d59ac767bFei Jiang    int fbfd = -1;
762befccec034c13d34746a9e87149889d59ac767bFei Jiang    int ret;
77437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
782befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (output == NULL) {
792befccec034c13d34746a9e87149889d59ac767bFei Jiang        psb__error_message("Can't malloc memory\n");
80dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_STATUS_ERROR_ALLOCATION_FAILED;
81437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
82437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
832befccec034c13d34746a9e87149889d59ac767bFei Jiang    /* Guess the screen size */
842befccec034c13d34746a9e87149889d59ac767bFei Jiang    output->screen_width = 800;
852befccec034c13d34746a9e87149889d59ac767bFei Jiang    output->screen_height = 480;
86437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
872befccec034c13d34746a9e87149889d59ac767bFei Jiang    // Open the frame buffer for reading
882befccec034c13d34746a9e87149889d59ac767bFei Jiang    fbfd = open("/dev/graphics/fb0", O_RDONLY);
892befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (fbfd) {
90dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo))
91dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb__information_message("Error reading screen information.\n");
922befccec034c13d34746a9e87149889d59ac767bFei Jiang    }
932befccec034c13d34746a9e87149889d59ac767bFei Jiang    close(fbfd);
942befccec034c13d34746a9e87149889d59ac767bFei Jiang    output->screen_width = vinfo.xres;
952befccec034c13d34746a9e87149889d59ac767bFei Jiang    output->screen_height = vinfo.yres;
962f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
972f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    /* TS by default */
982f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING;
994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    driver_data->color_key = 0x0; /*black*/
100437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
101bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* Init CTEXTURE for vaPutSurfaceBuf */
102bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    driver_data->ctexture = 1;
103dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
10454752e65b02b1a84c491e3f9c964046faeea306eKun Wang    if (psb_parse_config("PSB_VIDEO_TS", &put_surface[0]) == 0) {
10554752e65b02b1a84c491e3f9c964046faeea306eKun Wang        psb__information_message("Putsurface use texstreaming\n");
10654752e65b02b1a84c491e3f9c964046faeea306eKun Wang        driver_data->output_method = PSB_PUTSURFACE_FORCE_TEXSTREAMING;
10754752e65b02b1a84c491e3f9c964046faeea306eKun Wang    }
10854752e65b02b1a84c491e3f9c964046faeea306eKun Wang
109bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    if (psb_parse_config("PSB_VIDEO_COVERLAY", &put_surface[0]) == 0) {
1102befccec034c13d34746a9e87149889d59ac767bFei Jiang        psb__information_message("Putsurface use client overlay\n");
1112befccec034c13d34746a9e87149889d59ac767bFei Jiang        driver_data->output_method = PSB_PUTSURFACE_FORCE_COVERLAY;
11254752e65b02b1a84c491e3f9c964046faeea306eKun Wang    }
11354752e65b02b1a84c491e3f9c964046faeea306eKun Wang
11454752e65b02b1a84c491e3f9c964046faeea306eKun Wang    if (IS_MFLD(driver_data)) {
115dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        driver_data->coverlay = 1;
11654752e65b02b1a84c491e3f9c964046faeea306eKun Wang        if (psb_HDMIExt_init(ctx)) {
11754752e65b02b1a84c491e3f9c964046faeea306eKun Wang            psb__error_message("Failed to init psb_HDMIExt.\n");
11854752e65b02b1a84c491e3f9c964046faeea306eKun Wang            return VA_STATUS_ERROR_UNKNOWN;
11954752e65b02b1a84c491e3f9c964046faeea306eKun Wang        }
120dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
121dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1222befccec034c13d34746a9e87149889d59ac767bFei Jiang    return output;
123437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
124437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1252befccec034c13d34746a9e87149889d59ac767bFei JiangVAStatus psb_android_output_deinit(VADriverContextP ctx)
126437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
12754752e65b02b1a84c491e3f9c964046faeea306eKun Wang    INIT_DRIVER_DATA;
1282befccec034c13d34746a9e87149889d59ac767bFei Jiang    //psb_android_output_p output = GET_OUTPUT_DATA(ctx);
12954752e65b02b1a84c491e3f9c964046faeea306eKun Wang    if (IS_MFLD(driver_data))
13054752e65b02b1a84c491e3f9c964046faeea306eKun Wang        psb_HDMIExt_deinit();
1312befccec034c13d34746a9e87149889d59ac767bFei Jiang
1322befccec034c13d34746a9e87149889d59ac767bFei Jiang    return VA_STATUS_SUCCESS;
133437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
134437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1352befccec034c13d34746a9e87149889d59ac767bFei Jiangstatic VAStatus psb_putsurface_ctexture(
136437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VADriverContextP ctx,
137437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VASurfaceID surface,
138437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned char* data,
139437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcx,
140437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcy,
141437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short srcw,
142437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short srch,
143437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short destx,
144437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short desty,
145437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short destw,
146437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short desth,
147437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned int flags /* de-interlacing flags */
148437b3eda28a4bf098efa80598cab67f190275266Fei Jiang)
149437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
150437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_DRIVER_DATA;
1512befccec034c13d34746a9e87149889d59ac767bFei Jiang    INIT_OUTPUT_PRIV;
152437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_surface_p obj_surface = SURFACE(surface);
1532befccec034c13d34746a9e87149889d59ac767bFei Jiang    int offset = 0;
1542befccec034c13d34746a9e87149889d59ac767bFei Jiang    psb_surface_p psb_surface;
155437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1562befccec034c13d34746a9e87149889d59ac767bFei Jiang    obj_surface = SURFACE(surface);
1572befccec034c13d34746a9e87149889d59ac767bFei Jiang    psb_surface = obj_surface->psb_surface;
158437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
15954752e65b02b1a84c491e3f9c964046faeea306eKun Wang    //    psb_surface->buf.drm_buf;
16054752e65b02b1a84c491e3f9c964046faeea306eKun Wang    //    psb_surface->buf.pl_flags;
16154752e65b02b1a84c491e3f9c964046faeea306eKun Wang    psb_putsurface_textureblit(ctx, data, surface, srcx, srcy, srcw, srch,
16254752e65b02b1a84c491e3f9c964046faeea306eKun Wang                               destx, desty, destw, desth, 0, /* no subtitle */
163dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               obj_surface->width, obj_surface->height,
164dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               psb_surface->stride, psb_surface->buf.drm_buf,
165bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                               psb_surface->buf.pl_flags, 1 /* need wrap dst */);
1662befccec034c13d34746a9e87149889d59ac767bFei Jiang
1672befccec034c13d34746a9e87149889d59ac767bFei Jiang    psb_android_postBuffer(offset);
16854752e65b02b1a84c491e3f9c964046faeea306eKun Wang
1691f0ceeab52f69a9f6fc8817502fae178117292a7Bruce Beare    return VA_STATUS_SUCCESS;
170437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
171437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1722befccec034c13d34746a9e87149889d59ac767bFei JiangVAStatus psb_putsurface_coverlay(
173437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VADriverContextP ctx,
174437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VASurfaceID surface,
175437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcx,
176437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcy,
177437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short srcw,
178437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short srch,
1792befccec034c13d34746a9e87149889d59ac767bFei Jiang    short destx, /* screen cooridination */
180437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short desty,
181437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short destw,
182437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short desth,
183437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned int flags /* de-interlacing flags */
184437b3eda28a4bf098efa80598cab67f190275266Fei Jiang)
185437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
1862befccec034c13d34746a9e87149889d59ac767bFei Jiang    INIT_OUTPUT_PRIV;
187437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
188dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1892befccec034c13d34746a9e87149889d59ac767bFei Jiang    /* USE_FIT_SCR_SIZE */
1902befccec034c13d34746a9e87149889d59ac767bFei Jiang    /* calculate fit screen size of frame */
1912befccec034c13d34746a9e87149889d59ac767bFei Jiang    unsigned short _scr_x = output->screen_width;
1922befccec034c13d34746a9e87149889d59ac767bFei Jiang    unsigned short _scr_y = output->screen_height;
193dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    float _slope_xy = (float)srch / srcw;
194dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    unsigned short _destw = (short)(_scr_y / _slope_xy);
195dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    unsigned short _desth = (short)(_scr_x * _slope_xy);
1962befccec034c13d34746a9e87149889d59ac767bFei Jiang    short _pos_x, _pos_y;
197dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1982befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (_destw <= _scr_x) {
1992befccec034c13d34746a9e87149889d59ac767bFei Jiang        _desth = _scr_y;
200dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        _pos_x = (_scr_x - _destw) >> 1;
2012befccec034c13d34746a9e87149889d59ac767bFei Jiang        _pos_y = 0;
2022befccec034c13d34746a9e87149889d59ac767bFei Jiang    } else {
2032befccec034c13d34746a9e87149889d59ac767bFei Jiang        _destw = _scr_x;
2042befccec034c13d34746a9e87149889d59ac767bFei Jiang        _pos_x = 0;
205dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        _pos_y = (_scr_y - _desth) >> 1;
206437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
2072befccec034c13d34746a9e87149889d59ac767bFei Jiang    destx += _pos_x;
2082befccec034c13d34746a9e87149889d59ac767bFei Jiang    desty += _pos_y;
2092befccec034c13d34746a9e87149889d59ac767bFei Jiang    destw = _destw;
2102befccec034c13d34746a9e87149889d59ac767bFei Jiang    desth = _desth;
211437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
21254752e65b02b1a84c491e3f9c964046faeea306eKun Wang    psb__information_message("psb_putsurface_overlay: srcx is %d, srcy is %d, srcw is %d, srch is %d, destx is %d, desty is %d, destw is %d, desth is %d.\n", \
21354752e65b02b1a84c491e3f9c964046faeea306eKun Wang                             srcx, srcy, srcw, srch, destx, desty, destw, desth);
2142befccec034c13d34746a9e87149889d59ac767bFei Jiang    /* display by overlay */
2152befccec034c13d34746a9e87149889d59ac767bFei Jiang    vaStatus = psb_putsurface_overlay(
216dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                   ctx, surface, srcx, srcy, srcw, srch,
217dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                   destx, desty, destw, desth, /* screen coordinate */
218dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                   flags, OVERLAY_A, PIPEA);
219437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
2202befccec034c13d34746a9e87149889d59ac767bFei Jiang    return vaStatus;
221437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
222437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
2232befccec034c13d34746a9e87149889d59ac767bFei JiangVAStatus psb_PutSurface(
224437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VADriverContextP ctx,
225437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VASurfaceID surface,
2262befccec034c13d34746a9e87149889d59ac767bFei Jiang    void *android_isurface,
227437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcx,
228437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcy,
229437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short srcw,
230437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short srch,
231437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short destx,
232437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short desty,
233437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short destw,
234437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short desth,
235437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VARectangle *cliprects, /* client supplied clip list */
236437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned int number_cliprects, /* number of clip rects in the clip list */
237437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned int flags /* de-interlacing flags */
2382befccec034c13d34746a9e87149889d59ac767bFei Jiang)
239437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
240437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_DRIVER_DATA;
2412befccec034c13d34746a9e87149889d59ac767bFei Jiang    INIT_OUTPUT_PRIV;
242437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_surface_p obj_surface;
243437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
24454752e65b02b1a84c491e3f9c964046faeea306eKun Wang    PsbPortPrivPtr pPriv = (PsbPortPrivPtr)(&driver_data->coverlay_priv);
24554752e65b02b1a84c491e3f9c964046faeea306eKun Wang    psb_hdmi_mode hdmi_mode = OFF;
246437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
247437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    obj_surface = SURFACE(surface);
248dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == obj_surface) {
249437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        vaStatus = VA_STATUS_ERROR_INVALID_SURFACE;
250437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        DEBUG_FAILURE;
251437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return vaStatus;
252437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
25354752e65b02b1a84c491e3f9c964046faeea306eKun Wang
25454752e65b02b1a84c491e3f9c964046faeea306eKun Wang    if ((srcx < 0) || (srcx > obj_surface->width) || (srcw > (obj_surface->width - srcx)) ||
25554752e65b02b1a84c491e3f9c964046faeea306eKun Wang            (srcy < 0) || (srcy > obj_surface->height_origin) || (srch > (obj_surface->height_origin - srcy))) {
25654752e65b02b1a84c491e3f9c964046faeea306eKun Wang        psb__error_message("vaPutSurface: source rectangle passed from upper layer is not correct.\n");
25754752e65b02b1a84c491e3f9c964046faeea306eKun Wang        return VA_STATUS_ERROR_UNKNOWN;
25854752e65b02b1a84c491e3f9c964046faeea306eKun Wang    }
25954752e65b02b1a84c491e3f9c964046faeea306eKun Wang    if ((destx < 0) || (desty < 0)) {
26054752e65b02b1a84c491e3f9c964046faeea306eKun Wang        psb__error_message("vaPutSurface: dest rectangle passed from upper layer is not correct.\n");
2613f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan        return VA_STATUS_ERROR_UNKNOWN;
2623f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan    }
26354752e65b02b1a84c491e3f9c964046faeea306eKun Wang
2642befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (driver_data->dummy_putsurface) {
2653f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan        psb__information_message("vaPutSurface: dummy mode, return directly\n");
2662befccec034c13d34746a9e87149889d59ac767bFei Jiang        return VA_STATUS_SUCCESS;
2672befccec034c13d34746a9e87149889d59ac767bFei Jiang    }
2682befccec034c13d34746a9e87149889d59ac767bFei Jiang
26954752e65b02b1a84c491e3f9c964046faeea306eKun Wang    if (IS_MFLD(driver_data)) {
27054752e65b02b1a84c491e3f9c964046faeea306eKun Wang	if (psb_HDMIExt_update(ctx)) {
27154752e65b02b1a84c491e3f9c964046faeea306eKun Wang	    psb__error_message("%s: Failed to update HDMIExt info.\n", __FUNCTION__);
27254752e65b02b1a84c491e3f9c964046faeea306eKun Wang	    return VA_STATUS_ERROR_UNKNOWN;
27354752e65b02b1a84c491e3f9c964046faeea306eKun Wang	}
27454752e65b02b1a84c491e3f9c964046faeea306eKun Wang
27554752e65b02b1a84c491e3f9c964046faeea306eKun Wang        hdmi_mode = psb_HDMIExt_get_mode();
27654752e65b02b1a84c491e3f9c964046faeea306eKun Wang        psb__information_message("hdmi_mode = %d\n", hdmi_mode);
27754752e65b02b1a84c491e3f9c964046faeea306eKun Wang        if (hdmi_mode != OFF) {
27854752e65b02b1a84c491e3f9c964046faeea306eKun Wang            psb_HDMIExt_get_prop(&driver_data->render_rect.width, &driver_data->render_rect.height,
27954752e65b02b1a84c491e3f9c964046faeea306eKun Wang                                 &driver_data->render_rect.x, &driver_data->render_rect.y);
28054752e65b02b1a84c491e3f9c964046faeea306eKun Wang            psb__information_message("driver_data->render_rect.width=%d, driver_data->render_rect.height=%d, driver_data->render_rect.x =%d, driver_data->render_rect.y=%d\n",
28154752e65b02b1a84c491e3f9c964046faeea306eKun Wang                                     driver_data->render_rect.width, driver_data->render_rect.height, driver_data->render_rect.x, driver_data->render_rect.y);
28254752e65b02b1a84c491e3f9c964046faeea306eKun Wang        }
28354752e65b02b1a84c491e3f9c964046faeea306eKun Wang    }
28454752e65b02b1a84c491e3f9c964046faeea306eKun Wang    if ((driver_data->render_device == VA_RENDER_DEVICE_EXTERNAL) ||
28554752e65b02b1a84c491e3f9c964046faeea306eKun Wang            (hdmi_mode == EXTENDED_VIDEO)) {
286bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        /*Use overlay to render external HDMI display*/
28754752e65b02b1a84c491e3f9c964046faeea306eKun Wang        psb__information_message("Use overlay to render external HDMI display.\n");
288bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        vaStatus = psb_putsurface_overlay(ctx, surface,
289bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                          srcx, srcy, srcw, srch,
290bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                          driver_data->render_rect.x, driver_data->render_rect.y,
291bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                          driver_data->render_rect.width, driver_data->render_rect.height,
292bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                          flags, OVERLAY_A, PIPEB);
29354752e65b02b1a84c491e3f9c964046faeea306eKun Wang    } else if (((hdmi_mode != CLONE) && psb_android_fallback_overlay()
29454752e65b02b1a84c491e3f9c964046faeea306eKun Wang                && (driver_data->output_method != PSB_PUTSURFACE_FORCE_TEXSTREAMING)) ||
29554752e65b02b1a84c491e3f9c964046faeea306eKun Wang               (driver_data->render_mode & VA_RENDER_MODE_LOCAL_OVERLAY) ||
296bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang               (driver_data->output_method == PSB_PUTSURFACE_FORCE_COVERLAY) ||
297bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang               (driver_data->output_method == PSB_PUTSURFACE_COVERLAY)) {
2983f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan        psb__information_message("Use overlay to display video.\n");
29954752e65b02b1a84c491e3f9c964046faeea306eKun Wang        /*Hack for repaint color key to black(0,0,0).*/
30054752e65b02b1a84c491e3f9c964046faeea306eKun Wang        if (!pPriv->overlayA_enabled) {
30154752e65b02b1a84c491e3f9c964046faeea306eKun Wang            psb_android_texture_streaming_display(-1);
30254752e65b02b1a84c491e3f9c964046faeea306eKun Wang            LOGD("It is a Hack for repainting color key for overlay. Ignore the error message \"Texture Streaming Fails...\".\n");
30354752e65b02b1a84c491e3f9c964046faeea306eKun Wang        }
30454752e65b02b1a84c491e3f9c964046faeea306eKun Wang
305bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        /*Use overlay to render local display*/
306bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        if (destw > output->screen_width)
307bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            destw = output->screen_width;
308bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        if (desth > output->screen_height)
309bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            desth = output->screen_height;
31054752e65b02b1a84c491e3f9c964046faeea306eKun Wang        vaStatus = psb_putsurface_coverlay(ctx, surface,
31154752e65b02b1a84c491e3f9c964046faeea306eKun Wang                                           srcx, srcy, srcw, srch,
31254752e65b02b1a84c491e3f9c964046faeea306eKun Wang                                           destx, desty, destw, desth,
31354752e65b02b1a84c491e3f9c964046faeea306eKun Wang                                           flags);
314bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        /*Use overlay to render external HDMI display*/
315bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        if (driver_data->render_device & VA_RENDER_DEVICE_EXTERNAL) {
316bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            vaStatus = psb_putsurface_overlay(ctx, surface,
317bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                              srcx, srcy, srcw, srch,
318bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                              driver_data->render_rect.x, driver_data->render_rect.y,
319bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                              driver_data->render_rect.width, driver_data->render_rect.height,
320bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                              flags, OVERLAY_C, PIPEB);
321bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        }
322bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    } else {
3233f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan#if 0
3243f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan        psb__android_message("In psb_PutSurface, srcx is %d, srcy is %d, srcw is %d, srch is %d, destx is %d, desty is %d, destw is %d, desth is %d.\n",
32554752e65b02b1a84c491e3f9c964046faeea306eKun Wang                             srcx, srcy, srcw, srch, destx, desty, destw, desth);
3263f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan#endif
3273f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan        psb__information_message("Use texture streaming to display video.\n");
32854752e65b02b1a84c491e3f9c964046faeea306eKun Wang        /*Stop overlay if overlay still enabled*/
32954752e65b02b1a84c491e3f9c964046faeea306eKun Wang        psb_coverlay_stop(ctx);
33054752e65b02b1a84c491e3f9c964046faeea306eKun Wang
331bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        if (psb_android_register_isurface(android_isurface, driver_data->bcd_id, srcw, srch)) {
3323f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan            psb__error_message("In psb_PutSurface, android_isurface is not a valid isurface object.\n");
333bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            return VA_STATUS_ERROR_UNKNOWN;
334bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        }
335dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /*blend/positioning setting can be called by app directly, or enable VA_ENABLE_BLEND flag to let driver call*/
336dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (flags & VA_ENABLE_BLEND)
337dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_android_texture_streaming_set_blend(destx, desty, destw, desth,
338dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                                    driver_data->clear_color,
339dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                                    driver_data->blend_color,
340dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                                    driver_data->blend_mode);
341dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /*cropping can be also used for dynamic resolution change feature, only high to low resolution*/
342dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /*by default, srcw and srch is set to video width and height*/
343dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if ((0 == srcw) || (0 == srch)) {
344dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            srcw = obj_surface->width;
345dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            srch = obj_surface->height_origin;
3462befccec034c13d34746a9e87149889d59ac767bFei Jiang        }
3473f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan        psb_android_texture_streaming_set_texture_dim(srcw, srch);
348bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#if 0
349bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        /*use cliprect for crop*/
350bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        if (cliprects && (number_cliprects == 1))
351bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            psb_android_texture_streaming_set_crop(cliprects->x, cliprects->y, cliprects->width, cliprects->height);
352bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#endif
35354752e65b02b1a84c491e3f9c964046faeea306eKun Wang        uint32_t ttm_handle, i;
35454752e65b02b1a84c491e3f9c964046faeea306eKun Wang        psb_surface_p psb_surface;
35554752e65b02b1a84c491e3f9c964046faeea306eKun Wang        psb_surface = obj_surface->psb_surface;
35654752e65b02b1a84c491e3f9c964046faeea306eKun Wang        ttm_handle = (uint32_t)(wsbmKBufHandle(wsbmKBuf(psb_surface->buf.drm_buf)));
35754752e65b02b1a84c491e3f9c964046faeea306eKun Wang
35854752e65b02b1a84c491e3f9c964046faeea306eKun Wang        for (i = 0; i < driver_data->bcd_buffer_num; i++) {
35954752e65b02b1a84c491e3f9c964046faeea306eKun Wang            if (driver_data->bcd_ttm_handles[i] == ttm_handle)
36054752e65b02b1a84c491e3f9c964046faeea306eKun Wang                break;
36154752e65b02b1a84c491e3f9c964046faeea306eKun Wang        }
36254752e65b02b1a84c491e3f9c964046faeea306eKun Wang        if (i == driver_data->bcd_buffer_num) {
36354752e65b02b1a84c491e3f9c964046faeea306eKun Wang            psb__error_message("Failed to get buffer index.\n");
36454752e65b02b1a84c491e3f9c964046faeea306eKun Wang            return VA_STATUS_ERROR_UNKNOWN;
36554752e65b02b1a84c491e3f9c964046faeea306eKun Wang        }
366bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang
36754752e65b02b1a84c491e3f9c964046faeea306eKun Wang        psb_android_texture_streaming_display(i);
368bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang
3692befccec034c13d34746a9e87149889d59ac767bFei Jiang    }
370bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang
3712f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    return vaStatus;
372437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
373