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