DisplayAnalyzer.h revision b7e04bcc10f0b8aaa698b1ccae40e87664ebef18
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#ifndef DISPLAY_ANALYZER_H
2965efc253a628175c7afa95c431b746ea20052794Andy Qiu#define DISPLAY_ANALYZER_H
3065efc253a628175c7afa95c431b746ea20052794Andy Qiu
31d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu#include <utils/threads.h>
32eb726af21649d79ed720bdf329e0849270995c45Andy Qiu#include <utils/Vector.h>
3365efc253a628175c7afa95c431b746ea20052794Andy Qiu
3465efc253a628175c7afa95c431b746ea20052794Andy Qiu
3565efc253a628175c7afa95c431b746ea20052794Andy Qiunamespace android {
3665efc253a628175c7afa95c431b746ea20052794Andy Qiunamespace intel {
3765efc253a628175c7afa95c431b746ea20052794Andy Qiu
3865efc253a628175c7afa95c431b746ea20052794Andy Qiu
3965efc253a628175c7afa95c431b746ea20052794Andy Qiuclass DisplayAnalyzer {
4065efc253a628175c7afa95c431b746ea20052794Andy Qiupublic:
4165efc253a628175c7afa95c431b746ea20052794Andy Qiu    DisplayAnalyzer();
4265efc253a628175c7afa95c431b746ea20052794Andy Qiu    virtual ~DisplayAnalyzer();
4365efc253a628175c7afa95c431b746ea20052794Andy Qiu
4465efc253a628175c7afa95c431b746ea20052794Andy Qiupublic:
4565efc253a628175c7afa95c431b746ea20052794Andy Qiu    bool initialize();
46e2ad4c047651d4442f6a0e002290016d45e9201afu jin    void deinitialize();
4765efc253a628175c7afa95c431b746ea20052794Andy Qiu    void analyzeContents(size_t numDisplays, hwc_display_contents_1_t** displays);
4865efc253a628175c7afa95c431b746ea20052794Andy Qiu    bool checkVideoExtendedMode();
495490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu    bool isVideoExtendedModeEnabled();
5065efc253a628175c7afa95c431b746ea20052794Andy Qiu    bool isVideoLayer(hwc_layer_1_t &layer);
510131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu    bool isVideoFullScreen(int device, hwc_layer_1_t &layer);
52eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    bool isOverlayAllowed();
5335fc4846ba9657d6d2638e68d810618fedec7ecdAshish Singhi    int  getVideoInstances();
54eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    void postHotplugEvent(bool connected);
55b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    void postVideoEvent(int instanceID, int state);
56eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    void postBlankEvent(bool blank);
57d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri    bool isPresentationLayer(hwc_layer_1_t &layer);
58ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi    bool isProtectedLayer(hwc_layer_1_t &layer);
5965efc253a628175c7afa95c431b746ea20052794Andy Qiu
6065efc253a628175c7afa95c431b746ea20052794Andy Qiuprivate:
61eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    enum DisplayEventType {
62eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        HOTPLUG_EVENT,
63eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        BLANK_EVENT,
64eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        VIDEO_EVENT,
65b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        TIMING_EVENT,
66eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    };
67eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
68eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    struct Event {
69eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        int type;
70eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
71eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        struct VideoEvent {
72b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie            int instanceID;
73b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe            int state;
74eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        };
75eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
76eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        union {
77b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe            bool bValue;
78eb726af21649d79ed720bdf329e0849270995c45Andy Qiu            VideoEvent videoEvent;
79eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        };
80eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    };
81eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    inline void postEvent(Event& e);
82b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    inline bool getEvent(Event& e);
83eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    void handlePendingEvents();
84eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    void handleHotplugEvent(bool connected);
85eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    void handleBlankEvent(bool blank);
86b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    void handleVideoEvent(int instanceID, int state);
87b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    void handleTimingEvent();
88eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
89eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    void blankSecondaryDevice();
90eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    void detectVideoExtendedMode();
91770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie    void detectTrickMode(hwc_display_contents_1_t *list);
92b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    bool hasProtectedLayer();
93ab1610b6b232267dd2971ee05dd9dda2cfe2a6a1Lin Xie    inline void resetCompositionType(hwc_display_contents_1_t *content);
94770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie
95eb726af21649d79ed720bdf329e0849270995c45Andy Qiuprivate:
96b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    // Video playback state, must match defintion in Multi Display Service
97b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    enum
98b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    {
99b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        VIDEO_PLAYBACK_IDLE,
100b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        VIDEO_PLAYBACK_STARTING,
101b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        VIDEO_PLAYBACK_STARTED,
102b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        VIDEO_PLAYBACK_STOPPING,
103b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        VIDEO_PLAYBACK_STOPPED,
104b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    };
105b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe
106b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpeprivate:
10765efc253a628175c7afa95c431b746ea20052794Andy Qiu    bool mInitialized;
1085490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu    bool mEnableVideoExtendedMode;
10965efc253a628175c7afa95c431b746ea20052794Andy Qiu    bool mVideoExtendedMode;
110770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie    bool mForceCloneMode;
111d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu    bool mBlankDevice;
112b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    // map video instance ID to video state
113b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    KeyedVector<int, int> mVideoStateMap;
114eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    bool mOverlayAllowed;
115eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    int mCachedNumDisplays;
116eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    hwc_display_contents_1_t** mCachedDisplays;
117eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    Vector<Event> mPendingEvents;
118eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    Mutex mEventMutex;
1194ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu    Condition mEventHandledCondition;
12065efc253a628175c7afa95c431b746ea20052794Andy Qiu};
12165efc253a628175c7afa95c431b746ea20052794Andy Qiu
12265efc253a628175c7afa95c431b746ea20052794Andy Qiu} // namespace intel
12365efc253a628175c7afa95c431b746ea20052794Andy Qiu} // namespace android
12465efc253a628175c7afa95c431b746ea20052794Andy Qiu
12565efc253a628175c7afa95c431b746ea20052794Andy Qiu
12665efc253a628175c7afa95c431b746ea20052794Andy Qiu
12765efc253a628175c7afa95c431b746ea20052794Andy Qiu#endif /* DISPLAY_ANALYZER_H */
128