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