CameraSourceTimeLapse.h revision 0aacf105eea098a0b47761a4a9a5c4d820611f2d
165e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra/*
265e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra * Copyright (C) 2010 The Android Open Source Project
365e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra *
465e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra * Licensed under the Apache License, Version 2.0 (the "License");
565e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra * you may not use this file except in compliance with the License.
665e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra * You may obtain a copy of the License at
765e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra *
865e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra *      http://www.apache.org/licenses/LICENSE-2.0
965e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra *
1065e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra * Unless required by applicable law or agreed to in writing, software
1165e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra * distributed under the License is distributed on an "AS IS" BASIS,
1265e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1365e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra * See the License for the specific language governing permissions and
1465e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra * limitations under the License.
1565e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra */
1665e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
1765e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra#ifndef CAMERA_SOURCE_TIME_LAPSE_H_
1865e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
1965e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra#define CAMERA_SOURCE_TIME_LAPSE_H_
2065e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
2165e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra#include <pthread.h>
2265e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
2365e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra#include <utils/RefBase.h>
2465e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra#include <utils/threads.h>
2565e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
2665e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatranamespace android {
2765e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
2865e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatraclass ICamera;
2965e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatraclass IMemory;
3065e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatraclass Camera;
3165e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
3265e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatraclass CameraSourceTimeLapse : public CameraSource {
3365e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatrapublic:
3465e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    static CameraSourceTimeLapse *Create(bool useStillCameraForTimeLapse,
3565e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra        int64_t timeBetweenTimeLapseFrameCaptureUs,
3665e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra        int32_t videoFrameRate);
3765e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
3865e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    static CameraSourceTimeLapse *CreateFromCamera(const sp<Camera> &camera,
3965e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra        bool useStillCameraForTimeLapse,
4065e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra        int64_t timeBetweenTimeLapseFrameCaptureUs,
4165e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra        int32_t videoFrameRate);
4265e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
4365e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    virtual ~CameraSourceTimeLapse();
4465e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
4565e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatraprivate:
4665e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // If true, will use still camera takePicture() for time lapse frames
4765e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // If false, will use the videocamera frames instead.
4865e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    bool mUseStillCameraForTimeLapse;
4965e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
5065e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // Time between capture of two frames during time lapse recording
5165e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // Negative value indicates that timelapse is disabled.
5265e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    int64_t mTimeBetweenTimeLapseFrameCaptureUs;
5365e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
5465e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // Time between two frames in final video (1/frameRate)
5565e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    int64_t mTimeBetweenTimeLapseVideoFramesUs;
5665e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
5765e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // Real timestamp of the last encoded time lapse frame
5865e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    int64_t mLastTimeLapseFrameRealTimestampUs;
5965e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
6065e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // Thread id of thread which takes still picture and sleeps in a loop.
6165e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    pthread_t mThreadTimeLapse;
6265e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
6365e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // Variable set in dataCallbackTimestamp() to help skipCurrentFrame()
6465e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // to know if current frame needs to be skipped.
6565e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    bool mSkipCurrentFrame;
6665e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
670aacf105eea098a0b47761a4a9a5c4d820611f2dNipun Kwatra    // True if camera is in preview mode and ready for takePicture().
680aacf105eea098a0b47761a4a9a5c4d820611f2dNipun Kwatra    bool mCameraIdle;
690aacf105eea098a0b47761a4a9a5c4d820611f2dNipun Kwatra
7065e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    CameraSourceTimeLapse(const sp<Camera> &camera,
7165e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra        bool useStillCameraForTimeLapse,
7265e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra        int64_t timeBetweenTimeLapseFrameCaptureUs,
7365e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra        int32_t videoFrameRate);
7465e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
7565e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // For still camera case starts a thread which calls camera's takePicture()
7665e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // in a loop. For video camera case, just starts the camera's video recording.
7765e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    virtual void startCameraRecording();
7865e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
7965e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // For still camera case joins the thread created in startCameraRecording().
8065e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // For video camera case, just stops the camera's video recording.
8165e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    virtual void stopCameraRecording();
8265e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
8365e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // For still camera case don't need to do anything as memory is locally
8465e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // allocated with refcounting.
8565e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // For video camera case just tell the camera to release the frame.
8665e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    virtual void releaseRecordingFrame(const sp<IMemory>& frame);
8765e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
8865e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // mSkipCurrentFrame is set to true in dataCallbackTimestamp() if the current
8965e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // frame needs to be skipped and this function just returns the value of mSkipCurrentFrame.
9065e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    virtual bool skipCurrentFrame(int64_t timestampUs);
9165e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
9265e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // Handles the callback to handle raw frame data from the still camera.
9365e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // Creates a copy of the frame data as the camera can reuse the frame memory
9465e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // once this callback returns. The function also sets a new timstamp corresponding
9565e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // to one frame time ahead of the last encoded frame's time stamp. It then
9665e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // calls dataCallbackTimestamp() of the base class with the copied data and the
9765e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // modified timestamp, which will think that it recieved the frame from a video
9865e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // camera and proceed as usual.
9965e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    virtual void dataCallback(int32_t msgType, const sp<IMemory> &data);
10065e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
10165e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // In the video camera case calls skipFrameAndModifyTimeStamp() to modify
10265e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // timestamp and set mSkipCurrentFrame.
10365e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // Then it calls the base CameraSource::dataCallbackTimestamp()
10465e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    virtual void dataCallbackTimestamp(int64_t timestampUs, int32_t msgType,
10565e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra            const sp<IMemory> &data);
10665e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
10765e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // When video camera is used for time lapse capture, returns true
10865e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // until enough time has passed for the next time lapse frame. When
10965e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // the frame needs to be encoded, it returns false and also modifies
11065e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // the time stamp to be one frame time ahead of the last encoded
11165e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // frame's time stamp.
11265e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    bool skipFrameAndModifyTimeStamp(int64_t *timestampUs);
11365e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
11465e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // Wrapper to enter threadTimeLapseEntry()
11565e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    static void *ThreadTimeLapseWrapper(void *me);
11665e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
11765e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // Runs a loop which sleeps until a still picture is required
11865e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // and then calls mCamera->takePicture() to take the still picture.
11965e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // Used only in the case mUseStillCameraForTimeLapse = true.
12065e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    void threadTimeLapseEntry();
12165e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
1220aacf105eea098a0b47761a4a9a5c4d820611f2dNipun Kwatra    // Wrapper to enter threadStartPreview()
1230aacf105eea098a0b47761a4a9a5c4d820611f2dNipun Kwatra    static void *ThreadStartPreviewWrapper(void *me);
1240aacf105eea098a0b47761a4a9a5c4d820611f2dNipun Kwatra
1250aacf105eea098a0b47761a4a9a5c4d820611f2dNipun Kwatra    // Starts the camera's preview.
1260aacf105eea098a0b47761a4a9a5c4d820611f2dNipun Kwatra    void threadStartPreview();
1270aacf105eea098a0b47761a4a9a5c4d820611f2dNipun Kwatra
1280aacf105eea098a0b47761a4a9a5c4d820611f2dNipun Kwatra    // Starts thread ThreadStartPreviewWrapper() for restarting preview.
1290aacf105eea098a0b47761a4a9a5c4d820611f2dNipun Kwatra    // Needs to be done in a thread so that dataCallback() which calls this function
1300aacf105eea098a0b47761a4a9a5c4d820611f2dNipun Kwatra    // can return, and the camera can know that takePicture() is done.
1310aacf105eea098a0b47761a4a9a5c4d820611f2dNipun Kwatra    void restartPreview();
1320aacf105eea098a0b47761a4a9a5c4d820611f2dNipun Kwatra
13365e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // Creates a copy of source_data into a new memory of final type MemoryBase.
13465e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    sp<IMemory> createIMemoryCopy(const sp<IMemory> &source_data);
13565e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
13665e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    CameraSourceTimeLapse(const CameraSourceTimeLapse &);
13765e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    CameraSourceTimeLapse &operator=(const CameraSourceTimeLapse &);
13865e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra};
13965e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
14065e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra}  // namespace android
14165e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
14265e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra#endif  // CAMERA_SOURCE_TIME_LAPSE_H_
143