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>
323e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar#include <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);
10120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10254ff19ac69ace7c05ea90d225e26dab3b133f487James Dong    /**
10354ff19ac69ace7c05ea90d225e26dab3b133f487James Dong     * Check whether a CameraSource object is properly initialized.
10454ff19ac69ace7c05ea90d225e26dab3b133f487James Dong     * Must call this method before stop().
10554ff19ac69ace7c05ea90d225e26dab3b133f487James Dong     * @return OK if initialization has successfully completed.
10654ff19ac69ace7c05ea90d225e26dab3b133f487James Dong     */
10754ff19ac69ace7c05ea90d225e26dab3b133f487James Dong    virtual status_t initCheck() const;
10854ff19ac69ace7c05ea90d225e26dab3b133f487James Dong
10954ff19ac69ace7c05ea90d225e26dab3b133f487James Dong    /**
11054ff19ac69ace7c05ea90d225e26dab3b133f487James Dong     * Returns the MetaData associated with the CameraSource,
11154ff19ac69ace7c05ea90d225e26dab3b133f487James Dong     * including:
11254ff19ac69ace7c05ea90d225e26dab3b133f487James Dong     * kKeyColorFormat: YUV color format of the video frames
11354ff19ac69ace7c05ea90d225e26dab3b133f487James Dong     * kKeyWidth, kKeyHeight: dimension (in pixels) of the video frames
11454ff19ac69ace7c05ea90d225e26dab3b133f487James Dong     * kKeySampleRate: frame rate in frames per second
1152b37ced30f89437c804c3945b901019b86d210aeJames Dong     * kKeyMIMEType: always fixed to be MEDIA_MIMETYPE_VIDEO_RAW
11654ff19ac69ace7c05ea90d225e26dab3b133f487James Dong     */
11720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual sp<MetaData> getFormat();
11820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
1195c9523154d106b555db6c41f85ab205a4f189b02James Dong    /**
1205c9523154d106b555db6c41f85ab205a4f189b02James Dong     * Tell whether this camera source stores meta data or real YUV
1215c9523154d106b555db6c41f85ab205a4f189b02James Dong     * frame data in video buffers.
1225c9523154d106b555db6c41f85ab205a4f189b02James Dong     *
1233e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar     * @return a valid type if meta data is stored in the video
1243e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar     *      buffers; kMetadataBufferTypeInvalid if real YUV data is stored in
1255c9523154d106b555db6c41f85ab205a4f189b02James Dong     *      the video buffers.
1265c9523154d106b555db6c41f85ab205a4f189b02James Dong     */
1273e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar    MetadataBufferType metaDataStoredInVideoBuffers() const;
12820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
1297278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong    virtual void signalBufferReturned(MediaBuffer* buffer);
1307278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong
13165e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatraprotected:
1328cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen
1338cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    /**
1348cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen     * The class for listening to BnCameraRecordingProxyListener. This is used to receive video
1358cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen     * buffers in VIDEO_BUFFER_MODE_DATA_CALLBACK_YUV and VIDEO_BUFFER_MODE_DATA_CALLBACK_METADATA
1368cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen     * mode. When a frame is available, CameraSource::dataCallbackTimestamp() will be called.
1378cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen     */
1384ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    class ProxyListener: public BnCameraRecordingProxyListener {
1394ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    public:
1404ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li        ProxyListener(const sp<CameraSource>& source);
1414ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li        virtual void dataCallbackTimestamp(int64_t timestampUs, int32_t msgType,
1424ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li                const sp<IMemory> &data);
1432d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen        virtual void recordingFrameHandleCallbackTimestamp(int64_t timestampUs,
1442d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen                native_handle_t* handle);
145b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh        virtual void recordingFrameHandleCallbackTimestampBatch(
146b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh                const std::vector<int64_t>& timestampsUs,
147b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh                const std::vector<native_handle_t*>& handles);
1484ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li
1494ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    private:
1504ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li        sp<CameraSource> mSource;
1514ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    };
1524ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li
1538cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    /**
1548cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen     * The class for listening to BufferQueue's onFrameAvailable. This is used to receive video
1558cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen     * buffers in VIDEO_BUFFER_MODE_BUFFER_QUEUE mode. When a frame is available,
1568cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen     * CameraSource::processBufferQueueFrame() will be called.
1578cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen     */
1588cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    class BufferQueueListener : public Thread,  public BufferItemConsumer::FrameAvailableListener {
1598cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    public:
1608cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        BufferQueueListener(const sp<BufferItemConsumer> &consumer,
1618cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen                const sp<CameraSource> &cameraSource);
1628cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        virtual void onFrameAvailable(const BufferItem& item);
1638cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        virtual bool threadLoop();
1648cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    private:
1658cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        static const nsecs_t kFrameAvailableTimeout = 50000000; // 50ms
1668cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen
1678cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        sp<BufferItemConsumer> mConsumer;
1688cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        sp<CameraSource> mCameraSource;
1698cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen
1708cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        Mutex mLock;
1718cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        Condition mFrameAvailableSignal;
1728cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        bool mFrameAvailable;
1738cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    };
1748cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen
1754ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    // isBinderAlive needs linkToDeath to work.
1764ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    class DeathNotifier: public IBinder::DeathRecipient {
1774ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    public:
1784ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li        DeathNotifier() {}
1794ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li        virtual void binderDied(const wp<IBinder>& who);
1804ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    };
1814ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li
18254ff19ac69ace7c05ea90d225e26dab3b133f487James Dong    enum CameraFlags {
18354ff19ac69ace7c05ea90d225e26dab3b133f487James Dong        FLAGS_SET_CAMERA = 1L << 0,
18454ff19ac69ace7c05ea90d225e26dab3b133f487James Dong        FLAGS_HOT_CAMERA = 1L << 1,
18554ff19ac69ace7c05ea90d225e26dab3b133f487James Dong    };
18654ff19ac69ace7c05ea90d225e26dab3b133f487James Dong
18754ff19ac69ace7c05ea90d225e26dab3b133f487James Dong    int32_t  mCameraFlags;
18854ff19ac69ace7c05ea90d225e26dab3b133f487James Dong    Size     mVideoSize;
189983cf231ab2d176a14595cdae46ff1b0c239af47James Dong    int32_t  mNumInputBuffers;
19054ff19ac69ace7c05ea90d225e26dab3b133f487James Dong    int32_t  mVideoFrameRate;
19154ff19ac69ace7c05ea90d225e26dab3b133f487James Dong    int32_t  mColorFormat;
192d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala    int32_t  mEncoderFormat;
193d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala    int32_t  mEncoderDataSpace;
19454ff19ac69ace7c05ea90d225e26dab3b133f487James Dong    status_t mInitCheck;
19554ff19ac69ace7c05ea90d225e26dab3b133f487James Dong
19654ff19ac69ace7c05ea90d225e26dab3b133f487James Dong    sp<Camera>   mCamera;
1974ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    sp<ICameraRecordingProxy>   mCameraRecordingProxy;
1984ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    sp<DeathNotifier> mDeathNotifier;
19999617adda9bc46c43f511f0940bc735c73de61deMathias Agopian    sp<IGraphicBufferProducer>  mSurface;
200653252be963c07c99109d20f942d1f30c52a9360James Dong    sp<MetaData> mMeta;
20120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
20265e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    int64_t mStartTimeUs;
20365e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    int32_t mNumFramesReceived;
20465e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    int64_t mLastFrameTimestampUs;
20565e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    bool mStarted;
2067757f5010a771fb8824b6fdf9788f588a1577e3fJames Dong    int32_t mNumFramesEncoded;
20765e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
208e8e5f86e9e310b065596c8cbbca1543eb833dee1James Dong    // Time between capture of two frames.
209e8e5f86e9e310b065596c8cbbca1543eb833dee1James Dong    int64_t mTimeBetweenFrameCaptureUs;
210e8e5f86e9e310b065596c8cbbca1543eb833dee1James Dong
211d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    CameraSource(const sp<hardware::ICamera>& camera, const sp<ICameraRecordingProxy>& proxy,
21298a668f6ea51e4d894d2ebb61a0e18287fb14008Chien-Yu Chen                 int32_t cameraId, const String16& clientName, uid_t clientUid, pid_t clientPid,
21354ff19ac69ace7c05ea90d225e26dab3b133f487James Dong                 Size videoSize, int32_t frameRate,
21499617adda9bc46c43f511f0940bc735c73de61deMathias Agopian                 const sp<IGraphicBufferProducer>& surface,
2155c9523154d106b555db6c41f85ab205a4f189b02James Dong                 bool storeMetaDataInVideoBuffers);
21665e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
21726cee964ab4e0a2bd6ae9ad199ba78ea9634421cRuben Brunk    virtual status_t startCameraRecording();
21865e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    virtual void releaseRecordingFrame(const sp<IMemory>& frame);
2192d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen    virtual void releaseRecordingFrameHandle(native_handle_t* handle);
220b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh    // stagefright recorder not using this for now
221b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh    virtual void releaseRecordingFrameHandleBatch(const std::vector<native_handle_t*>& handles);
22265e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
22365e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // Returns true if need to skip the current frame.
22465e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // Called from dataCallbackTimestamp.
225b5fc9e5454e606df9bed9ca81c1ab7f9317f8b54Dan Willemsen    virtual bool skipCurrentFrame(int64_t /*timestampUs*/) {return false;}
22665e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
22765e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // Callback called when still camera raw data is available.
228b5fc9e5454e606df9bed9ca81c1ab7f9317f8b54Dan Willemsen    virtual void dataCallback(int32_t /*msgType*/, const sp<IMemory>& /*data*/) {}
22965e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
23065e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    virtual void dataCallbackTimestamp(int64_t timestampUs, int32_t msgType,
23165e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra            const sp<IMemory> &data);
23265e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
2332d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen    virtual void recordingFrameHandleCallbackTimestamp(int64_t timestampUs,
2342d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen            native_handle_t* handle);
2352d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen
236b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh    virtual void recordingFrameHandleCallbackTimestampBatch(
237b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh            const std::vector<int64_t>& timestampsUs,
238b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh            const std::vector<native_handle_t*>& handles);
239b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh
2408fc3c670fff26cb21d1e16dbfcbc4410d7758574Chien-Yu Chen    // Process a buffer item received in BufferQueueListener.
2418fc3c670fff26cb21d1e16dbfcbc4410d7758574Chien-Yu Chen    virtual void processBufferQueueFrame(BufferItem& buffer);
2428fc3c670fff26cb21d1e16dbfcbc4410d7758574Chien-Yu Chen
2439bb976e1c78048081cf9df4d8a1db67311413e5bRobert Shih    void releaseCamera();
2449bb976e1c78048081cf9df4d8a1db67311413e5bRobert Shih
24565e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatraprivate:
246ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar    friend struct CameraSourceListener;
24765e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
24820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    Mutex mLock;
24920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    Condition mFrameAvailableCondition;
2507278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong    Condition mFrameCompleteCondition;
2517278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong    List<sp<IMemory> > mFramesReceived;
2527278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong    List<sp<IMemory> > mFramesBeingEncoded;
253be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber    List<int64_t> mFrameTimes;
25420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
255be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber    int64_t mFirstFrameTimeUs;
25613aec890216948b0c364f8f92792129d0335f506James Dong    int32_t mNumFramesDropped;
257f60cafe0e6aad8f9ce54660fa88b651ae4e749e6James Dong    int32_t mNumGlitches;
258f60cafe0e6aad8f9ce54660fa88b651ae4e749e6James Dong    int64_t mGlitchDurationThresholdUs;
259365a963142093a1cd8efdcea76b5f65096a5b115James Dong    bool mCollectStats;
2608cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen
2618cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    // The mode video buffers are received from camera. One of VIDEO_BUFFER_MODE_*.
2628cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    int32_t mVideoBufferMode;
2638cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen
2642d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen    static const uint32_t kDefaultVideoBufferCount = 32;
2652d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen
2668cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    /**
2678cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen     * The following variables are used in VIDEO_BUFFER_MODE_BUFFER_QUEUE mode.
2688cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen     */
2698cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    static const size_t kConsumerBufferCount = 8;
2700419ba7b1c1bd4f19b2fab06234eacb4547a7c04Chien-Yu Chen    static const nsecs_t kMemoryBaseAvailableTimeoutNs = 200000000; // 200ms
2718cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    // Consumer and producer of the buffer queue between this class and camera.
2728cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    sp<BufferItemConsumer> mVideoBufferConsumer;
2738cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    sp<IGraphicBufferProducer> mVideoBufferProducer;
2748cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    // Memory used to send the buffers to encoder, where sp<IMemory> stores VideoNativeMetadata.
2758cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    sp<IMemoryHeap> mMemoryHeapBase;
2768cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    List<sp<IMemory>> mMemoryBases;
2770419ba7b1c1bd4f19b2fab06234eacb4547a7c04Chien-Yu Chen    // The condition that will be signaled when there is an entry available in mMemoryBases.
2780419ba7b1c1bd4f19b2fab06234eacb4547a7c04Chien-Yu Chen    Condition mMemoryBaseAvailableCond;
2798cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    // A mapping from ANativeWindowBuffer sent to encoder to BufferItem received from camera.
2808cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    // This is protected by mLock.
2818cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    KeyedVector<ANativeWindowBuffer*, BufferItem> mReceivedBufferItemMap;
2828cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    sp<BufferQueueListener> mBufferQueueListener;
283c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong
284b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh    Mutex mBatchLock; // protecting access to mInflightXXXXX members below
285b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh    // Start of members protected by mBatchLock
286b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh    std::deque<uint32_t> mInflightBatchSizes;
287b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh    std::vector<native_handle_t*> mInflightReturnedHandles;
288b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh    std::vector<const sp<IMemory>> mInflightReturnedMemorys;
289b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh    // End of members protected by mBatchLock
290b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh
291c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong    void releaseQueuedFrames();
292f60cafe0e6aad8f9ce54660fa88b651ae4e749e6James Dong    void releaseOneRecordingFrame(const sp<IMemory>& frame);
2932d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen    void createVideoBufferMemoryHeap(size_t size, uint32_t bufferCount);
29454ff19ac69ace7c05ea90d225e26dab3b133f487James Dong
295d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    status_t init(const sp<hardware::ICamera>& camera, const sp<ICameraRecordingProxy>& proxy,
29698a668f6ea51e4d894d2ebb61a0e18287fb14008Chien-Yu Chen                  int32_t cameraId, const String16& clientName, uid_t clientUid, pid_t clientPid,
297ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala                  Size videoSize, int32_t frameRate, bool storeMetaDataInVideoBuffers);
298ae4c1ac6401185539c03ce0819e174fd1b04b136James Dong
299ae4c1ac6401185539c03ce0819e174fd1b04b136James Dong    status_t initWithCameraAccess(
300d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala                  const sp<hardware::ICamera>& camera, const sp<ICameraRecordingProxy>& proxy,
30198a668f6ea51e4d894d2ebb61a0e18287fb14008Chien-Yu Chen                  int32_t cameraId, const String16& clientName, uid_t clientUid, pid_t clientPid,
302ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala                  Size videoSize, int32_t frameRate, bool storeMetaDataInVideoBuffers);
303ae4c1ac6401185539c03ce0819e174fd1b04b136James Dong
3048cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    // Initialize the buffer queue used in VIDEO_BUFFER_MODE_BUFFER_QUEUE mode.
3058cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    status_t initBufferQueue(uint32_t width, uint32_t height, uint32_t format,
3068cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen                  android_dataspace dataSpace, uint32_t bufferCount);
3078cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen
308d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    status_t isCameraAvailable(const sp<hardware::ICamera>& camera,
3094ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li                               const sp<ICameraRecordingProxy>& proxy,
310ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala                               int32_t cameraId,
311ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala                               const String16& clientName,
31298a668f6ea51e4d894d2ebb61a0e18287fb14008Chien-Yu Chen                               uid_t clientUid,
31398a668f6ea51e4d894d2ebb61a0e18287fb14008Chien-Yu Chen                               pid_t clientPid);
314ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala
31554ff19ac69ace7c05ea90d225e26dab3b133f487James Dong    status_t isCameraColorFormatSupported(const CameraParameters& params);
31654ff19ac69ace7c05ea90d225e26dab3b133f487James Dong    status_t configureCamera(CameraParameters* params,
31754ff19ac69ace7c05ea90d225e26dab3b133f487James Dong                    int32_t width, int32_t height,
31854ff19ac69ace7c05ea90d225e26dab3b133f487James Dong                    int32_t frameRate);
31954ff19ac69ace7c05ea90d225e26dab3b133f487James Dong
32054ff19ac69ace7c05ea90d225e26dab3b133f487James Dong    status_t checkVideoSize(const CameraParameters& params,
32154ff19ac69ace7c05ea90d225e26dab3b133f487James Dong                    int32_t width, int32_t height);
32254ff19ac69ace7c05ea90d225e26dab3b133f487James Dong
32354ff19ac69ace7c05ea90d225e26dab3b133f487James Dong    status_t checkFrameRate(const CameraParameters& params,
32454ff19ac69ace7c05ea90d225e26dab3b133f487James Dong                    int32_t frameRate);
32554ff19ac69ace7c05ea90d225e26dab3b133f487James Dong
3268cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    // Check if this frame should be skipped based on the frame's timestamp in microsecond.
3278cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    // mLock must be locked before calling this function.
3288cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    bool shouldSkipFrameLocked(int64_t timestampUs);
3298cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen
330b44c9d2bdc0d5b9cb03254022a58e017b516e9e6James Dong    void stopCameraRecording();
331b44c9d2bdc0d5b9cb03254022a58e017b516e9e6James Dong    status_t reset();
332ea7b485595f8cec6a66668b5c54c8f297d843f77James Dong
33320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    CameraSource(const CameraSource &);
33420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    CameraSource &operator=(const CameraSource &);
33520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
33620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
33720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
33820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
33920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif  // CAMERA_SOURCE_H_
340