History log of /frameworks/av/media/libstagefright/CameraSourceTimeLapse.cpp
Revision Date Author Comments (<<< Hide modified files) (Show modified files >>>)
f1d5aa162c02a16b7195a43a9bcea4d592600ac4 07-Feb-2012 James Dong <jdong@google.com> Move away from MediaDebug and use ADebug instead

Change-Id: I963a3b6f79a7292891973cbeeaf3378b38629f08
b44c9d2bdc0d5b9cb03254022a58e017b516e9e6 03-Feb-2012 James Dong <jdong@google.com> Don't call virtual functions in the destructor for audio and camera source classes

Change-Id: Ia74ffc1c0cbd7971697f5e3c476e340ec5c7727a
29357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47 06-Jan-2012 Steve Block <steveblock@google.com> Rename (IF_)LOGE(_IF) to (IF_)ALOGE(_IF) DO NOT MERGE

See https://android-git.corp.google.com/g/#/c/157220

Bug: 5449033
Change-Id: Ic9c19d30693bd56755f55906127cd6bd7126096c
df64d15042bbd5e0e4933ac49bf3c177dd94752c 04-Jan-2012 Steve Block <steveblock@google.com> Rename (IF_)LOGI(_IF) to (IF_)ALOGI(_IF) DO NOT MERGE

See https://android-git.corp.google.com/g/156801

Bug: 5449033
Change-Id: Ib08fe86d23db91ee153e9f91a99a35c42b9208ea
b8a805261bf0282e992d3608035e47d05a898710 20-Dec-2011 Steve Block <steveblock@google.com> Rename (IF_)LOGD(_IF) to (IF_)ALOGD(_IF) DO NOT MERGE

See https://android-git.corp.google.com/g/156016

Bug: 5449033
Change-Id: I4c4e33bb9df3e39e11cd985e193e6fbab4635298
7c56bb3ac1fb758a222a0c23805704a2789657b6 22-Nov-2011 James Dong <jdong@google.com> am d0a25456: am 02740dc4: Merge "Fix log spamming during time lapse video recording" into ics-mr1

* commit 'd0a254566f5f0be5607b4d64839a575c888c94f6':
Fix log spamming during time lapse video recording
e8e5f86e9e310b065596c8cbbca1543eb833dee1 20-Nov-2011 James Dong <jdong@google.com> Fix log spamming during time lapse video recording

Change-Id: I4fc0809203684ebb02eaf217d7abad00aefc898f

related-to-bug: 5626569
6a9ab553ebd36705d3edacc6deb6a27dd6b799a3 08-Nov-2011 James Dong <jdong@google.com> am ee7ebb32: Merge "Fix a hang issue where the first frame can be dropped for timelapse video recording." into ics-mr1

* commit 'ee7ebb3257d9337627b175835dc3d08f9b8ab339':
Fix a hang issue where the first frame can be dropped for timelapse video recording.
93594b5aa16dbbb0b196f6e181a8ca099d7ab62b 27-Oct-2011 James Dong <jdong@google.com> Fix a hang issue where the first frame can be dropped for timelapse video recording.

Change-Id: I04754f1005a983953a80a659ff13f8762d0e120c
related-to-bug: 5523502
3856b090cd04ba5dd4a59a12430ed724d5995909 20-Oct-2011 Steve Block <steveblock@google.com> Rename (IF_)LOGV(_IF) to (IF_)ALOGV(_IF) DO NOT MERGE

See https://android-git.corp.google.com/g/#/c/143865

Bug: 5449033
Change-Id: I0122812ed6ff6f5b59fe4a43ab8bff0577adde0a
3cecf640c4daf2df616b278bd9986018c8182908 30-Jun-2011 James Dong <jdong@google.com> Do not support still image capture mode for timelapse video recording

related-to-bug: 4973779

Change-Id: Ica665217ab10247b2242acc4e93d4fe9f83e3f45
4ca2c7c913f8bd4ada13aca56d36045d42d1e00f 01-Jun-2011 Wu-cheng Li <wuchengli@google.com> Add framework support for camcorder zoom.

The purpose of ICameraRecordingProxy and ICameraRecordingProxyListener is to
allow applications using the camera during recording.

Camera service allows only one client at a time. Since camcorder application
needs to own the camera to do things like zoom, the media recorder cannot
access the camera directly during recording. So ICameraRecordingProxy is a proxy
of ICamera, which allows the media recorder to start/stop the recording and
release recording frames. ICameraRecordingProxyListener is an interface that
allows the recorder to receive video frames during recording.



The camcorder app opens the camera and starts the preview. The app passes
ICamera and ICameraRecordingProxy to the media recorder by
MediaRecorder::setCamera(). The recorder uses ICamera to setup the camera in
MediaRecorder::start(). After setup, the recorder disconnects from camera
service. The recorder calls ICameraRecordingProxy::startRecording() and
passes a ICameraRecordingProxyListener to the app. The app connects back to
camera service and starts the recording. The app owns the camera and can do
things like zoom. The media recorder receives the video frames from the
listener and releases them by ICameraRecordingProxy::releaseRecordingFrame.
The recorder calls ICameraRecordingProxy::stopRecording() to stop the

The call sequences are as follows:
1. The app: Camera.unlock().
2. The app: MediaRecorder.setCamera().
3. Start recording
(1) The app: MediaRecorder.start().
(2) The recorder: ICamera.unlock() and ICamera.disconnect().
(3) The recorder: ICameraRecordingProxy.startRecording().
(4) The app: ICamera.reconnect().
(5) The app: ICamera.startRecording().
4. During recording
(1) The recorder: receive frames from ICameraRecordingProxyListener.dataCallbackTimestamp()
(2) The recorder: release frames by ICameraRecordingProxy.releaseRecordingFrame().
5. Stop recording
(1) The app: MediaRecorder.stop()
(2) The recorder: ICameraRecordingProxy.stopRecording().
(3) The app: ICamera.stopRecording().


Change-Id: I15269397defc25cbbcae16abc071c8349c123122
1fc87828715ef5cda402f1960231621672f91513 14-Jun-2011 James Dong <jdong@google.com> Enforce the rule that the timestamp from timelapse video source monotically increases

Change-Id: Ie5ccb43e0192420300da58525ec52af7544e8e9e
e468ac57f6e8afc6078c76d4eb1ac327112a3de0 18-Feb-2011 James Dong <jdong@google.com> Application-managed callback buffer support for raw image

bug - 3292153

Change-Id: I9789f7c5cde3a3889d7375e881181e9152d95fc2
7757f5010a771fb8824b6fdf9788f588a1577e3f 26-Jan-2011 James Dong <jdong@google.com> Make sure that key frame is generated for timelapse video recording if there are at least two input video frames from camera source.

This will fix the stop failure issue where we have to wait n * time_interval before a key frame can be received by the file writer, where
o n is the actual number of buffers advertised by the video encoder
o time_interval is the interval settings for timelapse video recording
specifying the time distance between neighboring input video frames

The fix includes two parts:
o OMXCodec will not submit all n buffers at one time, but instead submit one input
frame at one time if it become available.

o Timelapse camera source made available the first two input frames and do not skip
them so that the first compressed output frame data can be received regardless
the specified time_interval

bug - 3367659

Change-Id: Ia68cc2cb0d71aa7dc54540e9ad82fae911ad530b
2b4883641e324c50a2ee24c5bd15170c7d31e57d 19-Jan-2011 James Dong <jdong@google.com> Use metadata in video buffers for timelapse video recording by default to eliminate memcpy

bug - 3361771

Change-Id: Ib37ffe4be8edc8708baa76b3507b6f11372536d9
b0fb6bf746f1d611033c55a4a1ab5a4b0e212a95 11-Jan-2011 James Dong <jdong@google.com> Don't release the video recording frame after recording is stopped in CameraSourceTimeLapse.cpp

bug - 3334999

Change-Id: I1c83080713696221048da9b1a9f8c2ee48849ade
28934a90e168291f6c77c56e8a05f272e5151bbd 05-Jan-2011 James Dong <jdong@google.com> Use video output if necessary for timelapse video recording

Change-Id: I88d0cc824f0fbf8b2f392fbc23c69b5bfefda1b8
ba29002c7aee13c068049037cd14bba6a244da6b 10-Dec-2010 James Dong <jdong@google.com> First step towards renabling Timelapse video recording

Change-Id: I93836b066fb69d5152d3774546a9935057a1f12f
5c9523154d106b555db6c41f85ab205a4f189b02 19-Oct-2010 James Dong <jdong@google.com> Make camera source ready for handling meta-data video buffers.

bug - 3042125

Change-Id: I877b265c6bf8e0593121c8d5a95ae5599cdc6fb9
54ff19ac69ace7c05ea90d225e26dab3b133f487 08-Oct-2010 James Dong <jdong@google.com> Move Camera specific logic out from StagefrightRecorder to CameraSource

o updated comments and streamlined the logic in
checkVideoSize() and checkFrameRate() as suggested

Change-Id: I49d04ac7998d4a215997aa63555dfb6e814e38d3
78eff720c86eb6d4e3d45a144df60b2ca464d2d4 16-Sep-2010 Nipun Kwatra <nkwatra@google.com> Implemented frequent read returns for quick stop in time lapse.

If the frame capture interval is large, read will block for a long time.
Due to the way the mediaRecorder framework works, a stop() call from
mediaRecorder waits until the read returns, causing a long wait for
stop() to return. To avoid this, we return a copy of the last read
frame with the same time stamp if a frame is not available quickly.
This keeps the read() call from blocking too long. This method is
triggered when startQuickReadReturns() is called on

In the still camera case, also using waitRelative on Condition
instaed of sleeping, so that we can wake it up.
Also for the idle check instead of sleeping, we now wait on a
condition variable, which is woken up when the last takePicture
callback gets called.

Change-Id: Ia74386e175536aee0f44ae2f8b114c353d3d72f5
616715ab614ce25ea395a8e9a553a82637f1021d 16-Sep-2010 James Dong <jdong@google.com> Fix potential unintialized variable yuvformat

Change-Id: If0a77855d98b45769a154b25d6535f30cd41536a
3ee899e0466ecce107257beec04a2178939cf24e 15-Sep-2010 Nipun Kwatra <nkwatra@google.com> Disable shutter sound and play recording sound for still mode time lapse.

Disabling shutter sound when using still capture for time lapse recording.
We also play recording sound at the start and stop of recording as is
done for usual video recording.

Change-Id: I6a6fa0c7c867979624105eea74fc17945db1f517
155e833a7a5fc3e193691324cf9326da1bc3289a 02-Sep-2010 Nipun Kwatra <nkwatra@google.com> Moving decision to use still camera to CameraSourceTimeLapse

CameraSourceTimeLapse now decides whether to use still or video
camera automatically. It checks if the passed in size is a valid
preview size and if it is, then uses the video camera else uses
the still camera.

Removed from StagefrightRecorder the support to set parameter

Change-Id: I71f5b0fc7080ca524792381efe918d22e41a7f36
900c1297683ab50ca8a2d73f937bd09d9e9b100a 11-Aug-2010 Nipun Kwatra <nkwatra@google.com> Call startPreview after stopping for mUseStillCameraForTimeLapse=true case.

In the case when stop is pressed after takePicture has been called
but the CAMERA_MSG_COMPRESSED_IMAGE message from camera has not yet
been received, preview was not getting restarted. The reason was that
CameraSource::stop sets the camera listener to NULL and hence the
dataCallback() function which handles the CAMERA_MSG_COMPRESSED_IMAGE
message and restarts preview never got called.

Change-Id: Ib8f3bb77d9eab1ed5a67798569025ea0d63d7fd4
7dbfa5a98c9f396ea63d0f322c3fa11df91d17a2 10-Aug-2010 Nipun Kwatra <nkwatra@google.com> use usleep instead of sleep.

Minor bugfix. sleep doesn't take fractional value for seconds, so use
usleep instead of sleep for sleeping small times.

Change-Id: I40e45c30cc595a54c18601117b9a1a3637652f60
fd150a8e03cdd8462eafd68f4a4231aa52f0e5a1 02-Aug-2010 Nipun Kwatra <nkwatra@google.com> including limits.h to fix simulator build.

Change-Id: I473a62ab8282e4e89e48ee6d7e99aec6ed37076a
40e2f3f9b41f44bdb59f7708a421b87f169a6ede 31-Jul-2010 Nipun Kwatra <nkwatra@google.com> Implementing getSupportedPictureSizes

Go through all the supported picture sizes and choose the smallest one with
both dimensions higher than the passed in video width and height.

Change-Id: I4e9fe7a6384a0feeb9e069239ec68c70fb5f3033
c4e47d1e81c4e4403663cb911e98dbf3ada9942c 28-Jul-2010 Nipun Kwatra <nkwatra@google.com> Support for video size to be different from captured picture size.

Adding support to allow video size to be different than the supported
picture sizes. A picture size larger than the demanded video size is
chosen. Captured pictures are then cropped to the size of the desired
video size. Cropping is done from the the center portion of the picture.

Change-Id: I6bcbe16f94b6ecbcf28b7f46826a81b4b6b8cbc3
e4e0a6994d39c4a7cba09c5fff442b2dca1df8f8 21-Jul-2010 Nipun Kwatra <nkwatra@google.com> Allowing setting of time lapse parameters through MediaRecorder.java

added setTimeLapseParameters() to MediaRecorder.java and SetParameter support
in StagefrightRecorder to allow enabling time lapse and setting the corresponding

Change-Id: I509040aa71f8d3fc37337b0894a81d9c0fd7a40a
0aacf105eea098a0b47761a4a9a5c4d820611f2d 19-Jul-2010 Nipun Kwatra <nkwatra@google.com> Restart preview after each takePicture is done.

Preview is called when CAMERA_MSG_COMPRESSED_IMAGE is recieved by
dataCallback(). It needs to be started as a new thread so that the
callback can return, and the camera can know that takePicture() is

Change-Id: I4d0febbc993aac43b37f9f4a824e9c7b8785f19e
65e7e6facda89927cb26594b3b65ae81b3235ebc 12-Jul-2010 Nipun Kwatra <nkwatra@google.com> Adding support for timelapse capture using still camera's takepicture.
Also moving entire implementation into a new class CameraSourceTimeLapse
which inherits from CameraSource.

For timelapse capture using still camera, we start a thread which runs a
loop in which it calls Camera::takePicture() and then sleeps until the next
frame should be captured.
The function dataCallback() handles the callback from the camera with the
raw image data. This function copies the data and creates an artificial
timestamp corresponding to one frame time ahead of the last encoded frame's
time stamp. It then calls dataCallbackTimestamp() of the base class which
will think that it recieved the frame from a video camera and proceed as usual.

For moving the implementation to the subclass CameraSourceTimeLapse, added a
few virtual functions to CameraSource, which do the current thing for the base
class, but specialized things for CameraSourceTimeLapse.
E.g. startCameraRecording() in the base class just calls mCamera->startRecording(),
while in CameraSourceTimeLapse it may start a thread for the still camera case.

Change-Id: Ib787f24bd2e1f41681513f0257e1c4ca10a2b4de