xref: /rockchip-linux_mpp/mpp/legacy/ppOp.cpp (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  * Copyright 2015 Rockchip Electronics Co. LTD
3*437bfbebSnyanmisaka  *
4*437bfbebSnyanmisaka  * Licensed under the Apache License, Version 2.0 (the "License");
5*437bfbebSnyanmisaka  * you may not use this file except in compliance with the License.
6*437bfbebSnyanmisaka  * You may obtain a copy of the License at
7*437bfbebSnyanmisaka  *
8*437bfbebSnyanmisaka  *      http://www.apache.org/licenses/LICENSE-2.0
9*437bfbebSnyanmisaka  *
10*437bfbebSnyanmisaka  * Unless required by applicable law or agreed to in writing, software
11*437bfbebSnyanmisaka  * distributed under the License is distributed on an "AS IS" BASIS,
12*437bfbebSnyanmisaka  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*437bfbebSnyanmisaka  * See the License for the specific language governing permissions and
14*437bfbebSnyanmisaka  * limitations under the License.
15*437bfbebSnyanmisaka  */
16*437bfbebSnyanmisaka 
17*437bfbebSnyanmisaka #define LOG_TAG "PpOp"
18*437bfbebSnyanmisaka 
19*437bfbebSnyanmisaka #include "vpu.h"
20*437bfbebSnyanmisaka #include "ppOp.h"
21*437bfbebSnyanmisaka 
22*437bfbebSnyanmisaka namespace android
23*437bfbebSnyanmisaka {
24*437bfbebSnyanmisaka 
ppOpInit(PP_OP_HANDLE * hnd,PP_OPERATION * init)25*437bfbebSnyanmisaka status_t ppOpInit(PP_OP_HANDLE *hnd, PP_OPERATION *init)
26*437bfbebSnyanmisaka {
27*437bfbebSnyanmisaka     (void)hnd;
28*437bfbebSnyanmisaka     (void)init;
29*437bfbebSnyanmisaka     return 0;
30*437bfbebSnyanmisaka }
31*437bfbebSnyanmisaka 
ppOpSet(PP_OP_HANDLE hnd,PP_SET_OPT opt,RK_U32 val)32*437bfbebSnyanmisaka status_t ppOpSet(PP_OP_HANDLE hnd, PP_SET_OPT opt, RK_U32 val)
33*437bfbebSnyanmisaka {
34*437bfbebSnyanmisaka     (void)hnd;
35*437bfbebSnyanmisaka     (void)opt;
36*437bfbebSnyanmisaka     (void)val;
37*437bfbebSnyanmisaka     return 0;
38*437bfbebSnyanmisaka }
39*437bfbebSnyanmisaka 
ppOpPerform(PP_OP_HANDLE hnd)40*437bfbebSnyanmisaka status_t ppOpPerform(PP_OP_HANDLE hnd)
41*437bfbebSnyanmisaka {
42*437bfbebSnyanmisaka     (void)hnd;
43*437bfbebSnyanmisaka     return 0;//VPU_REG_NUM_PP);
44*437bfbebSnyanmisaka }
45*437bfbebSnyanmisaka 
ppOpSync(PP_OP_HANDLE hnd)46*437bfbebSnyanmisaka status_t ppOpSync(PP_OP_HANDLE hnd)
47*437bfbebSnyanmisaka {
48*437bfbebSnyanmisaka     (void)hnd;
49*437bfbebSnyanmisaka     return 0;
50*437bfbebSnyanmisaka }
51*437bfbebSnyanmisaka 
ppOpRelease(PP_OP_HANDLE hnd)52*437bfbebSnyanmisaka status_t ppOpRelease(PP_OP_HANDLE hnd)
53*437bfbebSnyanmisaka {
54*437bfbebSnyanmisaka     (void)hnd;
55*437bfbebSnyanmisaka     return 0;
56*437bfbebSnyanmisaka }
57*437bfbebSnyanmisaka 
58*437bfbebSnyanmisaka }
59*437bfbebSnyanmisaka 
60*437bfbebSnyanmisaka #if BUILD_PPOP_TEST
61*437bfbebSnyanmisaka #define SRC_WIDTH           (1920)//(1920)
62*437bfbebSnyanmisaka #define SRC_HEIGHT          (1080)//(1080)
63*437bfbebSnyanmisaka #define SRC_SIZE            (SRC_WIDTH*SRC_HEIGHT*2)
64*437bfbebSnyanmisaka 
65*437bfbebSnyanmisaka #define DST_WIDTH           (720)//(720)
66*437bfbebSnyanmisaka #define DST_HEIGHT          (1280)
67*437bfbebSnyanmisaka #define DST_SIZE            (DST_WIDTH*DST_HEIGHT*2)
68*437bfbebSnyanmisaka 
69*437bfbebSnyanmisaka #include "vpu_mem.h"
70*437bfbebSnyanmisaka #include "vpu.h"
71*437bfbebSnyanmisaka #include "ppOp.h"
72*437bfbebSnyanmisaka 
main()73*437bfbebSnyanmisaka int main()
74*437bfbebSnyanmisaka {
75*437bfbebSnyanmisaka     FILE *fpr, *fpw;
76*437bfbebSnyanmisaka     int   wid_alig16 = ((SRC_WIDTH + 15) & (~0xf));
77*437bfbebSnyanmisaka     int   hei_alig16 = ((SRC_HEIGHT + 15) & (~0xf));
78*437bfbebSnyanmisaka     int   src_vir_width = 1920;//2048;
79*437bfbebSnyanmisaka     int   src_vir_height = 1088;//1088;
80*437bfbebSnyanmisaka     int   dst_vir_width = 800;//800;
81*437bfbebSnyanmisaka     int   dst_vir_height = 1280;//1280;
82*437bfbebSnyanmisaka     int   framecnt = 0;
83*437bfbebSnyanmisaka     char *tmpbuf = (char *)malloc(src_vir_width * src_vir_height / 2);
84*437bfbebSnyanmisaka     RK_S32 ret = 0, i,  j;
85*437bfbebSnyanmisaka 
86*437bfbebSnyanmisaka     ALOGI("ppOp test start\n");
87*437bfbebSnyanmisaka     VPUMemLinear_t src, dst;
88*437bfbebSnyanmisaka     android::PP_OP_HANDLE hnd;
89*437bfbebSnyanmisaka     int vpuFd = VPUClientInit(VPU_PP);
90*437bfbebSnyanmisaka     ret |= VPUMallocLinear(&src, src_vir_width * src_vir_height * 2); //SRC_SIZE);
91*437bfbebSnyanmisaka     ret |= VPUMallocLinear(&dst, dst_vir_width * dst_vir_height * 2); //DST_SIZE);
92*437bfbebSnyanmisaka     if (ret) {
93*437bfbebSnyanmisaka         ALOGE("failed to malloc vpu_mem");
94*437bfbebSnyanmisaka         goto end;
95*437bfbebSnyanmisaka     }
96*437bfbebSnyanmisaka     if (vpuFd < 0) {
97*437bfbebSnyanmisaka         ALOGE("failed to open vpu client");
98*437bfbebSnyanmisaka         goto end;
99*437bfbebSnyanmisaka     }
100*437bfbebSnyanmisaka 
101*437bfbebSnyanmisaka     {
102*437bfbebSnyanmisaka #if 0
103*437bfbebSnyanmisaka         int i,  j;
104*437bfbebSnyanmisaka         char *tmp = (char *)src.vir_addr;
105*437bfbebSnyanmisaka         for (i = 0; i < SRC_HEIGHT; i++) {
106*437bfbebSnyanmisaka             memset(tmp, (i & 0xff), SRC_WIDTH);
107*437bfbebSnyanmisaka             tmp += SRC_WIDTH;
108*437bfbebSnyanmisaka         }
109*437bfbebSnyanmisaka #endif
110*437bfbebSnyanmisaka 
111*437bfbebSnyanmisaka #if 1
112*437bfbebSnyanmisaka         char *tmp = (char *)src.vir_addr;
113*437bfbebSnyanmisaka         fpr = fopen("/sdcard/testin.yuv", "rb");
114*437bfbebSnyanmisaka         for (i = 0; i < SRC_HEIGHT; i++) {
115*437bfbebSnyanmisaka             if (fpr)fread(tmp, 1, SRC_WIDTH, fpr);
116*437bfbebSnyanmisaka             tmp += src_vir_width;
117*437bfbebSnyanmisaka         }
118*437bfbebSnyanmisaka         tmp = (char *)src.vir_addr;
119*437bfbebSnyanmisaka         if (fpr)fread(&tmp[src_vir_width * src_vir_height], 1, SRC_WIDTH * SRC_HEIGHT / 2, fpr);
120*437bfbebSnyanmisaka         if (fpr)fclose(fpr);
121*437bfbebSnyanmisaka 
122*437bfbebSnyanmisaka         for (i = 0; i < SRC_HEIGHT / 2; i++) { //planar to semi planar
123*437bfbebSnyanmisaka             for (j = 0; j < SRC_WIDTH / 2; j++) { //planar to semi planar
124*437bfbebSnyanmisaka                 tmpbuf[i * src_vir_width + j * 2 + 0] = tmp[src_vir_width * src_vir_height + i * SRC_WIDTH / 2 + j];
125*437bfbebSnyanmisaka                 tmpbuf[i * src_vir_width + j * 2 + 1] = tmp[src_vir_width * src_vir_height + SRC_WIDTH * SRC_HEIGHT / 4 + i * SRC_WIDTH / 2 + j];
126*437bfbebSnyanmisaka             }
127*437bfbebSnyanmisaka         }
128*437bfbebSnyanmisaka         memcpy(&tmp[src_vir_width * src_vir_height], tmpbuf, src_vir_width * src_vir_height / 2);
129*437bfbebSnyanmisaka         //memset(&tmp[SRC_WIDTH*SRC_HEIGHT], 0x80, SRC_WIDTH*SRC_HEIGHT/2);
130*437bfbebSnyanmisaka #endif
131*437bfbebSnyanmisaka         VPUMemClean(&src);
132*437bfbebSnyanmisaka     }
133*437bfbebSnyanmisaka 
134*437bfbebSnyanmisaka     while (1) {
135*437bfbebSnyanmisaka         printf("framecnt=%d\n", framecnt);
136*437bfbebSnyanmisaka 
137*437bfbebSnyanmisaka         if (framecnt++ >= 1)
138*437bfbebSnyanmisaka             break;
139*437bfbebSnyanmisaka 
140*437bfbebSnyanmisaka         wid_alig16 = ((SRC_WIDTH + 15) & (~0xf));
141*437bfbebSnyanmisaka         hei_alig16 = ((SRC_HEIGHT + 15) & (~0xf));
142*437bfbebSnyanmisaka 
143*437bfbebSnyanmisaka         android::PP_OPERATION opt;
144*437bfbebSnyanmisaka         memset(&opt, 0, sizeof(opt));
145*437bfbebSnyanmisaka         opt.srcAddr     = src.phy_addr;
146*437bfbebSnyanmisaka         opt.srcFormat   = PP_IN_FORMAT_YUV420SEMI;
147*437bfbebSnyanmisaka         opt.srcWidth    = SRC_WIDTH;
148*437bfbebSnyanmisaka         opt.srcHeight   = SRC_HEIGHT;
149*437bfbebSnyanmisaka         opt.srcHStride  = src_vir_width;
150*437bfbebSnyanmisaka         opt.srcVStride  = src_vir_height;
151*437bfbebSnyanmisaka         opt.srcX   = 0;
152*437bfbebSnyanmisaka         opt.srcY   = 0;
153*437bfbebSnyanmisaka         if (wid_alig16 != SRC_WIDTH)
154*437bfbebSnyanmisaka             opt.srcCrop8R = 1;
155*437bfbebSnyanmisaka         if (hei_alig16 != SRC_HEIGHT)
156*437bfbebSnyanmisaka             opt.srcCrop8D = 1;
157*437bfbebSnyanmisaka 
158*437bfbebSnyanmisaka         wid_alig16 = ((DST_WIDTH + 15) & (~0xf));
159*437bfbebSnyanmisaka         hei_alig16 = ((DST_HEIGHT + 15) & (~0xf));
160*437bfbebSnyanmisaka 
161*437bfbebSnyanmisaka         opt.dstAddr     = dst.phy_addr;
162*437bfbebSnyanmisaka         opt.dstFormat   = PP_OUT_FORMAT_YUV420INTERLAVE;
163*437bfbebSnyanmisaka         opt.dstWidth    = DST_WIDTH;
164*437bfbebSnyanmisaka         opt.dstHeight   = DST_HEIGHT;
165*437bfbebSnyanmisaka         opt.dstHStride  = dst_vir_width;
166*437bfbebSnyanmisaka         opt.dstVStride  = dst_vir_height;
167*437bfbebSnyanmisaka         opt.dstX   = 0;
168*437bfbebSnyanmisaka         opt.dstY   = 0;
169*437bfbebSnyanmisaka 
170*437bfbebSnyanmisaka         opt.deinterlace = 0;
171*437bfbebSnyanmisaka 
172*437bfbebSnyanmisaka         opt.rotation    = PP_ROTATION_RIGHT_90;//PP_ROTATION_RIGHT_90;//PP_ROTATION_RIGHT_90;//PP_ROTATION_RIGHT_90;
173*437bfbebSnyanmisaka 
174*437bfbebSnyanmisaka         opt.vpuFd       = vpuFd;
175*437bfbebSnyanmisaka         ret |= android::ppOpInit(&hnd, &opt);
176*437bfbebSnyanmisaka         if (ret) {
177*437bfbebSnyanmisaka             ALOGE("ppOpInit failed");
178*437bfbebSnyanmisaka             hnd = NULL;
179*437bfbebSnyanmisaka             goto end;
180*437bfbebSnyanmisaka         }
181*437bfbebSnyanmisaka         ret = android::ppOpPerform(hnd);
182*437bfbebSnyanmisaka         if (ret) {
183*437bfbebSnyanmisaka             ALOGE("ppOpPerform failed");
184*437bfbebSnyanmisaka         }
185*437bfbebSnyanmisaka         ret = android::ppOpSync(hnd);
186*437bfbebSnyanmisaka         if (ret) {
187*437bfbebSnyanmisaka             ALOGE("ppOpSync failed");
188*437bfbebSnyanmisaka         }
189*437bfbebSnyanmisaka         ret = android::ppOpRelease(hnd);
190*437bfbebSnyanmisaka         if (ret) {
191*437bfbebSnyanmisaka             ALOGE("ppOpPerform failed");
192*437bfbebSnyanmisaka         }
193*437bfbebSnyanmisaka 
194*437bfbebSnyanmisaka         VPUMemInvalidate(&dst);
195*437bfbebSnyanmisaka         {
196*437bfbebSnyanmisaka #if 0
197*437bfbebSnyanmisaka             int i,  j, ret = 0;
198*437bfbebSnyanmisaka             char *tmp = (char *)dst.vir_addr;
199*437bfbebSnyanmisaka             /*for(i=0; i<3; i++)
200*437bfbebSnyanmisaka             {
201*437bfbebSnyanmisaka                 printf("col out_pos=%d, 0x%x\n", i*DST_WIDTH, tmp[i*DST_WIDTH]);
202*437bfbebSnyanmisaka             }
203*437bfbebSnyanmisaka             for(i=0; i<3; i++)
204*437bfbebSnyanmisaka             {
205*437bfbebSnyanmisaka                 printf("las out_pos=%d, 0x%x\n", (DST_HEIGHT-1-i)*DST_WIDTH, tmp[(DST_HEIGHT-1-i)*DST_WIDTH]);
206*437bfbebSnyanmisaka             }*/
207*437bfbebSnyanmisaka             for (i = 0; i < DST_HEIGHT; i++) {
208*437bfbebSnyanmisaka                 for (j = 0; j < DST_WIDTH; j++) {
209*437bfbebSnyanmisaka                     if ( tmp[i * DST_WIDTH + j] != (i & 0xff))
210*437bfbebSnyanmisaka                         ret = 1;
211*437bfbebSnyanmisaka                 }
212*437bfbebSnyanmisaka             }
213*437bfbebSnyanmisaka             if ( ret)
214*437bfbebSnyanmisaka                 printf("framecount=%d pp operation is failed!\n", (framecnt - 1));
215*437bfbebSnyanmisaka             else
216*437bfbebSnyanmisaka                 printf("framecount=%d pp operation is suceess!\n", (framecnt - 1));
217*437bfbebSnyanmisaka 
218*437bfbebSnyanmisaka             memset(dst.vir_addr, 0xff, DST_SIZE);
219*437bfbebSnyanmisaka             VPUMemClean(&dst);
220*437bfbebSnyanmisaka #endif
221*437bfbebSnyanmisaka 
222*437bfbebSnyanmisaka #if 1
223*437bfbebSnyanmisaka             char *tmp = (char *)dst.vir_addr;
224*437bfbebSnyanmisaka             //memset(&tmp[DST_WIDTH*DST_HEIGHT], 0x80, DST_WIDTH*DST_HEIGHT/2);
225*437bfbebSnyanmisaka             //VPUMemClean(&dst);
226*437bfbebSnyanmisaka             fpw = fopen("/data/testout.yuv", "wb+");
227*437bfbebSnyanmisaka 
228*437bfbebSnyanmisaka             if (fpw)fwrite((char *)(dst.vir_addr), 1, dst_vir_width * dst_vir_height * 3 / 2, fpw);
229*437bfbebSnyanmisaka             if (fpw)fclose(fpw);
230*437bfbebSnyanmisaka #endif
231*437bfbebSnyanmisaka         }
232*437bfbebSnyanmisaka     }
233*437bfbebSnyanmisaka 
234*437bfbebSnyanmisaka end:
235*437bfbebSnyanmisaka     if (tmpbuf)free(tmpbuf);
236*437bfbebSnyanmisaka     if (src.phy_addr) VPUFreeLinear(&src);
237*437bfbebSnyanmisaka     if (dst.phy_addr) VPUFreeLinear(&dst);
238*437bfbebSnyanmisaka     if (vpuFd > 0) VPUClientRelease(vpuFd);
239*437bfbebSnyanmisaka     ALOGI("ppOp test end\n");
240*437bfbebSnyanmisaka     return 0;
241*437bfbebSnyanmisaka }
242*437bfbebSnyanmisaka 
243*437bfbebSnyanmisaka #endif
244*437bfbebSnyanmisaka 
245