2025-05-10 21:58:58 +08:00

202 lines
5.8 KiB
C++

/*
* Copyright (C) 2022 Rockchip Electronics Co., Ltd.
* Authors:
* YuQiaowei <cerf.yu@rock-chips.com>
*
* 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 <iostream>
#include <fstream>
#include <sstream>
#include <cstddef>
#include <cmath>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <unistd.h>
#include "RgaUtils.h"
int64_t get_cur_us() {
struct timeval tv;
gettimeofday(&tv,NULL);
return tv.tv_sec * 1000000 + tv.tv_usec;
}
int64_t get_cur_ms() {
struct timeval tv;
gettimeofday(&tv,NULL);
return tv.tv_sec * 1000 + tv.tv_usec / 1000;
}
void draw_rgba(char *buffer, int width, int height) {
for (int i = 0; i < height; i++) {
for (int j = 0; j < width/4; j++) {
buffer[(i*width*4) + j*4 + 0] = 0xff; //R
buffer[(i*width*4) + j*4 + 1] = 0x00; //G
buffer[(i*width*4) + j*4 + 2] = 0x00; //B
buffer[(i*width*4) + j*4 + 3] = 0xff; //A
}
for (int j = width/4; j < width/4*2; j++) {
buffer[(i*width*4) + j*4 + 0] = 0x00;
buffer[(i*width*4) + j*4 + 1] = 0xff;
buffer[(i*width*4) + j*4 + 2] = 0x00;
buffer[(i*width*4) + j*4 + 3] = 0xff;
}
for (int j = width/4*2; j < width/4*3; j++) {
buffer[(i*width*4) + j*4 + 0] = 0x00;
buffer[(i*width*4) + j*4 + 1] = 0x00;
buffer[(i*width*4) + j*4 + 2] = 0xff;
buffer[(i*width*4) + j*4 + 3] = 0xff;
}
for (int j = width/4*3; j < width; j++) {
buffer[(i*width*4) + j*4 + 0] = 0xff;
buffer[(i*width*4) + j*4 + 1] = 0xff;
buffer[(i*width*4) + j*4 + 2] = 0xff;
buffer[(i*width*4) + j*4 + 3] = 0xff;
}
}
}
void draw_YUV420(char *buffer, int width, int height) {
/* Y channel */
memset(buffer, 0xa8, width * height / 2);
memset(buffer + width * height / 2, 0x54, width * height / 2);
/* UV channel */
memset(buffer + width * height, 0x80, width * height / 4);
memset(buffer + (int)(width * height * 1.25), 0x30, width * height / 4);
}
void draw_YUV422(char *buffer, int width, int height) {
/* Y channel */
memset(buffer, 0xa8, width * height / 2);
memset(buffer + width * height / 2, 0x54, width * height / 2);
/* UV channel */
memset(buffer + width * height, 0x80, width * height / 2);
memset(buffer + (int)(width * height * 1.5), 0x30, width * height / 2);
}
void draw_gray256(char *buffer, int width, int height) {
for (int i = 0; i < height; i++) {
for (int j = 0; j < width/4; j++) {
buffer[(i*width*4) + j*4] = 0xa8;
}
for (int j = width/4; j < width/4*2; j++) {
buffer[(i*width*4) + j*4] = 0x80;
}
for (int j = width/4*2; j < width/4*3; j++) {
buffer[(i*width*4) + j*4] = 0x54;
}
for (int j = width/4*3; j < width; j++) {
buffer[(i*width*4) + j*4] = 0x30;
}
}
}
int read_image_from_fbc_file(void *buf, const char *path, int sw, int sh, int fmt, int index) {
int size;
char filePath[100];
const char *inputFbcFilePath = "%s/in%dw%d-h%d-%s-fbc.bin";
snprintf(filePath, 100, inputFbcFilePath,
path, index, sw, sh, translate_format_str(fmt));
FILE *file = fopen(filePath, "rb");
if (!file) {
fprintf(stderr, "Could not open %s\n", filePath);
return -EINVAL;
}
size = sw * sh * get_bpp_from_format(fmt) * 1.5;
fread(buf, size, 1, file);
fclose(file);
return 0;
}
int read_image_from_file(void *buf, const char *path, int sw, int sh, int fmt, int index) {
int size;
char filePath[100];
const char *inputFilePath = "%s/in%dw%d-h%d-%s.bin";
snprintf(filePath, 100, inputFilePath,
path, index, sw, sh, translate_format_str(fmt));
FILE *file = fopen(filePath, "rb");
if (!file) {
fprintf(stderr, "Could not open %s\n", filePath);
return -EINVAL;
}
size = sw * sh * get_bpp_from_format(fmt);
fread(buf, size, 1, file);
fclose(file);
return 0;
}
int write_image_to_fbc_file(void *buf, const char *path, int sw, int sh, int fmt, int index) {
int size;
char filePath[100];
const char *outputFbcFilePath = "%s/out%dw%d-h%d-%s-fbc.bin";
snprintf(filePath, 100, outputFbcFilePath,
path, index, sw, sh, translate_format_str(fmt));
FILE *file = fopen(filePath, "wb+");
if (!file) {
fprintf(stderr, "Could not open %s\n", filePath);
return false;
} else {
fprintf(stderr, "open %s and write ok\n", filePath);
}
size = sw * sh * get_bpp_from_format(fmt) * 1.5;
fwrite(buf, size, 1, file);
fclose(file);
return 0;
}
int write_image_to_file(void *buf, const char *path, int sw, int sh, int fmt, int index) {
int size;
char filePath[100];
const char *outputFilePath = "%s/out%dw%d-h%d-%s.bin";
snprintf(filePath, 100, outputFilePath,
path, index, sw, sh, translate_format_str(fmt));
FILE *file = fopen(filePath, "wb+");
if (!file) {
fprintf(stderr, "Could not open %s\n", filePath);
return false;
} else {
fprintf(stderr, "open %s and write ok\n", filePath);
}
size = sw * sh * get_bpp_from_format(fmt);
fwrite(buf, size, 1, file);
fclose(file);
return 0;
}