/* * device_manager.h - device manager * * Copyright (c) 2014-2015 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. * * Author: Wind Yuan */ #ifndef XCAM_DEVICE_MANAGER_H #define XCAM_DEVICE_MANAGER_H #include #include #include #include #include #include #include #include #include namespace XCam { enum XCamMessageType { XCAM_MESSAGE_BUF_OK = 0, XCAM_MESSAGE_BUF_ERROR, XCAM_MESSAGE_STATS_OK, XCAM_MESSAGE_STATS_ERROR, XCAM_MESSAGE_3A_RESULTS_OK, XCAM_MESSAGE_3A_RESULTS_ERROR, }; struct XCamMessage { int64_t timestamp; XCamMessageType msg_id; char *msg; XCamMessage ( XCamMessageType type, int64_t timestamp = InvalidTimestamp, const char *message = NULL); ~XCamMessage (); XCAM_DEAD_COPY (XCamMessage); }; class MessageThread; class DeviceManager : public PollCallback , public StatsCallback , public AnalyzerCallback , public ImageProcessCallback { friend class MessageThread; public: DeviceManager(); virtual ~DeviceManager(); bool set_capture_device (SmartPtr device); bool set_event_device (SmartPtr device); bool set_3a_analyzer (SmartPtr analyzer); bool set_smart_analyzer (SmartPtr analyzer); bool add_image_processor (SmartPtr processor); bool set_poll_thread (SmartPtr thread); SmartPtr& get_capture_device () { return _device; } SmartPtr& get_event_device () { return _subdevice; } SmartPtr& get_analyzer () { return _3a_analyzer; } bool is_running () const { return _is_running; } bool has_3a () const { return _has_3a; } XCamReturn start (); XCamReturn stop (); protected: virtual void handle_message (const SmartPtr &msg) = 0; virtual void handle_buffer (const SmartPtr &buf) = 0; protected: //virtual functions derived from PollCallback virtual XCamReturn poll_buffer_ready (SmartPtr &buf); virtual XCamReturn poll_buffer_failed (int64_t timestamp, const char *msg); virtual XCamReturn x3a_stats_ready (const SmartPtr &stats); virtual XCamReturn dvs_stats_ready (); virtual XCamReturn scaled_image_ready (const SmartPtr &buffer); //virtual functions derived from AnalyzerCallback virtual void x3a_calculation_done (XAnalyzer *analyzer, X3aResultList &results); virtual void x3a_calculation_failed (XAnalyzer *analyzer, int64_t timestamp, const char *msg); //virtual functions derived from ImageProcessCallback virtual void process_buffer_done (ImageProcessor *processor, const SmartPtr &buf); virtual void process_buffer_failed (ImageProcessor *processor, const SmartPtr &buf); virtual void process_image_result_done (ImageProcessor *processor, const SmartPtr &result); private: void post_message (XCamMessageType type, int64_t timestamp, const char *msg); XCamReturn message_loop (); XCAM_DEAD_COPY (DeviceManager); protected: SmartPtr _device; SmartPtr _subdevice; SmartPtr _poll_thread; /* 3A calculation and image processing*/ bool _has_3a; SmartPtr _3a_analyzer; SmartPtr _3a_process_center; /* msg queue */ SafeList _msg_queue; SmartPtr _msg_thread; bool _is_running; /* smart analysis */ SmartPtr _smart_analyzer; }; }; #endif //XCAM_DEVICE_MANAGER_H