/* // Copyright (c) 2014 Intel Corporation // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. */ #ifndef __MULTIDISPLAY_OBSERVER_H #define __MULTIDISPLAY_OBSERVER_H #ifdef TARGET_HAS_MULTIPLE_DISPLAY #include <display/MultiDisplayService.h> #include <SimpleThread.h> #else #include <utils/Errors.h> #endif #include <string.h> namespace android { namespace intel { struct VideoSourceInfo { VideoSourceInfo() { memset(this, 0, sizeof(VideoSourceInfo)); } int width; int height; int frameRate; bool isProtected; }; #ifdef TARGET_HAS_MULTIPLE_DISPLAY class MultiDisplayObserver; class MultiDisplayCallback : public BnMultiDisplayCallback { public: MultiDisplayCallback(MultiDisplayObserver *observer); virtual ~MultiDisplayCallback(); status_t blankSecondaryDisplay(bool blank); status_t updateVideoState(int sessionId, MDS_VIDEO_STATE state); status_t setHdmiTiming(const MDSHdmiTiming& timing); status_t setHdmiScalingType(MDS_SCALING_TYPE type); status_t setHdmiOverscan(int hValue, int vValue); status_t updateInputState(bool state); private: MultiDisplayObserver *mDispObserver; MDS_VIDEO_STATE mVideoState; }; class MultiDisplayObserver { public: MultiDisplayObserver(); virtual ~MultiDisplayObserver(); public: bool initialize(); void deinitialize(); status_t notifyHotPlug(bool connected); status_t getVideoSourceInfo(int sessionID, VideoSourceInfo* info); int getVideoSessionNumber(); bool isExternalDeviceTimingFixed() const; status_t notifyWidiConnectionStatus(bool connected); status_t setDecoderOutputResolution(int sessionID, int32_t width, int32_t height, int32_t offX, int32_t offY, int32_t bufWidth, int32_t bufHeight); private: bool isMDSRunning(); bool initMDSClient(); bool initMDSClientAsync(); void deinitMDSClient(); status_t blankSecondaryDisplay(bool blank); status_t updateVideoState(int sessionId, MDS_VIDEO_STATE state); status_t setHdmiTiming(const MDSHdmiTiming& timing); status_t updateInputState(bool active); friend class MultiDisplayCallback; private: enum { THREAD_LOOP_DELAY = 10, // 10 ms THREAD_LOOP_BOUND = 2000, // 20s }; private: sp<IMultiDisplayCallbackRegistrar> mMDSCbRegistrar; sp<IMultiDisplayInfoProvider> mMDSInfoProvider; sp<IMultiDisplayConnectionObserver> mMDSConnObserver; sp<IMultiDisplayDecoderConfig> mMDSDecoderConfig; sp<MultiDisplayCallback> mMDSCallback; mutable Mutex mLock; Condition mCondition; int mThreadLoopCount; bool mDeviceConnected; // indicate external devices's timing is set bool mExternalHdmiTiming; bool mInitialized; private: DECLARE_THREAD(MDSClientInitThread, MultiDisplayObserver); }; #else // dummy declaration and implementation of MultiDisplayObserver class MultiDisplayObserver { public: MultiDisplayObserver() {} virtual ~MultiDisplayObserver() {} bool initialize() { return true; } void deinitialize() {} status_t notifyHotPlug(bool connected) { return NO_ERROR; } status_t getVideoSourceInfo(int sessionID, VideoSourceInfo* info) { return INVALID_OPERATION; } int getVideoSessionNumber() { return 0; } bool isExternalDeviceTimingFixed() const { return false; } status_t notifyWidiConnectionStatus(bool connected) { return NO_ERROR; } status_t setDecoderOutputResolution( int sessionID, int32_t width, int32_t height, int32_t, int32_t, int32_t, int32_t) { return NO_ERROR; } }; #endif //TARGET_HAS_MULTIPLE_DISPLAY } // namespace intel } // namespace android #endif /* __MULTIMultiDisplayObserver_H_ */