libge2d: add the 1555/4444/CLUT8 format support [1/1]
PD#SWPL-68696
Problem:
1555/4444/CLUT8 format validation
Solution:
add this support
Verify:
t7
Signed-off-by: yuhua.lin <yuhua.lin@amlogic.com>
Change-Id: Id234d530cab5a260802ec6444a1801e67a8bdf38
diff --git a/ge2d_feature_test.c b/ge2d_feature_test.c
index 96eb5d9..c2004ed 100644
--- a/ge2d_feature_test.c
+++ b/ge2d_feature_test.c
@@ -67,6 +67,12 @@
static int rotation_option = 0;
static int dst_rpt_times = 0;
static int dst_signed_mode = 0;
+static int src1_endian = PIXEL_FORMAT_LITTLE_ENDIAN;
+static int src2_endian = PIXEL_FORMAT_LITTLE_ENDIAN;
+static int dst_endian = PIXEL_FORMAT_LITTLE_ENDIAN;
+static int clut8_count = 0;
+static int clut8_data[256] = {0};
+static char clut8_table_file[64] = "";
#define THREADS_MAX_NUM (64)
#define ATTACH_SRC (0x1)
@@ -109,16 +115,19 @@
pge2dinfo->src_info[0].canvas_h = SY_SRC1;
pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
pge2dinfo->src_info[0].plane_number = src1_plane_number;
+ pge2dinfo->src_info[0].endain = src1_endian;
pge2dinfo->src_info[1].canvas_w = SX_SRC2;
pge2dinfo->src_info[1].canvas_h = SY_SRC2;
pge2dinfo->src_info[1].format = SRC2_PIXFORMAT;
pge2dinfo->src_info[1].plane_number = src2_plane_number;
+ pge2dinfo->src_info[1].endain = src2_endian;
pge2dinfo->dst_info.canvas_w = SX_DST;
pge2dinfo->dst_info.canvas_h = SY_DST;
pge2dinfo->dst_info.format = DST_PIXFORMAT;
pge2dinfo->dst_info.plane_number = dst_plane_number;
+ pge2dinfo->dst_info.endain = dst_endian;
pge2dinfo->dst_info.rotation = ge2d_rotation(rotation_option);
pge2dinfo->offset = 0;
pge2dinfo->ge2d_op = OP;
@@ -196,13 +205,19 @@
printf (" --r <num> rotation option, 0/1/2/3/4/5 for 0/90/180/270/H-mirror/V-mirror.\n");
printf (" --dst_rpt_times <num> dst repeat x times, 0:disable 2/4/8:repeat times.\n");
printf (" --dst_signed_mode <num> dst signed mode, 0:disable 1:enable.\n");
+ printf (" --src1_endian <num> src1 endian, 0:little_endian 1:big_endian.\n");
+ printf (" --src2_endian <num> src2 endian, 0:little_endian 1:big_endian.\n");
+ printf (" --dst_endian <num> dst endian, 0:little_endian 1:big_endian.\n");
+ printf (" --clut8_table_file <name> clut8 table, filename of clut8_data");
+ printf (" --clut8_count <num> clut8 count, count of clut8_data");
+ printf (" --clut8_data <nums> clut8 data, clut8_data");
printf (" --help Print usage information.\n");
printf ("\n");
}
static int parse_command_line(int argc, char *argv[])
{
- int i;
+ int i, j = 0;
/* parse command line */
for (i = 1; i < argc; i++) {
if (strncmp (argv[i], "--", 2) == 0) {
@@ -385,8 +400,39 @@
}
continue;
}
+ else if (strcmp (argv[i] + 2, "src1_endian") == 0 && ++i < argc &&
+ sscanf (argv[i], "%d", &src1_endian) == 1) {
+ continue;
+ }
+ else if (strcmp (argv[i] + 2, "src2_endian") == 0 && ++i < argc &&
+ sscanf (argv[i], "%d", &src2_endian) == 1) {
+ continue;
+ }
+ else if (strcmp (argv[i] + 2, "dst_endian") == 0 && ++i < argc &&
+ sscanf (argv[i], "%d", &dst_endian) == 1) {
+ continue;
+ }
+ else if (strcmp (argv[i] + 2, "clut8_table_file") == 0 && ++i < argc &&
+ sscanf (argv[i], "%s", clut8_table_file) == 1) {
+ continue;
+ }
+ else if (strcmp (argv[i] + 2, "clut8_count") == 0 && ++i < argc &&
+ sscanf (argv[i], "%d", &clut8_count) == 1) {
+ continue;
+ }
+ else if (strcmp (argv[i] + 2, "clut8_data") == 0 && ++i < argc) {
+ if (clut8_count == 0) {
+ printf("error clut8_count\n");
+ return ge2d_fail;
+ } else {
+ while (sscanf (argv[i], "%d", &clut8_data[j]) != EOF && j < clut8_count && ++i <argc)
+ j++;
+ }
+ continue;
+ }
}
}
+
return ge2d_success;
}
@@ -408,6 +454,27 @@
return ret;
}
+static int aml_read_file_clut(struct ge2d_clut8_t *clut8_table, const char* url)
+{
+ int count = 0;
+ FILE *fp;
+ fp = fopen(url, "r");
+ if (fp == NULL) {
+ E_GE2D("open clut8_data.txt fail\n");
+ return ge2d_fail;
+ }
+ while (fscanf(fp, "%u", &clut8_table->data[count]) != EOF)
+ count++;
+ fclose(fp);
+ if (count == 0 || count > 256) {
+ E_GE2D("clut8_data.txt context error\n");
+ return ge2d_fail;
+ }
+ clut8_table->count = count;
+ return ge2d_success;
+}
+
+
static int aml_read_file_src1(aml_ge2d_t *amlge2d, const char* url)
{
int fd = -1;
@@ -1107,6 +1174,7 @@
ret = aml_read_file_src1(amlge2d, SRC1_FILE_NAME);
if (ret < 0)
return ge2d_fail;
+
if (amlge2d->ge2dinfo.src_info[0].mem_alloc_type == AML_GE2D_MEM_ION) {
ret = aml_ge2d_sync_cache(pge2dinfo, 0);
if (ret < 0)
@@ -1219,6 +1287,7 @@
unsigned long stime;
aml_ge2d_t amlge2d;
char dst_file_name[128] = {};
+ struct ge2d_clut8_t *clut8_table = NULL;
for (run_time = 0; run_time < num_process_per_thread; run_time++) {
printf("ThreadIdx -- %d, run time -- %d\n", *(int *)arg, run_time);
@@ -1265,6 +1334,35 @@
ret = aml_ge2d_mem_alloc(&amlge2d);
if (ret < 0)
goto exit;
+
+ if (strlen(clut8_table_file) != 0) {
+ clut8_table = malloc(sizeof(struct ge2d_clut8_t));
+ ret = aml_read_file_clut(clut8_table, clut8_table_file);
+ if (ret < 0) {
+ free(clut8_table);
+ printf("Error read clut8_table_file\n");
+ return NULL;
+ }
+ ret = ge2d_set_clut8_table(amlge2d.ge2dinfo.ge2d_fd, clut8_table);
+ if (ret < 0) {
+ free(clut8_table);
+ printf("Error set clut8_table\n");
+ return NULL;
+ }
+ free(clut8_table);
+ } else if (clut8_count) {
+ clut8_table = malloc(clut8_count * sizeof(unsigned int));
+ memcpy(&clut8_table->data, &clut8_data, clut8_count * sizeof(unsigned int));
+ clut8_table->count = clut8_count;
+ ret = ge2d_set_clut8_table(amlge2d.ge2dinfo.ge2d_fd, clut8_table);
+ if (ret < 0) {
+ free(clut8_table);
+ printf("Error set clut8_table\n");
+ return NULL;
+ }
+ free(clut8_table);
+ }
+
#if 0
/* if dma_buf and used fd alloc other driver */
/* set dma buf fd */