From a05b3cd10c8381c48bbd3429ad6fbbe8e385b2a6 Mon Sep 17 00:00:00 2001 From: dongping wu Date: Thu, 28 Dec 2017 10:58:05 +0800 Subject: [PATCH 1/3] vpp: set color-balance attributes To support many color-balance parameters setting at the same time. color-balance parameters: HUE, SATURATION, BRIGHTNESS, CONTRAST. Signed-off-by: dongping wu --- vaapi/VaapiBuffer.cpp | 5 +- vaapi/VaapiBuffer.h | 5 +- vpp/vaapipostprocess_scaler.cpp | 92 ++++++++++----------------------- vpp/vaapipostprocess_scaler.h | 15 +++--- 4 files changed, 41 insertions(+), 76 deletions(-) diff --git a/vaapi/VaapiBuffer.cpp b/vaapi/VaapiBuffer.cpp index 9246ccea..6924d106 100644 --- a/vaapi/VaapiBuffer.cpp +++ b/vaapi/VaapiBuffer.cpp @@ -30,7 +30,8 @@ BufObjectPtr VaapiBuffer::create(const ContextPtr& context, VABufferType type, uint32_t size, const void* data, - void** mapped) + void** mapped, + uint32_t num) { BufObjectPtr buf; if (!size || !context || !context->getDisplay()){ @@ -40,7 +41,7 @@ BufObjectPtr VaapiBuffer::create(const ContextPtr& context, DisplayPtr display = context->getDisplay(); VABufferID id; VAStatus status = vaCreateBuffer(display->getID(), context->getID(), - type, size, 1, (void*)data, &id); + type, size, num, (void*)data, &id); if (!checkVaapiStatus(status, "vaCreateBuffer")) return buf; buf.reset(new VaapiBuffer(display, id, size)); diff --git a/vaapi/VaapiBuffer.h b/vaapi/VaapiBuffer.h index 326f6660..930165ae 100644 --- a/vaapi/VaapiBuffer.h +++ b/vaapi/VaapiBuffer.h @@ -28,10 +28,11 @@ namespace YamiMediaCodec { class VaapiBuffer { public: static BufObjectPtr create(const ContextPtr&, - VABufferType, + VABufferType type, uint32_t size, const void* data = 0, - void** mapped = 0); + void** mapped = 0, + uint32_t num = 1); template static BufObjectPtr create(const ContextPtr&, diff --git a/vpp/vaapipostprocess_scaler.cpp b/vpp/vaapipostprocess_scaler.cpp index 15952489..3765f962 100644 --- a/vpp/vaapipostprocess_scaler.cpp +++ b/vpp/vaapipostprocess_scaler.cpp @@ -65,6 +65,7 @@ VaapiPostProcessScaler::VaapiPostProcessScaler() { m_denoise.level = DENOISE_LEVEL_NONE; m_sharpening.level = SHARPENING_LEVEL_NONE; + m_colorBalanceChanged = false; m_transform = VPP_TRANSFORM_NONE; } @@ -80,11 +81,6 @@ bool VaapiPostProcessScaler::getFilters(std::vector& filters) filters.push_back(m_deinterlace.filter->getID()); } - for (ColorBalanceMapItr itr = m_colorBalance.begin(); itr != m_colorBalance.end(); itr++) { - if (itr->second.filter) { - filters.push_back(itr->second.filter->getID()); - } - } return !filters.empty(); } @@ -271,29 +267,6 @@ static bool mapToVppColorBalanceMode(VppColorBalanceMode& vppMode, VAProcColorBa return true; } -YamiStatus -VaapiPostProcessScaler::createColorBalanceFilters(ColorBalanceParam& clrBalance, const VPPColorBalanceParameter& vppClrBalance) -{ - float value; - - if (!mapToRange(value, clrBalance.range.min_value, clrBalance.range.max_value, vppClrBalance.level, COLORBALANCE_LEVEL_MIN, COLORBALANCE_LEVEL_MAX)) { - return YAMI_DRIVER_FAIL; - } - - VAProcFilterParameterBufferColorBalance* d; - clrBalance.filter = VaapiBuffer::create(m_context, VAProcFilterParameterBufferType, d); - if (!clrBalance.filter) - return YAMI_DRIVER_FAIL; - d->type = VAProcFilterColorBalance; - d->attrib = clrBalance.type; - d->value = value; - - //unmap for va usage - clrBalance.filter->unmap(); - clrBalance.level = vppClrBalance.level; - return YAMI_SUCCESS; -} - YamiStatus VaapiPostProcessScaler::setDeinterlaceParam(const VPPDeinterlaceParameters& deinterlace) { std::set& supported = m_deinterlace.supportedModes; @@ -328,49 +301,40 @@ YamiStatus VaapiPostProcessScaler::setColorBalanceParam(const VPPColorBalancePar { VAProcFilterCapColorBalance caps[VAProcColorBalanceCount]; VppColorBalanceMode vppClrBalanceMode; - if (m_colorBalance.empty()) { - uint32_t num = VAProcColorBalanceCount; - //query from libva. - YamiStatus status = queryVideoProcFilterCaps(VAProcFilterColorBalance, caps, &num); - if (status != YAMI_SUCCESS) - return status; - for (uint32_t i = 0; i < num; i++) { - if (mapToVppColorBalanceMode(vppClrBalanceMode, caps[i].type)) { - m_colorBalance[vppClrBalanceMode].range = caps[i].range; - m_colorBalance[vppClrBalanceMode].type = caps[i].type; - m_colorBalance[vppClrBalanceMode].level = COLORBALANCE_LEVEL_NONE; - } - } - } + bool supported = false; + //clear all colorbalance parameters if(COLORBALANCE_NONE == colorbalance.mode){ - for (ColorBalanceMapItr itr = m_colorBalance.begin(); itr != m_colorBalance.end(); itr++) { - if (itr->second.filter) { - itr->second.filter.reset(); - itr->second.level = COLORBALANCE_LEVEL_NONE; - } - } + m_colorBalance.colorBalance.clear(); + m_colorBalanceChanged = true; return YAMI_SUCCESS; } - ColorBalanceMapItr iteratorClrBalance = m_colorBalance.find(colorbalance.mode); - if (iteratorClrBalance == m_colorBalance.end()) { - ERROR("unsupported VppColorBalanceMode: %d", colorbalance.mode); - return YAMI_UNSUPPORTED; - } - - if (colorbalance.level == COLORBALANCE_LEVEL_NONE) { - if (iteratorClrBalance->second.filter) - iteratorClrBalance->second.filter.reset(); - iteratorClrBalance->second.level = colorbalance.level; - return YAMI_SUCCESS; - } - - if (colorbalance.level == iteratorClrBalance->second.level) { - return YAMI_SUCCESS; + uint32_t num = VAProcColorBalanceCount; + //query from libva. + YamiStatus status = queryVideoProcFilterCaps(VAProcFilterColorBalance, caps, &num); + if (status != YAMI_SUCCESS) + return status; + supported = false; + for (uint32_t i = 0; i < num; i++) { + if (mapToVppColorBalanceMode(vppClrBalanceMode, caps[i].type) && (vppClrBalanceMode == colorbalance.mode)) { + if (colorbalance.level != COLORBALANCE_LEVEL_NONE) { + if (!mapToRange(m_colorBalance.colorBalance[vppClrBalanceMode].value, caps[i].range.min_value, caps[i].range.max_value, colorbalance.level, COLORBALANCE_LEVEL_MIN, COLORBALANCE_LEVEL_MAX)) + return YAMI_DRIVER_FAIL; + m_colorBalance.colorBalance[vppClrBalanceMode].attrib = caps[i].type; + m_colorBalance.colorBalance[vppClrBalanceMode].type = VAProcFilterColorBalance; + } + else + m_colorBalance.colorBalance.erase(colorbalance.mode); + supported = true; + break; + } } + if (!supported) + return YAMI_UNSUPPORTED; - return createColorBalanceFilters(iteratorClrBalance->second, colorbalance); + m_colorBalanceChanged = true; + return YAMI_SUCCESS; } YamiStatus diff --git a/vpp/vaapipostprocess_scaler.h b/vpp/vaapipostprocess_scaler.h index e9889c20..ffdd6d16 100644 --- a/vpp/vaapipostprocess_scaler.h +++ b/vpp/vaapipostprocess_scaler.h @@ -49,15 +49,14 @@ class VaapiPostProcessScaler : public VaapiPostProcessBase { BufObjectPtr filter; //send to va; }; - struct ColorBalanceParam { + typedef std::map ColorBalanceMap; + typedef ColorBalanceMap::iterator ColorBalanceMapItr; + + struct ColorBalanceParams { BufObjectPtr filter; //send to va; - int32_t level; //send to va - VAProcColorBalanceType type; //query from va - VAProcFilterValueRange range; //query from va + ColorBalanceMap colorBalance; }; - typedef std::map ColorBalanceMap; - typedef ColorBalanceMap::iterator ColorBalanceMapItr; uint32_t mapToVARotationState(VppTransform vppTransform); bool mapToRange(float& value, float min, float max, @@ -78,12 +77,12 @@ class VaapiPostProcessScaler : public VaapiPostProcessBase { YamiStatus setDeinterlaceParam(const VPPDeinterlaceParameters&); YamiStatus createDeinterlaceFilter(const VPPDeinterlaceParameters&); YamiStatus setColorBalanceParam(const VPPColorBalanceParameter&); - YamiStatus createColorBalanceFilters(ColorBalanceParam& clrBalance, const VPPColorBalanceParameter& vppClrBalance); ProcParams m_denoise; ProcParams m_sharpening; DeinterlaceParams m_deinterlace; - ColorBalanceMap m_colorBalance; + ColorBalanceParams m_colorBalance; + bool m_colorBalanceChanged; VppTransform m_transform; /** From 4335e2d3efd05eb0cdd696ae1c7853251c58eec6 Mon Sep 17 00:00:00 2001 From: dongping wu Date: Thu, 28 Dec 2017 11:00:01 +0800 Subject: [PATCH 2/3] vpp: create filter for color-balance create the color-balance filter, to implement the color-balance setting. Signed-off-by: dongping wu --- vpp/vaapipostprocess_scaler.cpp | 33 +++++++++++++++++++++++++++++++++ vpp/vaapipostprocess_scaler.h | 1 + 2 files changed, 34 insertions(+) diff --git a/vpp/vaapipostprocess_scaler.cpp b/vpp/vaapipostprocess_scaler.cpp index 3765f962..77a256e1 100644 --- a/vpp/vaapipostprocess_scaler.cpp +++ b/vpp/vaapipostprocess_scaler.cpp @@ -80,6 +80,9 @@ bool VaapiPostProcessScaler::getFilters(std::vector& filters) if (m_deinterlace.filter) { filters.push_back(m_deinterlace.filter->getID()); } + if ((ensureColorBalanceFilter() == YAMI_SUCCESS) && m_colorBalance.filter) { + filters.push_back(m_colorBalance.filter->getID()); + } return !filters.empty(); } @@ -384,4 +387,34 @@ VaapiPostProcessScaler::setParameters(VppParamType type, void* vppParam) } return VaapiPostProcessBase::setParameters(type, vppParam); } + +YamiStatus VaapiPostProcessScaler::ensureColorBalanceFilter() +{ + if (m_colorBalanceChanged) { + if (!m_colorBalance.colorBalance.size()) { + if (m_colorBalance.filter) + m_colorBalance.filter.reset(); + m_colorBalanceChanged = false; + return YAMI_SUCCESS; + } + + VAProcFilterParameterBufferColorBalance colorBalanceVAParam[VAProcColorBalanceCount + 1]; + uint32_t i = 0; + for (ColorBalanceMapItr itr = m_colorBalance.colorBalance.begin(); itr != m_colorBalance.colorBalance.end(); itr++, i++) + colorBalanceVAParam[i] = itr->second; + + m_colorBalance.filter = VaapiBuffer::create(m_context, + VAProcFilterParameterBufferType, + sizeof(VAProcFilterParameterBufferColorBalance), + (void*)colorBalanceVAParam, + NULL, + m_colorBalance.colorBalance.size()); + + if (!m_colorBalance.filter) + return YAMI_DRIVER_FAIL; + m_colorBalanceChanged = false; + } + + return YAMI_SUCCESS; +} } diff --git a/vpp/vaapipostprocess_scaler.h b/vpp/vaapipostprocess_scaler.h index ffdd6d16..171d44e7 100644 --- a/vpp/vaapipostprocess_scaler.h +++ b/vpp/vaapipostprocess_scaler.h @@ -77,6 +77,7 @@ class VaapiPostProcessScaler : public VaapiPostProcessBase { YamiStatus setDeinterlaceParam(const VPPDeinterlaceParameters&); YamiStatus createDeinterlaceFilter(const VPPDeinterlaceParameters&); YamiStatus setColorBalanceParam(const VPPColorBalanceParameter&); + YamiStatus ensureColorBalanceFilter(); ProcParams m_denoise; ProcParams m_sharpening; From afe49c522be5ae9db4efe5088f54250c8f3ae6ba Mon Sep 17 00:00:00 2001 From: dongping wu Date: Fri, 29 Dec 2017 02:52:57 +0800 Subject: [PATCH 3/3] vpp-unittest: modify the colorbalance unittest Because some structures of color-balance are changed, here modify the unittest code to pass the unittest. Signed-off-by: dongping wu --- vpp/vaapipostprocess_scaler_unittest.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vpp/vaapipostprocess_scaler_unittest.cpp b/vpp/vaapipostprocess_scaler_unittest.cpp index e8414243..11c9a4f0 100644 --- a/vpp/vaapipostprocess_scaler_unittest.cpp +++ b/vpp/vaapipostprocess_scaler_unittest.cpp @@ -108,8 +108,8 @@ class VaapiPostProcessScalerTest static void checkColorBalanceFilter(VaapiPostProcessScaler& scaler, VppColorBalanceMode mode) { if (COLORBALANCE_NONE != mode) { - EXPECT_TRUE(bool(scaler.m_colorBalance[mode].filter)); - } + EXPECT_TRUE(bool(scaler.m_colorBalance.filter)); + } } protected: