summaryrefslogtreecommitdiff
path: root/toxav/av_test.c
diff options
context:
space:
mode:
authormannol <eniz_vukovic@hotmail.com>2015-04-07 01:24:36 +0200
committermannol <eniz_vukovic@hotmail.com>2015-04-07 01:24:36 +0200
commitbf9f7e2ae8dc5f1b83c45e383ec70cb08c4caf5f (patch)
treef4b207c229396f7121872c52e8ac047def6d8cf2 /toxav/av_test.c
parent62c4fd7409c47a30a8290c0bd1c486ad4b4b1973 (diff)
Video works but there is one deadlock left and video replay is slow
Diffstat (limited to 'toxav/av_test.c')
-rw-r--r--toxav/av_test.c112
1 files changed, 60 insertions, 52 deletions
diff --git a/toxav/av_test.c b/toxav/av_test.c
index b7260d7d..28d19ec8 100644
--- a/toxav/av_test.c
+++ b/toxav/av_test.c
@@ -60,6 +60,12 @@ typedef struct {
60 uint32_t state; 60 uint32_t state;
61} CallControl; 61} CallControl;
62 62
63struct toxav_thread_data {
64 ToxAV* AliceAV;
65 ToxAV* BobAV;
66 int32_t sig;
67};
68
63const char* vdout = "AV Test"; 69const char* vdout = "AV Test";
64uint32_t adout; 70uint32_t adout;
65 71
@@ -240,17 +246,24 @@ int iterate_tox(Tox* bootstrap, ToxAV* AliceAV, ToxAV* BobAV)
240 tox_do(toxav_get_tox(AliceAV)); 246 tox_do(toxav_get_tox(AliceAV));
241 tox_do(toxav_get_tox(BobAV)); 247 tox_do(toxav_get_tox(BobAV));
242 248
243 toxav_iterate(AliceAV); 249 uint32_t rc = MIN(tox_do_interval(toxav_get_tox(AliceAV)), tox_do_interval(toxav_get_tox(BobAV)));
244 toxav_iterate(BobAV);
245
246 int mina = MIN(tox_do_interval(toxav_get_tox(AliceAV)), toxav_iteration_interval(AliceAV));
247 int minb = MIN(tox_do_interval(toxav_get_tox(BobAV)), toxav_iteration_interval(BobAV));
248
249 int rc = MIN(mina, minb);
250 c_sleep(rc); 250 c_sleep(rc);
251
252 return rc; 251 return rc;
253} 252}
253void* iterate_toxav (void * data)
254{
255 struct toxav_thread_data* data_cast = data;
256 while (data_cast->sig == 0) {
257 toxav_iterate(data_cast->AliceAV);
258 toxav_iterate(data_cast->BobAV);
259// c_sleep(1);
260 }
261
262 data_cast->sig = 1;
263
264 cvDestroyWindow(vdout);
265 pthread_exit(NULL);
266}
254 267
255int send_opencv_img(ToxAV* av, uint32_t friend_number, const IplImage* img) 268int send_opencv_img(ToxAV* av, uint32_t friend_number, const IplImage* img)
256{ 269{
@@ -282,13 +295,11 @@ int send_opencv_img(ToxAV* av, uint32_t friend_number, const IplImage* img)
282 } 295 }
283 296
284 297
285// int rc = toxav_send_video_frame(av, friend_number, img->width, img->height, planes[0], planes[1], planes[2], NULL); 298 int rc = toxav_send_video_frame(av, friend_number, img->width, img->height, planes[0], planes[1], planes[2], NULL);
286 t_toxav_receive_video_frame_cb(av, 0, img->width, img->height, (const uint8_t**) planes, strides, NULL);
287 free(planes[0]); 299 free(planes[0]);
288 free(planes[1]); 300 free(planes[1]);
289 free(planes[2]); 301 free(planes[2]);
290// return rc; 302 return rc;
291 return 0;
292} 303}
293 304
294ALCdevice* open_audio_device(const char* audio_out_dev_name) 305ALCdevice* open_audio_device(const char* audio_out_dev_name)
@@ -349,8 +360,10 @@ int print_help (const char* name)
349 return 0; 360 return 0;
350} 361}
351 362
363
352int main (int argc, char** argv) 364int main (int argc, char** argv)
353{ 365{
366 cvNamedWindow(vdout, CV_WINDOW_AUTOSIZE);
354 struct stat st; 367 struct stat st;
355 368
356 /* AV files for testing */ 369 /* AV files for testing */
@@ -409,32 +422,6 @@ int main (int argc, char** argv)
409 } 422 }
410 } 423 }
411 424
412
413 cvNamedWindow(vdout, CV_WINDOW_AUTOSIZE);
414
415 CvCapture* capture = cvCreateFileCapture(vf_name);
416 if (!capture) {
417 printf("Failed to open video file: %s\n", vf_name);
418 exit(1);
419 }
420
421 IplImage* frame;
422 time_t start_time = time(NULL);
423
424 int frame_rate = cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
425 while(start_time + 4 > time(NULL)) {
426 frame = cvQueryFrame( capture );
427 if (!frame)
428 break;
429
430 send_opencv_img(NULL, 0, frame);
431 c_sleep(1);
432 }
433
434 cvReleaseCapture(&capture);
435 cvDestroyWindow(vdout);
436
437 return 0;
438 const char* audio_out_dev_name = NULL; 425 const char* audio_out_dev_name = NULL;
439 426
440 int i = 0; 427 int i = 0;
@@ -459,9 +446,6 @@ int main (int argc, char** argv)
459 446
460 initialize_tox(&bootstrap, &AliceAV, &AliceCC, &BobAV, &BobCC); 447 initialize_tox(&bootstrap, &AliceAV, &AliceCC, &BobAV, &BobCC);
461 448
462
463
464
465#define REGULAR_CALL_FLOW(A_BR, V_BR) \ 449#define REGULAR_CALL_FLOW(A_BR, V_BR) \
466 do { \ 450 do { \
467 memset(&AliceCC, 0, sizeof(CallControl)); \ 451 memset(&AliceCC, 0, sizeof(CallControl)); \
@@ -737,6 +721,18 @@ int main (int argc, char** argv)
737 time_t start_time = time(NULL); 721 time_t start_time = time(NULL);
738 time_t expected_time = af_info.frames / af_info.samplerate + 2; 722 time_t expected_time = af_info.frames / af_info.samplerate + 2;
739 723
724
725 /* Start decode thread */
726 struct toxav_thread_data data = {
727 .AliceAV = AliceAV,
728 .BobAV = BobAV,
729 .sig = 0
730 };
731
732 pthread_t dect;
733 pthread_create(&dect, NULL, iterate_toxav, &data);
734 pthread_detach(dect);
735
740 while ( start_time + expected_time > time(NULL) ) { 736 while ( start_time + expected_time > time(NULL) ) {
741 int frame_size = (af_info.samplerate * frame_duration / 1000) * af_info.channels; 737 int frame_size = (af_info.samplerate * frame_duration / 1000) * af_info.channels;
742 738
@@ -772,6 +768,10 @@ int main (int argc, char** argv)
772 iterate_tox(bootstrap, AliceAV, BobAV); 768 iterate_tox(bootstrap, AliceAV, BobAV);
773 assert(BobCC.state == TOXAV_CALL_STATE_END); 769 assert(BobCC.state == TOXAV_CALL_STATE_END);
774 770
771 /* Stop decode thread */
772 data.sig = -1;
773 while(data.sig != 1);
774
775 printf("Success!"); 775 printf("Success!");
776 } 776 }
777 777
@@ -783,7 +783,7 @@ int main (int argc, char** argv)
783 783
784 { /* Call */ 784 { /* Call */
785 TOXAV_ERR_CALL rc; 785 TOXAV_ERR_CALL rc;
786 toxav_call(AliceAV, 0, 0, 500000, &rc); 786 toxav_call(AliceAV, 0, 0, 5000000, &rc);
787 787
788 if (rc != TOXAV_ERR_CALL_OK) { 788 if (rc != TOXAV_ERR_CALL_OK) {
789 printf("toxav_call failed: %d\n", rc); 789 printf("toxav_call failed: %d\n", rc);
@@ -796,7 +796,7 @@ int main (int argc, char** argv)
796 796
797 { /* Answer */ 797 { /* Answer */
798 TOXAV_ERR_ANSWER rc; 798 TOXAV_ERR_ANSWER rc;
799 toxav_answer(BobAV, 0, 0, 500000, &rc); 799 toxav_answer(BobAV, 0, 0, 5000000, &rc);
800 800
801 if (rc != TOXAV_ERR_ANSWER_OK) { 801 if (rc != TOXAV_ERR_ANSWER_OK) {
802 printf("toxav_answer failed: %d\n", rc); 802 printf("toxav_answer failed: %d\n", rc);
@@ -806,7 +806,16 @@ int main (int argc, char** argv)
806 806
807 iterate_tox(bootstrap, AliceAV, BobAV); 807 iterate_tox(bootstrap, AliceAV, BobAV);
808 808
809 cvNamedWindow(vdout, CV_WINDOW_AUTOSIZE); 809 /* Start decode thread */
810 struct toxav_thread_data data = {
811 .AliceAV = AliceAV,
812 .BobAV = BobAV,
813 .sig = 0
814 };
815
816 pthread_t dect;
817 pthread_create(&dect, NULL, iterate_toxav, &data);
818 pthread_detach(dect);
810 819
811 CvCapture* capture = cvCreateFileCapture(vf_name); 820 CvCapture* capture = cvCreateFileCapture(vf_name);
812 if (!capture) { 821 if (!capture) {
@@ -814,23 +823,17 @@ int main (int argc, char** argv)
814 exit(1); 823 exit(1);
815 } 824 }
816 825
817 IplImage* frame;
818 time_t start_time = time(NULL); 826 time_t start_time = time(NULL);
819 827 while(start_time + 6 > time(NULL)) {
820 int frame_rate = cvGetCaptureProperty(capture, CV_CAP_PROP_FPS); 828 IplImage* frame = cvQueryFrame( capture );
821 while(start_time + 10 > time(NULL)) {
822 frame = cvQueryFrame( capture );
823 if (!frame) 829 if (!frame)
824 break; 830 break;
825 831
826// cvShowImage(vdout, frame);
827// cvWaitKey(frame_rate);
828 send_opencv_img(AliceAV, 0, frame); 832 send_opencv_img(AliceAV, 0, frame);
829 iterate_tox(bootstrap, AliceAV, BobAV); 833 iterate_tox(bootstrap, AliceAV, BobAV);
830 } 834 }
831 835
832 cvReleaseCapture(&capture); 836 cvReleaseCapture(&capture);
833 cvDestroyWindow(vdout);
834 837
835 { /* Hangup */ 838 { /* Hangup */
836 TOXAV_ERR_CALL_CONTROL rc; 839 TOXAV_ERR_CALL_CONTROL rc;
@@ -845,6 +848,11 @@ int main (int argc, char** argv)
845 iterate_tox(bootstrap, AliceAV, BobAV); 848 iterate_tox(bootstrap, AliceAV, BobAV);
846 assert(BobCC.state == TOXAV_CALL_STATE_END); 849 assert(BobCC.state == TOXAV_CALL_STATE_END);
847 850
851 /* Stop decode thread */
852 printf("Stopping decode thread");
853 data.sig = -1;
854 while(data.sig != 1);
855
848 printf("Success!"); 856 printf("Success!");
849 } 857 }
850 858