1c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/* 2c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Copyright (C) Texas Instruments - http://www.ti.com/ 3c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 4c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Licensed under the Apache License, Version 2.0 (the "License"); 5c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * you may not use this file except in compliance with the License. 6c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * You may obtain a copy of the License at 7c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 8c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * http://www.apache.org/licenses/LICENSE-2.0 9c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 10c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Unless required by applicable law or agreed to in writing, software 11c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * distributed under the License is distributed on an "AS IS" BASIS, 12c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * See the License for the specific language governing permissions and 14c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * limitations under the License. 15c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 16c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 17c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 18c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 19c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#ifndef V4L_CAMERA_ADAPTER_H 20c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define V4L_CAMERA_ADAPTER_H 21c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 22c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "CameraHal.h" 23c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "BaseCameraAdapter.h" 24c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "DebugUtils.h" 25c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 26c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevnamespace android { 27c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 28c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define DEFAULT_PIXEL_FORMAT V4L2_PIX_FMT_YUYV 29c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define NB_BUFFER 10 30c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define DEVICE "/dev/video4" 31c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 32c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 33c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstruct VideoInfo { 34c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev struct v4l2_capability cap; 35c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev struct v4l2_format format; 36c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev struct v4l2_buffer buf; 37c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev struct v4l2_requestbuffers rb; 38c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void *mem[NB_BUFFER]; 39c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool isStreaming; 40c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int width; 41c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int height; 42c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int formatIn; 43c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int framesizeIn; 44c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}; 45c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 46c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 47c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 48c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Class which completely abstracts the camera hardware interaction from camera hal 49c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * TODO: Need to list down here, all the message types that will be supported by this class 50c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Need to implement BufferProvider interface to use AllocateBuffer of OMX if needed 51c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 52c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevclass V4LCameraAdapter : public BaseCameraAdapter 53c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 54c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic: 55c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 56c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /*--------------------Constant declarations----------------------------------------*/ 57c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev static const int32_t MAX_NO_BUFFERS = 20; 58c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 59c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///@remarks OMX Camera has six ports - buffer input, time input, preview, image, video, and meta data 60c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev static const int MAX_NO_PORTS = 6; 61c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 62c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Five second timeout 63c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev static const int CAMERA_ADAPTER_TIMEOUT = 5000*1000; 64c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 65c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic: 66c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 67c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev V4LCameraAdapter(); 68c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ~V4LCameraAdapter(); 69c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 70c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 71c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Initialzes the camera adapter creates any resources required 72c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual status_t initialize(CameraProperties::Properties*, int sensor_index=0); 73c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 74c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //APIs to configure Camera adapter and get the current parameter set 75c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual status_t setParameters(const CameraParameters& params); 76c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual void getParameters(CameraParameters& params); 77c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 78c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // API 79c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual status_t UseBuffersPreview(void* bufArr, int num); 80c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 81c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //API to flush the buffers for preview 82c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t flushBuffers(); 83c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 84c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevprotected: 85c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 86c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//----------Parent class method implementation------------------------------------ 87c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual status_t startPreview(); 88c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual status_t stopPreview(); 89c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual status_t useBuffers(CameraMode mode, void* bufArr, int num, size_t length, unsigned int queueable); 90c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual status_t fillThisBuffer(void* frameBuf, CameraFrame::FrameType frameType); 91c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual status_t getFrameSize(size_t &width, size_t &height); 92c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual status_t getPictureBufferSize(size_t &length, size_t bufferCount); 93c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual status_t getFrameDataSize(size_t &dataFrameSize, size_t bufferCount); 94c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual void onOrientationEvent(uint32_t orientation, uint32_t tilt); 95c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//----------------------------------------------------------------------------- 96c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 97c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 98c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevprivate: 99c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev class PreviewThread : public Thread { 101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev V4LCameraAdapter* mAdapter; 102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev public: 103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev PreviewThread(V4LCameraAdapter* hw) : 104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Thread(false), mAdapter(hw) { } 105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual void onFirstRef() { 106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev run("CameraPreviewThread", PRIORITY_URGENT_DISPLAY); 107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual bool threadLoop() { 109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mAdapter->previewThread(); 110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // loop until we need to quit 111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return true; 112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev }; 114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Used for calculation of the average frame rate during preview 116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t recalculateFPS(); 117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev char * GetFrame(int &index); 119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int previewThread(); 121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic: 123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevprivate: 125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int mPreviewBufferCount; 126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev KeyedVector<int, int> mPreviewBufs; 127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mutable Mutex mPreviewBufsLock; 128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraParameters mParams; 130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool mPreviewing; 132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool mCapturing; 133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Mutex mLock; 134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int mFrameCount; 136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int mLastFrameCount; 137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev unsigned int mIter; 138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev nsecs_t mLastFPSTime; 139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //variables holding the estimated framerate 141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev float mFPS, mLastFPS; 142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int mSensorIndex; 144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // protected by mLock 146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sp<PreviewThread> mPreviewThread; 147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev struct VideoInfo *mVideoInfo; 149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int mCameraHandle; 150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int nQueued; 153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int nDequeued; 154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}; 156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}; //// namespace 157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif //V4L_CAMERA_ADAPTER_H 158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 159