/* * Copyright (C) 2011 The Android Open Source Project * * 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 HW_EMULATOR_CAMERA_CALLBACK_NOTIFIER_H #define HW_EMULATOR_CAMERA_CALLBACK_NOTIFIER_H /* * Contains declaration of a class CallbackNotifier that manages callbacks set * via set_callbacks, enable_msg_type, and disable_msg_type camera HAL API. */ #include <hardware/camera.h> #include <utils/List.h> #include <utils/Mutex.h> #include <utils/Timers.h> namespace android { class EmulatedCameraDevice; /* Manages callbacks set via set_callbacks, enable_msg_type, and * disable_msg_type camera HAL API. * * Objects of this class are contained in EmulatedCamera objects, and handle * relevant camera API callbacks. * Locking considerations. Apparently, it's not allowed to call callbacks * registered in this class, while holding a lock: recursion is quite possible, * which will cause a deadlock. */ class CallbackNotifier { public: /* Constructs CallbackNotifier instance. */ CallbackNotifier(); /* Destructs CallbackNotifier instance. */ ~CallbackNotifier(); /**************************************************************************** * Camera API ***************************************************************************/ public: /* Actual handler for camera_device_ops_t::set_callbacks callback. * This method is called by the containing emulated camera object when it is * handing the camera_device_ops_t::set_callbacks callback. */ void setCallbacks(camera_notify_callback notify_cb, camera_data_callback data_cb, camera_data_timestamp_callback data_cb_timestamp, camera_request_memory get_memory, void* user); /* Actual handler for camera_device_ops_t::enable_msg_type callback. * This method is called by the containing emulated camera object when it is * handing the camera_device_ops_t::enable_msg_type callback. */ void enableMessage(uint msg_type); /* Actual handler for camera_device_ops_t::disable_msg_type callback. * This method is called by the containing emulated camera object when it is * handing the camera_device_ops_t::disable_msg_type callback. */ void disableMessage(uint msg_type); /* Actual handler for camera_device_ops_t::store_meta_data_in_buffers * callback. This method is called by the containing emulated camera object * when it is handing the camera_device_ops_t::store_meta_data_in_buffers * callback. * Return: * NO_ERROR on success, or an appropriate error status. */ status_t storeMetaDataInBuffers(bool enable); /* Enables video recording. * This method is called by the containing emulated camera object when it is * handing the camera_device_ops_t::start_recording callback. * Param: * fps - Video frame frequency. This parameter determins when a frame * received via onNextFrameAvailable call will be pushed through the * callback. * Return: * NO_ERROR on success, or an appropriate error status. */ status_t enableVideoRecording(int fps); /* Disables video recording. * This method is called by the containing emulated camera object when it is * handing the camera_device_ops_t::stop_recording callback. */ void disableVideoRecording(); /* Releases video frame, sent to the framework. * This method is called by the containing emulated camera object when it is * handing the camera_device_ops_t::release_recording_frame callback. */ void releaseRecordingFrame(const void* opaque); /* Actual handler for camera_device_ops_t::msg_type_enabled callback. * This method is called by the containing emulated camera object when it is * handing the camera_device_ops_t::msg_type_enabled callback. * Note: this method doesn't grab a lock while checking message status, since * upon exit the status would be undefined anyway. So, grab a lock before * calling this method if you care about persisting a defined message status. * Return: * 0 if message is disabled, or non-zero value, if message is enabled. */ inline int isMessageEnabled(uint msg_type) { return mMessageEnabler & msg_type; } /* Checks id video recording is enabled. * This method is called by the containing emulated camera object when it is * handing the camera_device_ops_t::recording_enabled callback. * Note: this method doesn't grab a lock while checking video recordin status, * since upon exit the status would be undefined anyway. So, grab a lock * before calling this method if you care about persisting of a defined video * recording status. * Return: * true if video recording is enabled, or false if it is disabled. */ inline bool isVideoRecordingEnabled() { return mVideoRecEnabled; } /**************************************************************************** * Public API ***************************************************************************/ public: /* Resets the callback notifier. */ void cleanupCBNotifier(); /* Next frame is available in the camera device. * This is a notification callback that is invoked by the camera device when * a new frame is available. * Note that most likely this method is called in context of a worker thread * that camera device has created for frame capturing. * Param: * frame - Captured frame, or NULL if camera device didn't pull the frame * yet. If NULL is passed in this parameter use GetCurrentFrame method * of the camera device class to obtain the next frame. Also note that * the size of the frame that is passed here (as well as the frame * returned from the GetCurrentFrame method) is defined by the current * frame settings (width + height + pixel format) for the camera device. * timestamp - Frame's timestamp. * camera_dev - Camera device instance that delivered the frame. */ void onNextFrameAvailable(const void* frame, nsecs_t timestamp, EmulatedCameraDevice* camera_dev); /* Entry point for notifications that occur in camera device. * Param: * err - CAMERA_ERROR_XXX error code. */ void onCameraDeviceError(int err); /* Reports focus operation completion to camera client. */ void onCameraFocusAcquired(); /* Sets, or resets taking picture state. * This state control whether or not to notify the framework about compressed * image, shutter, and other picture related events. */ void setTakingPicture(bool taking) { mTakingPicture = taking; } /* Sets JPEG quality used to compress frame during picture taking. */ void setJpegQuality(int jpeg_quality) { mJpegQuality = jpeg_quality; } /**************************************************************************** * Private API ***************************************************************************/ protected: /* Checks if it's time to push new video frame. * Note that this method must be called while object is locked. * Param: * timestamp - Timestamp for the new frame. */ bool isNewVideoFrameTime(nsecs_t timestamp); /**************************************************************************** * Data members ***************************************************************************/ protected: /* Locks this instance for data change. */ Mutex mObjectLock; /* * Callbacks, registered in set_callbacks. */ camera_notify_callback mNotifyCB; camera_data_callback mDataCB; camera_data_timestamp_callback mDataCBTimestamp; camera_request_memory mGetMemoryCB; void* mCBOpaque; /* video frame queue for the CameraHeapMemory destruction */ List<camera_memory_t*> mCameraMemoryTs; /* Timestamp when last frame has been delivered to the framework. */ nsecs_t mLastFrameTimestamp; /* Video frequency in nanosec. */ nsecs_t mFrameRefreshFreq; /* Message enabler. */ uint32_t mMessageEnabler; /* JPEG quality used to compress frame during picture taking. */ int mJpegQuality; /* Video recording status. */ bool mVideoRecEnabled; /* Picture taking status. */ bool mTakingPicture; }; }; /* namespace android */ #endif /* HW_EMULATOR_CAMERA_CALLBACK_NOTIFIER_H */