blob: a0c3349d9fde14f0849d5e94b255cfb69e6e25d6 [file]
/*
* Copyright (C) 2025 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#define LOG_TAG "VirtualCameraCaptureResultConsumer"
#include "VirtualCameraCaptureResultConsumer.h"
#include "util/AidlUtil.h"
#include "utils/Log.h"
namespace android {
namespace companion {
namespace virtualcamera {
using ::aidl::android::companion::virtualcamera::VirtualCameraMetadata;
VirtualCameraCaptureResultConsumer::~VirtualCameraCaptureResultConsumer() {
std::lock_guard<std::mutex> lock(mLock);
if (mLastMetadata != nullptr) {
free_camera_metadata(mLastMetadata);
mLastMetadata = nullptr;
}
}
ndk::ScopedAStatus VirtualCameraCaptureResultConsumer::acceptCaptureResult(
int64_t timestamp, const VirtualCameraMetadata& captureResultMetadata) {
::aidl::android::hardware::camera::device::CameraMetadata deviceCameraMetadata;
status_t ret = convertVirtualToDeviceCameraMetadata(captureResultMetadata,
deviceCameraMetadata);
if (ret != OK) {
ALOGE("Failed to convert virtual to device CaptureResult!");
// Return OK to the client, we just log the error and drop the metadata.
return ndk::ScopedAStatus::ok();
}
const camera_metadata_t* rawMetadata =
reinterpret_cast<const camera_metadata_t*>(
deviceCameraMetadata.metadata.data());
camera_metadata_t* newMetadata = clone_camera_metadata(rawMetadata);
std::lock_guard<std::mutex> lock(mLock);
if (mLastMetadata) {
free_camera_metadata(mLastMetadata);
}
mLastTimestamp = timestamp;
mLastMetadata = newMetadata;
return ndk::ScopedAStatus::ok();
}
const camera_metadata_t*
VirtualCameraCaptureResultConsumer::getCaptureResultMetadataForTimestamp(
int64_t timestamp) {
std::lock_guard<std::mutex> lock(mLock);
if (mLastTimestamp == timestamp && mLastMetadata != nullptr) {
return clone_camera_metadata(mLastMetadata);
}
return nullptr;
}
} // namespace virtualcamera
} // namespace companion
} // namespace android