/*
* Copyright (C) 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 "VaapiBuffer.h"
#include "VaapiUtils.h"
#include "vaapicontext.h"
#include "vaapidisplay.h"
namespace YamiMediaCodec {
BufObjectPtr VaapiBuffer::create(const ContextPtr& context,
VABufferType type,
uint32_t size,
const void* data,
void** mapped)
{
BufObjectPtr buf;
if (!size || !context || !context->getDisplay()){
ERROR("vaapibuffer: can't create buffer");
return buf;
}
DisplayPtr display = context->getDisplay();
VABufferID id;
VAStatus status = vaCreateBuffer(display->getID(), context->getID(),
type, size, 1, (void*)data, &id);
if (!checkVaapiStatus(status, "vaCreateBuffer"))
return buf;
buf.reset(new VaapiBuffer(display, id, size));
if (mapped) {
*mapped = buf->map();
if (!*mapped)
buf.reset();
}
return buf;
}
void* VaapiBuffer::map()
{
if (!m_data) {
VAStatus status = vaMapBuffer(m_display->getID(), m_id, &m_data);
if (!checkVaapiStatus(status, "vaMapBuffer")) {
m_data = NULL;
}
}
return m_data;
}
void VaapiBuffer::unmap()
{
if (m_data) {
checkVaapiStatus(vaUnmapBuffer(m_display->getID(), m_id), "vaUnmapBuffer");
m_data = NULL;
}
}
uint32_t VaapiBuffer::getSize()
{
return m_size;
}
VABufferID VaapiBuffer::getID()
{
return m_id;
}
VaapiBuffer::VaapiBuffer(const DisplayPtr& display, VABufferID id, uint32_t size)
: m_display(display)
, m_id(id)
, m_data(NULL)
, m_size(size)
{
}
VaapiBuffer::~VaapiBuffer()
{
unmap();
checkVaapiStatus(vaDestroyBuffer(m_display->getID(), m_id), "vaDestroyBuffer");
}
}