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