|
Packit |
1244b8 |
/*
|
|
Packit |
1244b8 |
* Copyright (C) 2015 Intel Corporation. All rights reserved.
|
|
Packit |
1244b8 |
*
|
|
Packit |
1244b8 |
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
Packit |
1244b8 |
* you may not use this file except in compliance with the License.
|
|
Packit |
1244b8 |
* You may obtain a copy of the License at
|
|
Packit |
1244b8 |
*
|
|
Packit |
1244b8 |
* http://www.apache.org/licenses/LICENSE-2.0
|
|
Packit |
1244b8 |
*
|
|
Packit |
1244b8 |
* Unless required by applicable law or agreed to in writing, software
|
|
Packit |
1244b8 |
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
Packit |
1244b8 |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
Packit |
1244b8 |
* See the License for the specific language governing permissions and
|
|
Packit |
1244b8 |
* limitations under the License.
|
|
Packit |
1244b8 |
*/
|
|
Packit |
1244b8 |
|
|
Packit |
1244b8 |
#ifdef HAVE_CONFIG_H
|
|
Packit |
1244b8 |
#include "config.h"
|
|
Packit |
1244b8 |
#endif
|
|
Packit |
1244b8 |
|
|
Packit |
1244b8 |
#include "common/log.h"
|
|
Packit |
1244b8 |
#include "vaapi/vaapisurfaceallocator.h"
|
|
Packit |
1244b8 |
#include "vaapi/VaapiUtils.h"
|
|
Packit |
1244b8 |
#include <vector>
|
|
Packit |
1244b8 |
|
|
Packit |
1244b8 |
namespace YamiMediaCodec{
|
|
Packit |
1244b8 |
|
|
Packit |
1244b8 |
VaapiSurfaceAllocator::VaapiSurfaceAllocator(VADisplay display, uint32_t extraSize)
|
|
Packit |
1244b8 |
:m_display(display),
|
|
Packit |
1244b8 |
m_extraSize(extraSize)
|
|
Packit |
1244b8 |
{
|
|
Packit |
1244b8 |
}
|
|
Packit |
1244b8 |
|
|
Packit |
1244b8 |
YamiStatus VaapiSurfaceAllocator::doAlloc(SurfaceAllocParams* params)
|
|
Packit |
1244b8 |
{
|
|
Packit |
1244b8 |
if (!params)
|
|
Packit |
1244b8 |
return YAMI_INVALID_PARAM;
|
|
Packit |
1244b8 |
uint32_t size = params->size;
|
|
Packit |
1244b8 |
uint32_t width = params->width;
|
|
Packit |
1244b8 |
uint32_t height = params->height;
|
|
Packit |
1244b8 |
if (!width || !height || !size)
|
|
Packit |
1244b8 |
return YAMI_INVALID_PARAM;
|
|
Packit |
1244b8 |
uint32_t rtFormat = getRtFormat(params->fourcc);
|
|
Packit |
1244b8 |
if (!rtFormat) {
|
|
Packit |
1244b8 |
ERROR("unsupported format %x", params->fourcc);
|
|
Packit |
1244b8 |
return YAMI_UNSUPPORTED;
|
|
Packit |
1244b8 |
}
|
|
Packit |
1244b8 |
|
|
Packit |
1244b8 |
size += m_extraSize;
|
|
Packit |
1244b8 |
|
|
Packit |
1244b8 |
std::vector<VASurfaceID> v(size);
|
|
Packit |
1244b8 |
VASurfaceAttrib attrib;
|
|
Packit |
1244b8 |
attrib.flags = VA_SURFACE_ATTRIB_SETTABLE;
|
|
Packit |
1244b8 |
attrib.type = VASurfaceAttribPixelFormat;
|
|
Packit |
1244b8 |
attrib.value.type = VAGenericValueTypeInteger;
|
|
Packit |
1244b8 |
attrib.value.value.i = params->fourcc;
|
|
Packit |
1244b8 |
VAStatus status = vaCreateSurfaces(m_display,
|
|
Packit |
1244b8 |
rtFormat, width, height,
|
|
Packit |
1244b8 |
&v[0], size, &attrib, 1);
|
|
Packit |
1244b8 |
if (!checkVaapiStatus(status, "vaCreateSurfaces"))
|
|
Packit |
1244b8 |
return YAMI_OUT_MEMORY;
|
|
Packit |
1244b8 |
params->surfaces = new intptr_t[size];
|
|
Packit |
1244b8 |
for (uint32_t i = 0; i < size; i++) {
|
|
Packit |
1244b8 |
params->surfaces[i] = (intptr_t)v[i];
|
|
Packit |
1244b8 |
}
|
|
Packit |
1244b8 |
params->size = size;
|
|
Packit |
1244b8 |
return YAMI_SUCCESS;
|
|
Packit |
1244b8 |
}
|
|
Packit |
1244b8 |
|
|
Packit |
1244b8 |
YamiStatus VaapiSurfaceAllocator::doFree(SurfaceAllocParams* params)
|
|
Packit |
1244b8 |
{
|
|
Packit |
1244b8 |
if (!params || !params->size || !params->surfaces)
|
|
Packit |
1244b8 |
return YAMI_INVALID_PARAM;
|
|
Packit |
1244b8 |
uint32_t size = params->size;
|
|
Packit |
1244b8 |
std::vector<VASurfaceID> v(size);
|
|
Packit |
1244b8 |
for (uint32_t i = 0; i < size; i++) {
|
|
Packit |
1244b8 |
v[i] = (VASurfaceID)params->surfaces[i];
|
|
Packit |
1244b8 |
}
|
|
Packit |
1244b8 |
checkVaapiStatus(vaDestroySurfaces(m_display, &v[0], size), "vaDestroySurfaces");
|
|
Packit |
1244b8 |
delete[] params->surfaces;
|
|
Packit |
1244b8 |
return YAMI_SUCCESS;
|
|
Packit |
1244b8 |
}
|
|
Packit |
1244b8 |
|
|
Packit |
1244b8 |
void VaapiSurfaceAllocator::doUnref()
|
|
Packit |
1244b8 |
{
|
|
Packit |
1244b8 |
delete this;
|
|
Packit |
1244b8 |
}
|
|
Packit |
1244b8 |
|
|
Packit |
1244b8 |
} //YamiMediaCodec
|