summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/CameraSource.cpp
diff options
context:
space:
mode:
authorJames Dong <jdong@google.com>2010-10-18 21:42:27 -0700
committerJames Dong <jdong@google.com>2010-10-19 23:11:29 -0700
commit5c9523154d106b555db6c41f85ab205a4f189b02 (patch)
tree1017090612e96cc60853e6b0008b9df6bb3736d3 /media/libstagefright/CameraSource.cpp
parentf705b5aa8c3b319f7b49f9ea46207187278076f9 (diff)
downloadframeworks_av-5c9523154d106b555db6c41f85ab205a4f189b02.zip
frameworks_av-5c9523154d106b555db6c41f85ab205a4f189b02.tar.gz
frameworks_av-5c9523154d106b555db6c41f85ab205a4f189b02.tar.bz2
Make camera source ready for handling meta-data video buffers.
bug - 3042125 Change-Id: I877b265c6bf8e0593121c8d5a95ae5599cdc6fb9
Diffstat (limited to 'media/libstagefright/CameraSource.cpp')
-rw-r--r--media/libstagefright/CameraSource.cpp56
1 files changed, 50 insertions, 6 deletions
diff --git a/media/libstagefright/CameraSource.cpp b/media/libstagefright/CameraSource.cpp
index 1eb394a..df95cf7 100644
--- a/media/libstagefright/CameraSource.cpp
+++ b/media/libstagefright/CameraSource.cpp
@@ -115,7 +115,7 @@ CameraSource *CameraSource::Create() {
size.height = -1;
sp<ICamera> camera;
- return new CameraSource(camera, 0, size, -1, NULL);
+ return new CameraSource(camera, 0, size, -1, NULL, false);
}
// static
@@ -124,10 +124,12 @@ CameraSource *CameraSource::CreateFromCamera(
int32_t cameraId,
Size videoSize,
int32_t frameRate,
- const sp<Surface>& surface) {
+ const sp<Surface>& surface,
+ bool storeMetaDataInVideoBuffers) {
CameraSource *source = new CameraSource(camera, cameraId,
- videoSize, frameRate, surface);
+ videoSize, frameRate, surface,
+ storeMetaDataInVideoBuffers);
if (source != NULL) {
if (source->initCheck() != OK) {
@@ -143,7 +145,8 @@ CameraSource::CameraSource(
int32_t cameraId,
Size videoSize,
int32_t frameRate,
- const sp<Surface>& surface)
+ const sp<Surface>& surface,
+ bool storeMetaDataInVideoBuffers)
: mCameraFlags(0),
mVideoFrameRate(-1),
mCamera(0),
@@ -161,7 +164,9 @@ CameraSource::CameraSource(
mVideoSize.width = -1;
mVideoSize.height = -1;
- mInitCheck = init(camera, cameraId, videoSize, frameRate);
+ mInitCheck = init(camera, cameraId,
+ videoSize, frameRate,
+ storeMetaDataInVideoBuffers);
}
status_t CameraSource::initCheck() const {
@@ -411,13 +416,19 @@ status_t CameraSource::checkFrameRate(
* width and heigth settings by the camera
* @param frameRate the target frame rate in frames per second.
* if it is -1, use the current camera frame rate setting.
+ * @param storeMetaDataInVideoBuffers request to store meta
+ * data or real YUV data in video buffers. Request to
+ * store meta data in video buffers may not be honored
+ * if the source does not support this feature.
+ *
* @return OK if no error.
*/
status_t CameraSource::init(
const sp<ICamera>& camera,
int32_t cameraId,
Size videoSize,
- int32_t frameRate) {
+ int32_t frameRate,
+ bool storeMetaDataInVideoBuffers) {
status_t err = OK;
int64_t token = IPCThreadState::self()->clearCallingIdentity();
@@ -452,6 +463,12 @@ status_t CameraSource::init(
// check earlier by calling mCamera->setParameters().
CHECK_EQ(OK, mCamera->setPreviewDisplay(mSurface));
+ mIsMetaDataStoredInVideoBuffers = false;
+ if (storeMetaDataInVideoBuffers &&
+ OK == mCamera->storeMetaDataInBuffers(true)) {
+ mIsMetaDataStoredInVideoBuffers = true;
+ }
+
/*
* mCamera->startRecording() signals camera hal to make
* available the video buffers (for instance, allocation
@@ -722,4 +739,31 @@ void CameraSource::dataCallbackTimestamp(int64_t timestampUs,
mFrameAvailableCondition.signal();
}
+size_t CameraSource::getNumberOfVideoBuffers() const {
+ LOGV("getNumberOfVideoBuffers");
+ size_t nBuffers = 0;
+ int64_t token = IPCThreadState::self()->clearCallingIdentity();
+ if (mInitCheck == OK && mCamera != 0) {
+ nBuffers = mCamera->getNumberOfVideoBuffers();
+ }
+ IPCThreadState::self()->restoreCallingIdentity(token);
+ return nBuffers;
+}
+
+sp<IMemory> CameraSource::getVideoBuffer(size_t index) const {
+ LOGV("getVideoBuffer: %d", index);
+ sp<IMemory> buffer = 0;
+ int64_t token = IPCThreadState::self()->clearCallingIdentity();
+ if (mInitCheck == OK && mCamera != 0) {
+ buffer = mCamera->getVideoBuffer(index);
+ }
+ IPCThreadState::self()->restoreCallingIdentity(token);
+ return buffer;
+}
+
+bool CameraSource::isMetaDataStoredInVideoBuffers() const {
+ LOGV("isMetaDataStoredInVideoBuffers");
+ return mIsMetaDataStoredInVideoBuffers;
+}
+
} // namespace android