1 /*
2  * Copyright (C) Texas Instruments - http://www.ti.com/
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 
18 
19 #ifndef V4L_CAMERA_ADAPTER_H
20 #define V4L_CAMERA_ADAPTER_H
21 
22 #include <linux/videodev2.h>
23 
24 #include "CameraHal.h"
25 #include "BaseCameraAdapter.h"
26 #include "DebugUtils.h"
27 
28 namespace Ti {
29 namespace Camera {
30 
31 #define DEFAULT_PIXEL_FORMAT V4L2_PIX_FMT_YUYV
32 
33 #define NB_BUFFER 10
34 #define DEVICE "/dev/videoxx"
35 #define DEVICE_PATH "/dev/"
36 #define DEVICE_NAME "videoxx"
37 
38 typedef int V4L_HANDLETYPE;
39 
40 struct CapPixelformat {
41         uint32_t pixelformat;
42         const char *param;
43 };
44 
45 struct CapResolution {
46         size_t width, height;
47         char param[10];
48 };
49 
50 struct CapU32 {
51         uint32_t num;
52         const char *param;
53 };
54 
55 typedef CapU32 CapFramerate;
56 
57 struct VideoInfo {
58     struct v4l2_capability cap;
59     struct v4l2_format format;
60     struct v4l2_buffer buf;
61     struct v4l2_requestbuffers rb;
62     void *mem[NB_BUFFER];
63     void *CaptureBuffers[NB_BUFFER];
64     bool isStreaming;
65     int width;
66     int height;
67     int formatIn;
68     int framesizeIn;
69 };
70 
71 typedef struct V4L_TI_CAPTYPE {
72     uint16_t        ulPreviewFormatCount;   // supported preview pixelformat count
73     uint32_t        ePreviewFormats[32];
74     uint16_t        ulPreviewResCount;   // supported preview resolution sizes
75     CapResolution   tPreviewRes[32];
76     uint16_t        ulCaptureResCount;   // supported capture resolution sizes
77     CapResolution   tCaptureRes[32];
78     uint16_t        ulFrameRateCount;   // supported frame rate
79     uint16_t        ulFrameRates[32];
80 }V4L_TI_CAPTYPE;
81 
82 /**
83   * Class which completely abstracts the camera hardware interaction from camera hal
84   * TODO: Need to list down here, all the message types that will be supported by this class
85                 Need to implement BufferProvider interface to use AllocateBuffer of OMX if needed
86   */
87 class V4LCameraAdapter : public BaseCameraAdapter
88 {
89 public:
90 
91     /*--------------------Constant declarations----------------------------------------*/
92     static const int32_t MAX_NO_BUFFERS = 20;
93 
94     ///@remarks OMX Camera has six ports - buffer input, time input, preview, image, video, and meta data
95     static const int MAX_NO_PORTS = 6;
96 
97     ///Five second timeout
98     static const int CAMERA_ADAPTER_TIMEOUT = 5000*1000;
99 
100 public:
101 
102     V4LCameraAdapter(size_t sensor_index);
103     ~V4LCameraAdapter();
104 
105 
106     ///Initialzes the camera adapter creates any resources required
107     virtual status_t initialize(CameraProperties::Properties*);
108 
109     //APIs to configure Camera adapter and get the current parameter set
110     virtual status_t setParameters(const android::CameraParameters& params);
111     virtual void getParameters(android::CameraParameters& params);
112 
113     // API
114     virtual status_t UseBuffersPreview(CameraBuffer *bufArr, int num);
115     virtual status_t UseBuffersCapture(CameraBuffer *bufArr, int num);
116 
117     static status_t getCaps(const int sensorId, CameraProperties::Properties* params, V4L_HANDLETYPE handle);
118 
119 protected:
120 
121 //----------Parent class method implementation------------------------------------
122     virtual status_t startPreview();
123     virtual status_t stopPreview();
124     virtual status_t takePicture();
125     virtual status_t stopImageCapture();
126     virtual status_t autoFocus();
127     virtual status_t useBuffers(CameraMode mode, CameraBuffer *bufArr, int num, size_t length, unsigned int queueable);
128     virtual status_t fillThisBuffer(CameraBuffer *frameBuf, CameraFrame::FrameType frameType);
129     virtual status_t getFrameSize(size_t &width, size_t &height);
130     virtual status_t getPictureBufferSize(CameraFrame &frame, size_t bufferCount);
131     virtual status_t getFrameDataSize(size_t &dataFrameSize, size_t bufferCount);
132     virtual void onOrientationEvent(uint32_t orientation, uint32_t tilt);
133 //-----------------------------------------------------------------------------
134 
135 
136 private:
137 
138     class PreviewThread : public android::Thread {
139             V4LCameraAdapter* mAdapter;
140         public:
PreviewThread(V4LCameraAdapter * hw)141             PreviewThread(V4LCameraAdapter* hw) :
142                     Thread(false), mAdapter(hw) { }
onFirstRef()143             virtual void onFirstRef() {
144                 run("CameraPreviewThread", android::PRIORITY_URGENT_DISPLAY);
145             }
threadLoop()146             virtual bool threadLoop() {
147                 mAdapter->previewThread();
148                 // loop until we need to quit
149                 return true;
150             }
151         };
152 
153     //Used for calculation of the average frame rate during preview
154     status_t recalculateFPS();
155 
156     char * GetFrame(int &index);
157 
158     int previewThread();
159 
160 public:
161 
162 private:
163     //capabilities data
164     static const CapPixelformat mPixelformats [];
165     static const CapResolution mPreviewRes [];
166     static const CapFramerate mFramerates [];
167     static const CapResolution mImageCapRes [];
168 
169     //camera defaults
170     static const char DEFAULT_PREVIEW_FORMAT[];
171     static const char DEFAULT_PREVIEW_SIZE[];
172     static const char DEFAULT_FRAMERATE[];
173     static const char DEFAULT_NUM_PREV_BUFS[];
174 
175     static const char DEFAULT_PICTURE_FORMAT[];
176     static const char DEFAULT_PICTURE_SIZE[];
177     static const char DEFAULT_FOCUS_MODE[];
178     static const char * DEFAULT_VSTAB;
179     static const char * DEFAULT_VNF;
180 
181     static status_t insertDefaults(CameraProperties::Properties*, V4L_TI_CAPTYPE&);
182     static status_t insertCapabilities(CameraProperties::Properties*, V4L_TI_CAPTYPE&);
183     static status_t insertPreviewFormats(CameraProperties::Properties* , V4L_TI_CAPTYPE&);
184     static status_t insertPreviewSizes(CameraProperties::Properties* , V4L_TI_CAPTYPE&);
185     static status_t insertImageSizes(CameraProperties::Properties* , V4L_TI_CAPTYPE&);
186     static status_t insertFrameRates(CameraProperties::Properties* , V4L_TI_CAPTYPE&);
187     static status_t sortAscend(V4L_TI_CAPTYPE&, uint16_t ) ;
188 
189     status_t v4lIoctl(int, int, void*);
190     status_t v4lInitMmap(int&);
191     status_t v4lInitUsrPtr(int&);
192     status_t v4lStartStreaming();
193     status_t v4lStopStreaming(int nBufferCount);
194     status_t v4lSetFormat(int, int, uint32_t);
195     status_t restartPreview();
196 
197 
198     int mPreviewBufferCount;
199     int mPreviewBufferCountQueueable;
200     int mCaptureBufferCount;
201     int mCaptureBufferCountQueueable;
202     android::KeyedVector<CameraBuffer *, int> mPreviewBufs;
203     android::KeyedVector<CameraBuffer *, int> mCaptureBufs;
204     mutable android::Mutex mPreviewBufsLock;
205     mutable android::Mutex mCaptureBufsLock;
206     mutable android::Mutex mStopPreviewLock;
207 
208     android::CameraParameters mParams;
209 
210     bool mPreviewing;
211     bool mCapturing;
212     android::Mutex mLock;
213 
214     int mFrameCount;
215     int mLastFrameCount;
216     unsigned int mIter;
217     nsecs_t mLastFPSTime;
218 
219     //variables holding the estimated framerate
220     float mFPS, mLastFPS;
221 
222     int mSensorIndex;
223 
224     // protected by mLock
225     android::sp<PreviewThread>   mPreviewThread;
226 
227     struct VideoInfo *mVideoInfo;
228     int mCameraHandle;
229 
230     int nQueued;
231     int nDequeued;
232 
233 };
234 
235 } // namespace Camera
236 } // namespace Ti
237 
238 #endif //V4L_CAMERA_ADAPTER_H
239