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