xref: /rockchip-linux_mpp/mpp/base/test/mpp_task_test.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka #include "mpp_time.h"
2*437bfbebSnyanmisaka #include "mpp_debug.h"
3*437bfbebSnyanmisaka #include "mpp_thread.h"
4*437bfbebSnyanmisaka 
5*437bfbebSnyanmisaka #include "mpp_task.h"
6*437bfbebSnyanmisaka #include "mpp_task_impl.h"
7*437bfbebSnyanmisaka 
8*437bfbebSnyanmisaka #define MAX_TASK_LOOP   10000
9*437bfbebSnyanmisaka 
10*437bfbebSnyanmisaka static MppTaskQueue input  = NULL;
11*437bfbebSnyanmisaka static MppTaskQueue output = NULL;
12*437bfbebSnyanmisaka 
task_input(void * arg)13*437bfbebSnyanmisaka void *task_input(void *arg)
14*437bfbebSnyanmisaka {
15*437bfbebSnyanmisaka     RK_S32 i;
16*437bfbebSnyanmisaka     MppTask task = NULL;
17*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
18*437bfbebSnyanmisaka     MppPort port = mpp_task_queue_get_port(input, MPP_PORT_INPUT);
19*437bfbebSnyanmisaka     MppFrame frm;
20*437bfbebSnyanmisaka 
21*437bfbebSnyanmisaka     mpp_frame_init(&frm);
22*437bfbebSnyanmisaka 
23*437bfbebSnyanmisaka     for (i = 0; i < MAX_TASK_LOOP; i++) {
24*437bfbebSnyanmisaka         ret = mpp_port_poll(port, MPP_POLL_BLOCK);
25*437bfbebSnyanmisaka         mpp_assert(ret >= 0);
26*437bfbebSnyanmisaka 
27*437bfbebSnyanmisaka         ret = mpp_port_dequeue(port, &task);
28*437bfbebSnyanmisaka         mpp_assert(!ret);
29*437bfbebSnyanmisaka         mpp_assert(task);
30*437bfbebSnyanmisaka 
31*437bfbebSnyanmisaka         ret = mpp_port_enqueue(port, task);
32*437bfbebSnyanmisaka         mpp_assert(!ret);
33*437bfbebSnyanmisaka     }
34*437bfbebSnyanmisaka 
35*437bfbebSnyanmisaka     mpp_frame_deinit(&frm);
36*437bfbebSnyanmisaka 
37*437bfbebSnyanmisaka     (void)arg;
38*437bfbebSnyanmisaka     return NULL;
39*437bfbebSnyanmisaka }
40*437bfbebSnyanmisaka 
task_output(void * arg)41*437bfbebSnyanmisaka void *task_output(void *arg)
42*437bfbebSnyanmisaka {
43*437bfbebSnyanmisaka     RK_S32 i;
44*437bfbebSnyanmisaka     MppTask task = NULL;
45*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
46*437bfbebSnyanmisaka     MppPort port = mpp_task_queue_get_port(output, MPP_PORT_OUTPUT);
47*437bfbebSnyanmisaka     MppPacket pkt;
48*437bfbebSnyanmisaka 
49*437bfbebSnyanmisaka     mpp_packet_init(&pkt, NULL, 0);
50*437bfbebSnyanmisaka 
51*437bfbebSnyanmisaka     for (i = 0; i < MAX_TASK_LOOP; i++) {
52*437bfbebSnyanmisaka         ret = mpp_port_poll(port, MPP_POLL_BLOCK);
53*437bfbebSnyanmisaka         mpp_assert(ret >= 0);
54*437bfbebSnyanmisaka 
55*437bfbebSnyanmisaka         ret = mpp_port_dequeue(port, &task);
56*437bfbebSnyanmisaka         mpp_assert(!ret);
57*437bfbebSnyanmisaka         mpp_assert(task);
58*437bfbebSnyanmisaka 
59*437bfbebSnyanmisaka         ret = mpp_port_enqueue(port, task);
60*437bfbebSnyanmisaka         mpp_assert(!ret);
61*437bfbebSnyanmisaka     }
62*437bfbebSnyanmisaka 
63*437bfbebSnyanmisaka     mpp_packet_deinit(&pkt);
64*437bfbebSnyanmisaka 
65*437bfbebSnyanmisaka     (void)arg;
66*437bfbebSnyanmisaka     return NULL;
67*437bfbebSnyanmisaka }
68*437bfbebSnyanmisaka 
task_in_and_out(void * arg)69*437bfbebSnyanmisaka void *task_in_and_out(void *arg)
70*437bfbebSnyanmisaka {
71*437bfbebSnyanmisaka     RK_S32 i;
72*437bfbebSnyanmisaka     MppTask task = NULL;
73*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
74*437bfbebSnyanmisaka     MppPort port_input  = mpp_task_queue_get_port(input, MPP_PORT_INPUT);
75*437bfbebSnyanmisaka     MppPort port_output = mpp_task_queue_get_port(output, MPP_PORT_OUTPUT);
76*437bfbebSnyanmisaka 
77*437bfbebSnyanmisaka     for (i = 0; i < MAX_TASK_LOOP; i++) {
78*437bfbebSnyanmisaka         ret = mpp_port_poll(port_input, MPP_POLL_BLOCK);
79*437bfbebSnyanmisaka         mpp_assert(ret >= 0);
80*437bfbebSnyanmisaka 
81*437bfbebSnyanmisaka         ret = mpp_port_dequeue(port_input, &task);
82*437bfbebSnyanmisaka         mpp_assert(!ret);
83*437bfbebSnyanmisaka         mpp_assert(task);
84*437bfbebSnyanmisaka 
85*437bfbebSnyanmisaka         ret = mpp_port_enqueue(port_input, task);
86*437bfbebSnyanmisaka         mpp_assert(!ret);
87*437bfbebSnyanmisaka 
88*437bfbebSnyanmisaka 
89*437bfbebSnyanmisaka         ret = mpp_port_poll(port_output, MPP_POLL_BLOCK);
90*437bfbebSnyanmisaka         mpp_assert(ret >= 0);
91*437bfbebSnyanmisaka 
92*437bfbebSnyanmisaka         ret = mpp_port_dequeue(port_output, &task);
93*437bfbebSnyanmisaka         mpp_assert(!ret);
94*437bfbebSnyanmisaka         mpp_assert(task);
95*437bfbebSnyanmisaka 
96*437bfbebSnyanmisaka         ret = mpp_port_enqueue(port_output, task);
97*437bfbebSnyanmisaka         mpp_assert(!ret);
98*437bfbebSnyanmisaka     }
99*437bfbebSnyanmisaka 
100*437bfbebSnyanmisaka     (void)arg;
101*437bfbebSnyanmisaka     return NULL;
102*437bfbebSnyanmisaka }
103*437bfbebSnyanmisaka 
task_worker(void * arg)104*437bfbebSnyanmisaka void *task_worker(void *arg)
105*437bfbebSnyanmisaka {
106*437bfbebSnyanmisaka     RK_S32 i;
107*437bfbebSnyanmisaka     MppTask task = NULL;
108*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
109*437bfbebSnyanmisaka     MppPort port_src = mpp_task_queue_get_port(input, MPP_PORT_OUTPUT);
110*437bfbebSnyanmisaka     MppPort port_dst = mpp_task_queue_get_port(output, MPP_PORT_INPUT);
111*437bfbebSnyanmisaka 
112*437bfbebSnyanmisaka     for (i = 0; i < MAX_TASK_LOOP; i++) {
113*437bfbebSnyanmisaka         ret = mpp_port_poll(port_src, MPP_POLL_BLOCK);
114*437bfbebSnyanmisaka         mpp_assert(ret >= 0);
115*437bfbebSnyanmisaka 
116*437bfbebSnyanmisaka         ret = mpp_port_dequeue(port_src, &task);
117*437bfbebSnyanmisaka         mpp_assert(!ret);
118*437bfbebSnyanmisaka         mpp_assert(task);
119*437bfbebSnyanmisaka 
120*437bfbebSnyanmisaka         ret = mpp_port_enqueue(port_src, task);
121*437bfbebSnyanmisaka         mpp_assert(!ret);
122*437bfbebSnyanmisaka 
123*437bfbebSnyanmisaka         ret = mpp_port_poll(port_dst, MPP_POLL_BLOCK);
124*437bfbebSnyanmisaka         mpp_assert(ret >= 0);
125*437bfbebSnyanmisaka 
126*437bfbebSnyanmisaka         ret = mpp_port_dequeue(port_dst, &task);
127*437bfbebSnyanmisaka         mpp_assert(!ret);
128*437bfbebSnyanmisaka         mpp_assert(task);
129*437bfbebSnyanmisaka 
130*437bfbebSnyanmisaka         ret = mpp_port_enqueue(port_dst, task);
131*437bfbebSnyanmisaka         mpp_assert(!ret);
132*437bfbebSnyanmisaka     }
133*437bfbebSnyanmisaka 
134*437bfbebSnyanmisaka     (void)arg;
135*437bfbebSnyanmisaka     return NULL;
136*437bfbebSnyanmisaka }
137*437bfbebSnyanmisaka 
serial_task(void)138*437bfbebSnyanmisaka void serial_task(void)
139*437bfbebSnyanmisaka {
140*437bfbebSnyanmisaka     RK_S32 i;
141*437bfbebSnyanmisaka     MppTask task = NULL;
142*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
143*437bfbebSnyanmisaka     MppPort port_ii = mpp_task_queue_get_port(input, MPP_PORT_INPUT);
144*437bfbebSnyanmisaka     MppPort port_io = mpp_task_queue_get_port(input, MPP_PORT_OUTPUT);
145*437bfbebSnyanmisaka     MppPort port_oi = mpp_task_queue_get_port(output, MPP_PORT_INPUT);
146*437bfbebSnyanmisaka     MppPort port_oo = mpp_task_queue_get_port(output, MPP_PORT_OUTPUT);
147*437bfbebSnyanmisaka 
148*437bfbebSnyanmisaka     for (i = 0; i < MAX_TASK_LOOP; i++) {
149*437bfbebSnyanmisaka         ret = mpp_port_poll(port_ii, MPP_POLL_BLOCK);
150*437bfbebSnyanmisaka         mpp_assert(ret >= 0);
151*437bfbebSnyanmisaka 
152*437bfbebSnyanmisaka         ret = mpp_port_dequeue(port_ii, &task);
153*437bfbebSnyanmisaka         mpp_assert(!ret);
154*437bfbebSnyanmisaka         mpp_assert(task);
155*437bfbebSnyanmisaka 
156*437bfbebSnyanmisaka         ret = mpp_port_enqueue(port_ii, task);
157*437bfbebSnyanmisaka         mpp_assert(!ret);
158*437bfbebSnyanmisaka 
159*437bfbebSnyanmisaka 
160*437bfbebSnyanmisaka         ret = mpp_port_poll(port_io, MPP_POLL_BLOCK);
161*437bfbebSnyanmisaka         mpp_assert(ret >= 0);
162*437bfbebSnyanmisaka 
163*437bfbebSnyanmisaka         ret = mpp_port_dequeue(port_io, &task);
164*437bfbebSnyanmisaka         mpp_assert(!ret);
165*437bfbebSnyanmisaka         mpp_assert(task);
166*437bfbebSnyanmisaka 
167*437bfbebSnyanmisaka         ret = mpp_port_enqueue(port_io, task);
168*437bfbebSnyanmisaka         mpp_assert(!ret);
169*437bfbebSnyanmisaka 
170*437bfbebSnyanmisaka 
171*437bfbebSnyanmisaka         ret = mpp_port_poll(port_oi, MPP_POLL_BLOCK);
172*437bfbebSnyanmisaka         mpp_assert(ret >= 0);
173*437bfbebSnyanmisaka 
174*437bfbebSnyanmisaka         ret = mpp_port_dequeue(port_oi, &task);
175*437bfbebSnyanmisaka         mpp_assert(!ret);
176*437bfbebSnyanmisaka         mpp_assert(task);
177*437bfbebSnyanmisaka 
178*437bfbebSnyanmisaka         ret = mpp_port_enqueue(port_oi, task);
179*437bfbebSnyanmisaka         mpp_assert(!ret);
180*437bfbebSnyanmisaka 
181*437bfbebSnyanmisaka 
182*437bfbebSnyanmisaka         ret = mpp_port_poll(port_oo, MPP_POLL_BLOCK);
183*437bfbebSnyanmisaka         mpp_assert(ret >= 0);
184*437bfbebSnyanmisaka 
185*437bfbebSnyanmisaka         ret = mpp_port_dequeue(port_oo, &task);
186*437bfbebSnyanmisaka         mpp_assert(!ret);
187*437bfbebSnyanmisaka         mpp_assert(task);
188*437bfbebSnyanmisaka 
189*437bfbebSnyanmisaka         ret = mpp_port_enqueue(port_oo, task);
190*437bfbebSnyanmisaka         mpp_assert(!ret);
191*437bfbebSnyanmisaka     }
192*437bfbebSnyanmisaka }
193*437bfbebSnyanmisaka 
main()194*437bfbebSnyanmisaka int main()
195*437bfbebSnyanmisaka {
196*437bfbebSnyanmisaka     RK_S64 time_start, time_end;
197*437bfbebSnyanmisaka 
198*437bfbebSnyanmisaka     pthread_t thread_input;
199*437bfbebSnyanmisaka     pthread_t thread_output;
200*437bfbebSnyanmisaka     pthread_t thread_in_and_out;
201*437bfbebSnyanmisaka     pthread_t thread_worker;
202*437bfbebSnyanmisaka     pthread_attr_t attr;
203*437bfbebSnyanmisaka     void *dummy;
204*437bfbebSnyanmisaka 
205*437bfbebSnyanmisaka     mpp_log("mpp task test start\n");
206*437bfbebSnyanmisaka 
207*437bfbebSnyanmisaka     mpp_task_queue_init(&input, NULL, "test_input");
208*437bfbebSnyanmisaka     mpp_task_queue_init(&output, NULL, "test_output");
209*437bfbebSnyanmisaka     mpp_task_queue_setup(input, 4);
210*437bfbebSnyanmisaka     mpp_task_queue_setup(output, 4);
211*437bfbebSnyanmisaka 
212*437bfbebSnyanmisaka     pthread_attr_init(&attr);
213*437bfbebSnyanmisaka     pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
214*437bfbebSnyanmisaka 
215*437bfbebSnyanmisaka     mpp_debug = MPP_DBG_TIMING;
216*437bfbebSnyanmisaka 
217*437bfbebSnyanmisaka     time_start = mpp_time();
218*437bfbebSnyanmisaka     pthread_create(&thread_input,  &attr, task_input,  NULL);
219*437bfbebSnyanmisaka     pthread_create(&thread_output, &attr, task_output, NULL);
220*437bfbebSnyanmisaka     pthread_create(&thread_worker, &attr, task_worker, NULL);
221*437bfbebSnyanmisaka 
222*437bfbebSnyanmisaka     pthread_join(thread_input, &dummy);
223*437bfbebSnyanmisaka     pthread_join(thread_worker, &dummy);
224*437bfbebSnyanmisaka     pthread_join(thread_output, &dummy);
225*437bfbebSnyanmisaka     time_end = mpp_time();
226*437bfbebSnyanmisaka     mpp_time_diff(time_start, time_end, 0, "3 thread test");
227*437bfbebSnyanmisaka 
228*437bfbebSnyanmisaka     time_start = mpp_time();
229*437bfbebSnyanmisaka     pthread_create(&thread_in_and_out,  &attr, task_in_and_out,  NULL);
230*437bfbebSnyanmisaka     pthread_create(&thread_worker, &attr, task_worker, NULL);
231*437bfbebSnyanmisaka 
232*437bfbebSnyanmisaka     pthread_join(thread_in_and_out, &dummy);
233*437bfbebSnyanmisaka     pthread_join(thread_worker, &dummy);
234*437bfbebSnyanmisaka     time_end = mpp_time();
235*437bfbebSnyanmisaka     mpp_time_diff(time_start, time_end, 0, "2 thread test");
236*437bfbebSnyanmisaka     pthread_attr_destroy(&attr);
237*437bfbebSnyanmisaka 
238*437bfbebSnyanmisaka     time_start = mpp_time();
239*437bfbebSnyanmisaka     serial_task();
240*437bfbebSnyanmisaka     time_end = mpp_time();
241*437bfbebSnyanmisaka     mpp_time_diff(time_start, time_end, 0, "1 thread test");
242*437bfbebSnyanmisaka 
243*437bfbebSnyanmisaka     mpp_debug = 0;
244*437bfbebSnyanmisaka 
245*437bfbebSnyanmisaka     mpp_task_queue_deinit(input);
246*437bfbebSnyanmisaka     mpp_task_queue_deinit(output);
247*437bfbebSnyanmisaka 
248*437bfbebSnyanmisaka     mpp_log("mpp task test done\n");
249*437bfbebSnyanmisaka 
250*437bfbebSnyanmisaka     return 0;
251*437bfbebSnyanmisaka }
252*437bfbebSnyanmisaka 
253