DisplayAnalyzer.cpp revision b16cf47b6865c4ba53e336558671d11b0325e78b
165efc253a628175c7afa95c431b746ea20052794Andy Qiu/* 265efc253a628175c7afa95c431b746ea20052794Andy Qiu * Copyright © 2012 Intel Corporation 365efc253a628175c7afa95c431b746ea20052794Andy Qiu * All rights reserved. 465efc253a628175c7afa95c431b746ea20052794Andy Qiu * 565efc253a628175c7afa95c431b746ea20052794Andy Qiu * Permission is hereby granted, free of charge, to any person obtaining a 665efc253a628175c7afa95c431b746ea20052794Andy Qiu * copy of this software and associated documentation files (the "Software"), 765efc253a628175c7afa95c431b746ea20052794Andy Qiu * to deal in the Software without restriction, including without limitation 865efc253a628175c7afa95c431b746ea20052794Andy Qiu * the rights to use, copy, modify, merge, publish, distribute, sublicense, 965efc253a628175c7afa95c431b746ea20052794Andy Qiu * and/or sell copies of the Software, and to permit persons to whom the 1065efc253a628175c7afa95c431b746ea20052794Andy Qiu * Software is furnished to do so, subject to the following conditions: 1165efc253a628175c7afa95c431b746ea20052794Andy Qiu * 1265efc253a628175c7afa95c431b746ea20052794Andy Qiu * The above copyright notice and this permission notice (including the next 1365efc253a628175c7afa95c431b746ea20052794Andy Qiu * paragraph) shall be included in all copies or substantial portions of the 1465efc253a628175c7afa95c431b746ea20052794Andy Qiu * Software. 1565efc253a628175c7afa95c431b746ea20052794Andy Qiu * 1665efc253a628175c7afa95c431b746ea20052794Andy Qiu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1765efc253a628175c7afa95c431b746ea20052794Andy Qiu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1865efc253a628175c7afa95c431b746ea20052794Andy Qiu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1965efc253a628175c7afa95c431b746ea20052794Andy Qiu * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 2065efc253a628175c7afa95c431b746ea20052794Andy Qiu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 2165efc253a628175c7afa95c431b746ea20052794Andy Qiu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 2265efc253a628175c7afa95c431b746ea20052794Andy Qiu * IN THE SOFTWARE. 2365efc253a628175c7afa95c431b746ea20052794Andy Qiu * 2465efc253a628175c7afa95c431b746ea20052794Andy Qiu * Authors: 2565efc253a628175c7afa95c431b746ea20052794Andy Qiu * Jackie Li <yaodong.li@intel.com> 2665efc253a628175c7afa95c431b746ea20052794Andy Qiu * 2765efc253a628175c7afa95c431b746ea20052794Andy Qiu */ 2865efc253a628175c7afa95c431b746ea20052794Andy Qiu 2965efc253a628175c7afa95c431b746ea20052794Andy Qiu#include <HwcTrace.h> 3065efc253a628175c7afa95c431b746ea20052794Andy Qiu#include <IDisplayDevice.h> 3165efc253a628175c7afa95c431b746ea20052794Andy Qiu#include <DisplayQuery.h> 3265efc253a628175c7afa95c431b746ea20052794Andy Qiu#include <BufferManager.h> 3365efc253a628175c7afa95c431b746ea20052794Andy Qiu#include <DisplayPlaneManager.h> 3465efc253a628175c7afa95c431b746ea20052794Andy Qiu#include <Hwcomposer.h> 3565efc253a628175c7afa95c431b746ea20052794Andy Qiu#include <DisplayAnalyzer.h> 365490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu#include <cutils/properties.h> 37ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi#include <GraphicBuffer.h> 382413102f33fdefa6bdb80ed2c4f56fae83cd5bd8fu jin#include <ExternalDevice.h> 3965efc253a628175c7afa95c431b746ea20052794Andy Qiu 4065efc253a628175c7afa95c431b746ea20052794Andy Qiunamespace android { 4165efc253a628175c7afa95c431b746ea20052794Andy Qiunamespace intel { 4265efc253a628175c7afa95c431b746ea20052794Andy Qiu 4365efc253a628175c7afa95c431b746ea20052794Andy QiuDisplayAnalyzer::DisplayAnalyzer() 4465efc253a628175c7afa95c431b746ea20052794Andy Qiu : mInitialized(false), 455490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu mEnableVideoExtendedMode(true), 46770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie mVideoExtendedMode(false), 47d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu mForceCloneMode(false), 48d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu mBlankDevice(false), 49eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mOverlayAllowed(true), 50eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mCachedNumDisplays(0), 51eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mCachedDisplays(0), 52eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mPendingEvents(), 534ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu mEventMutex(), 544ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu mEventHandledCondition() 5565efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 5665efc253a628175c7afa95c431b746ea20052794Andy Qiu} 5765efc253a628175c7afa95c431b746ea20052794Andy Qiu 5865efc253a628175c7afa95c431b746ea20052794Andy QiuDisplayAnalyzer::~DisplayAnalyzer() 5965efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 6065efc253a628175c7afa95c431b746ea20052794Andy Qiu} 6165efc253a628175c7afa95c431b746ea20052794Andy Qiu 6265efc253a628175c7afa95c431b746ea20052794Andy Qiubool DisplayAnalyzer::initialize() 6365efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 645490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu // by default video extended mode is enabled 655490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu char prop[PROPERTY_VALUE_MAX]; 665490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu if (property_get("hwc.video.extmode.enable", prop, "1") > 0) { 675490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu mEnableVideoExtendedMode = atoi(prop) ? true : false; 685490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu } 69d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu mVideoExtendedMode = false; 70d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu mForceCloneMode = false; 71d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu mBlankDevice = false; 72eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mOverlayAllowed = true; 73eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mCachedNumDisplays = 0; 74eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mCachedDisplays = 0; 75eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mPendingEvents.clear(); 76b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe mVideoStateMap.clear(); 7765efc253a628175c7afa95c431b746ea20052794Andy Qiu mInitialized = true; 78b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie 7965efc253a628175c7afa95c431b746ea20052794Andy Qiu return true; 8065efc253a628175c7afa95c431b746ea20052794Andy Qiu} 8165efc253a628175c7afa95c431b746ea20052794Andy Qiu 82e2ad4c047651d4442f6a0e002290016d45e9201afu jinvoid DisplayAnalyzer::deinitialize() 8365efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 84eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mPendingEvents.clear(); 85b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe mVideoStateMap.clear(); 8665efc253a628175c7afa95c431b746ea20052794Andy Qiu mInitialized = false; 8765efc253a628175c7afa95c431b746ea20052794Andy Qiu} 8865efc253a628175c7afa95c431b746ea20052794Andy Qiu 89770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xievoid DisplayAnalyzer::analyzeContents( 90770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie size_t numDisplays, hwc_display_contents_1_t** displays) 91770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie{ 92eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // cache and use them only in this context during analysis 93eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mCachedNumDisplays = numDisplays; 94eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mCachedDisplays = displays; 95eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 96eb726af21649d79ed720bdf329e0849270995c45Andy Qiu handlePendingEvents(); 97eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 985490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu if (mEnableVideoExtendedMode) { 995490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu detectVideoExtendedMode(); 1005490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu if (mVideoExtendedMode) { 1015490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu detectTrickMode(mCachedDisplays[IDisplayDevice::DEVICE_PRIMARY]); 1025490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu } 103770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie } 104b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe 105b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if (mBlankDevice) { 106b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe // this will make sure device is blanked after geometry changes. 107b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe // blank event is only processed once 108b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe blankSecondaryDevice(); 109b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } 110770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie} 111770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie 112770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xievoid DisplayAnalyzer::detectTrickMode(hwc_display_contents_1_t *list) 113770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie{ 114770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie if (list == NULL) 115770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie return; 116770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie 117770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie bool detected = false; 118770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie for (size_t i = 0; i < list->numHwLayers; i++) { 119770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie hwc_layer_1_t *layer = &list->hwLayers[i]; 120770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie if (layer && (layer->flags & HWC_TRICK_MODE)) { 121770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie detected = true; 122770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie break; 123770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie } 124770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie } 125770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie 126770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie if (detected != mForceCloneMode) { 127770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie list->flags |= HWC_GEOMETRY_CHANGED; 128770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie mForceCloneMode = detected; 129ab1610b6b232267dd2971ee05dd9dda2cfe2a6a1Lin Xie resetCompositionType(list); 130770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie } 131770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie} 132770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie 133eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::detectVideoExtendedMode() 13465efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 135b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if (mVideoStateMap.size() != 1) { 136eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mVideoExtendedMode = false; 137eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mForceCloneMode = false; 138eb726af21649d79ed720bdf329e0849270995c45Andy Qiu return; 139eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 140eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 14165efc253a628175c7afa95c431b746ea20052794Andy Qiu bool geometryChanged = false; 14265efc253a628175c7afa95c431b746ea20052794Andy Qiu int activeDisplays = 0; 143d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu 14465efc253a628175c7afa95c431b746ea20052794Andy Qiu hwc_display_contents_1_t *content = NULL; 145eb726af21649d79ed720bdf329e0849270995c45Andy Qiu for (int i = 0; i < (int)mCachedNumDisplays; i++) { 146eb726af21649d79ed720bdf329e0849270995c45Andy Qiu content = mCachedDisplays[i]; 14765efc253a628175c7afa95c431b746ea20052794Andy Qiu if (content == NULL) { 14865efc253a628175c7afa95c431b746ea20052794Andy Qiu continue; 14965efc253a628175c7afa95c431b746ea20052794Andy Qiu } 15065efc253a628175c7afa95c431b746ea20052794Andy Qiu activeDisplays++; 15165efc253a628175c7afa95c431b746ea20052794Andy Qiu if (content->flags & HWC_GEOMETRY_CHANGED) { 15265efc253a628175c7afa95c431b746ea20052794Andy Qiu geometryChanged = true; 15365efc253a628175c7afa95c431b746ea20052794Andy Qiu } 15465efc253a628175c7afa95c431b746ea20052794Andy Qiu } 15565efc253a628175c7afa95c431b746ea20052794Andy Qiu 15665efc253a628175c7afa95c431b746ea20052794Andy Qiu if (activeDisplays <= 1) { 15765efc253a628175c7afa95c431b746ea20052794Andy Qiu mVideoExtendedMode = false; 15865efc253a628175c7afa95c431b746ea20052794Andy Qiu return; 15965efc253a628175c7afa95c431b746ea20052794Andy Qiu } 16065efc253a628175c7afa95c431b746ea20052794Andy Qiu 16165efc253a628175c7afa95c431b746ea20052794Andy Qiu if (geometryChanged == false) { 16265efc253a628175c7afa95c431b746ea20052794Andy Qiu // use previous analysis result 16365efc253a628175c7afa95c431b746ea20052794Andy Qiu return; 16465efc253a628175c7afa95c431b746ea20052794Andy Qiu } 16565efc253a628175c7afa95c431b746ea20052794Andy Qiu 16665efc253a628175c7afa95c431b746ea20052794Andy Qiu // reset status of video extended mode 16765efc253a628175c7afa95c431b746ea20052794Andy Qiu mVideoExtendedMode = false; 16865efc253a628175c7afa95c431b746ea20052794Andy Qiu 16965efc253a628175c7afa95c431b746ea20052794Andy Qiu // check if there is video layer in the primary device 170eb726af21649d79ed720bdf329e0849270995c45Andy Qiu content = mCachedDisplays[0]; 17165efc253a628175c7afa95c431b746ea20052794Andy Qiu if (content == NULL) { 17265efc253a628175c7afa95c431b746ea20052794Andy Qiu return; 17365efc253a628175c7afa95c431b746ea20052794Andy Qiu } 17465efc253a628175c7afa95c431b746ea20052794Andy Qiu 175d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu uint32_t videoHandle = 0; 17665efc253a628175c7afa95c431b746ea20052794Andy Qiu bool videoLayerExist = false; 17765efc253a628175c7afa95c431b746ea20052794Andy Qiu // exclude the frame buffer target layer 17865efc253a628175c7afa95c431b746ea20052794Andy Qiu for (int j = 0; j < (int)content->numHwLayers - 1; j++) { 17965efc253a628175c7afa95c431b746ea20052794Andy Qiu videoLayerExist = isVideoLayer(content->hwLayers[j]); 180bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie if (videoLayerExist) { 18165efc253a628175c7afa95c431b746ea20052794Andy Qiu videoHandle = (uint32_t)content->hwLayers[j].handle; 18265efc253a628175c7afa95c431b746ea20052794Andy Qiu break; 18365efc253a628175c7afa95c431b746ea20052794Andy Qiu } 18465efc253a628175c7afa95c431b746ea20052794Andy Qiu } 18565efc253a628175c7afa95c431b746ea20052794Andy Qiu 18665efc253a628175c7afa95c431b746ea20052794Andy Qiu if (videoLayerExist == false) { 18765efc253a628175c7afa95c431b746ea20052794Andy Qiu // no video layer is found in the primary layer 18865efc253a628175c7afa95c431b746ea20052794Andy Qiu return; 18965efc253a628175c7afa95c431b746ea20052794Andy Qiu } 19065efc253a628175c7afa95c431b746ea20052794Andy Qiu 19165efc253a628175c7afa95c431b746ea20052794Andy Qiu // check whether video layer exists in external device or virtual device 19265efc253a628175c7afa95c431b746ea20052794Andy Qiu // TODO: video may exist in virtual device but no in external device or vice versa 19365efc253a628175c7afa95c431b746ea20052794Andy Qiu // TODO: multiple video layers are not addressed here 194eb726af21649d79ed720bdf329e0849270995c45Andy Qiu for (int i = 1; i < (int)mCachedNumDisplays; i++) { 195eb726af21649d79ed720bdf329e0849270995c45Andy Qiu content = mCachedDisplays[i]; 19665efc253a628175c7afa95c431b746ea20052794Andy Qiu if (content == NULL) { 19765efc253a628175c7afa95c431b746ea20052794Andy Qiu continue; 19865efc253a628175c7afa95c431b746ea20052794Andy Qiu } 19965efc253a628175c7afa95c431b746ea20052794Andy Qiu 20065efc253a628175c7afa95c431b746ea20052794Andy Qiu // exclude the frame buffer target layer 20165efc253a628175c7afa95c431b746ea20052794Andy Qiu for (int j = 0; j < (int)content->numHwLayers - 1; j++) { 20265efc253a628175c7afa95c431b746ea20052794Andy Qiu if ((uint32_t)content->hwLayers[j].handle == videoHandle) { 2039332f677fa9b02f55ff910ca08a36eb6f23030d6Andy Qiu VTRACE("video layer exists in device %d", i); 2048670d976afea4ba19b9fabccd44ea6486e0cf711Ashish Singhi mVideoExtendedMode = isVideoFullScreen(i, content->hwLayers[j]); 20529f1b7b02255e355fb6061b42b9c42d3af230d37Yong Yao#ifdef INTEL_WIDI_MERRIFIELD 20693a41077b270534d49dc34a03428b3442972468cAndy Qiu if (i == IDisplayDevice::DEVICE_VIRTUAL) { 20793a41077b270534d49dc34a03428b3442972468cAndy Qiu // WiDi exception: always in video extended mode 20893a41077b270534d49dc34a03428b3442972468cAndy Qiu mVideoExtendedMode = true; 20993a41077b270534d49dc34a03428b3442972468cAndy Qiu } 21029f1b7b02255e355fb6061b42b9c42d3af230d37Yong Yao#endif 21165efc253a628175c7afa95c431b746ea20052794Andy Qiu return; 21265efc253a628175c7afa95c431b746ea20052794Andy Qiu } 21365efc253a628175c7afa95c431b746ea20052794Andy Qiu } 21465efc253a628175c7afa95c431b746ea20052794Andy Qiu } 21565efc253a628175c7afa95c431b746ea20052794Andy Qiu} 21665efc253a628175c7afa95c431b746ea20052794Andy Qiu 21765efc253a628175c7afa95c431b746ea20052794Andy Qiubool DisplayAnalyzer::checkVideoExtendedMode() 21865efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 219770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie return mVideoExtendedMode && !mForceCloneMode; 22065efc253a628175c7afa95c431b746ea20052794Andy Qiu} 22165efc253a628175c7afa95c431b746ea20052794Andy Qiu 2225490411cb9330d4e92d59878da3693c33a948ad6Andy Qiubool DisplayAnalyzer::isVideoExtendedModeEnabled() 2235490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu{ 2245490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu#if 1 2255490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu // enable it for run-time debugging purpose. 2265490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu char prop[PROPERTY_VALUE_MAX]; 2275490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu if (property_get("hwc.video.extmode.enable", prop, "1") > 0) { 2285490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu mEnableVideoExtendedMode = atoi(prop) ? true : false; 2295490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu } 2305490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu ITRACE("video extended mode enabled: %d", mEnableVideoExtendedMode); 2315490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu#endif 2325490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu 2335490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu return mEnableVideoExtendedMode; 2345490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu} 2355490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu 23665efc253a628175c7afa95c431b746ea20052794Andy Qiubool DisplayAnalyzer::isVideoLayer(hwc_layer_1_t &layer) 23765efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 23865efc253a628175c7afa95c431b746ea20052794Andy Qiu bool ret = false; 23965efc253a628175c7afa95c431b746ea20052794Andy Qiu BufferManager *bm = Hwcomposer::getInstance().getBufferManager(); 240eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (!layer.handle) { 241eb726af21649d79ed720bdf329e0849270995c45Andy Qiu return false; 242eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 243eb726af21649d79ed720bdf329e0849270995c45Andy Qiu DataBuffer *buffer = bm->lockDataBuffer((uint32_t)layer.handle); 24465efc253a628175c7afa95c431b746ea20052794Andy Qiu if (!buffer) { 24565efc253a628175c7afa95c431b746ea20052794Andy Qiu ETRACE("failed to get buffer"); 24665efc253a628175c7afa95c431b746ea20052794Andy Qiu } else { 24765efc253a628175c7afa95c431b746ea20052794Andy Qiu ret = DisplayQuery::isVideoFormat(buffer->getFormat()); 248eb726af21649d79ed720bdf329e0849270995c45Andy Qiu bm->unlockDataBuffer(buffer); 24965efc253a628175c7afa95c431b746ea20052794Andy Qiu } 25065efc253a628175c7afa95c431b746ea20052794Andy Qiu return ret; 25165efc253a628175c7afa95c431b746ea20052794Andy Qiu} 25265efc253a628175c7afa95c431b746ea20052794Andy Qiu 2530131f123eba74813aca3eaaf99cd418b6b558416Andy Qiubool DisplayAnalyzer::isVideoFullScreen(int device, hwc_layer_1_t &layer) 254bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie{ 2550131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu IDisplayDevice *displayDevice = Hwcomposer::getInstance().getDisplayDevice(device); 2560131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu if (!displayDevice) { 257bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie return false; 258bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie } 2590131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu int width = 0, height = 0; 2600131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu if (!displayDevice->getDisplaySize(&width, &height)) { 2610131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu return false; 2620131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu } 2630131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu 2649332f677fa9b02f55ff910ca08a36eb6f23030d6Andy Qiu VTRACE("video left %d, right %d, top %d, bottom %d, device width %d, height %d", 2650131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu layer.displayFrame.left, layer.displayFrame.right, 2660131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu layer.displayFrame.top, layer.displayFrame.bottom, 2670131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu width, height); 268bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie 269bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie int dstW = layer.displayFrame.right - layer.displayFrame.left; 270bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie int dstH = layer.displayFrame.bottom - layer.displayFrame.top; 2710131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu if (dstW < width - 1 && 2720131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu dstH < height - 1) { 2739332f677fa9b02f55ff910ca08a36eb6f23030d6Andy Qiu VTRACE("video is not full-screen"); 2740131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu return false; 275bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie } 2760131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu return true; 277bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie} 278bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie 279eb726af21649d79ed720bdf329e0849270995c45Andy Qiubool DisplayAnalyzer::isOverlayAllowed() 280eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 281eb726af21649d79ed720bdf329e0849270995c45Andy Qiu return mOverlayAllowed; 282eb726af21649d79ed720bdf329e0849270995c45Andy Qiu} 283eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 28435fc4846ba9657d6d2638e68d810618fedec7ecdAshish Singhiint DisplayAnalyzer::getVideoInstances() 28535fc4846ba9657d6d2638e68d810618fedec7ecdAshish Singhi{ 286b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe return (int)mVideoStateMap.size(); 28735fc4846ba9657d6d2638e68d810618fedec7ecdAshish Singhi} 28835fc4846ba9657d6d2638e68d810618fedec7ecdAshish Singhi 289eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::postHotplugEvent(bool connected) 290eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 291eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // TODO: turn on primary display immeidately 292eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 293eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (!connected) { 294eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // enable vsync on the primary device immediately 295eb726af21649d79ed720bdf329e0849270995c45Andy Qiu Hwcomposer::getInstance().getVsyncManager()->resetVsyncSource(); 296eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } else { 297eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // handle hotplug event (vsync switch) asynchronously 298eb726af21649d79ed720bdf329e0849270995c45Andy Qiu Event e; 299eb726af21649d79ed720bdf329e0849270995c45Andy Qiu e.type = HOTPLUG_EVENT; 300b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe e.bValue = connected; 301eb726af21649d79ed720bdf329e0849270995c45Andy Qiu postEvent(e); 302eb726af21649d79ed720bdf329e0849270995c45Andy Qiu Hwcomposer::getInstance().invalidate(); 303eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 304eb726af21649d79ed720bdf329e0849270995c45Andy Qiu} 305eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 306b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpevoid DisplayAnalyzer::postVideoEvent(int instanceID, int state) 307eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 308eb726af21649d79ed720bdf329e0849270995c45Andy Qiu Event e; 309eb726af21649d79ed720bdf329e0849270995c45Andy Qiu e.type = VIDEO_EVENT; 310b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie e.videoEvent.instanceID = instanceID; 311b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe e.videoEvent.state = state; 312eb726af21649d79ed720bdf329e0849270995c45Andy Qiu postEvent(e); 313b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe 314b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if ((state == VIDEO_PLAYBACK_STARTING) || 315b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe (state == VIDEO_PLAYBACK_STOPPING && hasProtectedLayer())) { 3164ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu Hwcomposer::getInstance().invalidate(); 3174ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu Mutex::Autolock lock(mEventMutex); 3184ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu // ideally overlay should be disabled in the surface flinger thread, if it is not processed 319b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe // in close to one vsync cycle (50ms) it will be safely disabled in this thread context 3204ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu // there is no threading issue 321b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe status_t err = mEventHandledCondition.waitRelative(mEventMutex, milliseconds(50)); 3224ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu if (err == -ETIMEDOUT) { 3234ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu WTRACE("timeout waiting for event handling"); 3244ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu Hwcomposer::getInstance().getPlaneManager()->disableOverlayPlanes(); 3254ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu } 3264ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu } 327eb726af21649d79ed720bdf329e0849270995c45Andy Qiu} 328eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 329eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::postBlankEvent(bool blank) 330eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 331eb726af21649d79ed720bdf329e0849270995c45Andy Qiu Event e; 332eb726af21649d79ed720bdf329e0849270995c45Andy Qiu e.type = BLANK_EVENT; 333b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe e.bValue = blank; 334eb726af21649d79ed720bdf329e0849270995c45Andy Qiu postEvent(e); 335d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu Hwcomposer::getInstance().invalidate(); 336d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu} 337d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu 338eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::postEvent(Event& e) 339d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu{ 340eb726af21649d79ed720bdf329e0849270995c45Andy Qiu Mutex::Autolock lock(mEventMutex); 341eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mPendingEvents.add(e); 342eb726af21649d79ed720bdf329e0849270995c45Andy Qiu} 343eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 344b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpebool DisplayAnalyzer::getEvent(Event& e) 345eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 346eb726af21649d79ed720bdf329e0849270995c45Andy Qiu Mutex::Autolock lock(mEventMutex); 347eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (mPendingEvents.size() == 0) { 348b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe return false; 349b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } 350b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe e = mPendingEvents[0]; 351b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe mPendingEvents.removeAt(0); 352b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe return true; 353b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe} 354b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe 355b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpevoid DisplayAnalyzer::handlePendingEvents() 356b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe{ 357b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe // handle one event per analysis to avoid blocking surface flinger 358b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe // some event may take lengthy time to process 359b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe Event e; 360b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if (!getEvent(e)) { 361eb726af21649d79ed720bdf329e0849270995c45Andy Qiu return; 362eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 363eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 364b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe switch (e.type) { 365b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe case HOTPLUG_EVENT: 366b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe handleHotplugEvent(e.bValue); 367b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe break; 368b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe case BLANK_EVENT: 369b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe handleBlankEvent(e.bValue); 370b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe break; 371b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe case VIDEO_EVENT: 372b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe handleVideoEvent(e.videoEvent.instanceID, e.videoEvent.state); 373b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe break; 374b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe case TIMING_EVENT: 375b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe handleTimingEvent(); 376b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe break; 377eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 378eb726af21649d79ed720bdf329e0849270995c45Andy Qiu} 379eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 380eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::handleHotplugEvent(bool connected) 381eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 382eb726af21649d79ed720bdf329e0849270995c45Andy Qiu Hwcomposer::getInstance().getVsyncManager()->resetVsyncSource(); 383eb726af21649d79ed720bdf329e0849270995c45Andy Qiu} 384eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 385eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::handleBlankEvent(bool blank) 386eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 387eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mBlankDevice = blank; 388eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // force geometry changed in the secondary device to reset layer composition type 389eb726af21649d79ed720bdf329e0849270995c45Andy Qiu for (int i = 0; i < (int)mCachedNumDisplays; i++) { 390eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (i == IDisplayDevice::DEVICE_PRIMARY) { 391eb726af21649d79ed720bdf329e0849270995c45Andy Qiu continue; 392eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 393eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (mCachedDisplays[i]) { 394eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mCachedDisplays[i]->flags |= HWC_GEOMETRY_CHANGED; 395eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 396d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu } 397eb726af21649d79ed720bdf329e0849270995c45Andy Qiu blankSecondaryDevice(); 398eb726af21649d79ed720bdf329e0849270995c45Andy Qiu} 399d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu 400b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpevoid DisplayAnalyzer::handleTimingEvent() 401b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie{ 402b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie // check whether external device is connected, reset refresh rate to match video frame rate 403b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie // if video is in playing state or reset refresh rate to default preferred one if video is not 404b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie // at playing state 405b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie Hwcomposer *hwc = &Hwcomposer::getInstance(); 406b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe ExternalDevice *dev = NULL; 407b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe dev = (ExternalDevice *)hwc->getDisplayDevice(IDisplayDevice::DEVICE_EXTERNAL); 408b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if (!dev) { 409b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie return; 410b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } 411b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe 412b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if (!dev->isConnected()) { 413b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe return; 414b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } 415b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie 416f320f1a53d9adba5885304f3589962a58a1b4e67Lin Xie if (hwc->getMultiDisplayObserver()->isExternalDeviceTimingFixed()) { 417b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe VTRACE("Timing of external device is fixed."); 418f320f1a53d9adba5885304f3589962a58a1b4e67Lin Xie return; 419f320f1a53d9adba5885304f3589962a58a1b4e67Lin Xie } 420f320f1a53d9adba5885304f3589962a58a1b4e67Lin Xie 421853b12aa319e4557a300923590538282c88314beAndy Qiu int hz = 0; 422b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if (mVideoStateMap.size() == 1) { 42384e17af0350016243463b4fe7a82e76524e01651Lin Xie VideoSourceInfo info; 424b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe int instanceID = mVideoStateMap.keyAt(0); 425b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie status_t err = hwc->getMultiDisplayObserver()->getVideoSourceInfo( 426b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe instanceID, &info); 42784e17af0350016243463b4fe7a82e76524e01651Lin Xie if (err == NO_ERROR) { 428853b12aa319e4557a300923590538282c88314beAndy Qiu hz = info.frameRate; 429b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie } 430b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie } 4312413102f33fdefa6bdb80ed2c4f56fae83cd5bd8fu jin 432b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe dev->setRefreshRate(hz); 433b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie} 434b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie 435b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpevoid DisplayAnalyzer::handleVideoEvent(int instanceID, int state) 436eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 437b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe mVideoStateMap.removeItem(instanceID); 438b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if (state != VIDEO_PLAYBACK_STOPPED) { 439b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe mVideoStateMap.add(instanceID, state); 440b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } 441b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe 442b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe Hwcomposer *hwc = &Hwcomposer::getInstance(); 443b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe 444b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe // sanity check 445b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if (hwc->getMultiDisplayObserver()->getVideoSessionNumber() != 446b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe (int)mVideoStateMap.size()) { 447b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe WTRACE("session number does not match!!"); 448b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe mVideoStateMap.clear(); 449b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if (state != VIDEO_PLAYBACK_STOPPED) { 450b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe mVideoStateMap.add(instanceID, state); 451b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } 452b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } 453b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe 454b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if ((state == VIDEO_PLAYBACK_STARTING) || 455b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe (state == VIDEO_PLAYBACK_STOPPING && hasProtectedLayer())) { 456b9a5828701cc5c7bd24f9369d9a790b8b5f2c8b0Zhu,Tianyang hwc_display_contents_1_t *content = NULL; 457eb726af21649d79ed720bdf329e0849270995c45Andy Qiu for (int i = 0; i < (int)mCachedNumDisplays; i++) { 458b9a5828701cc5c7bd24f9369d9a790b8b5f2c8b0Zhu,Tianyang content = mCachedDisplays[i]; 459b9a5828701cc5c7bd24f9369d9a790b8b5f2c8b0Zhu,Tianyang if (content == NULL) { 460b9a5828701cc5c7bd24f9369d9a790b8b5f2c8b0Zhu,Tianyang continue; 461b9a5828701cc5c7bd24f9369d9a790b8b5f2c8b0Zhu,Tianyang } 462b9a5828701cc5c7bd24f9369d9a790b8b5f2c8b0Zhu,Tianyang content->flags |= HWC_GEOMETRY_CHANGED; 463ab1610b6b232267dd2971ee05dd9dda2cfe2a6a1Lin Xie resetCompositionType(content); 464eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 465b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe // if video is in starting or stopping stage, overlay use is temporarily not allowed to 466b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe // avoid scrambed RGB overlay if video is protected. 467b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe mOverlayAllowed = false; 468b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie 469b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe // disable overlay plane and acknolwdge the waiting thread 470b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe hwc->getPlaneManager()->disableOverlayPlanes(); 471b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe mEventHandledCondition.signal(); 472b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } else { 473b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe mOverlayAllowed = true; 474b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie } 475b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie 476b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe // delay changing timing as it is a lengthy operation 477b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if (state == VIDEO_PLAYBACK_STARTED || 478b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe state == VIDEO_PLAYBACK_STOPPED) { 479b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe Event e; 480b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe e.type = TIMING_EVENT; 481b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe postEvent(e); 4824ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu } 483eb726af21649d79ed720bdf329e0849270995c45Andy Qiu} 484eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 485eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::blankSecondaryDevice() 486eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 487d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu hwc_display_contents_1_t *content = NULL; 488d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu hwc_layer_1 *layer = NULL; 489eb726af21649d79ed720bdf329e0849270995c45Andy Qiu for (int i = 0; i < (int)mCachedNumDisplays; i++) { 490d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu if (i == IDisplayDevice::DEVICE_PRIMARY) { 491d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu continue; 492d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu } 493eb726af21649d79ed720bdf329e0849270995c45Andy Qiu content = mCachedDisplays[i]; 494d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu if (content == NULL) { 495d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu continue; 496d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu } 497d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu 498d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu for (int j = 0; j < (int)content->numHwLayers - 1; j++) { 499d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu layer = &content->hwLayers[j]; 500d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu if (!layer) { 501d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu continue; 502d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu } 503d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu if (mBlankDevice) { 504d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu layer->hints |= HWC_HINT_CLEAR_FB; 505d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu layer->flags &= ~HWC_SKIP_LAYER; 506d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu layer->compositionType = HWC_OVERLAY; 507d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu } else { 508d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu layer->hints &= ~HWC_HINT_CLEAR_FB; 509d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu layer->compositionType = HWC_FRAMEBUFFER; 510d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu } 511d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu } 512d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu } 513d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu} 51465efc253a628175c7afa95c431b746ea20052794Andy Qiu 515d248396b4f48861e1e27c5e316c776121ab44938mamatha balguribool DisplayAnalyzer::isPresentationLayer(hwc_layer_1_t &layer) 516d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri{ 517d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri if (mCachedDisplays == NULL) { 518d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri return false; 519d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri } 520d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri // check if the given layer exists in the primary device 521d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri hwc_display_contents_1_t *content = mCachedDisplays[0]; 522d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri if (content == NULL) { 523d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri return false; 524d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri } 525d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri for (size_t i = 0; i < content->numHwLayers - 1; i++) { 526d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri if ((uint32_t)content->hwLayers[i].handle == (uint32_t)layer.handle) { 527d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri VTRACE("Layer exists for Primary device"); 528d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri return false; 529d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri } 530d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri } 531d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri return true; 532d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri} 533d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri 534b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpebool DisplayAnalyzer::hasProtectedLayer() 535b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe{ 536b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe DataBuffer * buffer = NULL; 537b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe hwc_display_contents_1_t *content = NULL; 538b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe BufferManager *bm = Hwcomposer::getInstance().getBufferManager(); 539b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe 540b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if (bm == NULL){ 541b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe return false; 542b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } 543b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe 544b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if (mCachedDisplays == NULL) { 545b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe return false; 546b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } 547b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe // check if the given layer exists in the primary device 548b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe for (int index = 0; index < (int)mCachedNumDisplays; index++) { 549b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe content = mCachedDisplays[index]; 550b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if (content == NULL) { 551b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe continue; 552b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } 553b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe 554b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe for (size_t i = 0; i < content->numHwLayers - 1; i++) { 555b16cf47b6865c4ba53e336558671d11b0325e78bLin Xie if (isProtectedLayer(content->hwLayers[i])) 556b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe return true; 557b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } 558b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } 559b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe 560b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe return false; 561b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe} 562b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe 563ab1610b6b232267dd2971ee05dd9dda2cfe2a6a1Lin Xie// reset the composition type of all layers to default 564ab1610b6b232267dd2971ee05dd9dda2cfe2a6a1Lin Xievoid DisplayAnalyzer::resetCompositionType(hwc_display_contents_1_t *display) 565ab1610b6b232267dd2971ee05dd9dda2cfe2a6a1Lin Xie{ 566ab1610b6b232267dd2971ee05dd9dda2cfe2a6a1Lin Xie if (display == NULL) 567ab1610b6b232267dd2971ee05dd9dda2cfe2a6a1Lin Xie return; 568ab1610b6b232267dd2971ee05dd9dda2cfe2a6a1Lin Xie 569ab1610b6b232267dd2971ee05dd9dda2cfe2a6a1Lin Xie for (size_t i = 0; i < display->numHwLayers - 1; i++) { 570ab1610b6b232267dd2971ee05dd9dda2cfe2a6a1Lin Xie hwc_layer_1_t *layer = &display->hwLayers[i]; 571ab1610b6b232267dd2971ee05dd9dda2cfe2a6a1Lin Xie if (layer) layer->compositionType = HWC_FRAMEBUFFER; 572ab1610b6b232267dd2971ee05dd9dda2cfe2a6a1Lin Xie } 573ab1610b6b232267dd2971ee05dd9dda2cfe2a6a1Lin Xie} 574ab1610b6b232267dd2971ee05dd9dda2cfe2a6a1Lin Xie 575ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhibool DisplayAnalyzer::isProtectedLayer(hwc_layer_1_t &layer) 576ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi{ 577ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi bool ret = false; 578ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi BufferManager *bm = Hwcomposer::getInstance().getBufferManager(); 579ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi if (!layer.handle) { 580ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi return ret; 581ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi } 582ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi DataBuffer *buffer = bm->lockDataBuffer((uint32_t)layer.handle); 583ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi if (!buffer) { 584ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi ETRACE("failed to get buffer"); 585ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi } else { 586ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi ret = GraphicBuffer::isProtectedBuffer((GraphicBuffer*)buffer); 587ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi bm->unlockDataBuffer(buffer); 588ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi } 589ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi return ret; 590ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi} 591ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi 59265efc253a628175c7afa95c431b746ea20052794Andy Qiu} // namespace intel 59365efc253a628175c7afa95c431b746ea20052794Andy Qiu} // namespace android 59465efc253a628175c7afa95c431b746ea20052794Andy Qiu 595