1e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber/*
2e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * Copyright (C) 2009 The Android Open Source Project
3e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber *
4e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * you may not use this file except in compliance with the License.
6e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * You may obtain a copy of the License at
7e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber *
8e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber *
10e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * Unless required by applicable law or agreed to in writing, software
11e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * See the License for the specific language governing permissions and
14e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * limitations under the License.
15e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber */
16e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
17e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#ifndef CAMERA_SOURCE_H_
18e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
19e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#define CAMERA_SOURCE_H_
20e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
21e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <media/stagefright/MediaBuffer.h>
22e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <media/stagefright/MediaSource.h>
230c128b67f066b2e691348d5375c2da47b84f69acJames Dong#include <camera/ICamera.h>
2442419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li#include <camera/ICameraRecordingProxyListener.h>
250c128b67f066b2e691348d5375c2da47b84f69acJames Dong#include <camera/CameraParameters.h>
26e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <utils/List.h>
27e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <utils/RefBase.h>
28e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
29e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubernamespace android {
30e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
31e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass IMemory;
32155e2ad04c9e15562149772fbbaa39004d4778a7Andreas Huberclass Camera;
330c128b67f066b2e691348d5375c2da47b84f69acJames Dongclass Surface;
34e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
35dfb1dd6a8c0c0b0ecde302fae266d9a37617dfdaJames Dongclass CameraSource : public MediaSource, public MediaBufferObserver {
36e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic:
370c128b67f066b2e691348d5375c2da47b84f69acJames Dong    /**
380c128b67f066b2e691348d5375c2da47b84f69acJames Dong     * Factory method to create a new CameraSource using the current
390c128b67f066b2e691348d5375c2da47b84f69acJames Dong     * settings (such as video size, frame rate, color format, etc)
400c128b67f066b2e691348d5375c2da47b84f69acJames Dong     * from the default camera.
410c128b67f066b2e691348d5375c2da47b84f69acJames Dong     *
420c128b67f066b2e691348d5375c2da47b84f69acJames Dong     * @return NULL on error.
430c128b67f066b2e691348d5375c2da47b84f69acJames Dong     */
44e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    static CameraSource *Create();
450c128b67f066b2e691348d5375c2da47b84f69acJames Dong
460c128b67f066b2e691348d5375c2da47b84f69acJames Dong    /**
470c128b67f066b2e691348d5375c2da47b84f69acJames Dong     * Factory method to create a new CameraSource.
480c128b67f066b2e691348d5375c2da47b84f69acJames Dong     *
490c128b67f066b2e691348d5375c2da47b84f69acJames Dong     * @param camera the video input frame data source. If it is NULL,
500c128b67f066b2e691348d5375c2da47b84f69acJames Dong     *          we will try to connect to the camera with the given
510c128b67f066b2e691348d5375c2da47b84f69acJames Dong     *          cameraId.
520c128b67f066b2e691348d5375c2da47b84f69acJames Dong     *
530c128b67f066b2e691348d5375c2da47b84f69acJames Dong     * @param cameraId the id of the camera that the source will connect
540c128b67f066b2e691348d5375c2da47b84f69acJames Dong     *          to if camera is NULL; otherwise ignored.
550c128b67f066b2e691348d5375c2da47b84f69acJames Dong     *
560c128b67f066b2e691348d5375c2da47b84f69acJames Dong     * @param videoSize the dimension (in pixels) of the video frame
570c128b67f066b2e691348d5375c2da47b84f69acJames Dong     * @param frameRate the target frames per second
580c128b67f066b2e691348d5375c2da47b84f69acJames Dong     * @param surface the preview surface for display where preview
590c128b67f066b2e691348d5375c2da47b84f69acJames Dong     *          frames are sent to
60ab79d1febcb6d0bfaaf5e8bfb75f4c641c00a2fbJames Dong     * @param storeMetaDataInVideoBuffers true to request the camera
61ab79d1febcb6d0bfaaf5e8bfb75f4c641c00a2fbJames Dong     *          source to store meta data in video buffers; false to
62ab79d1febcb6d0bfaaf5e8bfb75f4c641c00a2fbJames Dong     *          request the camera source to store real YUV frame data
63ab79d1febcb6d0bfaaf5e8bfb75f4c641c00a2fbJames Dong     *          in the video buffers. The camera source may not support
64ab79d1febcb6d0bfaaf5e8bfb75f4c641c00a2fbJames Dong     *          storing meta data in video buffers, if so, a request
65ab79d1febcb6d0bfaaf5e8bfb75f4c641c00a2fbJames Dong     *          to do that will NOT be honored. To find out whether
66ab79d1febcb6d0bfaaf5e8bfb75f4c641c00a2fbJames Dong     *          meta data is actually being stored in video buffers
67ab79d1febcb6d0bfaaf5e8bfb75f4c641c00a2fbJames Dong     *          during recording, call isMetaDataStoredInVideoBuffers().
680c128b67f066b2e691348d5375c2da47b84f69acJames Dong     *
690c128b67f066b2e691348d5375c2da47b84f69acJames Dong     * @return NULL on error.
700c128b67f066b2e691348d5375c2da47b84f69acJames Dong     */
710c128b67f066b2e691348d5375c2da47b84f69acJames Dong    static CameraSource *CreateFromCamera(const sp<ICamera> &camera,
7242419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li                                          const sp<ICameraRecordingProxy> &proxy,
730c128b67f066b2e691348d5375c2da47b84f69acJames Dong                                          int32_t cameraId,
740c128b67f066b2e691348d5375c2da47b84f69acJames Dong                                          Size videoSize,
750c128b67f066b2e691348d5375c2da47b84f69acJames Dong                                          int32_t frameRate,
76ab79d1febcb6d0bfaaf5e8bfb75f4c641c00a2fbJames Dong                                          const sp<Surface>& surface,
77ab79d1febcb6d0bfaaf5e8bfb75f4c641c00a2fbJames Dong                                          bool storeMetaDataInVideoBuffers = false);
78e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
79e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual ~CameraSource();
80e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
81e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual status_t start(MetaData *params = NULL);
82e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual status_t stop();
83ab79d1febcb6d0bfaaf5e8bfb75f4c641c00a2fbJames Dong    virtual status_t read(
84ab79d1febcb6d0bfaaf5e8bfb75f4c641c00a2fbJames Dong            MediaBuffer **buffer, const ReadOptions *options = NULL);
85e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
860c128b67f066b2e691348d5375c2da47b84f69acJames Dong    /**
870c128b67f066b2e691348d5375c2da47b84f69acJames Dong     * Check whether a CameraSource object is properly initialized.
880c128b67f066b2e691348d5375c2da47b84f69acJames Dong     * Must call this method before stop().
890c128b67f066b2e691348d5375c2da47b84f69acJames Dong     * @return OK if initialization has successfully completed.
900c128b67f066b2e691348d5375c2da47b84f69acJames Dong     */
910c128b67f066b2e691348d5375c2da47b84f69acJames Dong    virtual status_t initCheck() const;
920c128b67f066b2e691348d5375c2da47b84f69acJames Dong
930c128b67f066b2e691348d5375c2da47b84f69acJames Dong    /**
940c128b67f066b2e691348d5375c2da47b84f69acJames Dong     * Returns the MetaData associated with the CameraSource,
950c128b67f066b2e691348d5375c2da47b84f69acJames Dong     * including:
960c128b67f066b2e691348d5375c2da47b84f69acJames Dong     * kKeyColorFormat: YUV color format of the video frames
970c128b67f066b2e691348d5375c2da47b84f69acJames Dong     * kKeyWidth, kKeyHeight: dimension (in pixels) of the video frames
980c128b67f066b2e691348d5375c2da47b84f69acJames Dong     * kKeySampleRate: frame rate in frames per second
99997eaa2c7c6f7c59d145dab3e93431ea2e2a7dc7James Dong     * kKeyMIMEType: always fixed to be MEDIA_MIMETYPE_VIDEO_RAW
1000c128b67f066b2e691348d5375c2da47b84f69acJames Dong     */
101e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual sp<MetaData> getFormat();
102e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
103ab79d1febcb6d0bfaaf5e8bfb75f4c641c00a2fbJames Dong    /**
104ab79d1febcb6d0bfaaf5e8bfb75f4c641c00a2fbJames Dong     * Tell whether this camera source stores meta data or real YUV
105ab79d1febcb6d0bfaaf5e8bfb75f4c641c00a2fbJames Dong     * frame data in video buffers.
106ab79d1febcb6d0bfaaf5e8bfb75f4c641c00a2fbJames Dong     *
107ab79d1febcb6d0bfaaf5e8bfb75f4c641c00a2fbJames Dong     * @return true if meta data is stored in the video
108ab79d1febcb6d0bfaaf5e8bfb75f4c641c00a2fbJames Dong     *      buffers; false if real YUV data is stored in
109ab79d1febcb6d0bfaaf5e8bfb75f4c641c00a2fbJames Dong     *      the video buffers.
110ab79d1febcb6d0bfaaf5e8bfb75f4c641c00a2fbJames Dong     */
111ab79d1febcb6d0bfaaf5e8bfb75f4c641c00a2fbJames Dong    bool isMetaDataStoredInVideoBuffers() const;
112e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
113dfb1dd6a8c0c0b0ecde302fae266d9a37617dfdaJames Dong    virtual void signalBufferReturned(MediaBuffer* buffer);
114dfb1dd6a8c0c0b0ecde302fae266d9a37617dfdaJames Dong
115f9b80182bcd32d563c23c12b4ac06517fd6da531Nipun Kwatraprotected:
11642419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    class ProxyListener: public BnCameraRecordingProxyListener {
11742419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    public:
11842419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li        ProxyListener(const sp<CameraSource>& source);
11942419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li        virtual void dataCallbackTimestamp(int64_t timestampUs, int32_t msgType,
12042419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li                const sp<IMemory> &data);
12142419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li
12242419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    private:
12342419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li        sp<CameraSource> mSource;
12442419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    };
12542419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li
12642419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    // isBinderAlive needs linkToDeath to work.
12742419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    class DeathNotifier: public IBinder::DeathRecipient {
12842419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    public:
12942419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li        DeathNotifier() {}
13042419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li        virtual void binderDied(const wp<IBinder>& who);
13142419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    };
13242419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li
1330c128b67f066b2e691348d5375c2da47b84f69acJames Dong    enum CameraFlags {
1340c128b67f066b2e691348d5375c2da47b84f69acJames Dong        FLAGS_SET_CAMERA = 1L << 0,
1350c128b67f066b2e691348d5375c2da47b84f69acJames Dong        FLAGS_HOT_CAMERA = 1L << 1,
1360c128b67f066b2e691348d5375c2da47b84f69acJames Dong    };
1370c128b67f066b2e691348d5375c2da47b84f69acJames Dong
1380c128b67f066b2e691348d5375c2da47b84f69acJames Dong    int32_t  mCameraFlags;
1390c128b67f066b2e691348d5375c2da47b84f69acJames Dong    Size     mVideoSize;
1400c128b67f066b2e691348d5375c2da47b84f69acJames Dong    int32_t  mVideoFrameRate;
1410c128b67f066b2e691348d5375c2da47b84f69acJames Dong    int32_t  mColorFormat;
1420c128b67f066b2e691348d5375c2da47b84f69acJames Dong    status_t mInitCheck;
1430c128b67f066b2e691348d5375c2da47b84f69acJames Dong
1440c128b67f066b2e691348d5375c2da47b84f69acJames Dong    sp<Camera>   mCamera;
14542419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    sp<ICameraRecordingProxy>   mCameraRecordingProxy;
14642419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    sp<DeathNotifier> mDeathNotifier;
1470c128b67f066b2e691348d5375c2da47b84f69acJames Dong    sp<Surface>  mSurface;
148c2f328d0d2821e402823d6e17589da2849b67d0dJames Dong    sp<MetaData> mMeta;
149e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
150f9b80182bcd32d563c23c12b4ac06517fd6da531Nipun Kwatra    int64_t mStartTimeUs;
151f9b80182bcd32d563c23c12b4ac06517fd6da531Nipun Kwatra    int32_t mNumFramesReceived;
152f9b80182bcd32d563c23c12b4ac06517fd6da531Nipun Kwatra    int64_t mLastFrameTimestampUs;
153f9b80182bcd32d563c23c12b4ac06517fd6da531Nipun Kwatra    bool mStarted;
1545f3ab06e90365ad6c4865e2cab358a20e12ce0ebJames Dong    int32_t mNumFramesEncoded;
155f9b80182bcd32d563c23c12b4ac06517fd6da531Nipun Kwatra
15696af14d9b013496accf40a85a66fefcba3ac0111James Dong    // Time between capture of two frames.
15796af14d9b013496accf40a85a66fefcba3ac0111James Dong    int64_t mTimeBetweenFrameCaptureUs;
15896af14d9b013496accf40a85a66fefcba3ac0111James Dong
15942419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    CameraSource(const sp<ICamera>& camera, const sp<ICameraRecordingProxy>& proxy,
16042419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li                 int32_t cameraId,
1610c128b67f066b2e691348d5375c2da47b84f69acJames Dong                 Size videoSize, int32_t frameRate,
162ab79d1febcb6d0bfaaf5e8bfb75f4c641c00a2fbJames Dong                 const sp<Surface>& surface,
163ab79d1febcb6d0bfaaf5e8bfb75f4c641c00a2fbJames Dong                 bool storeMetaDataInVideoBuffers);
164f9b80182bcd32d563c23c12b4ac06517fd6da531Nipun Kwatra
165f9b80182bcd32d563c23c12b4ac06517fd6da531Nipun Kwatra    virtual void startCameraRecording();
166f9b80182bcd32d563c23c12b4ac06517fd6da531Nipun Kwatra    virtual void stopCameraRecording();
167f9b80182bcd32d563c23c12b4ac06517fd6da531Nipun Kwatra    virtual void releaseRecordingFrame(const sp<IMemory>& frame);
168f9b80182bcd32d563c23c12b4ac06517fd6da531Nipun Kwatra
169f9b80182bcd32d563c23c12b4ac06517fd6da531Nipun Kwatra    // Returns true if need to skip the current frame.
170f9b80182bcd32d563c23c12b4ac06517fd6da531Nipun Kwatra    // Called from dataCallbackTimestamp.
171f9b80182bcd32d563c23c12b4ac06517fd6da531Nipun Kwatra    virtual bool skipCurrentFrame(int64_t timestampUs) {return false;}
172f9b80182bcd32d563c23c12b4ac06517fd6da531Nipun Kwatra
173f9b80182bcd32d563c23c12b4ac06517fd6da531Nipun Kwatra    // Callback called when still camera raw data is available.
174f9b80182bcd32d563c23c12b4ac06517fd6da531Nipun Kwatra    virtual void dataCallback(int32_t msgType, const sp<IMemory> &data) {}
175f9b80182bcd32d563c23c12b4ac06517fd6da531Nipun Kwatra
176f9b80182bcd32d563c23c12b4ac06517fd6da531Nipun Kwatra    virtual void dataCallbackTimestamp(int64_t timestampUs, int32_t msgType,
177f9b80182bcd32d563c23c12b4ac06517fd6da531Nipun Kwatra            const sp<IMemory> &data);
178f9b80182bcd32d563c23c12b4ac06517fd6da531Nipun Kwatra
179f9b80182bcd32d563c23c12b4ac06517fd6da531Nipun Kwatraprivate:
180f9b80182bcd32d563c23c12b4ac06517fd6da531Nipun Kwatra    friend class CameraSourceListener;
181f9b80182bcd32d563c23c12b4ac06517fd6da531Nipun Kwatra
182e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    Mutex mLock;
183e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    Condition mFrameAvailableCondition;
184dfb1dd6a8c0c0b0ecde302fae266d9a37617dfdaJames Dong    Condition mFrameCompleteCondition;
185dfb1dd6a8c0c0b0ecde302fae266d9a37617dfdaJames Dong    List<sp<IMemory> > mFramesReceived;
186dfb1dd6a8c0c0b0ecde302fae266d9a37617dfdaJames Dong    List<sp<IMemory> > mFramesBeingEncoded;
187155e2ad04c9e15562149772fbbaa39004d4778a7Andreas Huber    List<int64_t> mFrameTimes;
188e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
189155e2ad04c9e15562149772fbbaa39004d4778a7Andreas Huber    int64_t mFirstFrameTimeUs;
1903300e9667e3daa374659b4a8b97dd92c4d34e501James Dong    int32_t mNumFramesDropped;
19136e573bf7db5888f92c52eda26e0771aaa2406e4James Dong    int32_t mNumGlitches;
19236e573bf7db5888f92c52eda26e0771aaa2406e4James Dong    int64_t mGlitchDurationThresholdUs;
193dae9fd31907c62712f7a96bb2a8e288b0cca57c2James Dong    bool mCollectStats;
194ab79d1febcb6d0bfaaf5e8bfb75f4c641c00a2fbJames Dong    bool mIsMetaDataStoredInVideoBuffers;
195b00e246669a1da84b1dd7e3f014eedc21747562fJames Dong
196b00e246669a1da84b1dd7e3f014eedc21747562fJames Dong    void releaseQueuedFrames();
19736e573bf7db5888f92c52eda26e0771aaa2406e4James Dong    void releaseOneRecordingFrame(const sp<IMemory>& frame);
198155e2ad04c9e15562149772fbbaa39004d4778a7Andreas Huber
1990c128b67f066b2e691348d5375c2da47b84f69acJames Dong
20042419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    status_t init(const sp<ICamera>& camera, const sp<ICameraRecordingProxy>& proxy,
20142419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li                  int32_t cameraId, Size videoSize, int32_t frameRate,
20242419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li                  bool storeMetaDataInVideoBuffers);
2038d19d3ae1e828e9189e2174e8ea88374af93f18eJames Dong
2048d19d3ae1e828e9189e2174e8ea88374af93f18eJames Dong    status_t initWithCameraAccess(
2058d19d3ae1e828e9189e2174e8ea88374af93f18eJames Dong                  const sp<ICamera>& camera, const sp<ICameraRecordingProxy>& proxy,
2068d19d3ae1e828e9189e2174e8ea88374af93f18eJames Dong                  int32_t cameraId, Size videoSize, int32_t frameRate,
2078d19d3ae1e828e9189e2174e8ea88374af93f18eJames Dong                  bool storeMetaDataInVideoBuffers);
2088d19d3ae1e828e9189e2174e8ea88374af93f18eJames Dong
20942419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    status_t isCameraAvailable(const sp<ICamera>& camera,
21042419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li                               const sp<ICameraRecordingProxy>& proxy,
21142419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li                               int32_t cameraId);
2120c128b67f066b2e691348d5375c2da47b84f69acJames Dong    status_t isCameraColorFormatSupported(const CameraParameters& params);
2130c128b67f066b2e691348d5375c2da47b84f69acJames Dong    status_t configureCamera(CameraParameters* params,
2140c128b67f066b2e691348d5375c2da47b84f69acJames Dong                    int32_t width, int32_t height,
2150c128b67f066b2e691348d5375c2da47b84f69acJames Dong                    int32_t frameRate);
2160c128b67f066b2e691348d5375c2da47b84f69acJames Dong
2170c128b67f066b2e691348d5375c2da47b84f69acJames Dong    status_t checkVideoSize(const CameraParameters& params,
2180c128b67f066b2e691348d5375c2da47b84f69acJames Dong                    int32_t width, int32_t height);
2190c128b67f066b2e691348d5375c2da47b84f69acJames Dong
2200c128b67f066b2e691348d5375c2da47b84f69acJames Dong    status_t checkFrameRate(const CameraParameters& params,
2210c128b67f066b2e691348d5375c2da47b84f69acJames Dong                    int32_t frameRate);
2220c128b67f066b2e691348d5375c2da47b84f69acJames Dong
2235df53fe2f038bc23f2e3c452dc8398c8bdd08d30James Dong    void releaseCamera();
2245df53fe2f038bc23f2e3c452dc8398c8bdd08d30James Dong
225e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    CameraSource(const CameraSource &);
226e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    CameraSource &operator=(const CameraSource &);
227e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber};
228e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
229e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber}  // namespace android
230e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
231e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#endif  // CAMERA_SOURCE_H_
232