xref: /OK3568_Linux_fs/external/linux-rga/samples/im2d_api_demo/rgaImDemo.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (C) 2020 Rockchip Electronics Co., Ltd.
3*4882a593Smuzhiyun  * Authors:
4*4882a593Smuzhiyun  *  PutinLee <putin.lee@rock-chips.com>
5*4882a593Smuzhiyun  *  Cerf Yu <cerf.yu@rock-chips.com>
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Licensed under the Apache License, Version 2.0 (the "License");
8*4882a593Smuzhiyun  * you may not use this file except in compliance with the License.
9*4882a593Smuzhiyun  * You may obtain a copy of the License at
10*4882a593Smuzhiyun  *
11*4882a593Smuzhiyun  *      http://www.apache.org/licenses/LICENSE-2.0
12*4882a593Smuzhiyun  *
13*4882a593Smuzhiyun  * Unless required by applicable law or agreed to in writing, software
14*4882a593Smuzhiyun  * distributed under the License is distributed on an "AS IS" BASIS,
15*4882a593Smuzhiyun  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*4882a593Smuzhiyun  * See the License for the specific language governing permissions and
17*4882a593Smuzhiyun  * limitations under the License.
18*4882a593Smuzhiyun  */
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #include <stdint.h>
21*4882a593Smuzhiyun #include <stdio.h>
22*4882a593Smuzhiyun #include <stdlib.h>
23*4882a593Smuzhiyun #include <sys/types.h>
24*4882a593Smuzhiyun #include <math.h>
25*4882a593Smuzhiyun #include <fcntl.h>
26*4882a593Smuzhiyun #include <memory.h>
27*4882a593Smuzhiyun #include <unistd.h>
28*4882a593Smuzhiyun #include <sys/time.h>
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun #ifdef ANDROID
31*4882a593Smuzhiyun #include <ui/GraphicBuffer.h>
32*4882a593Smuzhiyun #endif
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun #include "im2d.hpp"
35*4882a593Smuzhiyun #include "RockchipRga.h"
36*4882a593Smuzhiyun #include "RgaUtils.h"
37*4882a593Smuzhiyun #include "args.h"
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun #define ERROR               -1
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun /********** SrcInfo set **********/
42*4882a593Smuzhiyun #define SRC_WIDTH  1280
43*4882a593Smuzhiyun #define SRC_HEIGHT 720
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun #ifdef ANDROID
46*4882a593Smuzhiyun #define SRC_FORMAT HAL_PIXEL_FORMAT_RGBA_8888
47*4882a593Smuzhiyun #endif
48*4882a593Smuzhiyun #ifdef LINUX
49*4882a593Smuzhiyun #define SRC_FORMAT RK_FORMAT_RGBA_8888
50*4882a593Smuzhiyun #endif
51*4882a593Smuzhiyun /********** DstInfo set **********/
52*4882a593Smuzhiyun #define DST_WIDTH  1280
53*4882a593Smuzhiyun #define DST_HEIGHT 720
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun #ifdef ANDROID
56*4882a593Smuzhiyun #define DST_FORMAT HAL_PIXEL_FORMAT_RGBA_8888
57*4882a593Smuzhiyun #endif
58*4882a593Smuzhiyun #ifdef LINUX
59*4882a593Smuzhiyun #define DST_FORMAT RK_FORMAT_RGBA_8888
60*4882a593Smuzhiyun #endif
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun struct timeval start, end;
63*4882a593Smuzhiyun long usec1;
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun #ifdef ANDROID
66*4882a593Smuzhiyun enum {
67*4882a593Smuzhiyun     FILL_BUFF  = 0,
68*4882a593Smuzhiyun     EMPTY_BUFF = 1
69*4882a593Smuzhiyun };
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun /*
72*4882a593Smuzhiyun  *   In order to be compatible with different android versions,
73*4882a593Smuzhiyun  * some gralloc usage is defined here.
74*4882a593Smuzhiyun  *   The correct usage should be to refer to the corresponding header file:
75*4882a593Smuzhiyun  *   Android 12 and above: #include "hardware/gralloc_rockchip.h"
76*4882a593Smuzhiyun  *   Android 11 and below: #include "hardware/gralloc.h"
77*4882a593Smuzhiyun  */
78*4882a593Smuzhiyun #define GRALLOC_USAGE_PRIVATE_11                (1ULL << 56)
79*4882a593Smuzhiyun #define RK_GRALLOC_USAGE_WITHIN_4G              GRALLOC_USAGE_PRIVATE_11
80*4882a593Smuzhiyun #define RK_GRALLOC_USAGE_RGA_ACCESS             RK_GRALLOC_USAGE_WITHIN_4G
81*4882a593Smuzhiyun 
GraphicBuffer_Init(int width,int height,int format)82*4882a593Smuzhiyun sp<GraphicBuffer> GraphicBuffer_Init(int width, int height,int format) {
83*4882a593Smuzhiyun     uint64_t usage = 0;
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun     /* cacheable */
86*4882a593Smuzhiyun     // usage |= GRALLOC_USAGE_SW_READ_OFTEN;
87*4882a593Smuzhiyun     usage |= RK_GRALLOC_USAGE_WITHIN_4G;
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun     sp<GraphicBuffer> gb(new GraphicBuffer(width, height, format, 0, usage));
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun     if (gb->initCheck()) {
92*4882a593Smuzhiyun         printf("GraphicBuffer check error : %s\n",strerror(errno));
93*4882a593Smuzhiyun         return NULL;
94*4882a593Smuzhiyun     } else
95*4882a593Smuzhiyun         printf("GraphicBuffer check %s \n","ok");
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun     return gb;
98*4882a593Smuzhiyun }
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun /********** write data to buffer or init buffer**********/
GraphicBuffer_Fill(sp<GraphicBuffer> gb,int flag,int index)101*4882a593Smuzhiyun int GraphicBuffer_Fill(sp<GraphicBuffer> gb, int flag, int index) {
102*4882a593Smuzhiyun     int ret;
103*4882a593Smuzhiyun     char* buf = NULL;
104*4882a593Smuzhiyun     ret = gb->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, (void**)&buf);
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun     if (ret) {
107*4882a593Smuzhiyun         printf("lock buffer error : %s\n",strerror(errno));
108*4882a593Smuzhiyun         return ERROR;
109*4882a593Smuzhiyun     } else
110*4882a593Smuzhiyun         printf("lock buffer %s \n","ok");
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun     if(flag)
113*4882a593Smuzhiyun         memset(buf,0x00,gb->getPixelFormat()*gb->getWidth()*gb->getHeight());
114*4882a593Smuzhiyun     else {
115*4882a593Smuzhiyun         ret = get_buf_from_file(buf, gb->getPixelFormat(), gb->getWidth(), gb->getHeight(), index);
116*4882a593Smuzhiyun         if (!ret)
117*4882a593Smuzhiyun             printf("open file %s \n", "ok");
118*4882a593Smuzhiyun         else {
119*4882a593Smuzhiyun             printf ("open file %s \n", "fault");
120*4882a593Smuzhiyun             return ERROR;
121*4882a593Smuzhiyun         }
122*4882a593Smuzhiyun     }
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun     ret = gb->unlock();
125*4882a593Smuzhiyun     if (ret) {
126*4882a593Smuzhiyun         printf("unlock buffer error : %s\n",strerror(errno));
127*4882a593Smuzhiyun         return ERROR;
128*4882a593Smuzhiyun     } else
129*4882a593Smuzhiyun         printf("unlock buffer %s \n","ok");
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun     return 0;
132*4882a593Smuzhiyun }
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun #if USE_AHARDWAREBUFFER
AHardwareBuffer_Init(int width,int height,int format,AHardwareBuffer ** outBuffer)135*4882a593Smuzhiyun int AHardwareBuffer_Init(int width, int height, int format, AHardwareBuffer** outBuffer) {
136*4882a593Smuzhiyun     sp<GraphicBuffer> gbuffer;
137*4882a593Smuzhiyun     gbuffer = GraphicBuffer_Init(width, height, format);
138*4882a593Smuzhiyun     if(gbuffer == NULL) {
139*4882a593Smuzhiyun         return ERROR;
140*4882a593Smuzhiyun     }
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun     *outBuffer = reinterpret_cast<AHardwareBuffer*>(gbuffer.get());
143*4882a593Smuzhiyun     // Ensure the buffer doesn't get destroyed when the sp<> goes away.
144*4882a593Smuzhiyun     AHardwareBuffer_acquire(*outBuffer);
145*4882a593Smuzhiyun     printf("AHardwareBuffer init ok!\n");
146*4882a593Smuzhiyun     return 0;
147*4882a593Smuzhiyun }
148*4882a593Smuzhiyun 
AHardwareBuffer_Fill(AHardwareBuffer ** buffer,int flag,int index)149*4882a593Smuzhiyun int AHardwareBuffer_Fill(AHardwareBuffer** buffer, int flag, int index) {
150*4882a593Smuzhiyun     sp<GraphicBuffer> gbuffer;
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun     gbuffer = reinterpret_cast<GraphicBuffer*>(*buffer);
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun     if(ERROR == GraphicBuffer_Fill(gbuffer, flag, index)) {
155*4882a593Smuzhiyun         printf("%s, write Graphicbuffer error!\n", __FUNCTION__);
156*4882a593Smuzhiyun         return ERROR;
157*4882a593Smuzhiyun     }
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun     *buffer = reinterpret_cast<AHardwareBuffer*>(gbuffer.get());
160*4882a593Smuzhiyun     // Ensure the buffer doesn't get destroyed when the sp<> goes away.
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun     AHardwareBuffer_acquire(*buffer);
163*4882a593Smuzhiyun     printf("AHardwareBuffer %s ok!\n", flag==0?"fill":"empty");
164*4882a593Smuzhiyun     return 0;
165*4882a593Smuzhiyun }
166*4882a593Smuzhiyun 
AHardwareBuffer_Deinit(AHardwareBuffer * buffer)167*4882a593Smuzhiyun void AHardwareBuffer_Deinit(AHardwareBuffer* buffer) {
168*4882a593Smuzhiyun     AHardwareBuffer_release(buffer);
169*4882a593Smuzhiyun }
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun #endif
172*4882a593Smuzhiyun #endif
173*4882a593Smuzhiyun 
main(int argc,char * argv[])174*4882a593Smuzhiyun int main(int argc, char*  argv[]) {
175*4882a593Smuzhiyun     int ret = 0, while_time = 0;
176*4882a593Smuzhiyun     int parm_data[MODE_MAX] = {0};
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun     int               COLOR;
179*4882a593Smuzhiyun     IM_USAGE          ROTATE;
180*4882a593Smuzhiyun     IM_USAGE          FLIP;
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun     int               MODE;
183*4882a593Smuzhiyun     IM_INFORMATION    IM_INFO;
184*4882a593Smuzhiyun     IM_STATUS         STATUS;
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun     im_rect         src_rect;
187*4882a593Smuzhiyun     im_rect         dst_rect;
188*4882a593Smuzhiyun     rga_buffer_t     src;
189*4882a593Smuzhiyun     rga_buffer_t     dst;
190*4882a593Smuzhiyun     rga_buffer_handle_t src_handle;
191*4882a593Smuzhiyun     rga_buffer_handle_t dst_handle;
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun #ifdef ANDROID
194*4882a593Smuzhiyun #if USE_AHARDWAREBUFFER
195*4882a593Smuzhiyun     AHardwareBuffer* src_buf = nullptr;
196*4882a593Smuzhiyun     AHardwareBuffer* dst_buf = nullptr;
197*4882a593Smuzhiyun #else
198*4882a593Smuzhiyun     sp<GraphicBuffer> src_buf;
199*4882a593Smuzhiyun     sp<GraphicBuffer> dst_buf;
200*4882a593Smuzhiyun #endif
201*4882a593Smuzhiyun #endif
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun #ifdef LINUX
204*4882a593Smuzhiyun     char* src_buf = NULL;
205*4882a593Smuzhiyun     char* dst_buf = NULL;
206*4882a593Smuzhiyun #endif
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun     memset(&src_rect, 0, sizeof(src_rect));
209*4882a593Smuzhiyun     memset(&dst_rect, 0, sizeof(dst_rect));
210*4882a593Smuzhiyun     memset(&src, 0, sizeof(src));
211*4882a593Smuzhiyun     memset(&dst, 0, sizeof(dst));
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun     MODE = readArguments(argc, argv, parm_data);
214*4882a593Smuzhiyun     if (MODE & WHILE_FLAG) {
215*4882a593Smuzhiyun         /* Remove flag of MODE_WHILE. */
216*4882a593Smuzhiyun         MODE &= ~WHILE_FLAG;
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun         while_time = parm_data[MODE_WHILE];
219*4882a593Smuzhiyun     }
220*4882a593Smuzhiyun     printf("MODE = %x\n", MODE);
221*4882a593Smuzhiyun     if(MODE_NONE == MODE) {
222*4882a593Smuzhiyun         printf("%s, Unknow RGA mode\n", __FUNCTION__);
223*4882a593Smuzhiyun         return ERROR;
224*4882a593Smuzhiyun     }
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun     /********** Get parameters **********/
227*4882a593Smuzhiyun     if(MODE != MODE_QUERYSTRING) {
228*4882a593Smuzhiyun #ifdef ANDROID
229*4882a593Smuzhiyun #if USE_AHARDWAREBUFFER
230*4882a593Smuzhiyun         if(ERROR == AHardwareBuffer_Init(SRC_WIDTH, SRC_HEIGHT, SRC_FORMAT, &src_buf)) {
231*4882a593Smuzhiyun             printf("AHardwareBuffer init error!\n");
232*4882a593Smuzhiyun             return ERROR;
233*4882a593Smuzhiyun         }
234*4882a593Smuzhiyun         if(ERROR == AHardwareBuffer_Init(DST_WIDTH, DST_HEIGHT, DST_FORMAT, &dst_buf)) {
235*4882a593Smuzhiyun             printf("AHardwareBuffer init error!\n");
236*4882a593Smuzhiyun             return ERROR;
237*4882a593Smuzhiyun         }
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun         if(ERROR == AHardwareBuffer_Fill(&src_buf, FILL_BUFF, 0)) {
240*4882a593Smuzhiyun             printf("%s, write AHardwareBuffer error!\n", __FUNCTION__);
241*4882a593Smuzhiyun             return -1;
242*4882a593Smuzhiyun         }
243*4882a593Smuzhiyun         if(MODE == MODE_BLEND || MODE == MODE_FILL) {
244*4882a593Smuzhiyun             if(ERROR == AHardwareBuffer_Fill(&dst_buf, FILL_BUFF, 1)) {
245*4882a593Smuzhiyun                 printf("%s, write AHardwareBuffer error!\n", __FUNCTION__);
246*4882a593Smuzhiyun                 return ERROR;
247*4882a593Smuzhiyun             }
248*4882a593Smuzhiyun         } else {
249*4882a593Smuzhiyun             if(ERROR == AHardwareBuffer_Fill(&dst_buf, EMPTY_BUFF, 1)) {
250*4882a593Smuzhiyun                 printf("%s, write AHardwareBuffer error!\n", __FUNCTION__);
251*4882a593Smuzhiyun                 return ERROR;
252*4882a593Smuzhiyun             }
253*4882a593Smuzhiyun         }
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun         src_handle = importbuffer_AHardwareBuffer(src_buf);
256*4882a593Smuzhiyun         if (src_handle <= 0) {
257*4882a593Smuzhiyun             printf("Failed to import AHardwareBuffer for src channel!\n");
258*4882a593Smuzhiyun             return ERROR;
259*4882a593Smuzhiyun         }
260*4882a593Smuzhiyun         dst_handle = importbuffer_AHardwareBuffer(dst_buf);
261*4882a593Smuzhiyun         if (dst_handle <= 0) {
262*4882a593Smuzhiyun             printf("Failed to import AHardwareBuffer for dst channel!\n");
263*4882a593Smuzhiyun             return ERROR;
264*4882a593Smuzhiyun         }
265*4882a593Smuzhiyun #else
266*4882a593Smuzhiyun         src_buf = GraphicBuffer_Init(SRC_WIDTH, SRC_HEIGHT, SRC_FORMAT);
267*4882a593Smuzhiyun         dst_buf = GraphicBuffer_Init(DST_WIDTH, DST_HEIGHT, DST_FORMAT);
268*4882a593Smuzhiyun         if (src_buf == NULL || dst_buf == NULL) {
269*4882a593Smuzhiyun             printf("GraphicBuff init error!\n");
270*4882a593Smuzhiyun             return ERROR;
271*4882a593Smuzhiyun         }
272*4882a593Smuzhiyun 
273*4882a593Smuzhiyun         if(ERROR == GraphicBuffer_Fill(src_buf, FILL_BUFF, 0)) {
274*4882a593Smuzhiyun             printf("%s, write Graphicbuffer error!\n", __FUNCTION__);
275*4882a593Smuzhiyun             return -1;
276*4882a593Smuzhiyun         }
277*4882a593Smuzhiyun         if(MODE == MODE_BLEND || MODE == MODE_FILL) {
278*4882a593Smuzhiyun             if(ERROR == GraphicBuffer_Fill(dst_buf, FILL_BUFF, 1)) {
279*4882a593Smuzhiyun                 printf("%s, write Graphicbuffer error!\n", __FUNCTION__);
280*4882a593Smuzhiyun                 return ERROR;
281*4882a593Smuzhiyun             }
282*4882a593Smuzhiyun         } else {
283*4882a593Smuzhiyun             if(ERROR == GraphicBuffer_Fill(dst_buf, EMPTY_BUFF, 1)) {
284*4882a593Smuzhiyun                 printf("%s, write Graphicbuffer error!\n", __FUNCTION__);
285*4882a593Smuzhiyun                 return ERROR;
286*4882a593Smuzhiyun             }
287*4882a593Smuzhiyun         }
288*4882a593Smuzhiyun 
289*4882a593Smuzhiyun         src_handle = importbuffer_GraphicBuffer(src_buf);
290*4882a593Smuzhiyun         if (src_handle <= 0) {
291*4882a593Smuzhiyun             printf("Failed to import GraphicBuffer for src channel!\n");
292*4882a593Smuzhiyun             return ERROR;
293*4882a593Smuzhiyun         }
294*4882a593Smuzhiyun         dst_handle = importbuffer_GraphicBuffer(dst_buf);
295*4882a593Smuzhiyun         if (dst_handle <= 0) {
296*4882a593Smuzhiyun             printf("Failed to import GraphicBuffer for dst channel!\n");
297*4882a593Smuzhiyun             return ERROR;
298*4882a593Smuzhiyun         }
299*4882a593Smuzhiyun #endif
300*4882a593Smuzhiyun #elif LINUX
301*4882a593Smuzhiyun         src_buf = (char*)malloc(SRC_WIDTH*SRC_HEIGHT*get_bpp_from_format(SRC_FORMAT));
302*4882a593Smuzhiyun         dst_buf = (char*)malloc(DST_WIDTH*DST_HEIGHT*get_bpp_from_format(DST_FORMAT));
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun         ret = get_buf_from_file(src_buf, SRC_FORMAT, SRC_WIDTH, SRC_HEIGHT, 0);
305*4882a593Smuzhiyun         if (!ret)
306*4882a593Smuzhiyun             printf("open file\n");
307*4882a593Smuzhiyun         else
308*4882a593Smuzhiyun             printf ("can not open file\n");
309*4882a593Smuzhiyun 
310*4882a593Smuzhiyun         if(MODE == MODE_BLEND || MODE == MODE_FILL) {
311*4882a593Smuzhiyun             ret = get_buf_from_file(dst_buf, DST_FORMAT, DST_WIDTH, DST_HEIGHT, 1);
312*4882a593Smuzhiyun             if (!ret)
313*4882a593Smuzhiyun                 printf("open file\n");
314*4882a593Smuzhiyun             else
315*4882a593Smuzhiyun                 printf ("can not open file\n");
316*4882a593Smuzhiyun         } else {
317*4882a593Smuzhiyun             memset(dst_buf,0x00,DST_WIDTH*DST_HEIGHT*get_bpp_from_format(DST_FORMAT));
318*4882a593Smuzhiyun         }
319*4882a593Smuzhiyun 
320*4882a593Smuzhiyun         src_handle = importbuffer_virtualaddr(src_buf, SRC_WIDTH, SRC_HEIGHT, SRC_FORMAT);
321*4882a593Smuzhiyun         if (src_handle <= 0) {
322*4882a593Smuzhiyun             printf("Failed to import virtualaddr for src channel!\n");
323*4882a593Smuzhiyun             return ERROR;
324*4882a593Smuzhiyun         }
325*4882a593Smuzhiyun         dst_handle = importbuffer_virtualaddr(dst_buf, DST_WIDTH, DST_HEIGHT, DST_FORMAT);
326*4882a593Smuzhiyun         if (dst_handle <= 0) {
327*4882a593Smuzhiyun             printf("Failed to import virtualaddr for dst channel!\n");
328*4882a593Smuzhiyun             return ERROR;
329*4882a593Smuzhiyun         }
330*4882a593Smuzhiyun #endif
331*4882a593Smuzhiyun 
332*4882a593Smuzhiyun         src = wrapbuffer_handle(src_handle, SRC_WIDTH, SRC_HEIGHT, SRC_FORMAT);
333*4882a593Smuzhiyun         dst = wrapbuffer_handle(dst_handle, DST_WIDTH, DST_HEIGHT, DST_FORMAT);
334*4882a593Smuzhiyun         if(src.width == 0 || dst.width == 0) {
335*4882a593Smuzhiyun             printf("%s, %s", __FUNCTION__, imStrError());
336*4882a593Smuzhiyun             return ERROR;
337*4882a593Smuzhiyun         }
338*4882a593Smuzhiyun     }
339*4882a593Smuzhiyun 
340*4882a593Smuzhiyun     do {
341*4882a593Smuzhiyun         if (while_time) {
342*4882a593Smuzhiyun             static int while_num = 1;
343*4882a593Smuzhiyun             printf("This is %d time in the loop\n", while_num);
344*4882a593Smuzhiyun 
345*4882a593Smuzhiyun             while_num++;
346*4882a593Smuzhiyun             while_time--;
347*4882a593Smuzhiyun         }
348*4882a593Smuzhiyun         /********** Execution function according to mode **********/
349*4882a593Smuzhiyun         switch(MODE) {
350*4882a593Smuzhiyun             case MODE_QUERYSTRING :
351*4882a593Smuzhiyun 
352*4882a593Smuzhiyun                 IM_INFO = (IM_INFORMATION)parm_data[MODE_QUERYSTRING];
353*4882a593Smuzhiyun                 printf("\n%s\n", querystring(IM_INFO));
354*4882a593Smuzhiyun 
355*4882a593Smuzhiyun                 break;
356*4882a593Smuzhiyun 
357*4882a593Smuzhiyun             case MODE_COPY :      //rgaImDemo --copy
358*4882a593Smuzhiyun 
359*4882a593Smuzhiyun                 ret = imcheck(src, dst, src_rect, dst_rect);
360*4882a593Smuzhiyun                 if (IM_STATUS_NOERROR != ret) {
361*4882a593Smuzhiyun                     printf("%d, check error! %s\n", __LINE__, imStrError((IM_STATUS)ret));
362*4882a593Smuzhiyun                     return -1;
363*4882a593Smuzhiyun                 }
364*4882a593Smuzhiyun                 gettimeofday(&start, NULL);
365*4882a593Smuzhiyun 
366*4882a593Smuzhiyun                 STATUS = imcopy(src, dst);
367*4882a593Smuzhiyun 
368*4882a593Smuzhiyun                 gettimeofday(&end, NULL);
369*4882a593Smuzhiyun                 usec1 = 1000000 * (end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec);
370*4882a593Smuzhiyun                 printf("copying .... cost time %ld us, %s\n", usec1, imStrError(STATUS));
371*4882a593Smuzhiyun 
372*4882a593Smuzhiyun                 break;
373*4882a593Smuzhiyun 
374*4882a593Smuzhiyun             case MODE_RESIZE :    //rgaImDemo --resize=up/down
375*4882a593Smuzhiyun                 releasebuffer_handle(dst_handle);
376*4882a593Smuzhiyun                 dst_handle = -1;
377*4882a593Smuzhiyun 
378*4882a593Smuzhiyun                 switch(parm_data[MODE_RESIZE]) {
379*4882a593Smuzhiyun                     case IM_UP_SCALE :
380*4882a593Smuzhiyun #ifdef ANDROID
381*4882a593Smuzhiyun #if USE_AHARDWAREBUFFER
382*4882a593Smuzhiyun                         if(ERROR == AHardwareBuffer_Init(1920, 1080, DST_FORMAT, &dst_buf)) {
383*4882a593Smuzhiyun                             printf("AHardwareBuffer init error!\n");
384*4882a593Smuzhiyun                             return ERROR;
385*4882a593Smuzhiyun                         }
386*4882a593Smuzhiyun 
387*4882a593Smuzhiyun                         if(ERROR == AHardwareBuffer_Fill(&dst_buf, EMPTY_BUFF, 0)) {
388*4882a593Smuzhiyun                             printf("%s, write AHardwareBuffer error!\n", __FUNCTION__);
389*4882a593Smuzhiyun                             return ERROR;
390*4882a593Smuzhiyun                         }
391*4882a593Smuzhiyun 
392*4882a593Smuzhiyun                         dst_handle = importbuffer_AHardwareBuffer(dst_buf);
393*4882a593Smuzhiyun                         if (dst_handle <= 0) {
394*4882a593Smuzhiyun                             printf("Failed to import AHardwareBuffer for dst channel!\n");
395*4882a593Smuzhiyun                             return ERROR;
396*4882a593Smuzhiyun                         }
397*4882a593Smuzhiyun #else
398*4882a593Smuzhiyun                         dst_buf = GraphicBuffer_Init(1920, 1080, DST_FORMAT);
399*4882a593Smuzhiyun                         if (dst_buf == NULL) {
400*4882a593Smuzhiyun                             printf("dst GraphicBuff init error!\n");
401*4882a593Smuzhiyun                             return ERROR;
402*4882a593Smuzhiyun                         }
403*4882a593Smuzhiyun                         if(ERROR == GraphicBuffer_Fill(dst_buf, EMPTY_BUFF, 1)) {
404*4882a593Smuzhiyun                             printf("%s, write Graphicbuffer error!\n", __FUNCTION__);
405*4882a593Smuzhiyun                             return ERROR;
406*4882a593Smuzhiyun                         }
407*4882a593Smuzhiyun 
408*4882a593Smuzhiyun                         dst_handle = importbuffer_GraphicBuffer(dst_buf);
409*4882a593Smuzhiyun                         if (dst_handle <= 0) {
410*4882a593Smuzhiyun                             printf("Failed to import GraphicBuffer for dst channel!\n");
411*4882a593Smuzhiyun                             return ERROR;
412*4882a593Smuzhiyun                         }
413*4882a593Smuzhiyun #endif
414*4882a593Smuzhiyun #elif LINUX
415*4882a593Smuzhiyun                         if (dst_buf != NULL) {
416*4882a593Smuzhiyun                             free(dst_buf);
417*4882a593Smuzhiyun                             dst_buf = NULL;
418*4882a593Smuzhiyun                         }
419*4882a593Smuzhiyun                         dst_buf = (char*)malloc(1920*1080*get_bpp_from_format(DST_FORMAT));
420*4882a593Smuzhiyun 
421*4882a593Smuzhiyun                         memset(dst_buf,0x00,1920*1080*get_bpp_from_format(DST_FORMAT));
422*4882a593Smuzhiyun 
423*4882a593Smuzhiyun                         dst_handle = importbuffer_virtualaddr(dst_buf, 1920, 1080, DST_FORMAT);
424*4882a593Smuzhiyun                         if (dst_handle <= 0) {
425*4882a593Smuzhiyun                             printf("Failed to import virtualaddr for dst channel!\n");
426*4882a593Smuzhiyun                             return ERROR;
427*4882a593Smuzhiyun                         }
428*4882a593Smuzhiyun #endif
429*4882a593Smuzhiyun                         dst = wrapbuffer_handle(dst_handle, 1920, 1080, DST_FORMAT);
430*4882a593Smuzhiyun                         if(dst.width == 0) {
431*4882a593Smuzhiyun                             printf("%s, %s\n", __FUNCTION__, imStrError());
432*4882a593Smuzhiyun                             return ERROR;
433*4882a593Smuzhiyun                         }
434*4882a593Smuzhiyun 
435*4882a593Smuzhiyun                         break;
436*4882a593Smuzhiyun                     case IM_DOWN_SCALE :
437*4882a593Smuzhiyun 
438*4882a593Smuzhiyun #ifdef ANDROID
439*4882a593Smuzhiyun #if USE_AHARDWAREBUFFER
440*4882a593Smuzhiyun                         if(ERROR == AHardwareBuffer_Init(720, 480, DST_FORMAT, &dst_buf)) {
441*4882a593Smuzhiyun                             printf("AHardwareBuffer init error!\n");
442*4882a593Smuzhiyun                             return ERROR;
443*4882a593Smuzhiyun                         }
444*4882a593Smuzhiyun 
445*4882a593Smuzhiyun                         if(ERROR == AHardwareBuffer_Fill(&dst_buf, EMPTY_BUFF, 0)) {
446*4882a593Smuzhiyun                             printf("%s, write AHardwareBuffer error!\n", __FUNCTION__);
447*4882a593Smuzhiyun                             return ERROR;
448*4882a593Smuzhiyun                         }
449*4882a593Smuzhiyun 
450*4882a593Smuzhiyun                         dst_handle = importbuffer_AHardwareBuffer(dst_buf);
451*4882a593Smuzhiyun                         if (dst_handle <= 0) {
452*4882a593Smuzhiyun                             printf("Failed to import AHardwareBuffer for dst channel!\n");
453*4882a593Smuzhiyun                             return ERROR;
454*4882a593Smuzhiyun                         }
455*4882a593Smuzhiyun #else
456*4882a593Smuzhiyun                         dst_buf = GraphicBuffer_Init(720, 480, DST_FORMAT);
457*4882a593Smuzhiyun                         if (dst_buf == NULL) {
458*4882a593Smuzhiyun                             printf("dst GraphicBuff init error!\n");
459*4882a593Smuzhiyun                             return ERROR;
460*4882a593Smuzhiyun                         }
461*4882a593Smuzhiyun                         if(ERROR == GraphicBuffer_Fill(dst_buf, EMPTY_BUFF, 1)) {
462*4882a593Smuzhiyun                             printf("%s, write Graphicbuffer error!\n", __FUNCTION__);
463*4882a593Smuzhiyun                             return ERROR;
464*4882a593Smuzhiyun                         }
465*4882a593Smuzhiyun 
466*4882a593Smuzhiyun                         dst_handle = importbuffer_GraphicBuffer(dst_buf);
467*4882a593Smuzhiyun                         if (dst_handle <= 0) {
468*4882a593Smuzhiyun                             printf("Failed to import GraphicBuffer for dst channel!\n");
469*4882a593Smuzhiyun                             return ERROR;
470*4882a593Smuzhiyun                         }
471*4882a593Smuzhiyun #endif
472*4882a593Smuzhiyun #elif LINUX
473*4882a593Smuzhiyun                         if (dst_buf != NULL) {
474*4882a593Smuzhiyun                             free(dst_buf);
475*4882a593Smuzhiyun                             dst_buf = NULL;
476*4882a593Smuzhiyun                         }
477*4882a593Smuzhiyun                         dst_buf = (char*)malloc(720*480*get_bpp_from_format(DST_FORMAT));
478*4882a593Smuzhiyun 
479*4882a593Smuzhiyun                         memset(dst_buf,0x00,720*480*get_bpp_from_format(DST_FORMAT));
480*4882a593Smuzhiyun 
481*4882a593Smuzhiyun                         dst_handle = importbuffer_virtualaddr(dst_buf, 720, 480, DST_FORMAT);
482*4882a593Smuzhiyun                         if (dst_handle <= 0) {
483*4882a593Smuzhiyun                             printf("Failed to import virtualaddr for dst channel!\n");
484*4882a593Smuzhiyun                             return ERROR;
485*4882a593Smuzhiyun                         }
486*4882a593Smuzhiyun #endif
487*4882a593Smuzhiyun                         dst = wrapbuffer_handle(dst_handle, 720, 480, DST_FORMAT);
488*4882a593Smuzhiyun                         if(dst.width == 0) {
489*4882a593Smuzhiyun                             printf("%s, %s\n", __FUNCTION__, imStrError());
490*4882a593Smuzhiyun                             return ERROR;
491*4882a593Smuzhiyun                         }
492*4882a593Smuzhiyun                         break;
493*4882a593Smuzhiyun                 }
494*4882a593Smuzhiyun 
495*4882a593Smuzhiyun                 ret = imcheck(src, dst, src_rect, dst_rect);
496*4882a593Smuzhiyun                 if (IM_STATUS_NOERROR != ret) {
497*4882a593Smuzhiyun                     printf("%d, check error! %s\n", __LINE__, imStrError((IM_STATUS)ret));
498*4882a593Smuzhiyun                     return -1;
499*4882a593Smuzhiyun                 }
500*4882a593Smuzhiyun 
501*4882a593Smuzhiyun                 gettimeofday(&start, NULL);
502*4882a593Smuzhiyun 
503*4882a593Smuzhiyun                 STATUS = imresize(src, dst);
504*4882a593Smuzhiyun 
505*4882a593Smuzhiyun                 gettimeofday(&end, NULL);
506*4882a593Smuzhiyun                 usec1 = 1000000 * (end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec);
507*4882a593Smuzhiyun                 printf("resizing .... cost time %ld us, %s\n", usec1, imStrError(STATUS));
508*4882a593Smuzhiyun 
509*4882a593Smuzhiyun                 break;
510*4882a593Smuzhiyun 
511*4882a593Smuzhiyun             case MODE_CROP :      //rgaImDemo --crop
512*4882a593Smuzhiyun 
513*4882a593Smuzhiyun                 src_rect.x      = 100;
514*4882a593Smuzhiyun                 src_rect.y      = 100;
515*4882a593Smuzhiyun                 src_rect.width  = 300;
516*4882a593Smuzhiyun                 src_rect.height = 300;
517*4882a593Smuzhiyun 
518*4882a593Smuzhiyun                 ret = imcheck(src, dst, src_rect, dst_rect, IM_CROP);
519*4882a593Smuzhiyun                 if (IM_STATUS_NOERROR != ret) {
520*4882a593Smuzhiyun                     printf("%d, check error! %s\n", __LINE__, imStrError((IM_STATUS)ret));
521*4882a593Smuzhiyun                     return -1;
522*4882a593Smuzhiyun                 }
523*4882a593Smuzhiyun 
524*4882a593Smuzhiyun                 gettimeofday(&start, NULL);
525*4882a593Smuzhiyun 
526*4882a593Smuzhiyun                 STATUS = imcrop(src, dst, src_rect);
527*4882a593Smuzhiyun 
528*4882a593Smuzhiyun                 gettimeofday(&end, NULL);
529*4882a593Smuzhiyun                 usec1 = 1000000 * (end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec);
530*4882a593Smuzhiyun                 printf("cropping .... cost time %ld us, %s\n", usec1, imStrError(STATUS));
531*4882a593Smuzhiyun 
532*4882a593Smuzhiyun                 break;
533*4882a593Smuzhiyun 
534*4882a593Smuzhiyun             case MODE_ROTATE :    //rgaImDemo --rotate=90/180/270
535*4882a593Smuzhiyun 
536*4882a593Smuzhiyun                 ROTATE = (IM_USAGE)parm_data[MODE_ROTATE];
537*4882a593Smuzhiyun 
538*4882a593Smuzhiyun                 if (IM_HAL_TRANSFORM_ROT_90 ==  ROTATE || IM_HAL_TRANSFORM_ROT_270 == ROTATE) {
539*4882a593Smuzhiyun                     dst.width   = src.height;
540*4882a593Smuzhiyun                     dst.height  = src.width;
541*4882a593Smuzhiyun                     dst.wstride = src.hstride;
542*4882a593Smuzhiyun                     dst.hstride = src.wstride;
543*4882a593Smuzhiyun                 }
544*4882a593Smuzhiyun 
545*4882a593Smuzhiyun                 ret = imcheck(src, dst, src_rect, dst_rect, ROTATE);
546*4882a593Smuzhiyun                 if (IM_STATUS_NOERROR != ret) {
547*4882a593Smuzhiyun                     printf("%d, check error! %s\n", __LINE__, imStrError((IM_STATUS)ret));
548*4882a593Smuzhiyun                     return -1;
549*4882a593Smuzhiyun                 }
550*4882a593Smuzhiyun 
551*4882a593Smuzhiyun                 gettimeofday(&start, NULL);
552*4882a593Smuzhiyun 
553*4882a593Smuzhiyun                 STATUS = imrotate(src, dst, ROTATE);
554*4882a593Smuzhiyun 
555*4882a593Smuzhiyun                 gettimeofday(&end, NULL);
556*4882a593Smuzhiyun                 usec1 = 1000000 * (end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec);
557*4882a593Smuzhiyun                 printf("rotating .... cost time %ld us, %s\n", usec1, imStrError(STATUS));
558*4882a593Smuzhiyun 
559*4882a593Smuzhiyun                 break;
560*4882a593Smuzhiyun 
561*4882a593Smuzhiyun             case MODE_FLIP :      //rgaImDemo --flip=H/V
562*4882a593Smuzhiyun 
563*4882a593Smuzhiyun                 FLIP = (IM_USAGE)parm_data[MODE_FLIP];
564*4882a593Smuzhiyun 
565*4882a593Smuzhiyun                 ret = imcheck(src, dst, src_rect, dst_rect);
566*4882a593Smuzhiyun                 if (IM_STATUS_NOERROR != ret) {
567*4882a593Smuzhiyun                     printf("%d, check error! %s\n", __LINE__, imStrError((IM_STATUS)ret));
568*4882a593Smuzhiyun                     return -1;
569*4882a593Smuzhiyun                 }
570*4882a593Smuzhiyun 
571*4882a593Smuzhiyun                 gettimeofday(&start, NULL);
572*4882a593Smuzhiyun 
573*4882a593Smuzhiyun                 STATUS = imflip(src, dst, FLIP);
574*4882a593Smuzhiyun 
575*4882a593Smuzhiyun                 gettimeofday(&end, NULL);
576*4882a593Smuzhiyun                 usec1 = 1000000 * (end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec);
577*4882a593Smuzhiyun                 printf("flipping .... cost time %ld us, %s\n", usec1, imStrError(STATUS));
578*4882a593Smuzhiyun 
579*4882a593Smuzhiyun                 break;
580*4882a593Smuzhiyun 
581*4882a593Smuzhiyun             case MODE_TRANSLATE : //rgaImDemo --translate
582*4882a593Smuzhiyun 
583*4882a593Smuzhiyun                 src_rect.x = 300;
584*4882a593Smuzhiyun                 src_rect.y = 300;
585*4882a593Smuzhiyun 
586*4882a593Smuzhiyun                 ret = imcheck(src, dst, src_rect, dst_rect);
587*4882a593Smuzhiyun                 if (IM_STATUS_NOERROR != ret) {
588*4882a593Smuzhiyun                     printf("%d, check error! %s\n", __LINE__, imStrError((IM_STATUS)ret));
589*4882a593Smuzhiyun                     return -1;
590*4882a593Smuzhiyun                 }
591*4882a593Smuzhiyun 
592*4882a593Smuzhiyun                 gettimeofday(&start, NULL);
593*4882a593Smuzhiyun 
594*4882a593Smuzhiyun                 STATUS = imtranslate(src, dst, src_rect.x, src_rect.y);
595*4882a593Smuzhiyun 
596*4882a593Smuzhiyun                 gettimeofday(&end, NULL);
597*4882a593Smuzhiyun                 usec1 = 1000000 * (end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec);
598*4882a593Smuzhiyun                 printf("translating .... cost time %ld us, %s\n", usec1, imStrError(STATUS));
599*4882a593Smuzhiyun 
600*4882a593Smuzhiyun                 break;
601*4882a593Smuzhiyun 
602*4882a593Smuzhiyun             case MODE_BLEND :     //rgaImDemo --blend
603*4882a593Smuzhiyun 
604*4882a593Smuzhiyun                 ret = imcheck(src, dst, src_rect, dst_rect);
605*4882a593Smuzhiyun                 if (IM_STATUS_NOERROR != ret) {
606*4882a593Smuzhiyun                     printf("%d, check error! %s\n", __LINE__, imStrError((IM_STATUS)ret));
607*4882a593Smuzhiyun                     return -1;
608*4882a593Smuzhiyun                 }
609*4882a593Smuzhiyun 
610*4882a593Smuzhiyun                 gettimeofday(&start, NULL);
611*4882a593Smuzhiyun 
612*4882a593Smuzhiyun                 STATUS = imblend(src, dst);
613*4882a593Smuzhiyun 
614*4882a593Smuzhiyun                 gettimeofday(&end, NULL);
615*4882a593Smuzhiyun                 usec1 = 1000000 * (end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec);
616*4882a593Smuzhiyun                 printf("blending .... cost time %ld us, %s\n", usec1, imStrError(STATUS));
617*4882a593Smuzhiyun 
618*4882a593Smuzhiyun                 break;
619*4882a593Smuzhiyun 
620*4882a593Smuzhiyun             case MODE_CVTCOLOR :  //rgaImDemo --cvtcolor
621*4882a593Smuzhiyun 
622*4882a593Smuzhiyun #ifdef ANDROID
623*4882a593Smuzhiyun                 src.format = HAL_PIXEL_FORMAT_RGBA_8888;
624*4882a593Smuzhiyun                 dst.format = HAL_PIXEL_FORMAT_YCrCb_NV12;
625*4882a593Smuzhiyun #endif
626*4882a593Smuzhiyun #ifdef LINUX
627*4882a593Smuzhiyun                 src.format = RK_FORMAT_RGBA_8888;
628*4882a593Smuzhiyun                 dst.format = RK_FORMAT_YCbCr_420_SP;
629*4882a593Smuzhiyun #endif
630*4882a593Smuzhiyun 
631*4882a593Smuzhiyun                 ret = imcheck(src, dst, src_rect, dst_rect);
632*4882a593Smuzhiyun                 if (IM_STATUS_NOERROR != ret) {
633*4882a593Smuzhiyun                     printf("%d, check error! %s\n", __LINE__, imStrError((IM_STATUS)ret));
634*4882a593Smuzhiyun                     return -1;
635*4882a593Smuzhiyun                 }
636*4882a593Smuzhiyun 
637*4882a593Smuzhiyun                 gettimeofday(&start, NULL);
638*4882a593Smuzhiyun 
639*4882a593Smuzhiyun                 STATUS = imcvtcolor(src, dst, src.format, dst.format);
640*4882a593Smuzhiyun 
641*4882a593Smuzhiyun                 gettimeofday(&end, NULL);
642*4882a593Smuzhiyun                 usec1 = 1000000 * (end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec);
643*4882a593Smuzhiyun                 printf("cvtcolor .... cost time %ld us, %s\n", usec1, imStrError(STATUS));
644*4882a593Smuzhiyun 
645*4882a593Smuzhiyun                 break;
646*4882a593Smuzhiyun 
647*4882a593Smuzhiyun             case MODE_FILL :      //rgaImDemo --fill=blue/green/red
648*4882a593Smuzhiyun 
649*4882a593Smuzhiyun                 COLOR = parm_data[MODE_FILL];
650*4882a593Smuzhiyun 
651*4882a593Smuzhiyun                 dst_rect.x      = 100;
652*4882a593Smuzhiyun                 dst_rect.y      = 100;
653*4882a593Smuzhiyun                 dst_rect.width  = 300;
654*4882a593Smuzhiyun                 dst_rect.height = 300;
655*4882a593Smuzhiyun 
656*4882a593Smuzhiyun                 ret = imcheck(src, dst, src_rect, dst_rect, IM_COLOR_FILL);
657*4882a593Smuzhiyun                 if (IM_STATUS_NOERROR != ret) {
658*4882a593Smuzhiyun                     printf("%d, check error! %s\n", __LINE__, imStrError((IM_STATUS)ret));
659*4882a593Smuzhiyun                     return -1;
660*4882a593Smuzhiyun                 }
661*4882a593Smuzhiyun 
662*4882a593Smuzhiyun                 gettimeofday(&start, NULL);
663*4882a593Smuzhiyun 
664*4882a593Smuzhiyun                 STATUS = imfill(dst, dst_rect, COLOR);
665*4882a593Smuzhiyun 
666*4882a593Smuzhiyun                 gettimeofday(&end, NULL);
667*4882a593Smuzhiyun                 usec1 = 1000000 * (end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec);
668*4882a593Smuzhiyun                 printf("filling .... cost time %ld us, %s\n", usec1, imStrError(STATUS));
669*4882a593Smuzhiyun 
670*4882a593Smuzhiyun                 break;
671*4882a593Smuzhiyun 
672*4882a593Smuzhiyun             case MODE_NONE :
673*4882a593Smuzhiyun 
674*4882a593Smuzhiyun                 printf("%s, Unknown mode\n", __FUNCTION__);
675*4882a593Smuzhiyun 
676*4882a593Smuzhiyun                 break;
677*4882a593Smuzhiyun 
678*4882a593Smuzhiyun             default :
679*4882a593Smuzhiyun 
680*4882a593Smuzhiyun                 printf("%s, Invalid mode\n", __FUNCTION__);
681*4882a593Smuzhiyun 
682*4882a593Smuzhiyun                 break;
683*4882a593Smuzhiyun         }
684*4882a593Smuzhiyun 
685*4882a593Smuzhiyun         if (while_time) {
686*4882a593Smuzhiyun             /* 200ms */
687*4882a593Smuzhiyun             usleep(200000);
688*4882a593Smuzhiyun         }
689*4882a593Smuzhiyun     }while(while_time);
690*4882a593Smuzhiyun 
691*4882a593Smuzhiyun     /********** release rga buffer handle **********/
692*4882a593Smuzhiyun     releasebuffer_handle(src_handle);
693*4882a593Smuzhiyun     releasebuffer_handle(dst_handle);
694*4882a593Smuzhiyun 
695*4882a593Smuzhiyun     /********** output buf data to file **********/
696*4882a593Smuzhiyun #ifdef ANDROID
697*4882a593Smuzhiyun     char* outbuf = NULL;
698*4882a593Smuzhiyun #if USE_AHARDWAREBUFFER
699*4882a593Smuzhiyun     sp<GraphicBuffer> gbuffer = reinterpret_cast<GraphicBuffer*>(dst_buf);
700*4882a593Smuzhiyun     if (gbuffer != NULL) {
701*4882a593Smuzhiyun         ret = gbuffer->lock(GRALLOC_USAGE_SW_WRITE_OFTEN | GRALLOC_USAGE_SW_READ_OFTEN, (void**)&outbuf);
702*4882a593Smuzhiyun         if (ret != 0) {
703*4882a593Smuzhiyun             printf("%s, %d, lock buffer failed!\n", __FUNCTION__, __LINE__);
704*4882a593Smuzhiyun             return -1;
705*4882a593Smuzhiyun         }
706*4882a593Smuzhiyun         output_buf_data_to_file(outbuf, dst.format, dst.wstride, dst.hstride, 0);
707*4882a593Smuzhiyun         ret = gbuffer->unlock();
708*4882a593Smuzhiyun         if (ret != 0) {
709*4882a593Smuzhiyun             printf("%s, %d, unlock buffer failed!\n", __FUNCTION__, __LINE__);
710*4882a593Smuzhiyun             return -1;
711*4882a593Smuzhiyun         }
712*4882a593Smuzhiyun     }
713*4882a593Smuzhiyun 
714*4882a593Smuzhiyun     AHardwareBuffer_Deinit(src_buf);
715*4882a593Smuzhiyun     AHardwareBuffer_Deinit(dst_buf);
716*4882a593Smuzhiyun #else
717*4882a593Smuzhiyun     if (dst_buf != NULL) {
718*4882a593Smuzhiyun         ret = dst_buf->lock(GRALLOC_USAGE_SW_WRITE_OFTEN | GRALLOC_USAGE_SW_READ_OFTEN, (void**)&outbuf);
719*4882a593Smuzhiyun         if (ret != 0) {
720*4882a593Smuzhiyun             printf("%s, %d, lock buffer failed!\n", __FUNCTION__, __LINE__);
721*4882a593Smuzhiyun             return -1;
722*4882a593Smuzhiyun         }
723*4882a593Smuzhiyun         output_buf_data_to_file(outbuf, dst.format, dst.wstride, dst.hstride, 0);
724*4882a593Smuzhiyun         ret = dst_buf->unlock();
725*4882a593Smuzhiyun         if (ret != 0) {
726*4882a593Smuzhiyun             printf("%s, %d, unlock buffer failed!\n", __FUNCTION__, __LINE__);
727*4882a593Smuzhiyun             return -1;
728*4882a593Smuzhiyun         }
729*4882a593Smuzhiyun     }
730*4882a593Smuzhiyun #endif
731*4882a593Smuzhiyun #endif
732*4882a593Smuzhiyun 
733*4882a593Smuzhiyun #ifdef LINUX
734*4882a593Smuzhiyun     if (src_buf != NULL) {
735*4882a593Smuzhiyun         free(src_buf);
736*4882a593Smuzhiyun         src_buf = NULL;
737*4882a593Smuzhiyun     }
738*4882a593Smuzhiyun 
739*4882a593Smuzhiyun     if (dst_buf != NULL) {
740*4882a593Smuzhiyun         output_buf_data_to_file(dst_buf, dst.format, dst.wstride, dst.hstride, 0);
741*4882a593Smuzhiyun         free(dst_buf);
742*4882a593Smuzhiyun         dst_buf = NULL;
743*4882a593Smuzhiyun     }
744*4882a593Smuzhiyun #endif
745*4882a593Smuzhiyun 
746*4882a593Smuzhiyun     return 0;
747*4882a593Smuzhiyun }
748*4882a593Smuzhiyun 
749