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..77a256e1 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; } @@ -79,12 +80,10 @@ bool VaapiPostProcessScaler::getFilters(std::vector& filters) if (m_deinterlace.filter) { 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()); - } + if ((ensureColorBalanceFilter() == YAMI_SUCCESS) && m_colorBalance.filter) { + filters.push_back(m_colorBalance.filter->getID()); } + return !filters.empty(); } @@ -271,29 +270,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 +304,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; - } - } - 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; + m_colorBalance.colorBalance.clear(); + m_colorBalanceChanged = true; 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 @@ -420,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 e9889c20..171d44e7 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,13 @@ class VaapiPostProcessScaler : public VaapiPostProcessBase { YamiStatus setDeinterlaceParam(const VPPDeinterlaceParameters&); YamiStatus createDeinterlaceFilter(const VPPDeinterlaceParameters&); YamiStatus setColorBalanceParam(const VPPColorBalanceParameter&); - YamiStatus createColorBalanceFilters(ColorBalanceParam& clrBalance, const VPPColorBalanceParameter& vppClrBalance); + YamiStatus ensureColorBalanceFilter(); ProcParams m_denoise; ProcParams m_sharpening; DeinterlaceParams m_deinterlace; - ColorBalanceMap m_colorBalance; + ColorBalanceParams m_colorBalance; + bool m_colorBalanceChanged; VppTransform m_transform; /** 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: