Skip to content
This repository has been archived by the owner on Oct 23, 2023. It is now read-only.

Vpp color balance multi-parameter setting #821

Open
wants to merge 3 commits into
base: apache
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions vaapi/VaapiBuffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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()){
Expand All @@ -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));
Expand Down
5 changes: 3 additions & 2 deletions vaapi/VaapiBuffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 <class T>
static BufObjectPtr create(const ContextPtr&,
Expand Down
125 changes: 61 additions & 64 deletions vpp/vaapipostprocess_scaler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand All @@ -79,12 +80,10 @@ bool VaapiPostProcessScaler::getFilters(std::vector<VABufferID>& 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();
}

Expand Down Expand Up @@ -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<VppDeinterlaceMode>& supported = m_deinterlace.supportedModes;
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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;
}
}
16 changes: 8 additions & 8 deletions vpp/vaapipostprocess_scaler.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,15 +49,14 @@ class VaapiPostProcessScaler : public VaapiPostProcessBase {
BufObjectPtr filter; //send to va;
};

struct ColorBalanceParam {
typedef std::map<VppColorBalanceMode, VAProcFilterParameterBufferColorBalance> 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<VppColorBalanceMode, ColorBalanceParam> ColorBalanceMap;
typedef ColorBalanceMap::iterator ColorBalanceMapItr;
uint32_t mapToVARotationState(VppTransform vppTransform);

bool mapToRange(float& value, float min, float max,
Expand All @@ -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;

/**
Expand Down
4 changes: 2 additions & 2 deletions vpp/vaapipostprocess_scaler_unittest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down