diff options
-rw-r--r-- | camera/IProCameraUser.cpp | 30 | ||||
-rw-r--r-- | camera/ProCamera.cpp | 23 | ||||
-rw-r--r-- | camera/tests/ProCameraTests.cpp | 30 | ||||
-rw-r--r-- | include/camera/IProCameraUser.h | 5 | ||||
-rw-r--r-- | include/camera/ProCamera.h | 2 | ||||
-rw-r--r-- | services/camera/libcameraservice/ProCamera2Client.cpp | 14 | ||||
-rw-r--r-- | services/camera/libcameraservice/ProCamera2Client.h | 5 |
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 |