Camera NDK: internal->public format conversion

Test: new CTS test
Bug: 112897492
Change-Id: I785612966e7c6201db333e3a736e6efda9e63feb
gugelfrei
Yin-Chia Yeh 6 years ago
parent 12efcb14ee
commit e57e9a2ca6

@ -32,6 +32,10 @@ ACameraMetadata::ACameraMetadata(camera_metadata_t* buffer, ACAMERA_METADATA_TYP
if (mType == ACM_CHARACTERISTICS) {
filterUnsupportedFeatures();
filterStreamConfigurations();
filterDurations(ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS);
filterDurations(ANDROID_SCALER_AVAILABLE_STALL_DURATIONS);
filterDurations(ANDROID_DEPTH_AVAILABLE_DEPTH_MIN_FRAME_DURATIONS);
filterDurations(ANDROID_DEPTH_AVAILABLE_DEPTH_STALL_DURATIONS);
}
// TODO: filter request/result keys
}
@ -81,6 +85,72 @@ ACameraMetadata::filterUnsupportedFeatures() {
}
void
ACameraMetadata::filterDurations(uint32_t tag) {
const int STREAM_CONFIGURATION_SIZE = 4;
const int STREAM_FORMAT_OFFSET = 0;
const int STREAM_WIDTH_OFFSET = 1;
const int STREAM_HEIGHT_OFFSET = 2;
const int STREAM_DURATION_OFFSET = 3;
camera_metadata_entry entry = mData.find(tag);
if (entry.count == 0 || entry.count % 4 || entry.type != TYPE_INT64) {
ALOGE("%s: malformed duration key %d! count %zu, type %d",
__FUNCTION__, tag, entry.count, entry.type);
return;
}
Vector<int64_t> filteredDurations;
filteredDurations.setCapacity(entry.count * 2);
for (size_t i=0; i < entry.count; i += STREAM_CONFIGURATION_SIZE) {
int64_t format = entry.data.i64[i + STREAM_FORMAT_OFFSET];
int64_t width = entry.data.i64[i + STREAM_WIDTH_OFFSET];
int64_t height = entry.data.i64[i + STREAM_HEIGHT_OFFSET];
int64_t duration = entry.data.i32[i + STREAM_DURATION_OFFSET];
// Leave the unfiltered format in so apps depending on previous wrong
// filter behavior continue to work
filteredDurations.push_back(format);
filteredDurations.push_back(width);
filteredDurations.push_back(height);
filteredDurations.push_back(duration);
// Translate HAL formats to NDK format
switch (tag) {
case ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS:
case ANDROID_SCALER_AVAILABLE_STALL_DURATIONS:
if (format == HAL_PIXEL_FORMAT_BLOB) {
format = AIMAGE_FORMAT_JPEG;
filteredDurations.push_back(format);
filteredDurations.push_back(width);
filteredDurations.push_back(height);
filteredDurations.push_back(duration);
}
break;
case ANDROID_DEPTH_AVAILABLE_DEPTH_MIN_FRAME_DURATIONS:
case ANDROID_DEPTH_AVAILABLE_DEPTH_STALL_DURATIONS:
if (format == HAL_PIXEL_FORMAT_BLOB) {
format = AIMAGE_FORMAT_DEPTH_POINT_CLOUD;
filteredDurations.push_back(format);
filteredDurations.push_back(width);
filteredDurations.push_back(height);
filteredDurations.push_back(duration);
} else if (format == HAL_PIXEL_FORMAT_Y16) {
format = AIMAGE_FORMAT_DEPTH16;
filteredDurations.push_back(format);
filteredDurations.push_back(width);
filteredDurations.push_back(height);
filteredDurations.push_back(duration);
}
break;
default:
// Should not reach here
ALOGE("%s: Unkown tag 0x%x", __FUNCTION__, tag);
}
}
mData.update(tag, filteredDurations);
}
void
ACameraMetadata::filterStreamConfigurations() {
const int STREAM_CONFIGURATION_SIZE = 4;

@ -58,13 +58,16 @@ struct ACameraMetadata : public RefBase {
camera_status_t getTags(/*out*/int32_t* numTags,
/*out*/const uint32_t** tags) const;
const CameraMetadata& getInternalData() const;
private:
bool isNdkSupportedCapability(const int32_t capability);
static inline bool isVendorTag(const uint32_t tag);
static bool isCaptureRequestTag(const uint32_t tag);
void filterUnsupportedFeatures(); // Hide features not yet supported by NDK
void filterStreamConfigurations(); // Hide input streams, translate hal format to NDK formats
const CameraMetadata& getInternalData() const;
void filterDurations(uint32_t tag); // translate hal format to NDK formats
template<typename INTERNAL_T, typename NDK_T>
camera_status_t updateImpl(uint32_t tag, uint32_t count, const NDK_T* data) {
@ -96,7 +99,6 @@ struct ACameraMetadata : public RefBase {
}
}
private:
// guard access of public APIs: get/update/getTags
mutable Mutex mLock;
CameraMetadata mData;

Loading…
Cancel
Save