CameraSourceTimeLapse.h revision 40e2f3f9b41f44bdb59f7708a421b87f169a6ede
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,
36e4e0a6994d39c4a7cba09c5fff442b2dca1df8f8Nipun Kwatra        int32_t width, int32_t height,
3765e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra        int32_t videoFrameRate);
3865e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
3965e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    static CameraSourceTimeLapse *CreateFromCamera(const sp<Camera> &camera,
4065e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra        bool useStillCameraForTimeLapse,
4165e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra        int64_t timeBetweenTimeLapseFrameCaptureUs,
42e4e0a6994d39c4a7cba09c5fff442b2dca1df8f8Nipun Kwatra        int32_t width, int32_t height,
4365e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra        int32_t videoFrameRate);
4465e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
4565e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    virtual ~CameraSourceTimeLapse();
4665e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
4765e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatraprivate:
4865e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // If true, will use still camera takePicture() for time lapse frames
4965e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // If false, will use the videocamera frames instead.
5065e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    bool mUseStillCameraForTimeLapse;
5165e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
52c4e47d1e81c4e4403663cb911e98dbf3ada9942cNipun Kwatra    // Size of picture taken from still camera. This may be larger than the size
53c4e47d1e81c4e4403663cb911e98dbf3ada9942cNipun Kwatra    // of the video, as still camera may not support the exact video resolution
54c4e47d1e81c4e4403663cb911e98dbf3ada9942cNipun Kwatra    // demanded. See setPictureSizeToClosestSupported().
55c4e47d1e81c4e4403663cb911e98dbf3ada9942cNipun Kwatra    int32_t mPictureWidth;
56c4e47d1e81c4e4403663cb911e98dbf3ada9942cNipun Kwatra    int32_t mPictureHeight;
57c4e47d1e81c4e4403663cb911e98dbf3ada9942cNipun Kwatra
58c4e47d1e81c4e4403663cb911e98dbf3ada9942cNipun Kwatra    // size of the encoded video.
59c4e47d1e81c4e4403663cb911e98dbf3ada9942cNipun Kwatra    int32_t mVideoWidth;
60c4e47d1e81c4e4403663cb911e98dbf3ada9942cNipun Kwatra    int32_t mVideoHeight;
61c4e47d1e81c4e4403663cb911e98dbf3ada9942cNipun Kwatra
62c4e47d1e81c4e4403663cb911e98dbf3ada9942cNipun Kwatra    // True if we need to crop the still camera image to get the video frame.
63c4e47d1e81c4e4403663cb911e98dbf3ada9942cNipun Kwatra    bool mNeedCropping;
64c4e47d1e81c4e4403663cb911e98dbf3ada9942cNipun Kwatra
65c4e47d1e81c4e4403663cb911e98dbf3ada9942cNipun Kwatra    // Start location of the cropping rectangle.
66c4e47d1e81c4e4403663cb911e98dbf3ada9942cNipun Kwatra    int32_t mCropRectStartX;
67c4e47d1e81c4e4403663cb911e98dbf3ada9942cNipun Kwatra    int32_t mCropRectStartY;
68c4e47d1e81c4e4403663cb911e98dbf3ada9942cNipun Kwatra
6965e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // Time between capture of two frames during time lapse recording
7065e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // Negative value indicates that timelapse is disabled.
7165e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    int64_t mTimeBetweenTimeLapseFrameCaptureUs;
7265e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
7365e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // Time between two frames in final video (1/frameRate)
7465e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    int64_t mTimeBetweenTimeLapseVideoFramesUs;
7565e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
7665e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // Real timestamp of the last encoded time lapse frame
7765e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    int64_t mLastTimeLapseFrameRealTimestampUs;
7865e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
7965e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // Thread id of thread which takes still picture and sleeps in a loop.
8065e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    pthread_t mThreadTimeLapse;
8165e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
8265e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // Variable set in dataCallbackTimestamp() to help skipCurrentFrame()
8365e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // to know if current frame needs to be skipped.
8465e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    bool mSkipCurrentFrame;
8565e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
860aacf105eea098a0b47761a4a9a5c4d820611f2dNipun Kwatra    // True if camera is in preview mode and ready for takePicture().
870aacf105eea098a0b47761a4a9a5c4d820611f2dNipun Kwatra    bool mCameraIdle;
880aacf105eea098a0b47761a4a9a5c4d820611f2dNipun Kwatra
8965e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    CameraSourceTimeLapse(const sp<Camera> &camera,
9065e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra        bool useStillCameraForTimeLapse,
9165e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra        int64_t timeBetweenTimeLapseFrameCaptureUs,
92e4e0a6994d39c4a7cba09c5fff442b2dca1df8f8Nipun Kwatra        int32_t width, int32_t height,
9365e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra        int32_t videoFrameRate);
9465e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
9565e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // For still camera case starts a thread which calls camera's takePicture()
9665e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // in a loop. For video camera case, just starts the camera's video recording.
9765e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    virtual void startCameraRecording();
9865e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
9965e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // For still camera case joins the thread created in startCameraRecording().
10065e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // For video camera case, just stops the camera's video recording.
10165e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    virtual void stopCameraRecording();
10265e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
10365e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // For still camera case don't need to do anything as memory is locally
10465e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // allocated with refcounting.
10565e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // For video camera case just tell the camera to release the frame.
10665e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    virtual void releaseRecordingFrame(const sp<IMemory>& frame);
10765e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
10865e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // mSkipCurrentFrame is set to true in dataCallbackTimestamp() if the current
10965e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // frame needs to be skipped and this function just returns the value of mSkipCurrentFrame.
11065e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    virtual bool skipCurrentFrame(int64_t timestampUs);
11165e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
11265e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // Handles the callback to handle raw frame data from the still camera.
11365e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // Creates a copy of the frame data as the camera can reuse the frame memory
11465e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // once this callback returns. The function also sets a new timstamp corresponding
11565e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // to one frame time ahead of the last encoded frame's time stamp. It then
11665e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // calls dataCallbackTimestamp() of the base class with the copied data and the
11765e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // modified timestamp, which will think that it recieved the frame from a video
11865e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // camera and proceed as usual.
11965e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    virtual void dataCallback(int32_t msgType, const sp<IMemory> &data);
12065e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
12165e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // In the video camera case calls skipFrameAndModifyTimeStamp() to modify
12265e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // timestamp and set mSkipCurrentFrame.
12365e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // Then it calls the base CameraSource::dataCallbackTimestamp()
12465e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    virtual void dataCallbackTimestamp(int64_t timestampUs, int32_t msgType,
12565e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra            const sp<IMemory> &data);
12665e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
127c4e47d1e81c4e4403663cb911e98dbf3ada9942cNipun Kwatra    // The still camera may not support the demanded video width and height.
128c4e47d1e81c4e4403663cb911e98dbf3ada9942cNipun Kwatra    // We look for the supported picture sizes from the still camera and
12940e2f3f9b41f44bdb59f7708a421b87f169a6edeNipun Kwatra    // choose the smallest one with either dimensions higher than the corresponding
13040e2f3f9b41f44bdb59f7708a421b87f169a6edeNipun Kwatra    // video dimensions. The still picture will be cropped to get the video frame.
13140e2f3f9b41f44bdb59f7708a421b87f169a6edeNipun Kwatra    // The function returns true if the camera supports picture sizes greater than
13240e2f3f9b41f44bdb59f7708a421b87f169a6edeNipun Kwatra    // or equal to the passed in width and height, and false otherwise.
13340e2f3f9b41f44bdb59f7708a421b87f169a6edeNipun Kwatra    bool setPictureSizeToClosestSupported(int32_t width, int32_t height);
134c4e47d1e81c4e4403663cb911e98dbf3ada9942cNipun Kwatra
135c4e47d1e81c4e4403663cb911e98dbf3ada9942cNipun Kwatra    // Computes the offset of the rectangle from where to start cropping the
136c4e47d1e81c4e4403663cb911e98dbf3ada9942cNipun Kwatra    // still image into the video frame. We choose the center of the image to be
137c4e47d1e81c4e4403663cb911e98dbf3ada9942cNipun Kwatra    // cropped. The offset is stored in (mCropRectStartX, mCropRectStartY).
138c4e47d1e81c4e4403663cb911e98dbf3ada9942cNipun Kwatra    bool computeCropRectangleOffset();
139c4e47d1e81c4e4403663cb911e98dbf3ada9942cNipun Kwatra
140c4e47d1e81c4e4403663cb911e98dbf3ada9942cNipun Kwatra    // Crops the source data into a smaller image starting at
141c4e47d1e81c4e4403663cb911e98dbf3ada9942cNipun Kwatra    // (mCropRectStartX, mCropRectStartY) and of the size of the video frame.
142c4e47d1e81c4e4403663cb911e98dbf3ada9942cNipun Kwatra    // The data is returned into a newly allocated IMemory.
143c4e47d1e81c4e4403663cb911e98dbf3ada9942cNipun Kwatra    sp<IMemory> cropYUVImage(const sp<IMemory> &source_data);
144c4e47d1e81c4e4403663cb911e98dbf3ada9942cNipun Kwatra
14565e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // When video camera is used for time lapse capture, returns true
14665e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // until enough time has passed for the next time lapse frame. When
14765e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // the frame needs to be encoded, it returns false and also modifies
14865e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // the time stamp to be one frame time ahead of the last encoded
14965e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // frame's time stamp.
15065e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    bool skipFrameAndModifyTimeStamp(int64_t *timestampUs);
15165e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
15265e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // Wrapper to enter threadTimeLapseEntry()
15365e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    static void *ThreadTimeLapseWrapper(void *me);
15465e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
15565e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // Runs a loop which sleeps until a still picture is required
15665e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // and then calls mCamera->takePicture() to take the still picture.
15765e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // Used only in the case mUseStillCameraForTimeLapse = true.
15865e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    void threadTimeLapseEntry();
15965e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
1600aacf105eea098a0b47761a4a9a5c4d820611f2dNipun Kwatra    // Wrapper to enter threadStartPreview()
1610aacf105eea098a0b47761a4a9a5c4d820611f2dNipun Kwatra    static void *ThreadStartPreviewWrapper(void *me);
1620aacf105eea098a0b47761a4a9a5c4d820611f2dNipun Kwatra
1630aacf105eea098a0b47761a4a9a5c4d820611f2dNipun Kwatra    // Starts the camera's preview.
1640aacf105eea098a0b47761a4a9a5c4d820611f2dNipun Kwatra    void threadStartPreview();
1650aacf105eea098a0b47761a4a9a5c4d820611f2dNipun Kwatra
1660aacf105eea098a0b47761a4a9a5c4d820611f2dNipun Kwatra    // Starts thread ThreadStartPreviewWrapper() for restarting preview.
1670aacf105eea098a0b47761a4a9a5c4d820611f2dNipun Kwatra    // Needs to be done in a thread so that dataCallback() which calls this function
1680aacf105eea098a0b47761a4a9a5c4d820611f2dNipun Kwatra    // can return, and the camera can know that takePicture() is done.
1690aacf105eea098a0b47761a4a9a5c4d820611f2dNipun Kwatra    void restartPreview();
1700aacf105eea098a0b47761a4a9a5c4d820611f2dNipun Kwatra
17165e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    // Creates a copy of source_data into a new memory of final type MemoryBase.
17265e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    sp<IMemory> createIMemoryCopy(const sp<IMemory> &source_data);
17365e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
17465e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    CameraSourceTimeLapse(const CameraSourceTimeLapse &);
17565e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra    CameraSourceTimeLapse &operator=(const CameraSourceTimeLapse &);
17665e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra};
17765e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
17865e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra}  // namespace android
17965e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra
18065e7e6facda89927cb26594b3b65ae81b3235ebcNipun Kwatra#endif  // CAMERA_SOURCE_TIME_LAPSE_H_
181