summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIgor Murashkin <iam@google.com>2013-02-21 13:49:26 -0800
committerIgor Murashkin <iam@google.com>2013-02-22 10:50:15 -0800
commit7b33a74bbc514b99c16be7fff9a34e892bc19264 (patch)
treea3c2e719aebc4dc486312970b57c588cba8f5ce9
parenta91537e268f2b35f9f0dfdc0c4f84655c93285ae (diff)
downloadframeworks_av-7b33a74bbc514b99c16be7fff9a34e892bc19264.zip
frameworks_av-7b33a74bbc514b99c16be7fff9a34e892bc19264.tar.gz
frameworks_av-7b33a74bbc514b99c16be7fff9a34e892bc19264.tar.bz2
ProCamera: Add getInfo for getting static metadata (and a test)
Change-Id: I3b87dfbc621d98bf41f37a892a1012baf85b5166
-rw-r--r--camera/IProCameraUser.cpp30
-rw-r--r--camera/ProCamera.cpp23
-rw-r--r--camera/tests/ProCameraTests.cpp30
-rw-r--r--include/camera/IProCameraUser.h5
-rw-r--r--include/camera/ProCamera.h2
-rw-r--r--services/camera/libcameraservice/ProCamera2Client.cpp14
-rw-r--r--services/camera/libcameraservice/ProCamera2Client.h5
7 files changed, 103 insertions, 6 deletions
diff --git a/camera/IProCameraUser.cpp b/camera/IProCameraUser.cpp
index e60cfe5..c9d98aa 100644
--- a/camera/IProCameraUser.cpp
+++ b/camera/IProCameraUser.cpp
@@ -44,6 +44,7 @@ enum {
CANCEL_STREAM,
CREATE_STREAM,
CREATE_DEFAULT_REQUEST,
+ GET_CAMERA_INFO,
};
/**
@@ -255,6 +256,17 @@ public:
}
+ virtual status_t getCameraInfo(int cameraId, camera_metadata** info)
+ {
+ Parcel data, reply;
+ data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor());
+ data.writeInt32(cameraId);
+ remote()->transact(GET_CAMERA_INFO, data, &reply);
+ readMetadata(reply, /*out*/info);
+ return reply.readInt32();
+ }
+
+
private:
@@ -367,6 +379,24 @@ status_t BnProCameraUser::onTransact(
writeMetadata(*reply, request);
reply->writeInt32(ret);
+ free_camera_metadata(request);
+
+ return NO_ERROR;
+ } break;
+ case GET_CAMERA_INFO: {
+ CHECK_INTERFACE(IProCameraUser, data, reply);
+
+ int cameraId = data.readInt32();
+
+ camera_metadata_t* info = NULL;
+ status_t ret;
+ ret = getCameraInfo(cameraId, &info);
+
+ writeMetadata(*reply, info);
+ reply->writeInt32(ret);
+
+ free_camera_metadata(info);
+
return NO_ERROR;
} break;
default:
diff --git a/camera/ProCamera.cpp b/camera/ProCamera.cpp
index 142c03b..c95c4e0 100644
--- a/camera/ProCamera.cpp
+++ b/camera/ProCamera.cpp
@@ -361,15 +361,28 @@ status_t ProCamera::createStreamCpu(int width, int height, int format,
}
int ProCamera::getNumberOfCameras() {
- ALOGE("%s: not implemented yet", __FUNCTION__);
- return 1;
+ const sp<ICameraService> cs = getCameraService();
+
+ if (!cs.get()) {
+ return DEAD_OBJECT;
+ }
+ return cs->getNumberOfCameras();
}
camera_metadata* ProCamera::getCameraInfo(int cameraId) {
- ALOGE("%s: not implemented yet", __FUNCTION__);
-
ALOGV("%s: cameraId = %d", __FUNCTION__, cameraId);
- return NULL;
+
+ sp <IProCameraUser> c = mCamera;
+ if (c == 0) return NULL;
+
+ camera_metadata* ptr = NULL;
+ status_t status = c->getCameraInfo(cameraId, &ptr);
+
+ if (status != OK) {
+ ALOGE("%s: Failed to get camera info, error = %d", __FUNCTION__, status);
+ }
+
+ return ptr;
}
status_t ProCamera::createDefaultRequest(int templateId,
diff --git a/camera/tests/ProCameraTests.cpp b/camera/tests/ProCameraTests.cpp
index 021fbae..69b7f3c 100644
--- a/camera/tests/ProCameraTests.cpp
+++ b/camera/tests/ProCameraTests.cpp
@@ -324,10 +324,40 @@ protected:
ASSERT_NE((void*)NULL, surface.get());
}
+ template <typename T>
+ static bool FindItem(T needle, T* array, size_t count) {
+ for (int i = 0; i < count; ++i) {
+ if (array[i] == needle) {
+ return true;
+ }
+ }
+ return false;
+ }
+
};
sp<Thread> ProCameraTest::mTestThread;
+TEST_F(ProCameraTest, AvailableFormats) {
+ if (HasFatalFailure()) {
+ return;
+ }
+
+ camera_metadata_t* info = mCamera->getCameraInfo(CAMERA_ID);
+ ASSERT_NE((void*)NULL, info);
+
+ camera_metadata_entry_t entry;
+ uint32_t tag = static_cast<uint32_t>(ANDROID_SCALER_AVAILABLE_FORMATS);
+ EXPECT_EQ(OK, find_camera_metadata_entry(info, tag, &entry));
+
+ EXPECT_TRUE(FindItem<int32_t>(HAL_PIXEL_FORMAT_YV12,
+ entry.data.i32, entry.count));
+ EXPECT_TRUE(FindItem<int32_t>(HAL_PIXEL_FORMAT_YCrCb_420_SP,
+ entry.data.i32, entry.count));
+
+ free_camera_metadata(info);
+}
+
// test around exclusiveTryLock (immediate locking)
TEST_F(ProCameraTest, LockingImmediate) {
diff --git a/include/camera/IProCameraUser.h b/include/camera/IProCameraUser.h
index a141769..7bddb0c 100644
--- a/include/camera/IProCameraUser.h
+++ b/include/camera/IProCameraUser.h
@@ -75,6 +75,11 @@ public:
camera_metadata** request)
= 0;
+ // Get static camera metadata
+ virtual status_t getCameraInfo(int cameraId,
+ /*out*/
+ camera_metadata** info) = 0;
+
};
// ----------------------------------------------------------------------------
diff --git a/include/camera/ProCamera.h b/include/camera/ProCamera.h
index 7cd9138..11904f9 100644
--- a/include/camera/ProCamera.h
+++ b/include/camera/ProCamera.h
@@ -172,7 +172,7 @@ public:
static int getNumberOfCameras();
// Get static camera metadata
- static camera_metadata* getCameraInfo(int cameraId);
+ camera_metadata* getCameraInfo(int cameraId);
sp<IProCameraUser> remote();
diff --git a/services/camera/libcameraservice/ProCamera2Client.cpp b/services/camera/libcameraservice/ProCamera2Client.cpp
index 7611796..c264e2a 100644
--- a/services/camera/libcameraservice/ProCamera2Client.cpp
+++ b/services/camera/libcameraservice/ProCamera2Client.cpp
@@ -309,6 +309,20 @@ status_t ProCamera2Client::createDefaultRequest(int templateId,
return res;
}
+status_t ProCamera2Client::getCameraInfo(int cameraId,
+ /*out*/
+ camera_metadata** info)
+{
+ if (cameraId != mCameraId) {
+ return INVALID_OPERATION;
+ }
+
+ CameraMetadata deviceInfo = mDevice->info();
+ *info = deviceInfo.release();
+
+ return OK;
+}
+
status_t ProCamera2Client::dump(int fd, const Vector<String16>& args) {
String8 result;
result.appendFormat("ProCamera2Client[%d] (%p) PID: %d, dump:\n",
diff --git a/services/camera/libcameraservice/ProCamera2Client.h b/services/camera/libcameraservice/ProCamera2Client.h
index dfea1e1..cd0a2ae 100644
--- a/services/camera/libcameraservice/ProCamera2Client.h
+++ b/services/camera/libcameraservice/ProCamera2Client.h
@@ -65,6 +65,11 @@ public:
/*out*/
camera_metadata** request);
+ // Get the static metadata for the camera
+ // -- Caller owns the newly allocated metadata
+ virtual status_t getCameraInfo(int cameraId,
+ /*out*/
+ camera_metadata** info);
/**
* Interface used by CameraService