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