1a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala/* 2a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project 3a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala * 4a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License"); 5a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala * you may not use this file except in compliance with the License. 6a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala * You may obtain a copy of the License at 7a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala * 8a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala * http://www.apache.org/licenses/LICENSE-2.0 9a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala * 10a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software 11a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS, 12a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala * See the License for the specific language governing permissions and 14a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala * limitations under the License. 15a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala */ 16a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala 17a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala#ifndef ANDROID_SERVERS_CAMERA_CAMERA2_FRAMEPROCESSOR_H 18a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala#define ANDROID_SERVERS_CAMERA_CAMERA2_FRAMEPROCESSOR_H 19a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala 20a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala#include <utils/Thread.h> 21a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala#include <utils/String16.h> 22a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala#include <utils/Vector.h> 2369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include <utils/KeyedVector.h> 244c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala#include <utils/List.h> 2571381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin#include <camera/CameraMetadata.h> 2671381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin 277b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "common/FrameProcessorBase.h" 28a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala 2946dee9da04e80971c93cf23d772355217c88bb6aIgor Murashkinstruct camera_frame_metadata; 3046dee9da04e80971c93cf23d772355217c88bb6aIgor Murashkin 31a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalanamespace android { 32a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala 33a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalaclass Camera2Client; 34a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala 35a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalanamespace camera2 { 36a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala 37a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala/* Output frame metadata processing thread. This thread waits for new 38a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala * frames from the device, and analyzes them as necessary. 39a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala */ 407b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass FrameProcessor : public FrameProcessorBase { 41a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala public: 42fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala FrameProcessor(wp<CameraDeviceBase> device, sp<Camera2Client> client); 43a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala ~FrameProcessor(); 44a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala 45a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala private: 46a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala wp<Camera2Client> mClient; 4746910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala 4846910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala bool mSynthesize3ANotify; 4946910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala 5071381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin int mLastFrameNumberOfFaces; 51a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala 5271381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin void processNewFrames(const sp<Camera2Client> &client); 5369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 54cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei virtual bool processSingleFrame(CaptureResult &frame, 5571381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin const sp<CameraDeviceBase> &device); 5669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 57a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala status_t processFaceDetect(const CameraMetadata &frame, 5871381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin const sp<Camera2Client> &client); 5946dee9da04e80971c93cf23d772355217c88bb6aIgor Murashkin 6046910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala // Send 3A state change notifications to client based on frame metadata 61741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh status_t process3aState(const CaptureResult &frame, 6246910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala const sp<Camera2Client> &client); 6346910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala 64fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Helper for process3aState 65fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala template<typename Src, typename T> 66fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala bool get3aResult(const CameraMetadata& result, int32_t tag, T* value, 67fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala int32_t frameNumber, int cameraId); 68fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 69fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 7046910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala struct AlgState { 71fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // TODO: also track AE mode 72fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala camera_metadata_enum_android_control_af_mode afMode; 73fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala camera_metadata_enum_android_control_awb_mode awbMode; 74fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 7546910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala camera_metadata_enum_android_control_ae_state aeState; 7646910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala camera_metadata_enum_android_control_af_state afState; 7746910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala camera_metadata_enum_android_control_awb_state awbState; 7846910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala 79fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala int32_t afTriggerId; 80fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala int32_t aeTriggerId; 81fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 82fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // These defaults need to match those in Parameters.cpp 8346910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala AlgState() : 84fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala afMode(ANDROID_CONTROL_AF_MODE_AUTO), 85fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala awbMode(ANDROID_CONTROL_AWB_MODE_AUTO), 8646910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala aeState(ANDROID_CONTROL_AE_STATE_INACTIVE), 8746910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala afState(ANDROID_CONTROL_AF_STATE_INACTIVE), 88fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala awbState(ANDROID_CONTROL_AWB_STATE_INACTIVE), 89fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala afTriggerId(0), 90fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala aeTriggerId(0) { 9146910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala } 9246910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala } m3aState; 9346910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala 94204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He // Whether the partial result is enabled for this device 95204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He bool mUsePartialResult; 96fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 97fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Track most recent frame number for which 3A notifications were sent for. 98fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Used to filter against sending 3A notifications for the same frame 99fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // several times. 100fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala int32_t mLast3AFrameNumber; 101fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 10246dee9da04e80971c93cf23d772355217c88bb6aIgor Murashkin // Emit FaceDetection event to java if faces changed 10346dee9da04e80971c93cf23d772355217c88bb6aIgor Murashkin void callbackFaceDetection(sp<Camera2Client> client, 10471381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin const camera_frame_metadata &metadata); 105a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala}; 106a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala 107a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala 108a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala}; //namespace camera2 109a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala}; //namespace android 110a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala 111a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala#endif 112