/*
* Copyright (C) 2013-2014 Intel Corporation. All rights reserved.
*
* 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.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "vaapipostprocess_base.h"
#include "common/log.h"
#include "vaapi/vaapidisplay.h"
#include "vaapi/vaapicontext.h"
#include "vaapi/VaapiUtils.h"
namespace YamiMediaCodec{
YamiStatus VaapiPostProcessBase::setNativeDisplay(const NativeDisplay& display)
{
return initVA(display);
}
YamiStatus VaapiPostProcessBase::initVA(const NativeDisplay& display)
{
if (m_context) {
ERROR("do not init va more than one time");
return YAMI_FAIL;
}
m_display = VaapiDisplay::create(display);
if (!m_display) {
ERROR("failed to create display");
return YAMI_DRIVER_FAIL;
}
ConfigPtr config;
YamiStatus status = VaapiConfig::create(m_display, VAProfileNone, VAEntrypointVideoProc, NULL, 0, config);
if (YAMI_SUCCESS != status) {
ERROR("failed to create config");
return YAMI_NO_CONFIG;
}
//register WxH as 1x1 to make configure creation not fail.
m_context = VaapiContext::create(config,1, 1,
0, NULL, 0);
if (!m_context) {
ERROR("failed to create context");
return YAMI_FAIL;
}
return YAMI_SUCCESS;
}
void VaapiPostProcessBase::cleanupVA()
{
m_context.reset();
m_display.reset();
}
YamiStatus VaapiPostProcessBase::queryVideoProcFilterCaps(
VAProcFilterType filterType, void* filterCaps, uint32_t* numFilterCaps)
{
if (!filterCaps)
return YAMI_INVALID_PARAM;
if (!m_context) {
ERROR("no va context");
return YAMI_FAIL;
}
uint32_t tmp = 1;
if (!numFilterCaps)
numFilterCaps = &tmp;
VAStatus status = vaQueryVideoProcFilterCaps(m_display->getID(), m_context->getID(),
filterType, filterCaps, numFilterCaps);
if (!checkVaapiStatus(status, "vaQueryVideoProcFilterCaps") || !*numFilterCaps) {
return YAMI_UNSUPPORTED;
}
return YAMI_SUCCESS;
}
VaapiPostProcessBase::~VaapiPostProcessBase()
{
cleanupVA();
}
}