History log of /frameworks/base/media/libstagefright/CameraSourceTimeLapse.cpp
Revision Date Author Comments (<<< Hide modified files) (Show modified files >>>)
96af14d9b013496accf40a85a66fefcba3ac0111 20-Nov-2011 James Dong <jdong@google.com> Fix log spamming during time lapse video recording

Change-Id: I4fc0809203684ebb02eaf217d7abad00aefc898f

related-to-bug: 5626569
/frameworks/base/media/libstagefright/CameraSourceTimeLapse.cpp
b888fd130616807ca40fd77279ad56db4394da3b 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
/frameworks/base/media/libstagefright/CameraSourceTimeLapse.cpp
83dd43f45aa3212239acfb35d799216e840c9e2f 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
/frameworks/base/media/libstagefright/CameraSourceTimeLapse.cpp
42419ce28a09eb63e29a8fef87e6f5534f41902f 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.

ICameraRecordingProxy
startRecording()
stopRecording()
releaseRecordingFrame()

ICameraRecordingProxyListener
dataCallbackTimestamp()

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
recording.

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().

bug:2644213

Change-Id: I15269397defc25cbbcae16abc071c8349c123122
/frameworks/base/media/libstagefright/CameraSourceTimeLapse.cpp
21663e5dc761c4bfdb99e348e04b2ce1d1d9214c 14-Jun-2011 James Dong <jdong@google.com> Enforce the rule that the timestamp from timelapse video source monotically increases

Change-Id: Ie5ccb43e0192420300da58525ec52af7544e8e9e
/frameworks/base/media/libstagefright/CameraSourceTimeLapse.cpp
e00cab707dcaf6f05adb5ccb9c80fdf25c483427 18-Feb-2011 James Dong <jdong@google.com> Application-managed callback buffer support for raw image

bug - 3292153

Change-Id: I9789f7c5cde3a3889d7375e881181e9152d95fc2
/frameworks/base/media/libstagefright/CameraSourceTimeLapse.cpp
5f3ab06e90365ad6c4865e2cab358a20e12ce0eb 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
/frameworks/base/media/libstagefright/CameraSourceTimeLapse.cpp
5fb60c7af2cbf59a99ae324c4284c7860b37c723 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
/frameworks/base/media/libstagefright/CameraSourceTimeLapse.cpp
545c22ffd27588acabe3e5861e2d084cf17ff322 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
/frameworks/base/media/libstagefright/CameraSourceTimeLapse.cpp
a1d2d8f7a5fd956ab82acc641415e09ff6c00a7e 05-Jan-2011 James Dong <jdong@google.com> Use video output if necessary for timelapse video recording

Change-Id: I88d0cc824f0fbf8b2f392fbc23c69b5bfefda1b8
/frameworks/base/media/libstagefright/CameraSourceTimeLapse.cpp
08800f3fdc607e1e8f8d0554eff4a9dc9a6c53d3 10-Dec-2010 James Dong <jdong@google.com> First step towards renabling Timelapse video recording

Change-Id: I93836b066fb69d5152d3774546a9935057a1f12f
/frameworks/base/media/libstagefright/CameraSourceTimeLapse.cpp
ab79d1febcb6d0bfaaf5e8bfb75f4c641c00a2fb 19-Oct-2010 James Dong <jdong@google.com> Make camera source ready for handling meta-data video buffers.

bug - 3042125

Change-Id: I877b265c6bf8e0593121c8d5a95ae5599cdc6fb9
/frameworks/base/media/libstagefright/CameraSourceTimeLapse.cpp
0c128b67f066b2e691348d5375c2da47b84f69ac 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
/frameworks/base/media/libstagefright/CameraSourceTimeLapse.cpp
7553cf74e67a83440139b34a098b90a2ad6ed86d 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
CameraSourceTimeLapse.

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
/frameworks/base/media/libstagefright/CameraSourceTimeLapse.cpp
5d1d920be18881ca2c948dbca85ce47785742552 16-Sep-2010 James Dong <jdong@google.com> Fix potential unintialized variable yuvformat

Change-Id: If0a77855d98b45769a154b25d6535f30cd41536a
/frameworks/base/media/libstagefright/CameraSourceTimeLapse.cpp
8e02ca748bf41e1357b94170226dfb5e8ca11f10 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
/frameworks/base/media/libstagefright/CameraSourceTimeLapse.cpp
4a857e620fecd91d051d8e58f573b5ff30d81aaf 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
useStillCameraForTimeLapse.

Change-Id: I71f5b0fc7080ca524792381efe918d22e41a7f36
/frameworks/base/media/libstagefright/CameraSourceTimeLapse.cpp
c44cf627036f54d14438f5d003542c47d7c417cd 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
/frameworks/base/media/libstagefright/CameraSourceTimeLapse.cpp
7913998c4ba9b7d8ff6868b2a8e05a566fbb8042 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
/frameworks/base/media/libstagefright/CameraSourceTimeLapse.cpp
7d435c5e7e5a953cf0c899bf822b6ca661f5ba31 02-Aug-2010 Nipun Kwatra <nkwatra@google.com> including limits.h to fix simulator build.

Change-Id: I473a62ab8282e4e89e48ee6d7e99aec6ed37076a
/frameworks/base/media/libstagefright/CameraSourceTimeLapse.cpp
b1fb6079ef7f005c4be8de76bef57ce10c1efe76 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
/frameworks/base/media/libstagefright/CameraSourceTimeLapse.cpp
dce4beb17982faeb6308bd7ee86c684514a3bad3 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
/frameworks/base/media/libstagefright/CameraSourceTimeLapse.cpp
d01371bf691ff04e4957e49805503dbf20b338df 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
parameters.

Change-Id: I509040aa71f8d3fc37337b0894a81d9c0fd7a40a
/frameworks/base/media/libstagefright/CameraSourceTimeLapse.cpp
4cd8672662b0e56f6b8b5c7e3cf6ced8c1b15638 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
done.

Change-Id: I4d0febbc993aac43b37f9f4a824e9c7b8785f19e
/frameworks/base/media/libstagefright/CameraSourceTimeLapse.cpp
f9b80182bcd32d563c23c12b4ac06517fd6da531 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
/frameworks/base/media/libstagefright/CameraSourceTimeLapse.cpp