blob: f15313093f6a583a7c4f7c144a74a4255c1d9632 [file] [log] [blame]
Cao Jianaea2cc02019-07-11 15:22:42 +08001/*
2 * Copyright (c) 2014 Amlogic, Inc. All rights reserved.
3 *
4 * This source code is subject to the terms and conditions defined in the
5 * file 'LICENSE' which is part of this source code package.
6 *
7 * Description:
8 */
9
10#include <stdio.h>
11#include <stdlib.h>
12#include <unistd.h>
13#include <fcntl.h>
14#include <malloc.h>
15#include <string.h>
16#include <sys/time.h> /* for gettimeofday() */
17#include "ge2d_port.h"
18#include "ge2d_com.h"
19#include "aml_ge2d.h"
20#include "color_bar.h"
21
22static int SX_SRC1 = 640;
23static int SY_SRC1 = 480;
24static int SX_SRC2 = 640;
25static int SY_SRC2 = 480;
26static int SX_DST = 640;
27static int SY_DST = 480;
28
29static int SRC1_PIXFORMAT = PIXEL_FORMAT_RGBA_8888;
30static int SRC2_PIXFORMAT = PIXEL_FORMAT_RGBA_8888;
31static int DST_PIXFORMAT = PIXEL_FORMAT_RGBA_8888;
32
33static int OP = AML_GE2D_BLIT;
34static int src1_layer_mode = LAYER_MODE_PREMULTIPLIED;
35static int src2_layer_mode = 0;
36static int gb1_alpha = 0xff;
37static int gb2_alpha = 0xff;
38static aml_ge2d_t amlge2d;
39#define TEST_NUM 3
40
41static void set_ge2dinfo(aml_ge2d_info_t *pge2dinfo)
42{
43 pge2dinfo->src_info[0].memtype = GE2D_CANVAS_ALLOC;
44 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
45 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
46 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
Cao Jianf4835362021-03-11 13:30:53 +080047 pge2dinfo->src_info[0].plane_number = 1;
48
Cao Jianaea2cc02019-07-11 15:22:42 +080049 pge2dinfo->src_info[1].memtype = GE2D_CANVAS_ALLOC;
50 pge2dinfo->src_info[1].canvas_w = SX_SRC2;
51 pge2dinfo->src_info[1].canvas_h = SY_SRC2;
52 pge2dinfo->src_info[1].format = SRC2_PIXFORMAT;
Cao Jianf4835362021-03-11 13:30:53 +080053 pge2dinfo->src_info[1].plane_number = 1;
Cao Jianaea2cc02019-07-11 15:22:42 +080054
55 pge2dinfo->dst_info.memtype = GE2D_CANVAS_ALLOC;
56 pge2dinfo->dst_info.canvas_w = SX_DST;
57 pge2dinfo->dst_info.canvas_h = SY_DST;
58 pge2dinfo->dst_info.format = DST_PIXFORMAT;
59 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
Cao Jianf4835362021-03-11 13:30:53 +080060 pge2dinfo->dst_info.plane_number = 1;
61
Cao Jianaea2cc02019-07-11 15:22:42 +080062 pge2dinfo->offset = 0;
63 pge2dinfo->ge2d_op = OP;
64 pge2dinfo->blend_mode = BLEND_MODE_PREMULTIPLIED;
65}
66
67static void print_usage(void)
68{
69 int i;
70 printf ("Usage: ge2d_chip_check [options]\n\n");
71 printf ("Options:\n\n");
72 printf (" --help Print usage information.\n");
73 printf ("\n");
74}
75
76static int parse_command_line(int argc, char *argv[])
77{
78 int i;
79 /* parse command line */
80 for (i = 1; i < argc; i++) {
81 if (strncmp (argv[i], "--", 2) == 0) {
82 if (strcmp (argv[i] + 2, "help") == 0) {
83 print_usage();
84 return ge2d_fail;
85 } else if (strcmp (argv[i] + 2, "bo1") == 0 && ++i < argc &&
86 sscanf (argv[i], "%d", &src1_layer_mode) == 1) {
87 continue;
88 } else if (strcmp (argv[i] + 2, "bo2") == 0 && ++i < argc &&
89 sscanf (argv[i], "%d", &src2_layer_mode) == 1) {
90 continue;
91 } else if (strcmp (argv[i] + 2, "gb1") == 0 && ++i < argc &&
92 sscanf (argv[i], "%d", &gb1_alpha) == 1) {
93 continue;
94 } else if (strcmp (argv[i] + 2, "gb2") == 0 && ++i < argc &&
95 sscanf (argv[i], "%d", &gb2_alpha) == 1) {
96 continue;
97 }
98 }
99 }
100 return ge2d_success;
101}
102
Cao Jian53a15142019-08-16 13:58:17 +0800103static int compare_data(char *data1, char *data2, int size)
Cao Jianaea2cc02019-07-11 15:22:42 +0800104{
105 int i = 0, err_hit = 0;
106 int thresh_hold = 1;//size * 5/100;
107
108 if (!data1 || !data2 || !size)
109 return 0;
110 for (i=0; i< size; i++) {
111 if (*data1 != *data2) {
112 printf("data1=%x,data2=%x\n",*data1,*data2);
113 err_hit++;
114 }
115 data1++;
116 data2++;
117 if (err_hit > thresh_hold) {
118 printf("bad chip found,err_hit=%d\n",err_hit);
119 return -1;
120 }
121 }
122 return 0;
123}
124
Cao Jian53a15142019-08-16 13:58:17 +0800125static int load_result_file(const char* url)
Cao Jianaea2cc02019-07-11 15:22:42 +0800126{
127 int fd = -1;
128 int length = 0;
129 int read_num = 0;
Cao Jian65331472019-11-01 21:01:49 +0800130 if (amlge2d.src_size[0] == 0)
Cao Jianaea2cc02019-07-11 15:22:42 +0800131 return 0;
132
133 fd = open(url,O_RDONLY );
134 if (fd < 0) {
135 E_GE2D("read source file:%s open error\n",url);
136 return ge2d_fail;
137 }
138
Cao Jian65331472019-11-01 21:01:49 +0800139 amlge2d.src_data[0] = (char*)malloc(amlge2d.src_size[0]);
140 if (!amlge2d.src_data[0]) {
Cao Jianaea2cc02019-07-11 15:22:42 +0800141 E_GE2D("malloc for src_data failed\n");
yuhua.lin34978d02021-12-07 11:03:56 +0800142 close(fd);
Cao Jianaea2cc02019-07-11 15:22:42 +0800143 return ge2d_fail;
144 }
145
Cao Jian65331472019-11-01 21:01:49 +0800146 read_num = read(fd,amlge2d.src_data[0],amlge2d.src_size[0]);
Cao Jianaea2cc02019-07-11 15:22:42 +0800147 if (read_num <= 0) {
148 E_GE2D("read file read_num=%d error\n",read_num);
yuhua.lin34978d02021-12-07 11:03:56 +0800149 close(fd);
Cao Jianaea2cc02019-07-11 15:22:42 +0800150 return ge2d_fail;
151 }
152
153 close(fd);
154 return ge2d_success;
155}
156
157
Cao Jian53a15142019-08-16 13:58:17 +0800158static int aml_read_file_src1(const char* url , aml_ge2d_info_t *pge2dinfo)
Cao Jianaea2cc02019-07-11 15:22:42 +0800159{
160 int fd = -1;
161 int length = 0;
162 int read_num = 0;
Cao Jian65331472019-11-01 21:01:49 +0800163 if (amlge2d.src_size[0] == 0)
Cao Jianaea2cc02019-07-11 15:22:42 +0800164 return 0;
165
166 fd = open(url,O_RDONLY );
167 if (fd < 0) {
168 E_GE2D("read source file:%s open error\n",url);
169 return ge2d_fail;
170 }
171
Cao Jian65331472019-11-01 21:01:49 +0800172 amlge2d.src_data[0] = (char*)malloc(amlge2d.src_size[0]);
173 if (!amlge2d.src_data[0]) {
Cao Jianaea2cc02019-07-11 15:22:42 +0800174 E_GE2D("malloc for src_data failed\n");
yuhua.lin34978d02021-12-07 11:03:56 +0800175 close(fd);
Cao Jianaea2cc02019-07-11 15:22:42 +0800176 return ge2d_fail;
177 }
178
Cao Jian65331472019-11-01 21:01:49 +0800179 read_num = read(fd,amlge2d.src_data[0],amlge2d.src_size[0]);
Cao Jianaea2cc02019-07-11 15:22:42 +0800180 if (read_num <= 0) {
181 E_GE2D("read file read_num=%d error\n",read_num);
yuhua.lin34978d02021-12-07 11:03:56 +0800182 close(fd);
Cao Jianaea2cc02019-07-11 15:22:42 +0800183 return ge2d_fail;
184 }
185
Cao Jian65331472019-11-01 21:01:49 +0800186 memcpy(pge2dinfo->src_info[0].vaddr, amlge2d.src_data[0], amlge2d.src_size[0]);
Cao Jianaea2cc02019-07-11 15:22:42 +0800187#if 0
188 printf("pixel: 0x%2x, 0x%2x,0x%2x,0x%2x, 0x%2x,0x%2x,0x%2x,0x%2x\n",
189 pge2dinfo->src_info[0].vaddr[0],
190 pge2dinfo->src_info[0].vaddr[1],
191 pge2dinfo->src_info[0].vaddr[2],
192 pge2dinfo->src_info[0].vaddr[3],
193 pge2dinfo->src_info[0].vaddr[4],
194 pge2dinfo->src_info[0].vaddr[5],
195 pge2dinfo->src_info[0].vaddr[6],
196 pge2dinfo->src_info[0].vaddr[7]);
197#endif
198
199 close(fd);
200 return ge2d_success;
201}
202
Cao Jian53a15142019-08-16 13:58:17 +0800203static int aml_read_file_src2(const char* url , aml_ge2d_info_t *pge2dinfo)
Cao Jianaea2cc02019-07-11 15:22:42 +0800204{
205 int fd = -1;
206 int length = 0;
207 int read_num = 0;
Cao Jian65331472019-11-01 21:01:49 +0800208 if (amlge2d.src2_size[0] == 0)
Cao Jianaea2cc02019-07-11 15:22:42 +0800209 return 0;
210
211 fd = open(url,O_RDONLY );
212 if (fd < 0) {
213 E_GE2D("read source file:%s open error\n",url);
214 return ge2d_fail;
215 }
216
Cao Jian65331472019-11-01 21:01:49 +0800217 amlge2d.src2_data[0] = (char*)malloc(amlge2d.src2_size[0]);
218 if (!amlge2d.src2_data[0]) {
Cao Jianaea2cc02019-07-11 15:22:42 +0800219 E_GE2D("malloc for src_data failed\n");
yuhua.lin34978d02021-12-07 11:03:56 +0800220 close(fd);
Cao Jianaea2cc02019-07-11 15:22:42 +0800221 return ge2d_fail;
222 }
223
Cao Jian65331472019-11-01 21:01:49 +0800224 read_num = read(fd,amlge2d.src2_data[0],amlge2d.src2_size[0]);
Cao Jianaea2cc02019-07-11 15:22:42 +0800225 if (read_num <= 0) {
226 E_GE2D("read file read_num=%d error\n",read_num);
yuhua.lin34978d02021-12-07 11:03:56 +0800227 close(fd);
Cao Jianaea2cc02019-07-11 15:22:42 +0800228 return ge2d_fail;
229 }
230
Cao Jian65331472019-11-01 21:01:49 +0800231 memcpy(pge2dinfo->src_info[1].vaddr[0], amlge2d.src2_data[0], amlge2d.src2_size[0]);
Cao Jianaea2cc02019-07-11 15:22:42 +0800232 close(fd);
233 return ge2d_success;
234}
235
236#ifdef DUMP_OUTPUT
Cao Jian53a15142019-08-16 13:58:17 +0800237static int aml_write_file(const char* url , aml_ge2d_info_t *pge2dinfo)
Cao Jianaea2cc02019-07-11 15:22:42 +0800238{
239 int fd = -1;
240 int length = 0;
241 int write_num = 0;
242 unsigned int *value;
243
Cao Jian65331472019-11-01 21:01:49 +0800244 if (amlge2d.dst_size[0] == 0)
Cao Jianaea2cc02019-07-11 15:22:42 +0800245 return 0;
246 if ((GE2D_CANVAS_OSD0 == pge2dinfo->dst_info.memtype)
247 || (GE2D_CANVAS_OSD1 == pge2dinfo->dst_info.memtype))
248 return 0;
249
250 fd = open(url,O_RDWR | O_CREAT,0660);
251 if (fd < 0) {
252 E_GE2D("write file:%s open error\n",url);
253 return ge2d_fail;
254 }
255
Cao Jian65331472019-11-01 21:01:49 +0800256 amlge2d.dst_data[0] = (char*)malloc(amlge2d.dst_size[0]);
257 if (!amlge2d.dst_data[0]) {
Cao Jianaea2cc02019-07-11 15:22:42 +0800258 E_GE2D("malloc for dst_data failed\n");
259 return ge2d_fail;
260 }
261
Cao Jian65331472019-11-01 21:01:49 +0800262 memcpy(amlge2d.dst_data[0],pge2dinfo->dst_info.vaddr[0],amlge2d.dst_size[0]);
Cao Jianaea2cc02019-07-11 15:22:42 +0800263
264 printf("dst pixel: 0x%2x, 0x%2x,0x%2x,0x%2x, 0x%2x,0x%2x,0x%2x,0x%2x\n",
Cao Jian65331472019-11-01 21:01:49 +0800265 pge2dinfo->dst_info.vaddr[0][0],
266 pge2dinfo->dst_info.vaddr[0][1],
267 pge2dinfo->dst_info.vaddr[0][2],
268 pge2dinfo->dst_info.vaddr[0][3],
269 pge2dinfo->dst_info.vaddr[0][4],
270 pge2dinfo->dst_info.vaddr[0][5],
271 pge2dinfo->dst_info.vaddr[0][6],
272 pge2dinfo->dst_info.vaddr[0][7]);
273 write_num = write(fd,amlge2d.dst_data[0],amlge2d.dst_size[0]);
Cao Jianaea2cc02019-07-11 15:22:42 +0800274 if (write_num <= 0) {
275 E_GE2D("read file read_num=%d error\n",write_num);
276 }
277 close(fd);
278 return ge2d_success;
279}
280#endif
281
282static int do_strechblit_rotate(aml_ge2d_info_t *pge2dinfo)
283{
284 int ret = -1;
285 char code = 0;
286
287 pge2dinfo->src_info[0].memtype = GE2D_CANVAS_ALLOC;
288 pge2dinfo->dst_info.memtype = GE2D_CANVAS_ALLOC;
289 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
290 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
291 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
292 pge2dinfo->dst_info.canvas_w = SX_DST;
293 pge2dinfo->dst_info.canvas_h = SY_DST;
294 pge2dinfo->dst_info.format = DST_PIXFORMAT;
295
296 pge2dinfo->src_info[0].rect.x = 0;
297 pge2dinfo->src_info[0].rect.y = 0;
298 pge2dinfo->src_info[0].rect.w = SX_SRC1;
299 pge2dinfo->src_info[0].rect.h = SY_SRC1;
300 pge2dinfo->dst_info.rect.x = 0;
301 pge2dinfo->dst_info.rect.y = 0;
302 pge2dinfo->dst_info.rect.w = SX_DST;
303 pge2dinfo->dst_info.rect.h = SY_DST;
304 pge2dinfo->dst_info.rotation = GE2D_ROTATION_180;
305 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
306 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
307
308 ret = aml_ge2d_process(pge2dinfo);
309
310 return ret;
311}
312
313static int do_blend(aml_ge2d_info_t *pge2dinfo)
314{
315 int ret = -1;
316 char code = 0;
317 int shared_fd_bakup;
318 unsigned long offset_bakup = 0;
319
320 pge2dinfo->src_info[0].memtype = GE2D_CANVAS_ALLOC;
321 pge2dinfo->src_info[1].memtype = GE2D_CANVAS_ALLOC;
322 pge2dinfo->dst_info.memtype = GE2D_CANVAS_ALLOC;
323 pge2dinfo->blend_mode = BLEND_MODE_PREMULTIPLIED;
324 /* do blend src1 blend src2(dst) to dst */
325
326 pge2dinfo->src_info[0].canvas_w = SX_SRC1;
327 pge2dinfo->src_info[0].canvas_h = SY_SRC1;
328 pge2dinfo->src_info[0].format = SRC1_PIXFORMAT;
329 pge2dinfo->src_info[0].rect.x = 0;
330 pge2dinfo->src_info[0].rect.y = 0;
331 pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w;
332 pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h;
333 pge2dinfo->src_info[0].fill_color_en = 0;
334
335 pge2dinfo->src_info[1].canvas_w = SX_SRC2;
336 pge2dinfo->src_info[1].canvas_h = SY_SRC2;
337 pge2dinfo->src_info[1].format = SRC2_PIXFORMAT;
338 pge2dinfo->src_info[1].rect.x = 0;
339 pge2dinfo->src_info[1].rect.y = 0;
340 pge2dinfo->src_info[1].rect.w = pge2dinfo->src_info[0].canvas_w;
341 pge2dinfo->src_info[1].rect.h = pge2dinfo->src_info[0].canvas_h;
342 pge2dinfo->src_info[1].fill_color_en = 0;
343 if (src2_layer_mode == LAYER_MODE_NON)
344 pge2dinfo->src_info[0].format = PIXEL_FORMAT_RGBX_8888;
345 pge2dinfo->dst_info.canvas_w = SX_DST;
346 pge2dinfo->dst_info.canvas_h = SY_DST;
347 pge2dinfo->dst_info.format = DST_PIXFORMAT;
348 pge2dinfo->dst_info.rect.x = 0;
349 pge2dinfo->dst_info.rect.y = 0;
350 pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w;
351 pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h;
352 pge2dinfo->dst_info.rotation = GE2D_ROTATION_0;
353
354 pge2dinfo->src_info[0].layer_mode = src1_layer_mode;
355 pge2dinfo->src_info[1].layer_mode = src2_layer_mode;
356 pge2dinfo->src_info[0].plane_alpha = gb1_alpha;
357 pge2dinfo->src_info[1].plane_alpha = gb2_alpha;
358 ret = aml_ge2d_process(pge2dinfo);
359
360 return ret;
361}
362
363static inline unsigned long myclock()
364{
365 struct timeval tv;
366
367 gettimeofday (&tv, NULL);
368
369 return (tv.tv_sec * 1000 + tv.tv_usec / 1000);
370}
371
372int aml_generate_src1(char *src, aml_ge2d_info_t *pge2dinfo)
373{
Cao Jian65331472019-11-01 21:01:49 +0800374 if (amlge2d.src_size[0] == 0)
Cao Jianaea2cc02019-07-11 15:22:42 +0800375 return 0;
Cao Jian65331472019-11-01 21:01:49 +0800376 memcpy(pge2dinfo->src_info[0].vaddr[0], src, amlge2d.src_size[0]);
Cao Jianaea2cc02019-07-11 15:22:42 +0800377 return ge2d_success;
378}
379
380int aml_generate_src2(int color, aml_ge2d_info_t *pge2dinfo)
381{
382 int i = 0;
383
Cao Jian65331472019-11-01 21:01:49 +0800384 if (amlge2d.src2_size[0] == 0)
Cao Jianaea2cc02019-07-11 15:22:42 +0800385 return 0;
386
Cao Jian65331472019-11-01 21:01:49 +0800387 for (i=0; i<amlge2d.src2_size[0]; ) {
388 pge2dinfo->src_info[1].vaddr[0][i] = color & 0xff;
389 pge2dinfo->src_info[1].vaddr[0][i+1] = (color & 0xff00)>>8;
390 pge2dinfo->src_info[1].vaddr[0][i+2] = (color & 0xff0000)>>16;
391 pge2dinfo->src_info[1].vaddr[0][i+3] = (color & 0xff000000)>>24;
Cao Jianaea2cc02019-07-11 15:22:42 +0800392 i+=4;
393 }
394 return ge2d_success;
395}
396
397int main(int argc, char **argv)
398{
399 int ret = -1;
400 int i = 0, err_cnt = 0;
401 unsigned long stime,etime;
402
403 memset(&amlge2d,0x0,sizeof(aml_ge2d_t));
404 memset(&(amlge2d.ge2dinfo.src_info[0]), 0, sizeof(buffer_info_t));
405 memset(&(amlge2d.ge2dinfo.src_info[1]), 0, sizeof(buffer_info_t));
406 memset(&(amlge2d.ge2dinfo.dst_info), 0, sizeof(buffer_info_t));
407 ret = parse_command_line(argc,argv);
408 if (ret == ge2d_fail)
409 return ge2d_success;
410
411 set_ge2dinfo(&amlge2d.ge2dinfo);
412
413 ret = aml_ge2d_init(&amlge2d);
414 if (ret < 0)
415 return ge2d_fail;
416
417 ret = aml_ge2d_mem_alloc(&amlge2d);
418 if (ret < 0)
419 goto exit;
420
421 printf("Start GE2D chip check...\n");
422 stime = myclock();
423
424 for (i = 0; i < TEST_NUM; i++) {
425 /* strechblit + rotate */
426 aml_generate_src1((char *)color_bar_code,&amlge2d.ge2dinfo);
427 amlge2d.ge2dinfo.ge2d_op = AML_GE2D_STRETCHBLIT;
428 ret = do_strechblit_rotate(&amlge2d.ge2dinfo);
429 if (ret < 0) {
430 printf("do_strechblit_rotate err\n");
431 }
432 ret = aml_ge2d_invalid_cache(&amlge2d.ge2dinfo);
433 if (ret < 0) {
434 printf("aml_ge2d_invalid_cache err\n");
435 }
Cao Jian65331472019-11-01 21:01:49 +0800436 ret = compare_data((char *)color_bar_rotate, amlge2d.ge2dinfo.dst_info.vaddr[0], amlge2d.dst_size[0]);
Cao Jianaea2cc02019-07-11 15:22:42 +0800437 if (ret < 0) {
438 err_cnt++;
439 printf("GE2D: strechbilt + rotate 180 [FAILED]\n");
440 #ifdef DUMP_OUTPUT
441 ret = aml_write_file("stretchblit_rotate_err.raw", &amlge2d.ge2dinfo);
442 if (ret < 0)
443 printf("stretchblit+rotate dump err\n");
444 #endif
445 }
446
447 /* blend */
448 aml_generate_src1((char *)color_bar_rotate,&amlge2d.ge2dinfo);
449 aml_generate_src2(0x40000000,&amlge2d.ge2dinfo);
450 amlge2d.ge2dinfo.ge2d_op = AML_GE2D_BLEND;
451 ret = do_blend(&amlge2d.ge2dinfo);
452 if (ret < 0) {
453 printf("do_blend err\n");
454 }
455 ret = aml_ge2d_invalid_cache(&amlge2d.ge2dinfo);
456 if (ret < 0) {
457 printf("aml_ge2d_invalid_cache err\n");
458 }
Cao Jian65331472019-11-01 21:01:49 +0800459 ret = compare_data((char *)color_bar_blend, amlge2d.ge2dinfo.dst_info.vaddr[0], amlge2d.dst_size[0]);
Cao Jianaea2cc02019-07-11 15:22:42 +0800460 if (ret < 0) {
461 err_cnt++;
462 printf("GE2D: blend [FAILED]\n");
463 #ifdef DUMP_OUTPUT
464 ret = aml_write_file("stretchblit_rotate_err.raw", &amlge2d.ge2dinfo);
465 if (ret < 0)
466 printf("stretchblit+rotate dump err\n");
467 #endif
468 }
469 }
470 etime = myclock();
471 D_GE2D("used time %d ms\n",etime - stime);
472
473 if (err_cnt >= TEST_NUM)
474 printf("===ge2d_slt_test:failed===\n");
475 else
476 printf("===ge2d_slt_test:pass===\n");
477
478exit:
Cao Jian65331472019-11-01 21:01:49 +0800479 if (amlge2d.src_data[0]) {
480 free(amlge2d.src_data[0]);
481 amlge2d.src_data[0] = NULL;
Cao Jianaea2cc02019-07-11 15:22:42 +0800482 }
Cao Jian65331472019-11-01 21:01:49 +0800483 if (amlge2d.src2_data[0]) {
484 free(amlge2d.src2_data[0]);
485 amlge2d.src2_data[0] = NULL;
Cao Jianaea2cc02019-07-11 15:22:42 +0800486 }
Cao Jian65331472019-11-01 21:01:49 +0800487 if (amlge2d.dst_data[0]) {
488 free(amlge2d.dst_data[0]);
489 amlge2d.dst_data[0] = NULL;
Cao Jianaea2cc02019-07-11 15:22:42 +0800490 }
491 aml_ge2d_mem_free(&amlge2d);
492 aml_ge2d_exit(&amlge2d);
493 return ge2d_success;
494}