From acfe2e6d73f26f9a1d306d96126bcfb4070b5360 Mon Sep 17 00:00:00 2001 From: "Wang,Fei" Date: Tue, 12 Dec 2017 10:13:21 +0800 Subject: [PATCH] Add color balance(Hue, Saturation, Brightness, Contrast) adjustment on VA module. Jira: None. Test: Build passes on Linux and Android. Signed-off-by: Wang,Fei --- common/compositor/va/varenderer.cpp | 96 +++++++++++++++++++++++++++++++++++++ common/compositor/va/varenderer.h | 21 +++++++- 2 files changed, 116 insertions(+), 1 deletion(-) diff --git a/common/compositor/va/varenderer.cpp b/common/compositor/va/varenderer.cpp index 27e8ccb..663e118 100644 --- a/common/compositor/va/varenderer.cpp +++ b/common/compositor/va/varenderer.cpp @@ -199,6 +199,59 @@ bool VARenderer::Init(int gpu_fd) { return ret == VA_STATUS_SUCCESS ? true : false; } +bool VARenderer::QueryVAProcFilterCaps(VAContextID context, + VAProcFilterType type, void* caps, + uint32_t* num) { + VAStatus ret = + vaQueryVideoProcFilterCaps(va_display_, context, type, caps, num); + if (ret != VA_STATUS_SUCCESS) + ETRACE("Query Filter Caps failed\n"); + return ret == VA_STATUS_SUCCESS ? true : false; +} + +bool VARenderer::MapVAProcFilterColorModetoHwc(HWCColorControl& vppmode, + VAProcColorBalanceType vamode) { + switch (vamode) { + case VAProcColorBalanceHue: + vppmode = HWCColorControl::kColorHue; + break; + case VAProcColorBalanceSaturation: + vppmode = HWCColorControl::kColorSaturation; + break; + case VAProcColorBalanceBrightness: + vppmode = HWCColorControl::kColorBrightness; + break; + case VAProcColorBalanceContrast: + vppmode = HWCColorControl::kColorContrast; + break; + default: + return false; + } + return true; +} + +bool VARenderer::SetVAProcFilterColorDefaultValue( + VAProcFilterCapColorBalance* caps) { + HWCColorControl mode; + for (int i = 0; i < VAProcColorBalanceCount; i++) { + if (MapVAProcFilterColorModetoHwc(mode, caps[i].type)) { + caps_[mode].caps = caps[i]; + caps_[mode].value = caps[i].range.default_value; + } + } + return true; +} + +bool VARenderer::SetVAProcFilterColorValue(HWCColorControl mode, float value) { + if (value > caps_[mode].caps.range.max_value || + value < caps_[mode].caps.range.min_value) { + ETRACE("VAlue Filter value out of range\n"); + return false; + } + caps_[mode].value = value; + return true; +} + bool VARenderer::Draw(const MediaState& state, NativeSurface* surface) { VASurfaceAttribExternalBuffers external_in; memset(&external_in, 0, sizeof(external_in)); @@ -294,6 +347,49 @@ bool VARenderer::Draw(const MediaState& state, NativeSurface* surface) { param.filters = nullptr; param.filter_flags = VA_FRAME_PICTURE; + VAProcFilterCapColorBalance vacaps[VAProcColorBalanceCount]; + uint32_t vacaps_num = VAProcColorBalanceCount; + + if (caps_.empty()) { + if (!QueryVAProcFilterCaps(va_context, VAProcFilterColorBalance, vacaps, + &vacaps_num)) { + return false; + } else { + SetVAProcFilterColorDefaultValue(&vacaps[0]); + } + } + + for (HWCColorMap::const_iterator itr = state.colors_.begin(); + itr != state.colors_.end(); itr++) { + SetVAProcFilterColorValue(itr->first, itr->second); + } + + std::vector cb_elements(VAProcColorBalanceCount, + va_display_); + std::vector filters; + VAProcFilterParameterBufferColorBalance cbparam; + cbparam.type = VAProcFilterColorBalance; + cbparam.attrib = VAProcColorBalanceNone; + + for (ColorBalanceCapMapItr itr = caps_.begin(); itr != caps_.end(); itr++) { + if (fabs(itr->second.value - itr->second.caps.range.default_value) >= + itr->second.caps.range.step) { + cbparam.value = itr->second.value; + cbparam.attrib = itr->second.caps.type; + if (!cb_elements[static_cast(itr->first)].CreateBuffer( + va_context, VAProcFilterParameterBufferType, + sizeof(VAProcFilterParameterBufferColorBalance), 1, &cbparam)) { + return false; + } + filters.push_back(cb_elements[static_cast(itr->first)].buffer()); + } + } + + if (filters.size()) { + param.filters = &filters[0]; + param.num_filters = static_cast(filters.size()); + } + ScopedVABufferID pipeline_buffer(va_display_); if (!pipeline_buffer.CreateBuffer( va_context, VAProcPipelineParameterBufferType, diff --git a/common/compositor/va/varenderer.h b/common/compositor/va/varenderer.h index e17fae5..9c74e2a 100644 --- a/common/compositor/va/varenderer.h +++ b/common/compositor/va/varenderer.h @@ -17,13 +17,25 @@ #ifndef COMMON_COMPOSITOR_VA_VARENDERER_H_ #define COMMON_COMPOSITOR_VA_VARENDERER_H_ +#include #include "renderer.h" +#include "hwcdefs.h" +#include "va/va.h" +#include "va/va_vpp.h" namespace hwcomposer { struct OverlayLayer; class NativeSurface; +typedef struct _VppColorBalanceCap { + VAProcFilterCapColorBalance caps; + float value; +} VppColorBalanceCap; + +typedef std::map ColorBalanceCapMap; +typedef ColorBalanceCapMap::iterator ColorBalanceCapMapItr; + class VARenderer : public Renderer { public: VARenderer() = default; @@ -37,10 +49,17 @@ class VARenderer : public Renderer { } private: + bool QueryVAProcFilterCaps(VAContextID context, VAProcFilterType type, + void* caps, uint32_t* num); + bool SetVAProcFilterColorValue(HWCColorControl type, float value); + bool SetVAProcFilterColorDefaultValue(VAProcFilterCapColorBalance* caps); int DrmFormatToVAFormat(int format); int DrmFormatToRTFormat(int format); + bool MapVAProcFilterColorModetoHwc(HWCColorControl& vppmode, + VAProcColorBalanceType vamode); - void *va_display_ = nullptr; + void* va_display_ = nullptr; + ColorBalanceCapMap caps_; }; } // namespace hwcomposer -- 2.11.0