120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber/* 220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Copyright (C) 2009 The Android Open Source Project 320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * you may not use this file except in compliance with the License. 620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * You may obtain a copy of the License at 720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 1020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Unless required by applicable law or agreed to in writing, software 1120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 1220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * See the License for the specific language governing permissions and 1420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * limitations under the License. 1520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber */ 1620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#ifndef CAMERA_SOURCE_H_ 1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define CAMERA_SOURCE_H_ 2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 21b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh#include <deque> 2220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MediaBuffer.h> 2320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MediaSource.h> 24d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <camera/android/hardware/ICamera.h> 25d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <camera/ICameraRecordingProxy.h> 264ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li#include <camera/ICameraRecordingProxyListener.h> 2754ff19ac69ace7c05ea90d225e26dab3b133f487James Dong#include <camera/CameraParameters.h> 288cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen#include <gui/BufferItemConsumer.h> 2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/List.h> 3020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/RefBase.h> 31ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala#include <utils/String16.h> 32255735a38b9d5c3755c7b819bdc8fdaf4357d860Pawin Vongmasa#include <media/hardware/MetadataBufferType.h> 3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3420111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android { 3520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass IMemory; 37be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huberclass Camera; 3854ff19ac69ace7c05ea90d225e26dab3b133f487James Dongclass Surface; 3920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 407278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dongclass CameraSource : public MediaSource, public MediaBufferObserver { 4120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic: 4254ff19ac69ace7c05ea90d225e26dab3b133f487James Dong /** 4354ff19ac69ace7c05ea90d225e26dab3b133f487James Dong * Factory method to create a new CameraSource using the current 4454ff19ac69ace7c05ea90d225e26dab3b133f487James Dong * settings (such as video size, frame rate, color format, etc) 4554ff19ac69ace7c05ea90d225e26dab3b133f487James Dong * from the default camera. 4654ff19ac69ace7c05ea90d225e26dab3b133f487James Dong * 47ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala * @param clientName The package/process name of the client application. 48ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala * This is used for permissions checking. 4954ff19ac69ace7c05ea90d225e26dab3b133f487James Dong * @return NULL on error. 5054ff19ac69ace7c05ea90d225e26dab3b133f487James Dong */ 51ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala static CameraSource *Create(const String16 &clientName); 5254ff19ac69ace7c05ea90d225e26dab3b133f487James Dong 5354ff19ac69ace7c05ea90d225e26dab3b133f487James Dong /** 5454ff19ac69ace7c05ea90d225e26dab3b133f487James Dong * Factory method to create a new CameraSource. 5554ff19ac69ace7c05ea90d225e26dab3b133f487James Dong * 5654ff19ac69ace7c05ea90d225e26dab3b133f487James Dong * @param camera the video input frame data source. If it is NULL, 5754ff19ac69ace7c05ea90d225e26dab3b133f487James Dong * we will try to connect to the camera with the given 5854ff19ac69ace7c05ea90d225e26dab3b133f487James Dong * cameraId. 5954ff19ac69ace7c05ea90d225e26dab3b133f487James Dong * 6054ff19ac69ace7c05ea90d225e26dab3b133f487James Dong * @param cameraId the id of the camera that the source will connect 6154ff19ac69ace7c05ea90d225e26dab3b133f487James Dong * to if camera is NULL; otherwise ignored. 62ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala * @param clientName the package/process name of the camera-using 63ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala * application if camera is NULL; otherwise ignored. Used for 64ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala * permissions checking. 65ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala * @param clientUid the UID of the camera-using application if camera is 66ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala * NULL; otherwise ignored. Used for permissions checking. 6798a668f6ea51e4d894d2ebb61a0e18287fb14008Chien-Yu Chen * @param clientPid the PID of the camera-using application if camera is 6898a668f6ea51e4d894d2ebb61a0e18287fb14008Chien-Yu Chen * NULL; otherwise ignored. Used for permissions checking. 6954ff19ac69ace7c05ea90d225e26dab3b133f487James Dong * @param videoSize the dimension (in pixels) of the video frame 7054ff19ac69ace7c05ea90d225e26dab3b133f487James Dong * @param frameRate the target frames per second 7154ff19ac69ace7c05ea90d225e26dab3b133f487James Dong * @param surface the preview surface for display where preview 7254ff19ac69ace7c05ea90d225e26dab3b133f487James Dong * frames are sent to 735c9523154d106b555db6c41f85ab205a4f189b02James Dong * @param storeMetaDataInVideoBuffers true to request the camera 745c9523154d106b555db6c41f85ab205a4f189b02James Dong * source to store meta data in video buffers; false to 755c9523154d106b555db6c41f85ab205a4f189b02James Dong * request the camera source to store real YUV frame data 765c9523154d106b555db6c41f85ab205a4f189b02James Dong * in the video buffers. The camera source may not support 775c9523154d106b555db6c41f85ab205a4f189b02James Dong * storing meta data in video buffers, if so, a request 785c9523154d106b555db6c41f85ab205a4f189b02James Dong * to do that will NOT be honored. To find out whether 795c9523154d106b555db6c41f85ab205a4f189b02James Dong * meta data is actually being stored in video buffers 805c9523154d106b555db6c41f85ab205a4f189b02James Dong * during recording, call isMetaDataStoredInVideoBuffers(). 8154ff19ac69ace7c05ea90d225e26dab3b133f487James Dong * 8254ff19ac69ace7c05ea90d225e26dab3b133f487James Dong * @return NULL on error. 8354ff19ac69ace7c05ea90d225e26dab3b133f487James Dong */ 84d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala static CameraSource *CreateFromCamera(const sp<hardware::ICamera> &camera, 854ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li const sp<ICameraRecordingProxy> &proxy, 8654ff19ac69ace7c05ea90d225e26dab3b133f487James Dong int32_t cameraId, 87ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala const String16& clientName, 88ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala uid_t clientUid, 8998a668f6ea51e4d894d2ebb61a0e18287fb14008Chien-Yu Chen pid_t clientPid, 9054ff19ac69ace7c05ea90d225e26dab3b133f487James Dong Size videoSize, 9154ff19ac69ace7c05ea90d225e26dab3b133f487James Dong int32_t frameRate, 9299617adda9bc46c43f511f0940bc735c73de61deMathias Agopian const sp<IGraphicBufferProducer>& surface, 93d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala bool storeMetaDataInVideoBuffers = true); 9420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 9520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual ~CameraSource(); 9620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 9720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual status_t start(MetaData *params = NULL); 98b44c9d2bdc0d5b9cb03254022a58e017b516e9e6James Dong virtual status_t stop() { return reset(); } 995c9523154d106b555db6c41f85ab205a4f189b02James Dong virtual status_t read( 1005c9523154d106b555db6c41f85ab205a4f189b02James Dong MediaBuffer **buffer, const ReadOptions *options = NULL); 101f8754cc59cdea9026ee4e1c821a6c362c55da7f8Hangyu Kuang virtual status_t setStopTimeUs(int64_t stopTimeUs); 10220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 10354ff19ac69ace7c05ea90d225e26dab3b133f487James Dong /** 10454ff19ac69ace7c05ea90d225e26dab3b133f487James Dong * Check whether a CameraSource object is properly initialized. 10554ff19ac69ace7c05ea90d225e26dab3b133f487James Dong * Must call this method before stop(). 10654ff19ac69ace7c05ea90d225e26dab3b133f487James Dong * @return OK if initialization has successfully completed. 10754ff19ac69ace7c05ea90d225e26dab3b133f487James Dong */ 10854ff19ac69ace7c05ea90d225e26dab3b133f487James Dong virtual status_t initCheck() const; 10954ff19ac69ace7c05ea90d225e26dab3b133f487James Dong 11054ff19ac69ace7c05ea90d225e26dab3b133f487James Dong /** 11154ff19ac69ace7c05ea90d225e26dab3b133f487James Dong * Returns the MetaData associated with the CameraSource, 11254ff19ac69ace7c05ea90d225e26dab3b133f487James Dong * including: 11354ff19ac69ace7c05ea90d225e26dab3b133f487James Dong * kKeyColorFormat: YUV color format of the video frames 11454ff19ac69ace7c05ea90d225e26dab3b133f487James Dong * kKeyWidth, kKeyHeight: dimension (in pixels) of the video frames 11554ff19ac69ace7c05ea90d225e26dab3b133f487James Dong * kKeySampleRate: frame rate in frames per second 1162b37ced30f89437c804c3945b901019b86d210aeJames Dong * kKeyMIMEType: always fixed to be MEDIA_MIMETYPE_VIDEO_RAW 11754ff19ac69ace7c05ea90d225e26dab3b133f487James Dong */ 11820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual sp<MetaData> getFormat(); 11920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1205c9523154d106b555db6c41f85ab205a4f189b02James Dong /** 1215c9523154d106b555db6c41f85ab205a4f189b02James Dong * Tell whether this camera source stores meta data or real YUV 1225c9523154d106b555db6c41f85ab205a4f189b02James Dong * frame data in video buffers. 1235c9523154d106b555db6c41f85ab205a4f189b02James Dong * 1243e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar * @return a valid type if meta data is stored in the video 1253e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar * buffers; kMetadataBufferTypeInvalid if real YUV data is stored in 1265c9523154d106b555db6c41f85ab205a4f189b02James Dong * the video buffers. 1275c9523154d106b555db6c41f85ab205a4f189b02James Dong */ 1283e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar MetadataBufferType metaDataStoredInVideoBuffers() const; 12920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1307278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong virtual void signalBufferReturned(MediaBuffer* buffer); 1317278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong 13265e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatraprotected: 1338cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen 1348cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen /** 1358cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen * The class for listening to BnCameraRecordingProxyListener. This is used to receive video 1368cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen * buffers in VIDEO_BUFFER_MODE_DATA_CALLBACK_YUV and VIDEO_BUFFER_MODE_DATA_CALLBACK_METADATA 1378cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen * mode. When a frame is available, CameraSource::dataCallbackTimestamp() will be called. 1388cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen */ 1394ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li class ProxyListener: public BnCameraRecordingProxyListener { 1404ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li public: 1414ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li ProxyListener(const sp<CameraSource>& source); 1424ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li virtual void dataCallbackTimestamp(int64_t timestampUs, int32_t msgType, 1434ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li const sp<IMemory> &data); 1442d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen virtual void recordingFrameHandleCallbackTimestamp(int64_t timestampUs, 1452d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen native_handle_t* handle); 146b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh virtual void recordingFrameHandleCallbackTimestampBatch( 147b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh const std::vector<int64_t>& timestampsUs, 148b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh const std::vector<native_handle_t*>& handles); 1494ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 1504ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li private: 1514ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li sp<CameraSource> mSource; 1524ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li }; 1534ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 1548cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen /** 1558cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen * The class for listening to BufferQueue's onFrameAvailable. This is used to receive video 1568cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen * buffers in VIDEO_BUFFER_MODE_BUFFER_QUEUE mode. When a frame is available, 1578cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen * CameraSource::processBufferQueueFrame() will be called. 1588cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen */ 1598cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen class BufferQueueListener : public Thread, public BufferItemConsumer::FrameAvailableListener { 1608cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen public: 1618cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen BufferQueueListener(const sp<BufferItemConsumer> &consumer, 1628cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen const sp<CameraSource> &cameraSource); 1638cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen virtual void onFrameAvailable(const BufferItem& item); 1648cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen virtual bool threadLoop(); 1658cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen private: 1668cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen static const nsecs_t kFrameAvailableTimeout = 50000000; // 50ms 1678cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen 1688cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen sp<BufferItemConsumer> mConsumer; 1698cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen sp<CameraSource> mCameraSource; 1708cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen 1718cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen Mutex mLock; 1728cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen Condition mFrameAvailableSignal; 1738cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen bool mFrameAvailable; 1748cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen }; 1758cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen 1764ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li // isBinderAlive needs linkToDeath to work. 1774ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li class DeathNotifier: public IBinder::DeathRecipient { 1784ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li public: 1794ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li DeathNotifier() {} 1804ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li virtual void binderDied(const wp<IBinder>& who); 1814ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li }; 1824ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 18354ff19ac69ace7c05ea90d225e26dab3b133f487James Dong enum CameraFlags { 18454ff19ac69ace7c05ea90d225e26dab3b133f487James Dong FLAGS_SET_CAMERA = 1L << 0, 18554ff19ac69ace7c05ea90d225e26dab3b133f487James Dong FLAGS_HOT_CAMERA = 1L << 1, 18654ff19ac69ace7c05ea90d225e26dab3b133f487James Dong }; 18754ff19ac69ace7c05ea90d225e26dab3b133f487James Dong 18854ff19ac69ace7c05ea90d225e26dab3b133f487James Dong int32_t mCameraFlags; 18954ff19ac69ace7c05ea90d225e26dab3b133f487James Dong Size mVideoSize; 190983cf231ab2d176a14595cdae46ff1b0c239af47James Dong int32_t mNumInputBuffers; 19154ff19ac69ace7c05ea90d225e26dab3b133f487James Dong int32_t mVideoFrameRate; 19254ff19ac69ace7c05ea90d225e26dab3b133f487James Dong int32_t mColorFormat; 193d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala int32_t mEncoderFormat; 194d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala int32_t mEncoderDataSpace; 19554ff19ac69ace7c05ea90d225e26dab3b133f487James Dong status_t mInitCheck; 19654ff19ac69ace7c05ea90d225e26dab3b133f487James Dong 19754ff19ac69ace7c05ea90d225e26dab3b133f487James Dong sp<Camera> mCamera; 1984ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li sp<ICameraRecordingProxy> mCameraRecordingProxy; 1994ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li sp<DeathNotifier> mDeathNotifier; 20099617adda9bc46c43f511f0940bc735c73de61deMathias Agopian sp<IGraphicBufferProducer> mSurface; 201653252be963c07c99109d20f942d1f30c52a9360James Dong sp<MetaData> mMeta; 20220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 20365e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra int64_t mStartTimeUs; 20465e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra int32_t mNumFramesReceived; 20565e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra int64_t mLastFrameTimestampUs; 20665e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra bool mStarted; 2077757f5010a771fb8824b6fdf9788f588a1577e3fJames Dong int32_t mNumFramesEncoded; 20865e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra 209e8e5f86e9e310b065596c8cbbca1543eb833dee1James Dong // Time between capture of two frames. 210e8e5f86e9e310b065596c8cbbca1543eb833dee1James Dong int64_t mTimeBetweenFrameCaptureUs; 211e8e5f86e9e310b065596c8cbbca1543eb833dee1James Dong 212d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala CameraSource(const sp<hardware::ICamera>& camera, const sp<ICameraRecordingProxy>& proxy, 21398a668f6ea51e4d894d2ebb61a0e18287fb14008Chien-Yu Chen int32_t cameraId, const String16& clientName, uid_t clientUid, pid_t clientPid, 21454ff19ac69ace7c05ea90d225e26dab3b133f487James Dong Size videoSize, int32_t frameRate, 21599617adda9bc46c43f511f0940bc735c73de61deMathias Agopian const sp<IGraphicBufferProducer>& surface, 2165c9523154d106b555db6c41f85ab205a4f189b02James Dong bool storeMetaDataInVideoBuffers); 21765e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra 21826cee964ab4e0a2bd6ae9ad199ba78ea9634421cRuben Brunk virtual status_t startCameraRecording(); 21965e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra virtual void releaseRecordingFrame(const sp<IMemory>& frame); 2202d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen virtual void releaseRecordingFrameHandle(native_handle_t* handle); 221b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh // stagefright recorder not using this for now 222b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh virtual void releaseRecordingFrameHandleBatch(const std::vector<native_handle_t*>& handles); 22365e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra 22465e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra // Returns true if need to skip the current frame. 22565e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra // Called from dataCallbackTimestamp. 226b5fc9e5454e606df9bed9ca81c1ab7f9317f8b54Dan Willemsen virtual bool skipCurrentFrame(int64_t /*timestampUs*/) {return false;} 22765e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra 22865e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra // Callback called when still camera raw data is available. 229b5fc9e5454e606df9bed9ca81c1ab7f9317f8b54Dan Willemsen virtual void dataCallback(int32_t /*msgType*/, const sp<IMemory>& /*data*/) {} 23065e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra 23165e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra virtual void dataCallbackTimestamp(int64_t timestampUs, int32_t msgType, 23265e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra const sp<IMemory> &data); 23365e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra 2342d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen virtual void recordingFrameHandleCallbackTimestamp(int64_t timestampUs, 2352d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen native_handle_t* handle); 2362d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen 237b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh virtual void recordingFrameHandleCallbackTimestampBatch( 238b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh const std::vector<int64_t>& timestampsUs, 239b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh const std::vector<native_handle_t*>& handles); 240b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh 2418fc3c670fff26cb21d1e16dbfcbc4410d7758574Chien-Yu Chen // Process a buffer item received in BufferQueueListener. 2428fc3c670fff26cb21d1e16dbfcbc4410d7758574Chien-Yu Chen virtual void processBufferQueueFrame(BufferItem& buffer); 2438fc3c670fff26cb21d1e16dbfcbc4410d7758574Chien-Yu Chen 2449bb976e1c78048081cf9df4d8a1db67311413e5bRobert Shih void releaseCamera(); 2459bb976e1c78048081cf9df4d8a1db67311413e5bRobert Shih 24665e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatraprivate: 247ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar friend struct CameraSourceListener; 24865e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra 24920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Mutex mLock; 25020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Condition mFrameAvailableCondition; 2517278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong Condition mFrameCompleteCondition; 2527278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong List<sp<IMemory> > mFramesReceived; 2537278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong List<sp<IMemory> > mFramesBeingEncoded; 254be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber List<int64_t> mFrameTimes; 25520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 256be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber int64_t mFirstFrameTimeUs; 257f8754cc59cdea9026ee4e1c821a6c362c55da7f8Hangyu Kuang int64_t mStopSystemTimeUs; 25813aec890216948b0c364f8f92792129d0335f506James Dong int32_t mNumFramesDropped; 259f60cafe0e6aad8f9ce54660fa88b651ae4e749e6James Dong int32_t mNumGlitches; 260f60cafe0e6aad8f9ce54660fa88b651ae4e749e6James Dong int64_t mGlitchDurationThresholdUs; 261365a963142093a1cd8efdcea76b5f65096a5b115James Dong bool mCollectStats; 2628cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen 2638cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen // The mode video buffers are received from camera. One of VIDEO_BUFFER_MODE_*. 2648cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen int32_t mVideoBufferMode; 2658cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen 2662d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen static const uint32_t kDefaultVideoBufferCount = 32; 2672d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen 2688cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen /** 2698cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen * The following variables are used in VIDEO_BUFFER_MODE_BUFFER_QUEUE mode. 2708cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen */ 2718cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen static const size_t kConsumerBufferCount = 8; 2720419ba7b1c1bd4f19b2fab06234eacb4547a7c04Chien-Yu Chen static const nsecs_t kMemoryBaseAvailableTimeoutNs = 200000000; // 200ms 2738cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen // Consumer and producer of the buffer queue between this class and camera. 2748cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen sp<BufferItemConsumer> mVideoBufferConsumer; 2758cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen sp<IGraphicBufferProducer> mVideoBufferProducer; 2768cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen // Memory used to send the buffers to encoder, where sp<IMemory> stores VideoNativeMetadata. 2778cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen sp<IMemoryHeap> mMemoryHeapBase; 2788cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen List<sp<IMemory>> mMemoryBases; 2790419ba7b1c1bd4f19b2fab06234eacb4547a7c04Chien-Yu Chen // The condition that will be signaled when there is an entry available in mMemoryBases. 2800419ba7b1c1bd4f19b2fab06234eacb4547a7c04Chien-Yu Chen Condition mMemoryBaseAvailableCond; 2818cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen // A mapping from ANativeWindowBuffer sent to encoder to BufferItem received from camera. 2828cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen // This is protected by mLock. 2838cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen KeyedVector<ANativeWindowBuffer*, BufferItem> mReceivedBufferItemMap; 2848cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen sp<BufferQueueListener> mBufferQueueListener; 285c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong 286b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh Mutex mBatchLock; // protecting access to mInflightXXXXX members below 287b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh // Start of members protected by mBatchLock 288b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh std::deque<uint32_t> mInflightBatchSizes; 289b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh std::vector<native_handle_t*> mInflightReturnedHandles; 290b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh std::vector<const sp<IMemory>> mInflightReturnedMemorys; 291b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh // End of members protected by mBatchLock 292b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh 293c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong void releaseQueuedFrames(); 294f60cafe0e6aad8f9ce54660fa88b651ae4e749e6James Dong void releaseOneRecordingFrame(const sp<IMemory>& frame); 2952d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen void createVideoBufferMemoryHeap(size_t size, uint32_t bufferCount); 29654ff19ac69ace7c05ea90d225e26dab3b133f487James Dong 297d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala status_t init(const sp<hardware::ICamera>& camera, const sp<ICameraRecordingProxy>& proxy, 29898a668f6ea51e4d894d2ebb61a0e18287fb14008Chien-Yu Chen int32_t cameraId, const String16& clientName, uid_t clientUid, pid_t clientPid, 299ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala Size videoSize, int32_t frameRate, bool storeMetaDataInVideoBuffers); 300ae4c1ac6401185539c03ce0819e174fd1b04b136James Dong 301ae4c1ac6401185539c03ce0819e174fd1b04b136James Dong status_t initWithCameraAccess( 302d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala const sp<hardware::ICamera>& camera, const sp<ICameraRecordingProxy>& proxy, 30398a668f6ea51e4d894d2ebb61a0e18287fb14008Chien-Yu Chen int32_t cameraId, const String16& clientName, uid_t clientUid, pid_t clientPid, 304ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala Size videoSize, int32_t frameRate, bool storeMetaDataInVideoBuffers); 305ae4c1ac6401185539c03ce0819e174fd1b04b136James Dong 3068cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen // Initialize the buffer queue used in VIDEO_BUFFER_MODE_BUFFER_QUEUE mode. 3078cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen status_t initBufferQueue(uint32_t width, uint32_t height, uint32_t format, 3088cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen android_dataspace dataSpace, uint32_t bufferCount); 3098cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen 310d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala status_t isCameraAvailable(const sp<hardware::ICamera>& camera, 3114ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li const sp<ICameraRecordingProxy>& proxy, 312ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala int32_t cameraId, 313ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala const String16& clientName, 31498a668f6ea51e4d894d2ebb61a0e18287fb14008Chien-Yu Chen uid_t clientUid, 31598a668f6ea51e4d894d2ebb61a0e18287fb14008Chien-Yu Chen pid_t clientPid); 316ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala 31754ff19ac69ace7c05ea90d225e26dab3b133f487James Dong status_t isCameraColorFormatSupported(const CameraParameters& params); 31854ff19ac69ace7c05ea90d225e26dab3b133f487James Dong status_t configureCamera(CameraParameters* params, 31954ff19ac69ace7c05ea90d225e26dab3b133f487James Dong int32_t width, int32_t height, 32054ff19ac69ace7c05ea90d225e26dab3b133f487James Dong int32_t frameRate); 32154ff19ac69ace7c05ea90d225e26dab3b133f487James Dong 32254ff19ac69ace7c05ea90d225e26dab3b133f487James Dong status_t checkVideoSize(const CameraParameters& params, 32354ff19ac69ace7c05ea90d225e26dab3b133f487James Dong int32_t width, int32_t height); 32454ff19ac69ace7c05ea90d225e26dab3b133f487James Dong 32554ff19ac69ace7c05ea90d225e26dab3b133f487James Dong status_t checkFrameRate(const CameraParameters& params, 32654ff19ac69ace7c05ea90d225e26dab3b133f487James Dong int32_t frameRate); 32754ff19ac69ace7c05ea90d225e26dab3b133f487James Dong 3288cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen // Check if this frame should be skipped based on the frame's timestamp in microsecond. 3298cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen // mLock must be locked before calling this function. 3308cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen bool shouldSkipFrameLocked(int64_t timestampUs); 3318cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen 332b44c9d2bdc0d5b9cb03254022a58e017b516e9e6James Dong void stopCameraRecording(); 333b44c9d2bdc0d5b9cb03254022a58e017b516e9e6James Dong status_t reset(); 334ea7b485595f8cec6a66668b5c54c8f297d843f77James Dong 33520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CameraSource(const CameraSource &); 33620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CameraSource &operator=(const CameraSource &); 33720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 33820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 33920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} // namespace android 34020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 34120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif // CAMERA_SOURCE_H_ 342