18b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol/*
28b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// Copyright (c) 2014 Intel Corporation 
38b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol//
48b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// Licensed under the Apache License, Version 2.0 (the "License");
58b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// you may not use this file except in compliance with the License.
68b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// You may obtain a copy of the License at
78b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol//
88b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol//      http://www.apache.org/licenses/LICENSE-2.0
98b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol//
108b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// Unless required by applicable law or agreed to in writing, software
118b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// distributed under the License is distributed on an "AS IS" BASIS,
128b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// See the License for the specific language governing permissions and
148b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// limitations under the License.
158b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol*/
168b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#ifndef DISPLAY_ANALYZER_H
178b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#define DISPLAY_ANALYZER_H
188b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
198b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <utils/threads.h>
208b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <utils/Vector.h>
218b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
228b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
238b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolnamespace android {
248b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolnamespace intel {
258b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
268b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
278b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolclass DisplayAnalyzer {
288b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolpublic:
298b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    DisplayAnalyzer();
308b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    virtual ~DisplayAnalyzer();
318b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
328b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolpublic:
338b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool initialize();
348b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    void deinitialize();
358b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    void analyzeContents(size_t numDisplays, hwc_display_contents_1_t** displays);
368b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool isVideoExtModeActive();
378b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool isVideoExtModeEnabled();
388b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool isVideoLayer(hwc_layer_1_t &layer);
398b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool isVideoFullScreen(int device, hwc_layer_1_t &layer);
408b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool isOverlayAllowed();
418b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    int  getVideoInstances();
428b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    void postHotplugEvent(bool connected);
438b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    void postVideoEvent(int instanceID, int state);
448b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    void postInputEvent(bool active);
458b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    void postVideoEvent(int instances, int instanceID, bool preparing, bool playing);
468b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    void postBlankEvent(bool blank);
478b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    void postIdleEntryEvent();
488b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool isPresentationLayer(hwc_layer_1_t &layer);
498b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool isProtectedLayer(hwc_layer_1_t &layer);
508b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool ignoreVideoSkipFlag();
518b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    int  getFirstVideoInstanceSessionID();
528b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
538b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolprivate:
548b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    enum DisplayEventType {
558b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        HOTPLUG_EVENT,
568b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        BLANK_EVENT,
578b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        VIDEO_EVENT,
588b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        TIMING_EVENT,
598b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        INPUT_EVENT,
608b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        DPMS_EVENT,
618b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        IDLE_ENTRY_EVENT,
628b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        IDLE_EXIT_EVENT,
638b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        VIDEO_CHECK_EVENT,
648b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    };
658b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
668b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    struct Event {
678b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        int type;
688b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
698b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        struct VideoEvent {
708b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            int instanceID;
718b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            int state;
728b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        };
738b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
748b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        union {
758b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            bool bValue;
768b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            int  nValue;
778b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            VideoEvent videoEvent;
788b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        };
798b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    };
808b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    inline void postEvent(Event& e);
818b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    inline bool getEvent(Event& e);
828b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    void handlePendingEvents();
838b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    void handleHotplugEvent(bool connected);
848b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    void handleBlankEvent(bool blank);
858b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    void handleVideoEvent(int instanceID, int state);
868b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    void handleTimingEvent();
878b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    void handleInputEvent(bool active);
888b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    void handleDpmsEvent(int delayCount);
898b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    void handleIdleEntryEvent(int count);
908b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    void handleIdleExitEvent();
918b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    void handleVideoCheckEvent();
928b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
938b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    void blankSecondaryDevice();
948b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    void handleVideoExtMode();
958b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    void checkVideoExtMode();
968b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    void enterVideoExtMode();
978b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    void exitVideoExtMode();
988b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool hasProtectedLayer();
998b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    inline void setCompositionType(hwc_display_contents_1_t *content, int type);
1008b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    inline void setCompositionType(int device, int type, bool reset);
1018b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
1028b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolprivate:
1038b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    // Video playback state, must match defintion in Multi Display Service
1048b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    enum
1058b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    {
1068b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        VIDEO_PLAYBACK_IDLE,
1078b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        VIDEO_PLAYBACK_STARTING,
1088b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        VIDEO_PLAYBACK_STARTED,
1098b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        VIDEO_PLAYBACK_STOPPING,
1108b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        VIDEO_PLAYBACK_STOPPED,
1118b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    };
1128b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
1138b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    enum
1148b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    {
1158b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        // number of flips before display can be powered off in video extended mode
1168b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        DELAY_BEFORE_DPMS_OFF = 0,
1178b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    };
1188b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
1198b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolprivate:
1208b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool mInitialized;
1218b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool mVideoExtModeEnabled;
1228b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool mVideoExtModeEligible;
1238b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool mVideoExtModeActive;
1248b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool mBlankDevice;
1258b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool mOverlayAllowed;
1268b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool mActiveInputState;
1278b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    // workaround HWC_SKIP_LAYER set during rotation for extended video mode
1288b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    // by default if layer has HWC_SKIP_LAYER flag it should not be processed by HWC
1298b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool mIgnoreVideoSkipFlag;
1308b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool mProtectedVideoSession;
1318b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    // map video instance ID to video state
1328b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    KeyedVector<int, int> mVideoStateMap;
1338b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    int mCachedNumDisplays;
1348b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    hwc_display_contents_1_t** mCachedDisplays;
1358b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    Vector<Event> mPendingEvents;
1368b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    Mutex mEventMutex;
1378b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    Condition mEventHandledCondition;
1388b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol};
1398b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
1408b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} // namespace intel
1418b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} // namespace android
1428b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
1438b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
1448b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
1458b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#endif /* DISPLAY_ANALYZER_H */
146