1 /*
2 // Copyright (c) 2014 Intel Corporation 
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //      http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 */
16 #ifndef DISPLAY_ANALYZER_H
17 #define DISPLAY_ANALYZER_H
18 
19 #include <utils/threads.h>
20 #include <utils/Vector.h>
21 
22 
23 namespace android {
24 namespace intel {
25 
26 
27 class DisplayAnalyzer {
28 public:
29     DisplayAnalyzer();
30     virtual ~DisplayAnalyzer();
31 
32 public:
33     bool initialize();
34     void deinitialize();
35     void analyzeContents(size_t numDisplays, hwc_display_contents_1_t** displays);
36     bool isVideoExtModeActive();
37     bool isVideoExtModeEnabled();
38     bool isVideoLayer(hwc_layer_1_t &layer);
39     bool isVideoFullScreen(int device, hwc_layer_1_t &layer);
40     bool isOverlayAllowed();
41     int  getVideoInstances();
42     void postHotplugEvent(bool connected);
43     void postVideoEvent(int instanceID, int state);
44     void postInputEvent(bool active);
45     void postVideoEvent(int instances, int instanceID, bool preparing, bool playing);
46     void postBlankEvent(bool blank);
47     void postIdleEntryEvent();
48     bool isPresentationLayer(hwc_layer_1_t &layer);
49     bool isProtectedLayer(hwc_layer_1_t &layer);
50     bool ignoreVideoSkipFlag();
51     int  getFirstVideoInstanceSessionID();
52 
53 private:
54     enum DisplayEventType {
55         HOTPLUG_EVENT,
56         BLANK_EVENT,
57         VIDEO_EVENT,
58         TIMING_EVENT,
59         INPUT_EVENT,
60         DPMS_EVENT,
61         IDLE_ENTRY_EVENT,
62         IDLE_EXIT_EVENT,
63         VIDEO_CHECK_EVENT,
64     };
65 
66     struct Event {
67         int type;
68 
69         struct VideoEvent {
70             int instanceID;
71             int state;
72         };
73 
74         union {
75             bool bValue;
76             int  nValue;
77             VideoEvent videoEvent;
78         };
79     };
80     inline void postEvent(Event& e);
81     inline bool getEvent(Event& e);
82     void handlePendingEvents();
83     void handleHotplugEvent(bool connected);
84     void handleBlankEvent(bool blank);
85     void handleVideoEvent(int instanceID, int state);
86     void handleTimingEvent();
87     void handleInputEvent(bool active);
88     void handleDpmsEvent(int delayCount);
89     void handleIdleEntryEvent(int count);
90     void handleIdleExitEvent();
91     void handleVideoCheckEvent();
92 
93     void blankSecondaryDevice();
94     void handleVideoExtMode();
95     void checkVideoExtMode();
96     void enterVideoExtMode();
97     void exitVideoExtMode();
98     bool hasProtectedLayer();
99     inline void setCompositionType(hwc_display_contents_1_t *content, int type);
100     inline void setCompositionType(int device, int type, bool reset);
101 
102 private:
103     // Video playback state, must match defintion in Multi Display Service
104     enum
105     {
106         VIDEO_PLAYBACK_IDLE,
107         VIDEO_PLAYBACK_STARTING,
108         VIDEO_PLAYBACK_STARTED,
109         VIDEO_PLAYBACK_STOPPING,
110         VIDEO_PLAYBACK_STOPPED,
111     };
112 
113     enum
114     {
115         // number of flips before display can be powered off in video extended mode
116         DELAY_BEFORE_DPMS_OFF = 0,
117     };
118 
119 private:
120     bool mInitialized;
121     bool mVideoExtModeEnabled;
122     bool mVideoExtModeEligible;
123     bool mVideoExtModeActive;
124     bool mBlankDevice;
125     bool mOverlayAllowed;
126     bool mActiveInputState;
127     // workaround HWC_SKIP_LAYER set during rotation for extended video mode
128     // by default if layer has HWC_SKIP_LAYER flag it should not be processed by HWC
129     bool mIgnoreVideoSkipFlag;
130     bool mProtectedVideoSession;
131     // map video instance ID to video state
132     KeyedVector<int, int> mVideoStateMap;
133     int mCachedNumDisplays;
134     hwc_display_contents_1_t** mCachedDisplays;
135     Vector<Event> mPendingEvents;
136     Mutex mEventMutex;
137     Condition mEventHandledCondition;
138 };
139 
140 } // namespace intel
141 } // namespace android
142 
143 
144 
145 #endif /* DISPLAY_ANALYZER_H */
146