Loading camera/ndk/NdkCameraMetadata.cpp +7 −7 Original line number Diff line number Diff line Loading @@ -81,15 +81,16 @@ bool InitJni(JNIEnv* env) { } // Given cameraMetadata, an instance of android.hardware.camera2.CameraMetadata, invokes // cameraMetadata.getNativeMetadataPtr() and returns it as a CameraMetadata*. CameraMetadata* CameraMetadata_getNativeMetadataPtr(JNIEnv* env, jobject cameraMetadata) { // cameraMetadata.getNativeMetadataPtr() and returns it as a std::shared_ptr<CameraMetadata>*. std::shared_ptr<CameraMetadata>* CameraMetadata_getNativeMetadataPtr(JNIEnv* env, jobject cameraMetadata) { if (cameraMetadata == nullptr) { ALOGE("%s: Invalid Java CameraMetadata object.", __FUNCTION__); return nullptr; } jlong ret = env->CallLongMethod(cameraMetadata, android_hardware_camera2_CameraMetadata_getNativeMetadataPtr); return reinterpret_cast<CameraMetadata *>(ret); return reinterpret_cast<std::shared_ptr<CameraMetadata>* >(ret); } } // namespace Loading Loading @@ -179,9 +180,8 @@ ACameraMetadata* ACameraMetadata_fromCameraMetadata(JNIEnv* env, jobject cameraM return nullptr; } CameraMetadata* src = CameraMetadata_getNativeMetadataPtr(env, cameraMetadata); ACameraMetadata* output = new ACameraMetadata(src, type); auto sharedData = CameraMetadata_getNativeMetadataPtr(env, cameraMetadata); ACameraMetadata* output = new ACameraMetadata(*sharedData, type); output->incStrong(/*id=*/(void*) ACameraMetadata_fromCameraMetadata); return output; } Loading camera/ndk/impl/ACameraMetadata.cpp +5 −14 Original line number Diff line number Diff line Loading @@ -28,33 +28,24 @@ using namespace android; * ACameraMetadata Implementation */ ACameraMetadata::ACameraMetadata(camera_metadata_t* buffer, ACAMERA_METADATA_TYPE type) : mData(new CameraMetadata(buffer)), mOwnsData(true), mData(std::make_shared<CameraMetadata>(buffer)), mType(type) { init(); } ACameraMetadata::ACameraMetadata(CameraMetadata* cameraMetadata, ACAMERA_METADATA_TYPE type) : ACameraMetadata::ACameraMetadata(const std::shared_ptr<CameraMetadata>& cameraMetadata, ACAMERA_METADATA_TYPE type) : mData(cameraMetadata), mOwnsData(false), mType(type) { init(); } ACameraMetadata::ACameraMetadata(const ACameraMetadata& other) : mOwnsData(other.mOwnsData), mData(std::make_shared<CameraMetadata>(*(other.mData))), mType(other.mType) { if (other.mOwnsData) { mData = new CameraMetadata(*(other.mData)); } else { mData = other.mData; } } ACameraMetadata::~ACameraMetadata() { if (mOwnsData) { delete mData; } } void Loading Loading @@ -373,7 +364,7 @@ ACameraMetadata::getConstEntry(uint32_t tag, ACameraMetadata_const_entry* entry) Mutex::Autolock _l(mLock); camera_metadata_ro_entry rawEntry = static_cast<const CameraMetadata*>(mData)->find(tag); camera_metadata_ro_entry rawEntry = static_cast<const CameraMetadata*>(mData.get())->find(tag); if (rawEntry.count == 0) { ALOGE("%s: cannot find metadata tag %d", __FUNCTION__, tag); return ACAMERA_ERROR_METADATA_NOT_FOUND; Loading camera/ndk/impl/ACameraMetadata.h +6 −8 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ #include <unordered_set> #include <vector> #include <memory> #include <sys/types.h> #include <utils/Mutex.h> Loading Loading @@ -50,14 +51,13 @@ struct ACameraMetadata : public RefBase { // Constructs a ACameraMetadata that takes ownership of `buffer`. ACameraMetadata(camera_metadata_t* buffer, ACAMERA_METADATA_TYPE type); // Constructs a ACameraMetadata that is a view of `cameraMetadata`. // `cameraMetadata` will not be deleted by ~ACameraMetadata(). ACameraMetadata(CameraMetadata* cameraMetadata, ACAMERA_METADATA_TYPE type); // Constructs a ACameraMetadata that shares its data with something else, like a Java object ACameraMetadata(const std::shared_ptr<CameraMetadata>& cameraMetadata, ACAMERA_METADATA_TYPE type); // Copy constructor. // // If `other` owns its CameraMetadata, then makes a deep copy. // Otherwise, the new instance is also a view of the same data. // Always makes a deep copy. ACameraMetadata(const ACameraMetadata& other); ~ACameraMetadata(); Loading Loading @@ -125,9 +125,7 @@ struct ACameraMetadata : public RefBase { // Guard access of public APIs: get/update/getTags. mutable Mutex mLock; CameraMetadata* mData; // If true, has ownership of mData. Otherwise, mData is a view of an external instance. bool mOwnsData; std::shared_ptr<CameraMetadata> mData; mutable Vector<uint32_t> mTags; // Updated by `getTags()`, cleared by `update()`. const ACAMERA_METADATA_TYPE mType; Loading camera/ndk/include/camera/NdkCameraMetadata.h +4 −5 Original line number Diff line number Diff line Loading @@ -274,10 +274,9 @@ bool ACameraMetadata_isLogicalMultiCamera(const ACameraMetadata* staticMetadata, * <p>The returned ACameraMetadata must be freed by the application by {@link ACameraMetadata_free} * after application is done using it.</p> * * <p>This function does not affect the lifetime of {@link cameraMetadata}. Attempting to use the * returned ACameraMetadata object after {@link cameraMetadata} has been garbage collected is * unsafe. To manage the lifetime beyond the current JNI function call, use * {@code env->NewGlobalRef()} and {@code env->DeleteGlobalRef()}. * <p>The ACameraMetadata maintains a reference count to the underlying data, so * it can be used independently of the Java object, and it remains valid even if * the Java metadata is garbage collected. * * @param env the JNI environment. * @param cameraMetadata the source {@link android.hardware.camera2.CameraMetadata} from which the Loading media/codec2/TEST_MAPPING +4 −0 Original line number Diff line number Diff line Loading @@ -9,6 +9,10 @@ }, { "exclude-annotation": "android.platform.test.annotations.RequiresDevice" }, // TODO: b/149314419 { "exclude-filter": "android.media.cts.AudioPlaybackCaptureTest" } ] } Loading Loading
camera/ndk/NdkCameraMetadata.cpp +7 −7 Original line number Diff line number Diff line Loading @@ -81,15 +81,16 @@ bool InitJni(JNIEnv* env) { } // Given cameraMetadata, an instance of android.hardware.camera2.CameraMetadata, invokes // cameraMetadata.getNativeMetadataPtr() and returns it as a CameraMetadata*. CameraMetadata* CameraMetadata_getNativeMetadataPtr(JNIEnv* env, jobject cameraMetadata) { // cameraMetadata.getNativeMetadataPtr() and returns it as a std::shared_ptr<CameraMetadata>*. std::shared_ptr<CameraMetadata>* CameraMetadata_getNativeMetadataPtr(JNIEnv* env, jobject cameraMetadata) { if (cameraMetadata == nullptr) { ALOGE("%s: Invalid Java CameraMetadata object.", __FUNCTION__); return nullptr; } jlong ret = env->CallLongMethod(cameraMetadata, android_hardware_camera2_CameraMetadata_getNativeMetadataPtr); return reinterpret_cast<CameraMetadata *>(ret); return reinterpret_cast<std::shared_ptr<CameraMetadata>* >(ret); } } // namespace Loading Loading @@ -179,9 +180,8 @@ ACameraMetadata* ACameraMetadata_fromCameraMetadata(JNIEnv* env, jobject cameraM return nullptr; } CameraMetadata* src = CameraMetadata_getNativeMetadataPtr(env, cameraMetadata); ACameraMetadata* output = new ACameraMetadata(src, type); auto sharedData = CameraMetadata_getNativeMetadataPtr(env, cameraMetadata); ACameraMetadata* output = new ACameraMetadata(*sharedData, type); output->incStrong(/*id=*/(void*) ACameraMetadata_fromCameraMetadata); return output; } Loading
camera/ndk/impl/ACameraMetadata.cpp +5 −14 Original line number Diff line number Diff line Loading @@ -28,33 +28,24 @@ using namespace android; * ACameraMetadata Implementation */ ACameraMetadata::ACameraMetadata(camera_metadata_t* buffer, ACAMERA_METADATA_TYPE type) : mData(new CameraMetadata(buffer)), mOwnsData(true), mData(std::make_shared<CameraMetadata>(buffer)), mType(type) { init(); } ACameraMetadata::ACameraMetadata(CameraMetadata* cameraMetadata, ACAMERA_METADATA_TYPE type) : ACameraMetadata::ACameraMetadata(const std::shared_ptr<CameraMetadata>& cameraMetadata, ACAMERA_METADATA_TYPE type) : mData(cameraMetadata), mOwnsData(false), mType(type) { init(); } ACameraMetadata::ACameraMetadata(const ACameraMetadata& other) : mOwnsData(other.mOwnsData), mData(std::make_shared<CameraMetadata>(*(other.mData))), mType(other.mType) { if (other.mOwnsData) { mData = new CameraMetadata(*(other.mData)); } else { mData = other.mData; } } ACameraMetadata::~ACameraMetadata() { if (mOwnsData) { delete mData; } } void Loading Loading @@ -373,7 +364,7 @@ ACameraMetadata::getConstEntry(uint32_t tag, ACameraMetadata_const_entry* entry) Mutex::Autolock _l(mLock); camera_metadata_ro_entry rawEntry = static_cast<const CameraMetadata*>(mData)->find(tag); camera_metadata_ro_entry rawEntry = static_cast<const CameraMetadata*>(mData.get())->find(tag); if (rawEntry.count == 0) { ALOGE("%s: cannot find metadata tag %d", __FUNCTION__, tag); return ACAMERA_ERROR_METADATA_NOT_FOUND; Loading
camera/ndk/impl/ACameraMetadata.h +6 −8 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ #include <unordered_set> #include <vector> #include <memory> #include <sys/types.h> #include <utils/Mutex.h> Loading Loading @@ -50,14 +51,13 @@ struct ACameraMetadata : public RefBase { // Constructs a ACameraMetadata that takes ownership of `buffer`. ACameraMetadata(camera_metadata_t* buffer, ACAMERA_METADATA_TYPE type); // Constructs a ACameraMetadata that is a view of `cameraMetadata`. // `cameraMetadata` will not be deleted by ~ACameraMetadata(). ACameraMetadata(CameraMetadata* cameraMetadata, ACAMERA_METADATA_TYPE type); // Constructs a ACameraMetadata that shares its data with something else, like a Java object ACameraMetadata(const std::shared_ptr<CameraMetadata>& cameraMetadata, ACAMERA_METADATA_TYPE type); // Copy constructor. // // If `other` owns its CameraMetadata, then makes a deep copy. // Otherwise, the new instance is also a view of the same data. // Always makes a deep copy. ACameraMetadata(const ACameraMetadata& other); ~ACameraMetadata(); Loading Loading @@ -125,9 +125,7 @@ struct ACameraMetadata : public RefBase { // Guard access of public APIs: get/update/getTags. mutable Mutex mLock; CameraMetadata* mData; // If true, has ownership of mData. Otherwise, mData is a view of an external instance. bool mOwnsData; std::shared_ptr<CameraMetadata> mData; mutable Vector<uint32_t> mTags; // Updated by `getTags()`, cleared by `update()`. const ACAMERA_METADATA_TYPE mType; Loading
camera/ndk/include/camera/NdkCameraMetadata.h +4 −5 Original line number Diff line number Diff line Loading @@ -274,10 +274,9 @@ bool ACameraMetadata_isLogicalMultiCamera(const ACameraMetadata* staticMetadata, * <p>The returned ACameraMetadata must be freed by the application by {@link ACameraMetadata_free} * after application is done using it.</p> * * <p>This function does not affect the lifetime of {@link cameraMetadata}. Attempting to use the * returned ACameraMetadata object after {@link cameraMetadata} has been garbage collected is * unsafe. To manage the lifetime beyond the current JNI function call, use * {@code env->NewGlobalRef()} and {@code env->DeleteGlobalRef()}. * <p>The ACameraMetadata maintains a reference count to the underlying data, so * it can be used independently of the Java object, and it remains valid even if * the Java metadata is garbage collected. * * @param env the JNI environment. * @param cameraMetadata the source {@link android.hardware.camera2.CameraMetadata} from which the Loading
media/codec2/TEST_MAPPING +4 −0 Original line number Diff line number Diff line Loading @@ -9,6 +9,10 @@ }, { "exclude-annotation": "android.platform.test.annotations.RequiresDevice" }, // TODO: b/149314419 { "exclude-filter": "android.media.cts.AudioPlaybackCaptureTest" } ] } Loading