1 #include "../../src/mixframemanager.h"
2 
3 gboolean stop_thread = FALSE;
4 GCond* data_cond = NULL;
5 GMutex* data_mutex = NULL;
6 
7 
deque_function(void * data)8 void *deque_function(void *data) {
9 
10 	MixFrameManager *fm = (MixFrameManager *) data;
11 	MIX_RESULT mixresult;
12 	MixVideoFrame *mvf = NULL;
13 	guint64 pts;
14 	while(!stop_thread) {
15 
16 		g_mutex_lock (data_mutex);
17 
18 		mixresult = mix_framemanager_dequeue(fm, &mvf);
19 		if(mixresult == MIX_RESULT_SUCCESS) {
20 			mixresult = mix_videoframe_get_timestamp(mvf, &pts);
21 			g_print("dequeued timestamp = %"G_GINT64_FORMAT"\n", pts);
22 			/* mix_videoframe_unref(mvf); */
23 		} else if(mixresult == MIX_RESULT_FRAME_NOTAVAIL) {
24 			g_print("mixresult == MIX_RESULT_FRAME_NOTAVAIL\n");
25 			g_cond_wait (data_cond, data_mutex);
26 		}
27 
28 		g_mutex_unlock (data_mutex);
29 
30 	}
31 }
32 
shuffle(GPtrArray * list)33 void shuffle(GPtrArray *list) {
34 	guint idx, jdx;
35 	guint len = list->len;
36 	for (idx = 0; idx < len - 1; idx++) {
37 		jdx = rand() % len;
38 		if (idx != jdx) {
39 			gpointer tmp = g_ptr_array_index(list, jdx);
40 			g_ptr_array_index(list, jdx) = g_ptr_array_index(list, idx);
41 			g_ptr_array_index(list, idx) = tmp;
42 		}
43 	}
44 }
45 
main()46 int main() {
47 	MIX_RESULT mixresult;
48 
49 	gint fps_n = 24000;
50 	gint fps_d = 1001;
51 
52 /*
53 	gint fps_n = 2500000;
54 	gint fps_d = 104297;
55 */
56 	GPtrArray *fa = NULL;
57 	MixFrameManager *fm = NULL;
58 	MixVideoFrame *mvf = NULL;
59 	MixVideoFrame *mvf_1st = NULL;
60 
61 	gint idx = 0;
62 	guint64 pts = 0;
63 
64 	GThread *deque_thread = NULL;
65 	GError *deque_thread_error = NULL;
66 
67 	/* first ting first */
68 	g_type_init();
69 
70 	/* create frame manager */
71 	fm = mix_framemanager_new();
72 	if (!fm) {
73 		goto cleanup;
74 	}
75 
76 	/* initialize frame manager */
77 	mixresult = mix_framemanager_initialize(fm,
78 			MIX_FRAMEORDER_MODE_DISPLAYORDER, fps_n, fps_d);
79 	if (mixresult != MIX_RESULT_SUCCESS) {
80 		goto cleanup;
81 	}
82 
83 	/* create frame_array */
84 	fa = g_ptr_array_sized_new(64);
85 	if (!fa) {
86 		goto cleanup;
87 	}
88 
89 	for (idx = 0; idx < 16; idx++) {
90 		/* generate MixVideoFrame */
91 		mvf = mix_videoframe_new();
92 		if (!mvf) {
93 			goto cleanup;
94 		}
95 
96 		pts = idx * G_USEC_PER_SEC * G_GINT64_CONSTANT(1000) * fps_d / fps_n;
97 		mixresult = mix_videoframe_set_timestamp(mvf, pts);
98 		if (mixresult != MIX_RESULT_SUCCESS) {
99 			goto cleanup;
100 		}
101 
102 		g_print("original timestamp = %"G_GINT64_FORMAT"\n", pts);
103 
104 		if (idx == 0) {
105 			mvf_1st = mvf;
106 		} else {
107 			g_ptr_array_add(fa, (gpointer) mvf);
108 		}
109 	}
110 
111 	/* shuffle the array */
112 	shuffle( fa);
113 
114 	data_mutex = g_mutex_new ();
115 	if(!data_mutex) {
116 		goto cleanup;
117 	}
118 
119 	data_cond =  g_cond_new();
120 	if(!data_cond) {
121 		goto cleanup;
122 	}
123 
124 
125 	/* create another thread to dequeue */
126 	deque_thread = g_thread_create((GThreadFunc) deque_function, (void *) fm,
127 			TRUE, &deque_thread_error);
128 	if (!deque_thread) {
129 		goto cleanup;
130 	}
131 
132 	/* enqueue */
133 	mixresult = mix_framemanager_enqueue(fm, mvf_1st);
134 	if (mixresult != MIX_RESULT_SUCCESS) {
135 		goto cleanup;
136 	}
137 
138 	mixresult = mix_videoframe_get_timestamp(mvf_1st, &pts);
139 	if (mixresult != MIX_RESULT_SUCCESS) {
140 		goto cleanup;
141 	}
142 	g_print("shuffled timestamp = %"G_GINT64_FORMAT"\n", pts);
143 
144 	for (idx = 0; idx < fa->len; idx++) {
145 
146 		g_mutex_lock (data_mutex);
147 
148 		/* wait for 100ms to enqueue another frame */
149 		g_usleep(G_USEC_PER_SEC / 10 );
150 
151 		mvf = (MixVideoFrame *) g_ptr_array_index(fa, idx);
152 		mixresult = mix_framemanager_enqueue(fm, mvf);
153 
154 		/* wake up deque thread */
155 		g_cond_signal (data_cond);
156 
157 
158 		g_mutex_unlock (data_mutex);
159 
160 		if (mixresult != MIX_RESULT_SUCCESS) {
161 			goto cleanup;
162 		}
163 
164 		mixresult = mix_videoframe_get_timestamp(mvf, &pts);
165 		if (mixresult != MIX_RESULT_SUCCESS) {
166 			goto cleanup;
167 		}
168 
169 		g_print("shuffled timestamp = %"G_GINT64_FORMAT"\n", pts);
170 	}
171 
172 	getchar();
173 
174 	stop_thread = TRUE;
175 
176 	/* wake up deque thread */
177 	g_cond_signal (data_cond);
178 
179 	g_thread_join(deque_thread);
180 
181 cleanup:
182 
183 	if(data_mutex) {
184 		g_mutex_free(data_mutex);
185 	}
186 
187 	if(data_cond) {
188 		g_cond_free(data_cond);
189 	}
190 
191 	if (fm) {
192 		mix_framemanager_unref(fm);
193 	}
194 
195 	if (fa) {
196 		g_ptr_array_free(fa, TRUE);
197 	}
198 
199 	return 0;
200 }
201