129 lines
4.0 KiB
C
129 lines
4.0 KiB
C
// Copyright (c) 2021 by Rockchip Electronics Co., Ltd. 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.
|
|
|
|
#include <stdbool.h>
|
|
#include "rga_func.h"
|
|
|
|
int RGA_init(rga_context *rga_ctx)
|
|
{
|
|
rga_ctx->rga_handle = dlopen("librga.so", RTLD_LAZY);
|
|
if (!rga_ctx->rga_handle)
|
|
{
|
|
printf("dlopen librga.so failed\n");
|
|
printf("dlopen error: %s\n", dlerror());
|
|
return -1;
|
|
}
|
|
rga_ctx->init_func = (FUNC_RGA_INIT)dlsym(rga_ctx->rga_handle, "c_RkRgaInit");
|
|
rga_ctx->deinit_func = (FUNC_RGA_DEINIT)dlsym(rga_ctx->rga_handle, "c_RkRgaDeInit");
|
|
rga_ctx->blit_func = (FUNC_RGA_BLIT)dlsym(rga_ctx->rga_handle, "c_RkRgaBlit");
|
|
rga_ctx->init_func();
|
|
return 0;
|
|
}
|
|
|
|
void img_resize_fast(rga_context *rga_ctx, int src_fd, int src_w, int src_h, uint64_t dst_phys, int dst_w, int dst_h)
|
|
{
|
|
// printf("rga use fd, src(%dx%d) -> dst(%dx%d)\n", src_w, src_h, dst_w, dst_h);
|
|
|
|
if (rga_ctx->rga_handle)
|
|
{
|
|
int ret = 0;
|
|
rga_info_t src, dst;
|
|
|
|
memset(&src, 0, sizeof(rga_info_t));
|
|
src.fd = src_fd;
|
|
src.mmuFlag = 1;
|
|
// src.virAddr = (void *)psrc;
|
|
|
|
memset(&dst, 0, sizeof(rga_info_t));
|
|
dst.fd = -1;
|
|
dst.mmuFlag = 0;
|
|
|
|
#if defined(__arm__)
|
|
dst.phyAddr = (void *)((uint32_t)dst_phys);
|
|
#else
|
|
dst.phyAddr = (void *)dst_phys;
|
|
#endif
|
|
|
|
dst.nn.nn_flag = 0;
|
|
|
|
rga_set_rect(&src.rect, 0, 0, src_w, src_h, src_w, src_h, RK_FORMAT_RGB_888);
|
|
rga_set_rect(&dst.rect, 0, 0, dst_w, dst_h, dst_w, dst_h, RK_FORMAT_RGB_888);
|
|
|
|
ret = rga_ctx->blit_func(&src, &dst, NULL);
|
|
if (ret)
|
|
{
|
|
printf("c_RkRgaBlit error : %s\n", strerror(errno));
|
|
}
|
|
|
|
return;
|
|
}
|
|
return;
|
|
}
|
|
|
|
void img_resize_slow(rga_context *rga_ctx, void *src_virt, int src_w, int src_h, void *dst_virt, int dst_w, int dst_h,
|
|
int w_offset, int h_offset, RgaSURF_FORMAT color, bool add_extra_sz_w, bool add_extra_sz_h)
|
|
{
|
|
// printf("rga use virtual, src(%dx%d) -> dst(%dx%d)\n", src_w, src_h, dst_w, dst_h);
|
|
if (rga_ctx->rga_handle)
|
|
{
|
|
int ret = 0;
|
|
rga_info_t src, dst;
|
|
|
|
memset(&src, 0, sizeof(rga_info_t));
|
|
src.fd = -1;
|
|
src.mmuFlag = 1;
|
|
src.virAddr = (void *)src_virt;
|
|
|
|
memset(&dst, 0, sizeof(rga_info_t));
|
|
dst.fd = -1;
|
|
dst.mmuFlag = 1;
|
|
dst.virAddr = dst_virt;
|
|
|
|
dst.nn.nn_flag = 0;
|
|
// printf("input to rga para, w_offset: %d, h_offset: %d, dst_w: %d, dst_h: %d\n",
|
|
// w_offset, h_offset, dst_w, dst_h);
|
|
|
|
rga_set_rect(&src.rect, 0, 0, src_w, src_h, src_w, src_h, RK_FORMAT_RGB_888);
|
|
int src_w = dst_w + 2*w_offset;
|
|
int src_h = dst_h + 2*h_offset;
|
|
if (add_extra_sz_w){
|
|
src_w += 1;
|
|
// printf("Adding extra sz w: %d\n", src_w);
|
|
}
|
|
else if (add_extra_sz_h){
|
|
src_h += 1;
|
|
// printf("Adding extra sz h: %d\n", src_h);
|
|
}
|
|
|
|
//rga_set_rect(&dst.rect, w_offset, h_offset, dst_w, dst_h, src_w, dst_h + 2*h_offset, color);
|
|
rga_set_rect(&dst.rect, w_offset, h_offset, dst_w, dst_h, src_w, src_h, color);
|
|
|
|
ret = rga_ctx->blit_func(&src, &dst, NULL);
|
|
if (ret){
|
|
printf("c_RkRgaBlit error : %s\n", strerror(errno));
|
|
}
|
|
|
|
return;
|
|
}
|
|
return;
|
|
}
|
|
|
|
int RGA_deinit(rga_context *rga_ctx)
|
|
{
|
|
if(rga_ctx->rga_handle)
|
|
{
|
|
dlclose(rga_ctx->rga_handle);
|
|
rga_ctx->rga_handle = NULL;
|
|
}
|
|
} |