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