DisplayAnalyzer.cpp revision 2f6c0128167508e86c3daf83e7b60f3b5f16f7ac
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),
45177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu      mVideoExtModeEnabled(true),
46177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu      mVideoExtModeEligible(false),
47177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu      mVideoExtModeActive(false),
48d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu      mBlankDevice(false),
49eb726af21649d79ed720bdf329e0849270995c45Andy Qiu      mOverlayAllowed(true),
50177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu      mActiveInputState(true),
51eb726af21649d79ed720bdf329e0849270995c45Andy Qiu      mCachedNumDisplays(0),
52eb726af21649d79ed720bdf329e0849270995c45Andy Qiu      mCachedDisplays(0),
53eb726af21649d79ed720bdf329e0849270995c45Andy Qiu      mPendingEvents(),
544ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu      mEventMutex(),
554ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu      mEventHandledCondition()
5665efc253a628175c7afa95c431b746ea20052794Andy Qiu{
5765efc253a628175c7afa95c431b746ea20052794Andy Qiu}
5865efc253a628175c7afa95c431b746ea20052794Andy Qiu
5965efc253a628175c7afa95c431b746ea20052794Andy QiuDisplayAnalyzer::~DisplayAnalyzer()
6065efc253a628175c7afa95c431b746ea20052794Andy Qiu{
6165efc253a628175c7afa95c431b746ea20052794Andy Qiu}
6265efc253a628175c7afa95c431b746ea20052794Andy Qiu
6365efc253a628175c7afa95c431b746ea20052794Andy Qiubool DisplayAnalyzer::initialize()
6465efc253a628175c7afa95c431b746ea20052794Andy Qiu{
655490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu    // by default video extended mode is enabled
665490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu    char prop[PROPERTY_VALUE_MAX];
675490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu    if (property_get("hwc.video.extmode.enable", prop, "1") > 0) {
68177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        mVideoExtModeEnabled = atoi(prop) ? true : false;
695490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu    }
70177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    mVideoExtModeEligible = false;
71177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    mVideoExtModeActive = false;
72d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu    mBlankDevice = false;
73eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mOverlayAllowed = true;
74177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    mActiveInputState = true;
75eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mCachedNumDisplays = 0;
76eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mCachedDisplays = 0;
77eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mPendingEvents.clear();
78b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    mVideoStateMap.clear();
7965efc253a628175c7afa95c431b746ea20052794Andy Qiu    mInitialized = true;
80b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie
8165efc253a628175c7afa95c431b746ea20052794Andy Qiu    return true;
8265efc253a628175c7afa95c431b746ea20052794Andy Qiu}
8365efc253a628175c7afa95c431b746ea20052794Andy Qiu
84e2ad4c047651d4442f6a0e002290016d45e9201afu jinvoid DisplayAnalyzer::deinitialize()
8565efc253a628175c7afa95c431b746ea20052794Andy Qiu{
86eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mPendingEvents.clear();
87b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    mVideoStateMap.clear();
8865efc253a628175c7afa95c431b746ea20052794Andy Qiu    mInitialized = false;
8965efc253a628175c7afa95c431b746ea20052794Andy Qiu}
9065efc253a628175c7afa95c431b746ea20052794Andy Qiu
91770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xievoid DisplayAnalyzer::analyzeContents(
92770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie        size_t numDisplays, hwc_display_contents_1_t** displays)
93770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie{
94eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    // cache and use them only in this context during analysis
95eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mCachedNumDisplays = numDisplays;
96eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mCachedDisplays = displays;
97eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
98eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    handlePendingEvents();
99eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
100177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    if (mVideoExtModeEnabled) {
101177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        handleVideoExtMode();
102770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie    }
103b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe
104b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    if (mBlankDevice) {
105b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        // this will make sure device is blanked after geometry changes.
106b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        // blank event is only processed once
107b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        blankSecondaryDevice();
108b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    }
109770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie}
110770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie
111177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiuvoid DisplayAnalyzer::handleVideoExtMode()
112770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie{
113177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    bool eligible = mVideoExtModeEligible;
114177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    checkVideoExtMode();
115177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    if (eligible == mVideoExtModeEligible) {
116177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        if (mVideoExtModeActive) {
117177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu            // need to mark all layers
118177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu            setCompositionType(0, HWC_OVERLAY, false);
119770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie        }
120177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        return;
121770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie    }
122770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie
123177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    if (mVideoExtModeEligible) {
124177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        if (mActiveInputState) {
125177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu            VTRACE("input is active");
126177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        } else {
127177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu            enterVideoExtMode();
128177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        }
129177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    } else {
130177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        exitVideoExtMode();
131770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie    }
132770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie}
133770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie
134177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiuvoid DisplayAnalyzer::checkVideoExtMode()
13565efc253a628175c7afa95c431b746ea20052794Andy Qiu{
136b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    if (mVideoStateMap.size() != 1) {
137177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        mVideoExtModeEligible = 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) {
157177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        mVideoExtModeEligible = false;
15865efc253a628175c7afa95c431b746ea20052794Andy Qiu        return;
15965efc253a628175c7afa95c431b746ea20052794Andy Qiu    }
16065efc253a628175c7afa95c431b746ea20052794Andy Qiu
161177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    // video state update event may come later than geometry change event.
162177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    // in that case, video extended mode is not detected properly.
163177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu#if 0
16465efc253a628175c7afa95c431b746ea20052794Andy Qiu    if (geometryChanged == false) {
16565efc253a628175c7afa95c431b746ea20052794Andy Qiu        // use previous analysis result
16665efc253a628175c7afa95c431b746ea20052794Andy Qiu        return;
16765efc253a628175c7afa95c431b746ea20052794Andy Qiu    }
168177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu#endif
169177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    // reset eligibility of video extended mode
170177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    mVideoExtModeEligible = false;
17165efc253a628175c7afa95c431b746ea20052794Andy Qiu
17265efc253a628175c7afa95c431b746ea20052794Andy Qiu    // check if there is video layer in the primary device
173eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    content = mCachedDisplays[0];
17465efc253a628175c7afa95c431b746ea20052794Andy Qiu    if (content == NULL) {
17565efc253a628175c7afa95c431b746ea20052794Andy Qiu        return;
17665efc253a628175c7afa95c431b746ea20052794Andy Qiu    }
17765efc253a628175c7afa95c431b746ea20052794Andy Qiu
178d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu    uint32_t videoHandle = 0;
17965efc253a628175c7afa95c431b746ea20052794Andy Qiu    bool videoLayerExist = false;
180319e5478ad0ed4a50df6190a7d529e020051eb50Andy Qiu    bool videoFullScreenOnPrimary = false;
1812f6c0128167508e86c3daf83e7b60f3b5f16f7acZhu,Tianyang    bool isVideoLayerSkipped = false;
1824a3844e0ffd267aae9ffbe5a3266c8e3c0dc7070Zhu,Tianyang
18365efc253a628175c7afa95c431b746ea20052794Andy Qiu    // exclude the frame buffer target layer
18465efc253a628175c7afa95c431b746ea20052794Andy Qiu    for (int j = 0; j < (int)content->numHwLayers - 1; j++) {
18565efc253a628175c7afa95c431b746ea20052794Andy Qiu        videoLayerExist = isVideoLayer(content->hwLayers[j]);
186bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie        if (videoLayerExist) {
1874a3844e0ffd267aae9ffbe5a3266c8e3c0dc7070Zhu,Tianyang            if ((content->hwLayers[j].flags & HWC_SKIP_LAYER)) {
1882f6c0128167508e86c3daf83e7b60f3b5f16f7acZhu,Tianyang                isVideoLayerSkipped = true;
1894a3844e0ffd267aae9ffbe5a3266c8e3c0dc7070Zhu,Tianyang            }
19065efc253a628175c7afa95c431b746ea20052794Andy Qiu            videoHandle = (uint32_t)content->hwLayers[j].handle;
191319e5478ad0ed4a50df6190a7d529e020051eb50Andy Qiu            videoFullScreenOnPrimary = isVideoFullScreen(0, content->hwLayers[j]);
19265efc253a628175c7afa95c431b746ea20052794Andy Qiu            break;
19365efc253a628175c7afa95c431b746ea20052794Andy Qiu        }
19465efc253a628175c7afa95c431b746ea20052794Andy Qiu    }
19565efc253a628175c7afa95c431b746ea20052794Andy Qiu
19665efc253a628175c7afa95c431b746ea20052794Andy Qiu    if (videoLayerExist == false) {
19765efc253a628175c7afa95c431b746ea20052794Andy Qiu        // no video layer is found in the primary layer
19865efc253a628175c7afa95c431b746ea20052794Andy Qiu        return;
19965efc253a628175c7afa95c431b746ea20052794Andy Qiu    }
20065efc253a628175c7afa95c431b746ea20052794Andy Qiu
20165efc253a628175c7afa95c431b746ea20052794Andy Qiu    // check whether video layer exists in external device or virtual device
20265efc253a628175c7afa95c431b746ea20052794Andy Qiu    // TODO: video may exist in virtual device but no in external device or vice versa
20365efc253a628175c7afa95c431b746ea20052794Andy Qiu    // TODO: multiple video layers are not addressed here
204eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    for (int i = 1; i < (int)mCachedNumDisplays; i++) {
205eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        content = mCachedDisplays[i];
20665efc253a628175c7afa95c431b746ea20052794Andy Qiu        if (content == NULL) {
20765efc253a628175c7afa95c431b746ea20052794Andy Qiu            continue;
20865efc253a628175c7afa95c431b746ea20052794Andy Qiu        }
20965efc253a628175c7afa95c431b746ea20052794Andy Qiu
21065efc253a628175c7afa95c431b746ea20052794Andy Qiu        // exclude the frame buffer target layer
21165efc253a628175c7afa95c431b746ea20052794Andy Qiu        for (int j = 0; j < (int)content->numHwLayers - 1; j++) {
21265efc253a628175c7afa95c431b746ea20052794Andy Qiu            if ((uint32_t)content->hwLayers[j].handle == videoHandle) {
2132f6c0128167508e86c3daf83e7b60f3b5f16f7acZhu,Tianyang                isVideoLayerSkipped |= (content->hwLayers[j].flags & HWC_SKIP_LAYER);
2149332f677fa9b02f55ff910ca08a36eb6f23030d6Andy Qiu                VTRACE("video layer exists in device %d", i);
2152f6c0128167508e86c3daf83e7b60f3b5f16f7acZhu,Tianyang                if (isVideoLayerSkipped || videoFullScreenOnPrimary){
2162f6c0128167508e86c3daf83e7b60f3b5f16f7acZhu,Tianyang                    VTRACE("Video ext mode eligible, %d, %d",
2172f6c0128167508e86c3daf83e7b60f3b5f16f7acZhu,Tianyang                            isVideoLayerSkipped, videoFullScreenOnPrimary);
218319e5478ad0ed4a50df6190a7d529e020051eb50Andy Qiu                    mVideoExtModeEligible = true;
219319e5478ad0ed4a50df6190a7d529e020051eb50Andy Qiu                } else {
220319e5478ad0ed4a50df6190a7d529e020051eb50Andy Qiu                    mVideoExtModeEligible = isVideoFullScreen(i, content->hwLayers[j]);
221319e5478ad0ed4a50df6190a7d529e020051eb50Andy Qiu                }
22265efc253a628175c7afa95c431b746ea20052794Andy Qiu                return;
22365efc253a628175c7afa95c431b746ea20052794Andy Qiu            }
22465efc253a628175c7afa95c431b746ea20052794Andy Qiu        }
22565efc253a628175c7afa95c431b746ea20052794Andy Qiu    }
22665efc253a628175c7afa95c431b746ea20052794Andy Qiu}
22765efc253a628175c7afa95c431b746ea20052794Andy Qiu
228177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiubool DisplayAnalyzer::isVideoExtModeActive()
22965efc253a628175c7afa95c431b746ea20052794Andy Qiu{
230177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    return mVideoExtModeActive;
23165efc253a628175c7afa95c431b746ea20052794Andy Qiu}
23265efc253a628175c7afa95c431b746ea20052794Andy Qiu
233177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiubool DisplayAnalyzer::isVideoExtModeEnabled()
2345490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu{
2355490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu#if 1
2365490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu    // enable it for run-time debugging purpose.
2375490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu    char prop[PROPERTY_VALUE_MAX];
2385490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu    if (property_get("hwc.video.extmode.enable", prop, "1") > 0) {
239177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        mVideoExtModeEnabled = atoi(prop) ? true : false;
2405490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu    }
241177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    ITRACE("video extended mode enabled: %d", mVideoExtModeEnabled);
2425490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu#endif
2435490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu
244177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    return mVideoExtModeEnabled;
2455490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu}
2465490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu
24765efc253a628175c7afa95c431b746ea20052794Andy Qiubool DisplayAnalyzer::isVideoLayer(hwc_layer_1_t &layer)
24865efc253a628175c7afa95c431b746ea20052794Andy Qiu{
24965efc253a628175c7afa95c431b746ea20052794Andy Qiu    bool ret = false;
25065efc253a628175c7afa95c431b746ea20052794Andy Qiu    BufferManager *bm = Hwcomposer::getInstance().getBufferManager();
251eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    if (!layer.handle) {
252eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        return false;
253eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    }
254eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    DataBuffer *buffer = bm->lockDataBuffer((uint32_t)layer.handle);
25565efc253a628175c7afa95c431b746ea20052794Andy Qiu     if (!buffer) {
25665efc253a628175c7afa95c431b746ea20052794Andy Qiu         ETRACE("failed to get buffer");
25765efc253a628175c7afa95c431b746ea20052794Andy Qiu     } else {
25865efc253a628175c7afa95c431b746ea20052794Andy Qiu        ret = DisplayQuery::isVideoFormat(buffer->getFormat());
259eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        bm->unlockDataBuffer(buffer);
26065efc253a628175c7afa95c431b746ea20052794Andy Qiu    }
26165efc253a628175c7afa95c431b746ea20052794Andy Qiu    return ret;
26265efc253a628175c7afa95c431b746ea20052794Andy Qiu}
26365efc253a628175c7afa95c431b746ea20052794Andy Qiu
2640131f123eba74813aca3eaaf99cd418b6b558416Andy Qiubool DisplayAnalyzer::isVideoFullScreen(int device, hwc_layer_1_t &layer)
265bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie{
2660131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu    IDisplayDevice *displayDevice = Hwcomposer::getInstance().getDisplayDevice(device);
2670131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu    if (!displayDevice) {
268bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie        return false;
269bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie    }
2700131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu    int width = 0, height = 0;
2710131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu    if (!displayDevice->getDisplaySize(&width, &height)) {
2720131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu        return false;
2730131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu    }
2740131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu
2759332f677fa9b02f55ff910ca08a36eb6f23030d6Andy Qiu    VTRACE("video left %d, right %d, top %d, bottom %d, device width %d, height %d",
2760131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu        layer.displayFrame.left, layer.displayFrame.right,
2770131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu        layer.displayFrame.top, layer.displayFrame.bottom,
2780131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu        width, height);
279bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie
280319e5478ad0ed4a50df6190a7d529e020051eb50Andy Qiu    // full-screen defintion:
281319e5478ad0ed4a50df6190a7d529e020051eb50Andy Qiu    // width of target display frame == width of target device, with 1 pixel of tolerance, or
282319e5478ad0ed4a50df6190a7d529e020051eb50Andy Qiu    // Height of target display frame == height of target device, with 1 pixel of tolerance, or
283319e5478ad0ed4a50df6190a7d529e020051eb50Andy Qiu    // width * height of display frame > 90% of width * height of display device, or
284319e5478ad0ed4a50df6190a7d529e020051eb50Andy Qiu    // any of above condition is met on either primary display or secondary display
285bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie    int dstW = layer.displayFrame.right - layer.displayFrame.left;
286bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie    int dstH = layer.displayFrame.bottom - layer.displayFrame.top;
28701b4571b91a4ef92f2a00bd98b2797f10538e431lychenx
2882f6c0128167508e86c3daf83e7b60f3b5f16f7acZhu,Tianyang    if (abs(dstW - width) <= 1 &&
2892f6c0128167508e86c3daf83e7b60f3b5f16f7acZhu,Tianyang        abs(dstH - height) <= 1 &&
290319e5478ad0ed4a50df6190a7d529e020051eb50Andy Qiu        dstW * dstH * 10 < width * height * 9) {
2919332f677fa9b02f55ff910ca08a36eb6f23030d6Andy Qiu        VTRACE("video is not full-screen");
2920131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu        return false;
293bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie    }
2940131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu    return true;
295bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie}
296bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie
297eb726af21649d79ed720bdf329e0849270995c45Andy Qiubool DisplayAnalyzer::isOverlayAllowed()
298eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{
299eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    return mOverlayAllowed;
300eb726af21649d79ed720bdf329e0849270995c45Andy Qiu}
301eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
30235fc4846ba9657d6d2638e68d810618fedec7ecdAshish Singhiint DisplayAnalyzer::getVideoInstances()
30335fc4846ba9657d6d2638e68d810618fedec7ecdAshish Singhi{
304b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    return (int)mVideoStateMap.size();
30535fc4846ba9657d6d2638e68d810618fedec7ecdAshish Singhi}
30635fc4846ba9657d6d2638e68d810618fedec7ecdAshish Singhi
307eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::postHotplugEvent(bool connected)
308eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{
309eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    if (!connected) {
310eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        // enable vsync on the primary device immediately
311177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        Hwcomposer::getInstance().getVsyncManager()->enableDynamicVsync(true);
312eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    }
313177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
314177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    // handle hotplug event (vsync switch) asynchronously
315177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    Event e;
316177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    e.type = HOTPLUG_EVENT;
317177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    e.bValue = connected;
318177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    postEvent(e);
319177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    Hwcomposer::getInstance().invalidate();
320eb726af21649d79ed720bdf329e0849270995c45Andy Qiu}
321eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
322b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpevoid DisplayAnalyzer::postVideoEvent(int instanceID, int state)
323eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{
324eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    Event e;
325eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    e.type = VIDEO_EVENT;
326b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie    e.videoEvent.instanceID = instanceID;
327b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    e.videoEvent.state = state;
328eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    postEvent(e);
329b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe
330b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    if ((state == VIDEO_PLAYBACK_STARTING) ||
331b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        (state == VIDEO_PLAYBACK_STOPPING && hasProtectedLayer())) {
3324ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu        Hwcomposer::getInstance().invalidate();
3334ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu        Mutex::Autolock lock(mEventMutex);
3344ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu        // ideally overlay should be disabled in the surface flinger thread, if it is not processed
335b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        // in close to one vsync cycle (50ms)  it will be safely disabled in this thread context
3364ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu        // there is no threading issue
337b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        status_t err = mEventHandledCondition.waitRelative(mEventMutex, milliseconds(50));
3384ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu        if (err == -ETIMEDOUT) {
3394ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu            WTRACE("timeout waiting for event handling");
3404ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu            Hwcomposer::getInstance().getPlaneManager()->disableOverlayPlanes();
3414ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu        }
3424ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu    }
343eb726af21649d79ed720bdf329e0849270995c45Andy Qiu}
344eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
345eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::postBlankEvent(bool blank)
346eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{
347eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    Event e;
348eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    e.type = BLANK_EVENT;
349b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    e.bValue = blank;
350eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    postEvent(e);
351d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu    Hwcomposer::getInstance().invalidate();
352d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu}
353d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu
354177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiuvoid DisplayAnalyzer::postInputEvent(bool active)
355177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu{
356177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    Event e;
357177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    e.type = INPUT_EVENT;
358177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    e.bValue = active;
359177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    postEvent(e);
360177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    Hwcomposer::getInstance().invalidate();
361177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu}
362177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
363466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Huvoid DisplayAnalyzer::postIdleEntryEvent(void)
364466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu{
365466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    Event e;
366466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    e.type = IDLE_ENTRY_EVENT;
367466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    e.nValue = 0;
368466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    postEvent(e);
369466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu}
370466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu
371eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::postEvent(Event& e)
372d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu{
373eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    Mutex::Autolock lock(mEventMutex);
374eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mPendingEvents.add(e);
375eb726af21649d79ed720bdf329e0849270995c45Andy Qiu}
376eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
377b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpebool DisplayAnalyzer::getEvent(Event& e)
378eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{
379eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    Mutex::Autolock lock(mEventMutex);
380eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    if (mPendingEvents.size() == 0) {
381b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        return false;
382b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    }
383b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    e = mPendingEvents[0];
384b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    mPendingEvents.removeAt(0);
385b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    return true;
386b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe}
387b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe
388b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpevoid DisplayAnalyzer::handlePendingEvents()
389b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe{
390b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    // handle one event per analysis to avoid blocking surface flinger
391b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    // some event may take lengthy time to process
392b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    Event e;
393b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    if (!getEvent(e)) {
394eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        return;
395eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    }
396eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
397b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    switch (e.type) {
398b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    case HOTPLUG_EVENT:
399b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        handleHotplugEvent(e.bValue);
400b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        break;
401b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    case BLANK_EVENT:
402b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        handleBlankEvent(e.bValue);
403b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        break;
404b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    case VIDEO_EVENT:
405b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        handleVideoEvent(e.videoEvent.instanceID, e.videoEvent.state);
406b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        break;
407b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    case TIMING_EVENT:
408b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        handleTimingEvent();
409b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        break;
410177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    case INPUT_EVENT:
411177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        handleInputEvent(e.bValue);
412177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        break;
413177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    case DPMS_EVENT:
414177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        handleDpmsEvent(e.nValue);
415177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        break;
416466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    case IDLE_ENTRY_EVENT:
417466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu        handleIdleEntryEvent(e.nValue);
418466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu        break;
419466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    case IDLE_EXIT_EVENT:
420466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu        handleIdleExitEvent();
421466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu        break;
422eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    }
423eb726af21649d79ed720bdf329e0849270995c45Andy Qiu}
424eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
425eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::handleHotplugEvent(bool connected)
426eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{
427466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    if (connected) {
428466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu        Hwcomposer::getInstance().getPowerManager()->disableIdleControl();
429aa24c338f8cee39de0bc570e224349257bdd7cc3Zhu,Tianyang    } else {
430aa24c338f8cee39de0bc570e224349257bdd7cc3Zhu,Tianyang        if (mVideoStateMap.size() == 0) {
431aa24c338f8cee39de0bc570e224349257bdd7cc3Zhu,Tianyang            Hwcomposer::getInstance().getPowerManager()->enableIdleControl();
432aa24c338f8cee39de0bc570e224349257bdd7cc3Zhu,Tianyang        } else if (mVideoStateMap.size() == 1) {
433aa24c338f8cee39de0bc570e224349257bdd7cc3Zhu,Tianyang            // Reset input state if HDMI is plug out to
434aa24c338f8cee39de0bc570e224349257bdd7cc3Zhu,Tianyang            // avoid entering extended mode immediately after HDMI is plug in
435aa24c338f8cee39de0bc570e224349257bdd7cc3Zhu,Tianyang            mActiveInputState = true;
436aa24c338f8cee39de0bc570e224349257bdd7cc3Zhu,Tianyang        }
437466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    }
438eb726af21649d79ed720bdf329e0849270995c45Andy Qiu}
439eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
440eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::handleBlankEvent(bool blank)
441eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{
442eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mBlankDevice = blank;
443eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    // force geometry changed in the secondary device to reset layer composition type
444eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    for (int i = 0; i < (int)mCachedNumDisplays; i++) {
445eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        if (i == IDisplayDevice::DEVICE_PRIMARY) {
446eb726af21649d79ed720bdf329e0849270995c45Andy Qiu            continue;
447eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        }
448eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        if (mCachedDisplays[i]) {
449eb726af21649d79ed720bdf329e0849270995c45Andy Qiu            mCachedDisplays[i]->flags |= HWC_GEOMETRY_CHANGED;
450eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        }
451d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu    }
452eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    blankSecondaryDevice();
453eb726af21649d79ed720bdf329e0849270995c45Andy Qiu}
454d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu
455b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpevoid DisplayAnalyzer::handleTimingEvent()
456b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie{
457b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie    // check whether external device is connected, reset refresh rate to match video frame rate
458b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie    // if video is in playing state or reset refresh rate to default preferred one if video is not
459b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie    // at playing state
460b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie    Hwcomposer *hwc = &Hwcomposer::getInstance();
461b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    ExternalDevice *dev = NULL;
462b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    dev = (ExternalDevice *)hwc->getDisplayDevice(IDisplayDevice::DEVICE_EXTERNAL);
463b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    if (!dev) {
464b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie        return;
465b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    }
466b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe
467b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    if (!dev->isConnected()) {
468b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        return;
469b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    }
470b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie
471f320f1a53d9adba5885304f3589962a58a1b4e67Lin Xie    if (hwc->getMultiDisplayObserver()->isExternalDeviceTimingFixed()) {
472b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        VTRACE("Timing of external device is fixed.");
473f320f1a53d9adba5885304f3589962a58a1b4e67Lin Xie        return;
474f320f1a53d9adba5885304f3589962a58a1b4e67Lin Xie    }
475f320f1a53d9adba5885304f3589962a58a1b4e67Lin Xie
476853b12aa319e4557a300923590538282c88314beAndy Qiu    int hz = 0;
477b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    if (mVideoStateMap.size() == 1) {
47884e17af0350016243463b4fe7a82e76524e01651Lin Xie        VideoSourceInfo info;
479b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        int instanceID = mVideoStateMap.keyAt(0);
480b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie        status_t err = hwc->getMultiDisplayObserver()->getVideoSourceInfo(
481b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe                instanceID, &info);
48284e17af0350016243463b4fe7a82e76524e01651Lin Xie        if (err == NO_ERROR) {
483853b12aa319e4557a300923590538282c88314beAndy Qiu            hz = info.frameRate;
484b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie        }
485b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie    }
4862413102f33fdefa6bdb80ed2c4f56fae83cd5bd8fu jin
487b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    dev->setRefreshRate(hz);
488b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie}
489b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie
490b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpevoid DisplayAnalyzer::handleVideoEvent(int instanceID, int state)
491eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{
492b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    mVideoStateMap.removeItem(instanceID);
493b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    if (state != VIDEO_PLAYBACK_STOPPED) {
494b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        mVideoStateMap.add(instanceID, state);
495b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    }
496b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe
497b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    Hwcomposer *hwc = &Hwcomposer::getInstance();
498b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe
499b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    // sanity check
500b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    if (hwc->getMultiDisplayObserver()->getVideoSessionNumber() !=
501b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        (int)mVideoStateMap.size()) {
502b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        WTRACE("session number does not match!!");
503b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        mVideoStateMap.clear();
504b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        if (state != VIDEO_PLAYBACK_STOPPED) {
505b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe            mVideoStateMap.add(instanceID, state);
506b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        }
507b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    }
508b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe
509f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu    // check if composition type needs to be reset
510f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu    bool reset = false;
511b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    if ((state == VIDEO_PLAYBACK_STARTING) ||
512b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        (state == VIDEO_PLAYBACK_STOPPING && hasProtectedLayer())) {
513b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        // if video is in starting or stopping stage, overlay use is temporarily not allowed to
514b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        // avoid scrambed RGB overlay if video is protected.
515b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        mOverlayAllowed = false;
516f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu        reset = true;
517b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie
518b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        // disable overlay plane and acknolwdge the waiting thread
519b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        hwc->getPlaneManager()->disableOverlayPlanes();
520b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        mEventHandledCondition.signal();
521b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    } else {
522f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu        reset = !mOverlayAllowed;
523b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        mOverlayAllowed = true;
524b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie    }
525b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie
526f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu    if (reset) {
527f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu        hwc_display_contents_1_t *content = NULL;
528f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu        for (int i = 0; i < (int)mCachedNumDisplays; i++) {
529177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu            setCompositionType(i, HWC_FRAMEBUFFER, true);
530f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu        }
531f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu    }
532f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu
533c8ed4d7c744a7f59864fa5a7db8ae3d0c05a119fZhu,Tianyang    if (mVideoStateMap.size() == 0) {
534c8ed4d7c744a7f59864fa5a7db8ae3d0c05a119fZhu,Tianyang        // reset active input state after video playback stops.
535c8ed4d7c744a7f59864fa5a7db8ae3d0c05a119fZhu,Tianyang        // MDS should update input state in 5 seconds after video playback starts
536c8ed4d7c744a7f59864fa5a7db8ae3d0c05a119fZhu,Tianyang        mActiveInputState = true;
537c8ed4d7c744a7f59864fa5a7db8ae3d0c05a119fZhu,Tianyang    }
538466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu
539466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    if (mVideoStateMap.size() > 0) {
540466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu        hwc->getPowerManager()->disableIdleControl();
541466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    } else if (!hwc->getDrm()->isConnected(IDisplayDevice::DEVICE_EXTERNAL)) {
542466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu         hwc->getPowerManager()->enableIdleControl();
543466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    }
544466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu
545ddc8e627fdde22f2b37a0e24c7ca8dcd1206df97Zhu,Tianyang    // Setting timing immediately,
546ddc8e627fdde22f2b37a0e24c7ca8dcd1206df97Zhu,Tianyang    // Don't posthone to next circle
547ddc8e627fdde22f2b37a0e24c7ca8dcd1206df97Zhu,Tianyang    handleTimingEvent();
548eb726af21649d79ed720bdf329e0849270995c45Andy Qiu}
549eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
550eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::blankSecondaryDevice()
551eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{
552d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu    hwc_display_contents_1_t *content = NULL;
553d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu    hwc_layer_1 *layer = NULL;
554eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    for (int i = 0; i < (int)mCachedNumDisplays; i++) {
555d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu        if (i == IDisplayDevice::DEVICE_PRIMARY) {
556d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu            continue;
557d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu        }
558eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        content = mCachedDisplays[i];
559d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu        if (content == NULL) {
560d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu            continue;
561d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu        }
562d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu
563d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu        for (int j = 0; j < (int)content->numHwLayers - 1; j++) {
564d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu            layer = &content->hwLayers[j];
565d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu            if (!layer) {
566d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu                continue;
567d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu            }
568d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu            if (mBlankDevice) {
569d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu                layer->hints |= HWC_HINT_CLEAR_FB;
570d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu                layer->flags &= ~HWC_SKIP_LAYER;
571d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu                layer->compositionType = HWC_OVERLAY;
572d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu            } else {
573d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu                layer->hints &= ~HWC_HINT_CLEAR_FB;
574d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu                layer->compositionType = HWC_FRAMEBUFFER;
575d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu            }
576d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu        }
577d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu    }
578d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu}
57965efc253a628175c7afa95c431b746ea20052794Andy Qiu
580177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiuvoid DisplayAnalyzer::handleInputEvent(bool active)
581177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu{
582c8ed4d7c744a7f59864fa5a7db8ae3d0c05a119fZhu,Tianyang    if (active == mActiveInputState) {
583c8ed4d7c744a7f59864fa5a7db8ae3d0c05a119fZhu,Tianyang        WTRACE("same input state: %d", active);
584c8ed4d7c744a7f59864fa5a7db8ae3d0c05a119fZhu,Tianyang    }
585177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    mActiveInputState = active;
586177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    if (!mVideoExtModeEligible) {
587177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        ITRACE("not eligible for video extended mode");
588177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        return;
589177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    }
590177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
591177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    if (active) {
592177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        exitVideoExtMode();
593177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    } else {
594177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        enterVideoExtMode();
595177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    }
596177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu}
597177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
598177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiuvoid DisplayAnalyzer::handleDpmsEvent(int delayCount)
599177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu{
600177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    if (mActiveInputState || !mVideoExtModeEligible) {
601177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        ITRACE("aborting display power off in video extended mode");
602177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        return;
603177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    }
604177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
605177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    if (delayCount < DELAY_BEFORE_DPMS_OFF) {
606177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        Event e;
607177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        e.type = DPMS_EVENT;
608177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        e.nValue = delayCount + 1;
609177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        postEvent(e);
6105a3b1ac20ca8e3594554e624efcc4b4d88dec392Lei Zhang        Hwcomposer::getInstance().invalidate();
611177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        return;
612177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    }
613177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
614177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    if (Hwcomposer::getInstance().getVsyncManager()->getVsyncSource() ==
615177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        IDisplayDevice::DEVICE_PRIMARY) {
6166c061a816e1bb454afc8d294231bc235a771d646Nie Jun            Hwcomposer::getInstance().getDrm()->setDpmsMode(
6176c061a816e1bb454afc8d294231bc235a771d646Nie Jun            IDisplayDevice::DEVICE_PRIMARY,
6186c061a816e1bb454afc8d294231bc235a771d646Nie Jun                IDisplayDevice::DEVICE_DISPLAY_STANDBY);
6196c061a816e1bb454afc8d294231bc235a771d646Nie Jun        ETRACE("primary display is source of vsync, we only dim backlight");
620177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        return;
621177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    }
622177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
623c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    // panel can't be powered off as touch panel shares the power supply with LCD.
624c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu    DTRACE("primary display coupled with touch on Saltbay, only dim backlight");
6256c061a816e1bb454afc8d294231bc235a771d646Nie Jun    Hwcomposer::getInstance().getDrm()->setDpmsMode(
6266c061a816e1bb454afc8d294231bc235a771d646Nie Jun               IDisplayDevice::DEVICE_PRIMARY,
6276c061a816e1bb454afc8d294231bc235a771d646Nie Jun               IDisplayDevice::DEVICE_DISPLAY_STANDBY);
628c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu               //IDisplayDevice::DEVICE_DISPLAY_OFF);
6296c061a816e1bb454afc8d294231bc235a771d646Nie Jun    return;
630177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu}
631177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
632466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu
633466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Huvoid DisplayAnalyzer::handleIdleEntryEvent(int count)
634466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu{
635466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    DTRACE("handling idle entry event, count %d", count);
636466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    if (hasProtectedLayer()) {
637466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu        ITRACE("Ignoring idle entry as protected layer exists.");
638466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu        setCompositionType(0, HWC_FRAMEBUFFER, true);
639466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu        return;
640466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    }
641466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu
642466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    // stop idle entry if external device is connected
643466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    if (mCachedDisplays && mCachedDisplays[IDisplayDevice::DEVICE_EXTERNAL]) {
644466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu        ITRACE("Ignoring idle entry as external device is connected.");
645466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu        setCompositionType(0, HWC_FRAMEBUFFER, true);
646466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu        return;
647466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    }
648466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu
649466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    // stop idle entry if video playback is active
650466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    // TODO: remove this check for Annidale
651466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    if (mVideoStateMap.size() > 0) {
652466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu        ITRACE("Ignoring idle entry as video session is active.");
653466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu        setCompositionType(0, HWC_FRAMEBUFFER, true);
654466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu        return;
655466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    }
656466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu
657466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    setCompositionType(0, HWC_FORCE_FRAMEBUFFER, true);
658466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu
659466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    IPowerManager *pm = Hwcomposer::getInstance().getPowerManager();
660466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    if (count == 0) {
661466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu        // ready to enter idel mode
662466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu        pm->setIdleReady();
663466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    }
664466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu
665466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    if (count >= DELAY_BEFORE_IDLE_ENTRY) {
666466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu        pm->enterIdleState();
667466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu        // next prepare/set will exit idle state.
668466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu        Event e;
669466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu        e.type = IDLE_EXIT_EVENT;
670466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu        postEvent(e);
671466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    } else {
672466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu        // invalidate surface flinger again
673466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu        Event e;
674466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu        e.type = IDLE_ENTRY_EVENT;
675466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu        e.nValue = count + 1;
676466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu        postEvent(e);
677466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu        Hwcomposer::getInstance().invalidate();
678466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    }
679466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu}
680466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu
681466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Huvoid DisplayAnalyzer::handleIdleExitEvent()
682466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu{
683466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    DTRACE("handling idle exit event");
684466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu
685466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    IPowerManager *pm = Hwcomposer::getInstance().getPowerManager();
686466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    pm->exitIdleState();
687466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    setCompositionType(0, HWC_FRAMEBUFFER, true);
688466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu}
689466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu
690177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiuvoid DisplayAnalyzer::enterVideoExtMode()
691177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu{
692177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    if (mVideoExtModeActive) {
693177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        WTRACE("already in video extended mode.");
694177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        return;
695177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    }
696177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
697177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    ITRACE("entering video extended mode...");
698177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    mVideoExtModeActive = true;
699177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    Hwcomposer::getInstance().getVsyncManager()->resetVsyncSource();
700177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
701177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    setCompositionType(0, HWC_OVERLAY, true);
702177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
703177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    // Do not power off primary display immediately as flip is asynchronous
704177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    Event e;
705177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    e.type = DPMS_EVENT;
706177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    e.nValue = 0;
707177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    postEvent(e);
7085a3b1ac20ca8e3594554e624efcc4b4d88dec392Lei Zhang    Hwcomposer::getInstance().invalidate();
709177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu}
710177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
711177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiuvoid DisplayAnalyzer::exitVideoExtMode()
712177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu{
713177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    if (!mVideoExtModeActive) {
714177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        WTRACE("Not in video extended mode");
715177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        return;
716177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    }
717177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
718c8ed4d7c744a7f59864fa5a7db8ae3d0c05a119fZhu,Tianyang    ITRACE("exiting video extended mode...");
719177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
720177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    mVideoExtModeActive = false;
721177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
722177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    Hwcomposer::getInstance().getDrm()->setDpmsMode(
723177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        IDisplayDevice::DEVICE_PRIMARY,
724177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        IDisplayDevice::DEVICE_DISPLAY_ON);
725177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
726177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    Hwcomposer::getInstance().getVsyncManager()->resetVsyncSource();
727177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
728177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    setCompositionType(0, HWC_FRAMEBUFFER, true);
729177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu}
730177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
731d248396b4f48861e1e27c5e316c776121ab44938mamatha balguribool DisplayAnalyzer::isPresentationLayer(hwc_layer_1_t &layer)
732d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri{
733177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    if (layer.handle == NULL) {
734177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        return false;
735177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    }
736d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri    if (mCachedDisplays == NULL) {
737d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri        return false;
738d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri    }
739d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri    // check if the given layer exists in the primary device
740d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri    hwc_display_contents_1_t *content = mCachedDisplays[0];
741d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri    if (content == NULL) {
742d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri        return false;
743d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri    }
744d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri    for (size_t i = 0; i < content->numHwLayers - 1; i++) {
745d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri        if ((uint32_t)content->hwLayers[i].handle == (uint32_t)layer.handle) {
746d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri            VTRACE("Layer exists for Primary device");
747d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri            return false;
748d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri        }
749d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri    }
750d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri    return true;
751d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri}
752d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri
753b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpebool DisplayAnalyzer::hasProtectedLayer()
754b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe{
755b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    DataBuffer * buffer = NULL;
756b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    hwc_display_contents_1_t *content = NULL;
757b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    BufferManager *bm = Hwcomposer::getInstance().getBufferManager();
758b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe
759b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    if (bm == NULL){
760b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        return false;
761b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    }
762b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe
763b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    if (mCachedDisplays == NULL) {
764b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        return false;
765b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    }
766b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    // check if the given layer exists in the primary device
767b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    for (int index = 0; index < (int)mCachedNumDisplays; index++) {
768b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        content = mCachedDisplays[index];
769b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        if (content == NULL) {
770b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe            continue;
771b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        }
772b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe
773b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        for (size_t i = 0; i < content->numHwLayers - 1; i++) {
774b16cf47b6865c4ba53e336558671d11b0325e78bLin Xie            if (isProtectedLayer(content->hwLayers[i]))
775b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe                return true;
776b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        }
777b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    }
778b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe
779b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    return false;
780b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe}
781b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe
782ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhibool DisplayAnalyzer::isProtectedLayer(hwc_layer_1_t &layer)
783ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi{
784ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi    if (!layer.handle) {
785177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        return false;
786ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi    }
787177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    bool ret = false;
788177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    BufferManager *bm = Hwcomposer::getInstance().getBufferManager();
789ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi    DataBuffer *buffer = bm->lockDataBuffer((uint32_t)layer.handle);
790ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi    if (!buffer) {
791ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi        ETRACE("failed to get buffer");
792ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi    } else {
793ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi        ret = GraphicBuffer::isProtectedBuffer((GraphicBuffer*)buffer);
794ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi        bm->unlockDataBuffer(buffer);
795ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi    }
796ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi    return ret;
797ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi}
798ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi
799177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiuvoid DisplayAnalyzer::setCompositionType(hwc_display_contents_1_t *display, int type)
800177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu{
801177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    for (size_t i = 0; i < display->numHwLayers - 1; i++) {
802177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        hwc_layer_1_t *layer = &display->hwLayers[i];
803177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        if (layer) layer->compositionType = type;
804177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    }
805177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu}
806177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
807177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiuvoid DisplayAnalyzer::setCompositionType(int device, int type, bool reset)
808177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu{
809177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    hwc_display_contents_1_t *content = mCachedDisplays[device];
810177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    if (content == NULL) {
811177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        ETRACE("Invalid device %d", device);
812177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        return;
813177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    }
814177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
815177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    // don't need to set geometry changed if layers are just needed to be marked
816177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    if (reset) {
817177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        content->flags |= HWC_GEOMETRY_CHANGED;
818177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    }
819177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
820177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    setCompositionType(content, type);
821177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu}
822177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
8231747c24dc5251a0a062ef5f8a6791c30a715e820Zhu,Tianyangint DisplayAnalyzer::getFirstVideoInstanceSessionID() {
8241747c24dc5251a0a062ef5f8a6791c30a715e820Zhu,Tianyang    if (mVideoStateMap.size() >= 1) {
8251747c24dc5251a0a062ef5f8a6791c30a715e820Zhu,Tianyang        return mVideoStateMap.keyAt(0);
8261747c24dc5251a0a062ef5f8a6791c30a715e820Zhu,Tianyang    }
8271747c24dc5251a0a062ef5f8a6791c30a715e820Zhu,Tianyang    return -1;
8281747c24dc5251a0a062ef5f8a6791c30a715e820Zhu,Tianyang}
8291747c24dc5251a0a062ef5f8a6791c30a715e820Zhu,Tianyang
83065efc253a628175c7afa95c431b746ea20052794Andy Qiu} // namespace intel
83165efc253a628175c7afa95c431b746ea20052794Andy Qiu} // namespace android
83265efc253a628175c7afa95c431b746ea20052794Andy Qiu
833