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
27namespace android {
28namespace intel {
29
30struct VideoSourceInfo {
31    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
43class MultiDisplayObserver;
44
45class MultiDisplayCallback : public BnMultiDisplayCallback {
46public:
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
57private:
58    MultiDisplayObserver *mDispObserver;
59    MDS_VIDEO_STATE mVideoState;
60};
61
62class MultiDisplayObserver {
63public:
64    MultiDisplayObserver();
65    virtual ~MultiDisplayObserver();
66
67public:
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
80private:
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
91private:
92    enum {
93        THREAD_LOOP_DELAY = 10, // 10 ms
94        THREAD_LOOP_BOUND = 2000, // 20s
95    };
96
97private:
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
111private:
112    DECLARE_THREAD(MDSClientInitThread, MultiDisplayObserver);
113};
114
115#else
116
117// dummy declaration and implementation of MultiDisplayObserver
118class MultiDisplayObserver {
119public:
120    MultiDisplayObserver() {}
121    virtual ~MultiDisplayObserver() {}
122
123    bool initialize() { return true; }
124    void deinitialize() {}
125    status_t notifyHotPlug(bool connected) { return NO_ERROR; }
126    status_t getVideoSourceInfo(int sessionID, VideoSourceInfo* info) { return INVALID_OPERATION; }
127    int  getVideoSessionNumber() { return 0; }
128    bool isExternalDeviceTimingFixed() const { return false; }
129    status_t notifyWidiConnectionStatus(bool connected) { return NO_ERROR; }
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