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