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 __MULTIDISPLAY_OBSERVER_H
17 #define __MULTIDISPLAY_OBSERVER_H
18 
19 #ifdef TARGET_HAS_MULTIPLE_DISPLAY
20 #include <display/MultiDisplayService.h>
21 #include <SimpleThread.h>
22 #else
23 #include <utils/Errors.h>
24 #endif
25 #include <string.h>
26 
27 namespace android {
28 namespace intel {
29 
30 struct VideoSourceInfo {
VideoSourceInfoVideoSourceInfo31     VideoSourceInfo() {
32         memset(this, 0, sizeof(VideoSourceInfo));
33     }
34     int width;
35     int height;
36     int frameRate;
37     bool isProtected;
38 };
39 
40 
41 #ifdef TARGET_HAS_MULTIPLE_DISPLAY
42 
43 class MultiDisplayObserver;
44 
45 class MultiDisplayCallback : public BnMultiDisplayCallback {
46 public:
47     MultiDisplayCallback(MultiDisplayObserver *observer);
48     virtual ~MultiDisplayCallback();
49 
50     status_t blankSecondaryDisplay(bool blank);
51     status_t updateVideoState(int sessionId, MDS_VIDEO_STATE state);
52     status_t setHdmiTiming(const MDSHdmiTiming& timing);
53     status_t setHdmiScalingType(MDS_SCALING_TYPE type);
54     status_t setHdmiOverscan(int hValue, int vValue);
55     status_t updateInputState(bool state);
56 
57 private:
58     MultiDisplayObserver *mDispObserver;
59     MDS_VIDEO_STATE mVideoState;
60 };
61 
62 class MultiDisplayObserver {
63 public:
64     MultiDisplayObserver();
65     virtual ~MultiDisplayObserver();
66 
67 public:
68     bool initialize();
69     void deinitialize();
70     status_t notifyHotPlug(bool connected);
71     status_t getVideoSourceInfo(int sessionID, VideoSourceInfo* info);
72     int  getVideoSessionNumber();
73     bool isExternalDeviceTimingFixed() const;
74     status_t notifyWidiConnectionStatus(bool connected);
75     status_t setDecoderOutputResolution(int sessionID,
76             int32_t width, int32_t height,
77             int32_t offX,  int32_t offY,
78             int32_t bufWidth, int32_t bufHeight);
79 
80 private:
81     bool isMDSRunning();
82     bool initMDSClient();
83     bool initMDSClientAsync();
84     void deinitMDSClient();
85     status_t blankSecondaryDisplay(bool blank);
86     status_t updateVideoState(int sessionId, MDS_VIDEO_STATE state);
87     status_t setHdmiTiming(const MDSHdmiTiming& timing);
88     status_t updateInputState(bool active);
89     friend class MultiDisplayCallback;
90 
91 private:
92     enum {
93         THREAD_LOOP_DELAY = 10, // 10 ms
94         THREAD_LOOP_BOUND = 2000, // 20s
95     };
96 
97 private:
98     sp<IMultiDisplayCallbackRegistrar> mMDSCbRegistrar;
99     sp<IMultiDisplayInfoProvider> mMDSInfoProvider;
100     sp<IMultiDisplayConnectionObserver> mMDSConnObserver;
101     sp<IMultiDisplayDecoderConfig> mMDSDecoderConfig;
102     sp<MultiDisplayCallback> mMDSCallback;
103     mutable Mutex mLock;
104     Condition mCondition;
105     int mThreadLoopCount;
106     bool mDeviceConnected;
107     // indicate external devices's timing is set
108     bool mExternalHdmiTiming;
109     bool mInitialized;
110 
111 private:
112     DECLARE_THREAD(MDSClientInitThread, MultiDisplayObserver);
113 };
114 
115 #else
116 
117 // dummy declaration and implementation of MultiDisplayObserver
118 class MultiDisplayObserver {
119 public:
MultiDisplayObserver()120     MultiDisplayObserver() {}
~MultiDisplayObserver()121     virtual ~MultiDisplayObserver() {}
122 
initialize()123     bool initialize() { return true; }
deinitialize()124     void deinitialize() {}
notifyHotPlug(bool connected)125     status_t notifyHotPlug(bool connected) { return NO_ERROR; }
getVideoSourceInfo(int sessionID,VideoSourceInfo * info)126     status_t getVideoSourceInfo(int sessionID, VideoSourceInfo* info) { return INVALID_OPERATION; }
getVideoSessionNumber()127     int  getVideoSessionNumber() { return 0; }
isExternalDeviceTimingFixed()128     bool isExternalDeviceTimingFixed() const { return false; }
notifyWidiConnectionStatus(bool connected)129     status_t notifyWidiConnectionStatus(bool connected) { return NO_ERROR; }
setDecoderOutputResolution(int sessionID,int32_t width,int32_t height,int32_t,int32_t,int32_t,int32_t)130     status_t setDecoderOutputResolution(
131             int sessionID,
132             int32_t width, int32_t height,
133             int32_t, int32_t, int32_t, int32_t) { return NO_ERROR; }
134 };
135 
136 #endif //TARGET_HAS_MULTIPLE_DISPLAY
137 
138 } // namespace intel
139 } // namespace android
140 
141 #endif /* __MULTIMultiDisplayObserver_H_ */
142