blob: 6cf6f78d55766a97804cc86b7b7ef43b1d77ba29 [file] [log] [blame]
/*
* Copyright (C) 2023 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.
*/
#include "HistogramController.h"
void HistogramController::initPlatformHistogramCapability() {
mHistogramCapability.supportSamplePosList.push_back(HistogramSamplePos::PRE_POSTPROC);
mHistogramCapability.supportBlockingRoi = true;
}
// TODO: b/295990513 - Remove the if defined after kernel prebuilts are merged.
#if defined(EXYNOS_HISTOGRAM_CHANNEL_REQUEST)
int HistogramController::createHistogramDrmConfigLocked(const ChannelInfo& channel,
std::shared_ptr<void>& configPtr,
size_t& length) const {
configPtr = std::make_shared<struct histogram_channel_config>();
struct histogram_channel_config* channelConfig =
(struct histogram_channel_config*)configPtr.get();
if (channelConfig == nullptr) {
ALOGE("%s: histogram failed to allocate histogram_channel_config", __func__);
return NO_MEMORY;
}
channelConfig->roi.start_x = channel.workingConfig.roi.left;
channelConfig->roi.start_y = channel.workingConfig.roi.top;
channelConfig->roi.hsize = channel.workingConfig.roi.right - channel.workingConfig.roi.left;
channelConfig->roi.vsize = channel.workingConfig.roi.bottom - channel.workingConfig.roi.top;
if (channel.workingConfig.blockingRoi.has_value() &&
channel.workingConfig.blockingRoi.value() != DISABLED_ROI) {
const HistogramRoiRect& blockedRoi = channel.workingConfig.blockingRoi.value();
channelConfig->flags |= HISTOGRAM_FLAGS_BLOCKED_ROI;
channelConfig->blocked_roi.start_x = blockedRoi.left;
channelConfig->blocked_roi.start_y = blockedRoi.top;
channelConfig->blocked_roi.hsize = blockedRoi.right - blockedRoi.left;
channelConfig->blocked_roi.vsize = blockedRoi.bottom - blockedRoi.top;
} else {
channelConfig->flags &= ~HISTOGRAM_FLAGS_BLOCKED_ROI;
}
channelConfig->weights.weight_r = channel.workingConfig.weights.weightR;
channelConfig->weights.weight_g = channel.workingConfig.weights.weightG;
channelConfig->weights.weight_b = channel.workingConfig.weights.weightB;
channelConfig->pos = (channel.workingConfig.samplePos == HistogramSamplePos::POST_POSTPROC)
? POST_DQE
: PRE_DQE;
channelConfig->threshold = channel.threshold;
length = sizeof(struct histogram_channel_config);
return NO_ERROR;
}
int HistogramController::parseDrmEvent(void* event, uint8_t& channelId, char16_t*& buffer) const {
struct exynos_drm_histogram_channel_event* histogram_channel_event =
(struct exynos_drm_histogram_channel_event*)event;
channelId = histogram_channel_event->hist_id;
buffer = (char16_t*)&histogram_channel_event->bins;
return NO_ERROR;
}
#endif