// 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 #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; } }