psb_output_android.c revision 605881752d4bbfb7c70d4d08f3cf1579b5473713
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])
610da1930627209986e8db220799a690f816494401Austin Yuan
625fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wangenum {
635fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang    eWidiOff             = 1,
645fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang    eWidiClone           = 2,
655fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang    eWidiExtendedVideo   = 3,
665fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang};
6762eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wangextern unsigned int update_forced;
682befccec034c13d34746a9e87149889d59ac767bFei Jiang
69f91c8768670386683a281cc39141e21bdda9c97fKun Wanginline int va2hw_rotation(int va_rotate)
70f91c8768670386683a281cc39141e21bdda9c97fKun Wang{
71f91c8768670386683a281cc39141e21bdda9c97fKun Wang    switch (va_rotate) {
72f91c8768670386683a281cc39141e21bdda9c97fKun Wang    case VA_ROTATION_90:
73f91c8768670386683a281cc39141e21bdda9c97fKun Wang        return HAL_TRANSFORM_ROT_270;
74f91c8768670386683a281cc39141e21bdda9c97fKun Wang    case VA_ROTATION_180:
75f91c8768670386683a281cc39141e21bdda9c97fKun Wang        return HAL_TRANSFORM_ROT_180;
76f91c8768670386683a281cc39141e21bdda9c97fKun Wang    case HAL_TRANSFORM_ROT_270:
77f91c8768670386683a281cc39141e21bdda9c97fKun Wang        return HAL_TRANSFORM_ROT_90;
7862eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wangdefaut:
79f91c8768670386683a281cc39141e21bdda9c97fKun Wang        return 0;
80f91c8768670386683a281cc39141e21bdda9c97fKun Wang    }
81f91c8768670386683a281cc39141e21bdda9c97fKun Wang
82f91c8768670386683a281cc39141e21bdda9c97fKun Wang    return 0;
83f91c8768670386683a281cc39141e21bdda9c97fKun Wang}
84f91c8768670386683a281cc39141e21bdda9c97fKun Wang
852befccec034c13d34746a9e87149889d59ac767bFei Jiangvoid *psb_android_output_init(VADriverContextP ctx)
86437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
87437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_DRIVER_DATA;
882befccec034c13d34746a9e87149889d59ac767bFei Jiang    char put_surface[1024];
8954752e65b02b1a84c491e3f9c964046faeea306eKun Wang    struct drm_psb_register_rw_arg regs;
902befccec034c13d34746a9e87149889d59ac767bFei Jiang    psb_android_output_p output = calloc(1, sizeof(psb_android_output_s));
91ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    struct fb_var_screeninfo vinfo;
922befccec034c13d34746a9e87149889d59ac767bFei Jiang    int fbfd = -1;
932befccec034c13d34746a9e87149889d59ac767bFei Jiang    int ret;
94437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
952befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (output == NULL) {
962befccec034c13d34746a9e87149889d59ac767bFei Jiang        psb__error_message("Can't malloc memory\n");
97ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        return NULL;
98437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
990da1930627209986e8db220799a690f816494401Austin Yuan    memset(output, 0, sizeof(psb_android_output_s));
100437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1012befccec034c13d34746a9e87149889d59ac767bFei Jiang    /* Guess the screen size */
1022befccec034c13d34746a9e87149889d59ac767bFei Jiang    output->screen_width = 800;
1032befccec034c13d34746a9e87149889d59ac767bFei Jiang    output->screen_height = 480;
104437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1052befccec034c13d34746a9e87149889d59ac767bFei Jiang    // Open the frame buffer for reading
1060da1930627209986e8db220799a690f816494401Austin Yuan    memset(&vinfo, 0, sizeof(vinfo));
1072befccec034c13d34746a9e87149889d59ac767bFei Jiang    fbfd = open("/dev/graphics/fb0", O_RDONLY);
1082befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (fbfd) {
109dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo))
110dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb__information_message("Error reading screen information.\n");
1112befccec034c13d34746a9e87149889d59ac767bFei Jiang    }
1122befccec034c13d34746a9e87149889d59ac767bFei Jiang    close(fbfd);
1132befccec034c13d34746a9e87149889d59ac767bFei Jiang    output->screen_width = vinfo.xres;
1142befccec034c13d34746a9e87149889d59ac767bFei Jiang    output->screen_height = vinfo.yres;
1152f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
1162f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    /* TS by default */
1172f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING;
11862eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang    driver_data->color_key = 0x000001; /*light blue*/
11962eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang    driver_data->overlay_idle_frame = 1;
120437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1218803df709aec9d485d757c681791d708f9a88fe6Austin Yuan    if (psb_parse_config("PSB_VIDEO_CTEXTURES", &put_surface[0]) == 0) {
1228803df709aec9d485d757c681791d708f9a88fe6Austin Yuan        psb__information_message("PSB_VIDEO_CTEXTURES is enabled for vaPutSurfaceBuf\n");
1238803df709aec9d485d757c681791d708f9a88fe6Austin Yuan        driver_data->ctexture = 1; /* Init CTEXTURE for vaPutSurfaceBuf */
1248803df709aec9d485d757c681791d708f9a88fe6Austin Yuan    }
125dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
12654752e65b02b1a84c491e3f9c964046faeea306eKun Wang    if (psb_parse_config("PSB_VIDEO_TS", &put_surface[0]) == 0) {
12754752e65b02b1a84c491e3f9c964046faeea306eKun Wang        psb__information_message("Putsurface use texstreaming\n");
12854752e65b02b1a84c491e3f9c964046faeea306eKun Wang        driver_data->output_method = PSB_PUTSURFACE_FORCE_TEXSTREAMING;
12954752e65b02b1a84c491e3f9c964046faeea306eKun Wang    }
13054752e65b02b1a84c491e3f9c964046faeea306eKun Wang
131bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    if (psb_parse_config("PSB_VIDEO_COVERLAY", &put_surface[0]) == 0) {
1322befccec034c13d34746a9e87149889d59ac767bFei Jiang        psb__information_message("Putsurface use client overlay\n");
1332befccec034c13d34746a9e87149889d59ac767bFei Jiang        driver_data->output_method = PSB_PUTSURFACE_FORCE_COVERLAY;
13454752e65b02b1a84c491e3f9c964046faeea306eKun Wang    }
13554752e65b02b1a84c491e3f9c964046faeea306eKun Wang
13654752e65b02b1a84c491e3f9c964046faeea306eKun Wang    if (IS_MFLD(driver_data)) {
137dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        driver_data->coverlay = 1;
13865174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan        output->psb_HDMIExt_info = psb_HDMIExt_init(ctx, output);
13965174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan        if (!output->psb_HDMIExt_info) {
14054752e65b02b1a84c491e3f9c964046faeea306eKun Wang            psb__error_message("Failed to init psb_HDMIExt.\n");
141ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan            free(output);
142ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan            return NULL;
14354752e65b02b1a84c491e3f9c964046faeea306eKun Wang        }
144dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
145dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1462befccec034c13d34746a9e87149889d59ac767bFei Jiang    return output;
147437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
148437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1492befccec034c13d34746a9e87149889d59ac767bFei JiangVAStatus psb_android_output_deinit(VADriverContextP ctx)
150437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
15154752e65b02b1a84c491e3f9c964046faeea306eKun Wang    INIT_DRIVER_DATA;
15265174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan    INIT_OUTPUT_PRIV;
1532befccec034c13d34746a9e87149889d59ac767bFei Jiang    //psb_android_output_p output = GET_OUTPUT_DATA(ctx);
15465174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan    if (IS_MFLD(driver_data)) {
15565174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan        psb_HDMIExt_deinit(output);
15665174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan    }
1572befccec034c13d34746a9e87149889d59ac767bFei Jiang
1582befccec034c13d34746a9e87149889d59ac767bFei Jiang    return VA_STATUS_SUCCESS;
159437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
160437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1612befccec034c13d34746a9e87149889d59ac767bFei Jiangstatic VAStatus psb_putsurface_ctexture(
162437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VADriverContextP ctx,
163437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VASurfaceID surface,
164437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned char* data,
165437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcx,
166437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcy,
167437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short srcw,
168437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short srch,
169437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short destx,
170437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short desty,
171437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short destw,
172437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short desth,
173437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned int flags /* de-interlacing flags */
174437b3eda28a4bf098efa80598cab67f190275266Fei Jiang)
175437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
176437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_DRIVER_DATA;
1772befccec034c13d34746a9e87149889d59ac767bFei Jiang    INIT_OUTPUT_PRIV;
178437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_surface_p obj_surface = SURFACE(surface);
1792befccec034c13d34746a9e87149889d59ac767bFei Jiang    int offset = 0;
1802befccec034c13d34746a9e87149889d59ac767bFei Jiang    psb_surface_p psb_surface;
181437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1822befccec034c13d34746a9e87149889d59ac767bFei Jiang    obj_surface = SURFACE(surface);
1832befccec034c13d34746a9e87149889d59ac767bFei Jiang    psb_surface = obj_surface->psb_surface;
184437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
18554752e65b02b1a84c491e3f9c964046faeea306eKun Wang    //    psb_surface->buf.drm_buf;
18654752e65b02b1a84c491e3f9c964046faeea306eKun Wang    //    psb_surface->buf.pl_flags;
18754752e65b02b1a84c491e3f9c964046faeea306eKun Wang    psb_putsurface_textureblit(ctx, data, surface, srcx, srcy, srcw, srch,
18854752e65b02b1a84c491e3f9c964046faeea306eKun Wang                               destx, desty, destw, desth, 0, /* no subtitle */
189dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               obj_surface->width, obj_surface->height,
190dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               psb_surface->stride, psb_surface->buf.drm_buf,
191bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                               psb_surface->buf.pl_flags, 1 /* need wrap dst */);
1922befccec034c13d34746a9e87149889d59ac767bFei Jiang
1932befccec034c13d34746a9e87149889d59ac767bFei Jiang    psb_android_postBuffer(offset);
19454752e65b02b1a84c491e3f9c964046faeea306eKun Wang
1951f0ceeab52f69a9f6fc8817502fae178117292a7Bruce Beare    return VA_STATUS_SUCCESS;
196437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
197437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1982befccec034c13d34746a9e87149889d59ac767bFei JiangVAStatus psb_putsurface_coverlay(
199437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VADriverContextP ctx,
200437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VASurfaceID surface,
201437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcx,
202437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcy,
203437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short srcw,
204437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short srch,
2052befccec034c13d34746a9e87149889d59ac767bFei Jiang    short destx, /* screen cooridination */
206437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short desty,
207437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short destw,
208437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short desth,
209437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned int flags /* de-interlacing flags */
210437b3eda28a4bf098efa80598cab67f190275266Fei Jiang)
211437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
2122befccec034c13d34746a9e87149889d59ac767bFei Jiang    INIT_OUTPUT_PRIV;
213437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
214dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2152befccec034c13d34746a9e87149889d59ac767bFei Jiang    /* USE_FIT_SCR_SIZE */
2162befccec034c13d34746a9e87149889d59ac767bFei Jiang    /* calculate fit screen size of frame */
2172befccec034c13d34746a9e87149889d59ac767bFei Jiang    unsigned short _scr_x = output->screen_width;
2182befccec034c13d34746a9e87149889d59ac767bFei Jiang    unsigned short _scr_y = output->screen_height;
219dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    float _slope_xy = (float)srch / srcw;
220dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    unsigned short _destw = (short)(_scr_y / _slope_xy);
221dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    unsigned short _desth = (short)(_scr_x * _slope_xy);
2222befccec034c13d34746a9e87149889d59ac767bFei Jiang    short _pos_x, _pos_y;
223dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2242befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (_destw <= _scr_x) {
2252befccec034c13d34746a9e87149889d59ac767bFei Jiang        _desth = _scr_y;
226dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        _pos_x = (_scr_x - _destw) >> 1;
2272befccec034c13d34746a9e87149889d59ac767bFei Jiang        _pos_y = 0;
2282befccec034c13d34746a9e87149889d59ac767bFei Jiang    } else {
2292befccec034c13d34746a9e87149889d59ac767bFei Jiang        _destw = _scr_x;
2302befccec034c13d34746a9e87149889d59ac767bFei Jiang        _pos_x = 0;
231dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        _pos_y = (_scr_y - _desth) >> 1;
232437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
2332befccec034c13d34746a9e87149889d59ac767bFei Jiang    destx += _pos_x;
2342befccec034c13d34746a9e87149889d59ac767bFei Jiang    desty += _pos_y;
2352befccec034c13d34746a9e87149889d59ac767bFei Jiang    destw = _destw;
2362befccec034c13d34746a9e87149889d59ac767bFei Jiang    desth = _desth;
237437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
238ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    psb__information_message("psb_putsurface_overlay: src (%d, %d, %d, %d), destx (%d, %d, %d, %d).\n",
23954752e65b02b1a84c491e3f9c964046faeea306eKun Wang                             srcx, srcy, srcw, srch, destx, desty, destw, desth);
2402befccec034c13d34746a9e87149889d59ac767bFei Jiang    /* display by overlay */
2412befccec034c13d34746a9e87149889d59ac767bFei Jiang    vaStatus = psb_putsurface_overlay(
242dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                   ctx, surface, srcx, srcy, srcw, srch,
243dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                   destx, desty, destw, desth, /* screen coordinate */
244dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                   flags, OVERLAY_A, PIPEA);
245437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
2462befccec034c13d34746a9e87149889d59ac767bFei Jiang    return vaStatus;
247437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
248437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
249ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
250ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin YuanVAStatus psb_putsurface_ts(
251ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    VADriverContextP ctx,
252ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    VASurfaceID surface,
253ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    void *android_isurface,
25462eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang    int buffer_index,
255ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    short srcx,
256ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    short srcy,
257ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    unsigned short srcw,
258ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    unsigned short srch,
259ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    short destx,
260ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    short desty,
261ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    unsigned short destw,
262ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    unsigned short desth,
263ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    VARectangle *cliprects, /* client supplied clip list */
264ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    unsigned int number_cliprects, /* number of clip rects in the clip list */
265ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    unsigned int flags /* de-interlacing flags */
266ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan)
267ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan{
268ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    INIT_DRIVER_DATA;
269ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    INIT_OUTPUT_PRIV;
270ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    object_surface_p obj_surface = SURFACE(surface);
27162eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang
27262eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang    if (driver_data->overlay_idle_frame == 0) {
27362eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang        psb_android_texture_streaming_resetParams();
27462eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang        update_forced = 1;
27562eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang    }
276ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
277ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /* blend/positioning setting can be called by app directly, or enable VA_ENABLE_BLEND flag to let driver call */
278ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    if (flags & VA_ENABLE_BLEND)
279ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        psb_android_texture_streaming_set_blend(destx, desty, destw, desth,
280ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                                driver_data->clear_color,
281ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                                driver_data->blend_color,
282ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                                driver_data->blend_mode);
283ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /*cropping can be also used for dynamic resolution change feature, only high to low resolution*/
284ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /*by default, srcw and srch is set to video width and height*/
285ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    if ((0 == srcw) || (0 == srch)) {
286ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        srcw = obj_surface->width;
287ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        srch = obj_surface->height_origin;
288ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    }
289ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    psb_android_texture_streaming_set_texture_dim(srcw, srch);
290f91c8768670386683a281cc39141e21bdda9c97fKun Wang    if (driver_data->va_rotate)
291f91c8768670386683a281cc39141e21bdda9c97fKun Wang        psb_android_texture_streaming_set_rotate(va2hw_rotation(driver_data->va_rotate));
29262eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang
293ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan#if 0
294ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /* use cliprect for crop */
295ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    if (cliprects && (number_cliprects == 1))
296ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        psb_android_texture_streaming_set_crop(cliprects->x, cliprects->y, cliprects->width, cliprects->height);
297ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan#endif
298ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
29962eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang    psb_android_texture_streaming_display(buffer_index);
300cafec1db7e3fab84fe6908d9b4398e1867978e23Austin Yuan
301cafec1db7e3fab84fe6908d9b4398e1867978e23Austin Yuan    driver_data->overlay_idle_frame++;
30262eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang    update_forced = 0;
303ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
304ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    return VA_STATUS_SUCCESS;
305ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan}
306ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
3075fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang
3080da1930627209986e8db220799a690f816494401Austin Yuanstatic int psb_update_destbox(
3090da1930627209986e8db220799a690f816494401Austin Yuan    VADriverContextP ctx
3100da1930627209986e8db220799a690f816494401Austin Yuan)
3110da1930627209986e8db220799a690f816494401Austin Yuan{
3120da1930627209986e8db220799a690f816494401Austin Yuan    INIT_DRIVER_DATA;
3130da1930627209986e8db220799a690f816494401Austin Yuan    INIT_OUTPUT_PRIV;
3140da1930627209986e8db220799a690f816494401Austin Yuan    short destx;
3150da1930627209986e8db220799a690f816494401Austin Yuan    short desty;
3160da1930627209986e8db220799a690f816494401Austin Yuan    unsigned short destw;
3170da1930627209986e8db220799a690f816494401Austin Yuan    unsigned short desth;
3180da1930627209986e8db220799a690f816494401Austin Yuan    VAStatus vaStatus = VA_STATUS_SUCCESS;
3190da1930627209986e8db220799a690f816494401Austin Yuan
3200da1930627209986e8db220799a690f816494401Austin Yuan    psb_android_get_destbox(&destx, &desty, &destw, &desth);
321f91c8768670386683a281cc39141e21bdda9c97fKun Wang    /*psb__information_message("destbox = (%d,%d,%d,%d)\n", destx, desty, destw, desth);*/
3220da1930627209986e8db220799a690f816494401Austin Yuan    if ((destx >= 0) && (desty >= 0) &&
3230da1930627209986e8db220799a690f816494401Austin Yuan            ((destx + destw) <= output->screen_width) &&
3240da1930627209986e8db220799a690f816494401Austin Yuan            ((desty + desth) <= output->screen_height) &&
3250da1930627209986e8db220799a690f816494401Austin Yuan            (output->destx != destx ||
3260da1930627209986e8db220799a690f816494401Austin Yuan             output->desty != desty ||
3270da1930627209986e8db220799a690f816494401Austin Yuan             output->destw != destw ||
3280da1930627209986e8db220799a690f816494401Austin Yuan             output->desth != desth)) {
3290da1930627209986e8db220799a690f816494401Austin Yuan        output->destx = destx;
3300da1930627209986e8db220799a690f816494401Austin Yuan        output->desty = desty;
3310da1930627209986e8db220799a690f816494401Austin Yuan        output->destw = destw;
3320da1930627209986e8db220799a690f816494401Austin Yuan        output->desth = desth;
3334338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang        output->new_destbox = 1;
3340da1930627209986e8db220799a690f816494401Austin Yuan
3350da1930627209986e8db220799a690f816494401Austin Yuan        LOGD("==========New Destbox=============\n");
3360da1930627209986e8db220799a690f816494401Austin Yuan        LOGD("output->destbox = (%d,%d,%d,%d)\n", output->destx, output->desty, output->destw, output->desth);
3370da1930627209986e8db220799a690f816494401Austin Yuan    }
3380da1930627209986e8db220799a690f816494401Austin Yuan
3390da1930627209986e8db220799a690f816494401Austin Yuan    return vaStatus;
3400da1930627209986e8db220799a690f816494401Austin Yuan}
341ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
342ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuanstatic int psb_check_outputmethod(
343ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    VADriverContextP ctx,
344ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    VASurfaceID surface,
34588c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang    unsigned short srcw,
34688c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang    unsigned short srch,
347ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    void *android_isurface,
3480da1930627209986e8db220799a690f816494401Austin Yuan    psb_hdmi_mode *hdmi_mode
349ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan)
350ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan{
351ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    INIT_DRIVER_DATA;
352ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    INIT_OUTPUT_PRIV;
353ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    psb_HDMIExt_info_p psb_HDMIExt_info = (psb_HDMIExt_info_p)output->psb_HDMIExt_info;
3540da1930627209986e8db220799a690f816494401Austin Yuan    object_surface_p obj_surface;
3555fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang    int rotation = 0, widi = 0;
356ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
35788c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang    if ((srcw >= 2048) || (srch >= 2048)) {
35888c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang        psb__information_message("Clip size extend overlay hw limit, use texstreaming\n");
35988c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang        driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING;
36088c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang        return 0;
36188c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang    }
36288c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang
363ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /* use saved status to avoid per-frame checking */
364ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    if ((driver_data->frame_count % driver_data->outputmethod_checkinterval) != 0) {
365ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        *hdmi_mode = psb_HDMIExt_get_mode(output);
366ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        return 0;
367ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    }
368ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
369ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /* check the status at outputmethod_checkinterval frequency */
370ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /* at first check HDMI status */
371ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    if (psb_HDMIExt_update(ctx, psb_HDMIExt_info)) {
372ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        psb__error_message("%s: Failed to update HDMIExt info.\n", __FUNCTION__);
3730da1930627209986e8db220799a690f816494401Austin Yuan        return -1;
374ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    }
375ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
376ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    *hdmi_mode = psb_HDMIExt_get_mode(output);
377ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    psb__information_message("hdmi_mode = %d\n", *hdmi_mode);
378ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    if (*hdmi_mode != OFF) {
379ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        psb_HDMIExt_get_prop(output, &driver_data->render_rect.width, &driver_data->render_rect.height,
380ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                             &driver_data->render_rect.x, &driver_data->render_rect.y);
381ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        psb__information_message("Render Rect: (%d,%d,%d,%d)\n",
382ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                 driver_data->render_rect.x, driver_data->render_rect.y,
383ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                 driver_data->render_rect.width, driver_data->render_rect.height);
384ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    }
385ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
3865fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang    if ((*hdmi_mode == EXTENDED_VIDEO) || (*hdmi_mode == CLONE)) {
387f91c8768670386683a281cc39141e21bdda9c97fKun Wang        /* need to handle VA rotation, and set WM rotate to 0
388f91c8768670386683a281cc39141e21bdda9c97fKun Wang         * for Android, MIPI0/HDMI has the same WM rotation always
389f91c8768670386683a281cc39141e21bdda9c97fKun Wang         */
390f91c8768670386683a281cc39141e21bdda9c97fKun Wang        if (driver_data->mipi0_rotation != 0) {
391f91c8768670386683a281cc39141e21bdda9c97fKun Wang            driver_data->mipi0_rotation = 0;
392f91c8768670386683a281cc39141e21bdda9c97fKun Wang            driver_data->hdmi_rotation = 0;
393f91c8768670386683a281cc39141e21bdda9c97fKun Wang            psb_RecalcRotate(ctx);
394f91c8768670386683a281cc39141e21bdda9c97fKun Wang        }
39562eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang
3960da1930627209986e8db220799a690f816494401Austin Yuan        return 0;
3975fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang    }
398ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
3994338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang    /*Update output destbox using layerbuffer's visible region*/
4004338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang    psb_update_destbox(ctx);
4014338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang
4024338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang    if ((driver_data->output_method == PSB_PUTSURFACE_FORCE_COVERLAY)
403f91c8768670386683a281cc39141e21bdda9c97fKun Wang        || (driver_data->output_method == PSB_PUTSURFACE_FORCE_TEXSTREAMING))
4044338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang        return 0;
4054338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang
4064338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang    /*If overlay can not get correct destbox, use texstreaming.*/
407605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang    if (output->destw == 0 || output->desth == 0 ||
408605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang        ((output->destw == srcw) && (output->desth == srch))) {
4094338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang        psb__information_message("No proper destbox, use texstreaming %d\n");
4104338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang        driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING;
4114338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang        return 0;
4124338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang    }
4134338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang
4140da1930627209986e8db220799a690f816494401Austin Yuan    /* HDMI is not enabled */
4155fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang    psb_android_surfaceflinger_status(android_isurface, &output->sf_composition, &rotation, &widi);
4165fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang    if (widi == eWidiClone) {
4175fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang        psb__information_message("WIDI service is detected, use texstreaming\n");
4185fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang        driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING;
419cafec1db7e3fab84fe6908d9b4398e1867978e23Austin Yuan        driver_data->msvdx_rotate_want = 0;/* disable msvdx rotae */
4204338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang
4215fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang        return 0;
4225fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang    }
4234338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang
4240da1930627209986e8db220799a690f816494401Austin Yuan    /* only care local rotation */
42562eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang    if (output->new_destbox && driver_data->mipi0_rotation != rotation) {
426f91c8768670386683a281cc39141e21bdda9c97fKun Wang        psb__information_message("New rotation degree %d of MIPI0 WM, Recalc rotation\n", rotation);
427f91c8768670386683a281cc39141e21bdda9c97fKun Wang        driver_data->mipi0_rotation = rotation;
428f91c8768670386683a281cc39141e21bdda9c97fKun Wang        driver_data->hdmi_rotation = rotation;
429f91c8768670386683a281cc39141e21bdda9c97fKun Wang
430f91c8768670386683a281cc39141e21bdda9c97fKun Wang        psb_RecalcRotate(ctx);
4310da1930627209986e8db220799a690f816494401Austin Yuan    }
432605881752d4bbfb7c70d4d08f3cf1579b5473713Kun Wang    output->new_destbox = 0;
4330da1930627209986e8db220799a690f816494401Austin Yuan
4340da1930627209986e8db220799a690f816494401Austin Yuan    obj_surface = SURFACE(surface);
4350da1930627209986e8db220799a690f816494401Austin Yuan    if (GET_SURFACE_INFO_protect(obj_surface->psb_surface)) {
4360da1930627209986e8db220799a690f816494401Austin Yuan        psb__information_message("Protected surface, use overlay\n");
4370da1930627209986e8db220799a690f816494401Austin Yuan        driver_data->output_method = PSB_PUTSURFACE_COVERLAY;
4380da1930627209986e8db220799a690f816494401Austin Yuan
4390da1930627209986e8db220799a690f816494401Austin Yuan        return 0;
4400da1930627209986e8db220799a690f816494401Austin Yuan    }
4410da1930627209986e8db220799a690f816494401Austin Yuan
4420da1930627209986e8db220799a690f816494401Austin Yuan    if (output->sf_composition) {
4430da1930627209986e8db220799a690f816494401Austin Yuan        psb__information_message("Composition is detected, use texstreaming\n");
4440da1930627209986e8db220799a690f816494401Austin Yuan        driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING;
4450da1930627209986e8db220799a690f816494401Austin Yuan        return 0;
4460da1930627209986e8db220799a690f816494401Austin Yuan    }
4470da1930627209986e8db220799a690f816494401Austin Yuan
448f91c8768670386683a281cc39141e21bdda9c97fKun Wang    if (driver_data->local_rotation != 0) { /* final rotation is not 0 */
4490da1930627209986e8db220799a690f816494401Austin Yuan        int srf_rotate = GET_SURFACE_INFO_rotate(obj_surface->psb_surface);
450f91c8768670386683a281cc39141e21bdda9c97fKun Wang        if ((srf_rotate != driver_data->local_rotation) || (NULL == obj_surface->psb_surface_rotate)) { /* surface rotation isn't same with the final rotation */
451f91c8768670386683a281cc39141e21bdda9c97fKun Wang            psb__information_message("SF rotation degree %d, MSVDX rotate %d, rotate surface 0x%08x\n", rotation, srf_rotate, obj_surface->psb_surface_rotate);
4520da1930627209986e8db220799a690f816494401Austin Yuan            driver_data->output_method = PSB_PUTSURFACE_TEXSTREAMING;
4530da1930627209986e8db220799a690f816494401Austin Yuan            return 0;
454ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        }
455ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    }
456ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
457f91c8768670386683a281cc39141e21bdda9c97fKun Wang    psb__information_message("Surfaceflinger rotation %d, final rotation degree %d, use overlay\n",
458f91c8768670386683a281cc39141e21bdda9c97fKun Wang                             rotation, driver_data->local_rotation);
4590da1930627209986e8db220799a690f816494401Austin Yuan    driver_data->output_method = PSB_PUTSURFACE_COVERLAY;
4600da1930627209986e8db220799a690f816494401Austin Yuan
461ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    return 0;
462ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan}
463ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
4642befccec034c13d34746a9e87149889d59ac767bFei JiangVAStatus psb_PutSurface(
465437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VADriverContextP ctx,
466437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VASurfaceID surface,
4672befccec034c13d34746a9e87149889d59ac767bFei Jiang    void *android_isurface,
468437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcx,
469437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short srcy,
470437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short srcw,
471437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short srch,
472437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short destx,
473437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    short desty,
474437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short destw,
475437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned short desth,
476437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VARectangle *cliprects, /* client supplied clip list */
477437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned int number_cliprects, /* number of clip rects in the clip list */
478437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned int flags /* de-interlacing flags */
4792befccec034c13d34746a9e87149889d59ac767bFei Jiang)
480437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
481437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_DRIVER_DATA;
4822befccec034c13d34746a9e87149889d59ac767bFei Jiang    INIT_OUTPUT_PRIV;
483437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_surface_p obj_surface;
484437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
48554752e65b02b1a84c491e3f9c964046faeea306eKun Wang    PsbPortPrivPtr pPriv = (PsbPortPrivPtr)(&driver_data->coverlay_priv);
48654752e65b02b1a84c491e3f9c964046faeea306eKun Wang    psb_hdmi_mode hdmi_mode = OFF;
48762eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang    int sf_composition = 0, buffer_index = 0, i = 0;
48862eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang    uint32_t ttm_handle;
48962eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang    psb_surface_p psb_surface;
490437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
491437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    obj_surface = SURFACE(surface);
492dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == obj_surface) {
493437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        vaStatus = VA_STATUS_ERROR_INVALID_SURFACE;
494437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        DEBUG_FAILURE;
495437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return vaStatus;
496437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
49754752e65b02b1a84c491e3f9c964046faeea306eKun Wang
4985fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang    if ((NULL == cliprects) && (0 != number_cliprects)) {
49988c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang        vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
50088c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang        DEBUG_FAILURE;
50188c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang        return vaStatus;
50288c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang    }
50388c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang
50454752e65b02b1a84c491e3f9c964046faeea306eKun Wang    if ((srcx < 0) || (srcx > obj_surface->width) || (srcw > (obj_surface->width - srcx)) ||
5050da1930627209986e8db220799a690f816494401Austin Yuan            (srcy < 0) || (srcy > obj_surface->height_origin) || (srch > (obj_surface->height_origin - srcy))) {
50654752e65b02b1a84c491e3f9c964046faeea306eKun Wang        psb__error_message("vaPutSurface: source rectangle passed from upper layer is not correct.\n");
50754752e65b02b1a84c491e3f9c964046faeea306eKun Wang        return VA_STATUS_ERROR_UNKNOWN;
50854752e65b02b1a84c491e3f9c964046faeea306eKun Wang    }
50954752e65b02b1a84c491e3f9c964046faeea306eKun Wang    if ((destx < 0) || (desty < 0)) {
51054752e65b02b1a84c491e3f9c964046faeea306eKun Wang        psb__error_message("vaPutSurface: dest rectangle passed from upper layer is not correct.\n");
5113f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan        return VA_STATUS_ERROR_UNKNOWN;
5123f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan    }
51354752e65b02b1a84c491e3f9c964046faeea306eKun Wang
5142befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (driver_data->dummy_putsurface) {
5153f0344d71a79eccf65858fe5ba8a55f75dc5d7f5Austin Yuan        psb__information_message("vaPutSurface: dummy mode, return directly\n");
5162befccec034c13d34746a9e87149889d59ac767bFei Jiang        return VA_STATUS_SUCCESS;
5172befccec034c13d34746a9e87149889d59ac767bFei Jiang    }
5182befccec034c13d34746a9e87149889d59ac767bFei Jiang
51962eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang    /*get bcd buffer index of current surface*/
52062eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang    psb_surface = obj_surface->psb_surface;
52162eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang    ttm_handle = (uint32_t)(wsbmKBufHandle(wsbmKBuf(psb_surface->buf.drm_buf)));
52262eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang
52362eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang    for (i = 0; i < driver_data->bcd_buffer_num; i++) {
52462eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang        if (driver_data->bcd_ttm_handles[i] == ttm_handle)
52562eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang            break;
52662eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang    }
52762eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang    if (i == driver_data->bcd_buffer_num) {
52862eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang        psb__error_message("Failed to get buffer index.\n");
52962eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang        return VA_STATUS_ERROR_UNKNOWN;
53062eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang    }
53162eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang    buffer_index = i;
53262eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang
5335b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang    /* set the current displaying video frame into kernel */
5345b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang    psb_surface_set_displaying(driver_data, obj_surface->width, obj_surface->height, obj_surface->psb_surface);
53562eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang
536ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /* exit MRST path at first */
537ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    if (IS_MRST(driver_data)) {
538ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        if (driver_data->output_method == PSB_PUTSURFACE_FORCE_COVERLAY) { /* overlay is for testing, not POR */
539ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan            psb__information_message("Force overlay to display\n");
540ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan            vaStatus = psb_putsurface_coverlay(ctx, surface,
541ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                               srcx, srcy, srcw, srch,
542ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                               destx, desty, destw, desth,
543ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                               flags);
544ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        } else {
545ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan            psb__information_message("Use texstreaming to display.\n");
54662eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang            vaStatus = psb_putsurface_ts(ctx, surface, android_isurface, buffer_index,
547ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                         srcx, srcy, srcw, srch,
548ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                         destx, desty, destw, desth,
549ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                         cliprects, number_cliprects, /* number of clip rects in the clip list */
550ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                         flags);
55165174cf623a03bf5ce819778f8bca002674c2e7eAustin Yuan        }
55254752e65b02b1a84c491e3f9c964046faeea306eKun Wang
553ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        return vaStatus;
55454752e65b02b1a84c491e3f9c964046faeea306eKun Wang    }
555ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
5560da1930627209986e8db220799a690f816494401Austin Yuan    if (psb_android_register_isurface(android_isurface, driver_data->bcd_id, srcw, srch)) {
5570da1930627209986e8db220799a690f816494401Austin Yuan        psb__error_message("In psb_PutSurface, android_isurface is not a valid isurface object.\n");
5580da1930627209986e8db220799a690f816494401Austin Yuan        return VA_STATUS_ERROR_UNKNOWN;
5590da1930627209986e8db220799a690f816494401Austin Yuan    }
5600da1930627209986e8db220799a690f816494401Austin Yuan
561ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /* time for MFLD platform */
56288c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang    psb_check_outputmethod(ctx, surface, srcw, srch, android_isurface, &hdmi_mode);
563ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
564ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /* Extvideo: Use overlay to render external HDMI display */
565ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    if (hdmi_mode == EXTENDED_VIDEO) {
566ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        psb__information_message("HDMI: ExtVideo mode enabled, use overlay to render external HDMI display.\n");
5670da1930627209986e8db220799a690f816494401Austin Yuan        /*we also need to clear local display if colorkey dirty.*/
56862eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang        if (driver_data->overlay_idle_frame != 0) {
56962eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang            psb_android_texture_streaming_set_background_color(driver_data->color_key | 0xff000000);
57062eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang            psb_android_texture_streaming_display(buffer_index);
57162eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang            driver_data->overlay_idle_frame = 0;
5720da1930627209986e8db220799a690f816494401Austin Yuan        }
573bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        vaStatus = psb_putsurface_overlay(ctx, surface,
574bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                          srcx, srcy, srcw, srch,
575bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                          driver_data->render_rect.x, driver_data->render_rect.y,
576bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                          driver_data->render_rect.width, driver_data->render_rect.height,
577bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                          flags, OVERLAY_A, PIPEB);
578ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
579ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        return vaStatus;
580ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    }
581ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
582ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    /* Clone mode: Use TS to render both MIPI and HDMI display */
583ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    if (hdmi_mode == CLONE) {
584ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        psb__information_message("HDMI: Clone mode enabled, use texsteaming for both devices\n");
58562eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang        vaStatus = psb_putsurface_ts(ctx, surface, android_isurface, buffer_index,
586ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                     srcx, srcy, srcw, srch,
587ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                     destx, desty, destw, desth,
588ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                     cliprects, number_cliprects, /* number of clip rects in the clip list */
589ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                     flags);
590ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        return vaStatus;
591ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    }
592ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
5930da1930627209986e8db220799a690f816494401Austin Yuan    /* local video playback */
5940da1930627209986e8db220799a690f816494401Austin Yuan    if ((driver_data->output_method == PSB_PUTSURFACE_TEXSTREAMING) ||
595f91c8768670386683a281cc39141e21bdda9c97fKun Wang        (driver_data->output_method == PSB_PUTSURFACE_FORCE_TEXSTREAMING)) {
596ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        psb__information_message("MIPI: Use texstreaming to display.\n");
597ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
59862eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang        vaStatus = psb_putsurface_ts(ctx, surface, android_isurface, buffer_index,
599ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                     srcx, srcy, srcw, srch,
600ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                     destx, desty, destw, desth,
601ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                     cliprects, number_cliprects, /* number of clip rects in the clip list */
602ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan                                     flags);
603ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    } else {
604ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        psb__information_message("MIPI: Use overlay to display.\n");
605ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
6064338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang        /*initialize output destbox using default destbox if it has not been initialized until here.*/
6074338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang        if (output->destw == 0 || output->desth == 0) {
6084338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang            output->destx = (destx > 0) ? destx : 0;
6094338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang            output->desty = (desty > 0) ? desty : 0;
6104338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang            output->destw = ((output->destx + destw) > output->screen_width) ? (output->screen_width - output->destx) : destw;
6114338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang            output->desth = ((output->desty + desth) > output->screen_height) ? (output->screen_height - output->desty) : desth;
6124338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang        }
6134338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang
614ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan        /* Hack for repaint color key to black(0,0,0). */
61562eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang        if (driver_data->overlay_idle_frame != 0) {
61662eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang            psb__information_message("Paint color key to 0x%x\n", driver_data->color_key);
61762eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang            psb_android_texture_streaming_set_background_color(driver_data->color_key | 0xff000000);
61862eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang            psb_android_texture_streaming_display(buffer_index);
61962eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang            driver_data->overlay_idle_frame = 0;
62054752e65b02b1a84c491e3f9c964046faeea306eKun Wang        }
62154752e65b02b1a84c491e3f9c964046faeea306eKun Wang
6225fc4c9dad588a06fd9f9d03585991517ff59dad1Kun Wang        psb__information_message("Overlay position = (%d,%d,%d,%d)\n", output->destx, output->desty, output->destw, output->desth);
6230da1930627209986e8db220799a690f816494401Austin Yuan        vaStatus = psb_putsurface_overlay(ctx, surface,
6240da1930627209986e8db220799a690f816494401Austin Yuan                                          srcx, srcy, srcw, srch,
6250da1930627209986e8db220799a690f816494401Austin Yuan                                          output->destx, output->desty, output->destw, output->desth,
6260da1930627209986e8db220799a690f816494401Austin Yuan                                          flags, OVERLAY_A, PIPEA);
6272befccec034c13d34746a9e87149889d59ac767bFei Jiang    }
628bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang
6294338997831d19bf1d5d286ba4cb5620f24b237b0Kun Wang    if (driver_data->overlay_idle_frame == 2)
630cafec1db7e3fab84fe6908d9b4398e1867978e23Austin Yuan        psb_coverlay_stop(ctx);
631cafec1db7e3fab84fe6908d9b4398e1867978e23Austin Yuan
632ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    driver_data->frame_count++;
633ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan
63462eed835ef3be46cbdc2239b73f5b261b72bf1beKun Wang
6352f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    return vaStatus;
636437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
637