mediastreamer2_player_tester.c 4.34 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/*
mediastreamer2 library - modular sound and video processing and streaming
Copyright (C) 2006-2013 Belledonne Communications, Grenoble

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*/

François Grisez's avatar
François Grisez committed
20
#include "mediastreamer2_tester.h"
21
#include "mediastreamer2/msmediaplayer.h"
François Grisez's avatar
François Grisez committed
22 23

static int tester_init() {
24
	ortp_set_log_level_mask(ORTP_MESSAGE | ORTP_WARNING | ORTP_ERROR | ORTP_FATAL);
François Grisez's avatar
François Grisez committed
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
	ms_init();
	return 0;
}

static int tester_cleanup() {
	ms_exit();
	return 0;
}

typedef struct _Eof {
	bool_t eof;
	int time_ms;
	ms_mutex_t mutex;
} Eof;

static void eof_init(Eof *obj) {
	obj->eof = FALSE;
	obj->time_ms = 0;
	ms_mutex_init(&obj->mutex, NULL);
}

static void eof_callback(void *user_data) {
	Eof *obj = (Eof *)user_data;
	ms_mutex_lock(&obj->mutex);
	obj->eof = TRUE;
	ms_mutex_unlock(&obj->mutex);
}

static void wait_for_eof(Eof *obj, int refresh_time_ms, int timeout_ms) {
	ms_mutex_lock(&obj->mutex);
	while(obj->time_ms < timeout_ms && !obj->eof) {
		ms_mutex_unlock(&obj->mutex);
57
		ms_usleep((useconds_t)(refresh_time_ms) * 1000U);
François Grisez's avatar
François Grisez committed
58 59 60 61 62 63
		obj->time_ms += refresh_time_ms;
		ms_mutex_lock(&obj->mutex);
	}
	ms_mutex_unlock(&obj->mutex);
}

64
static void play_file(const char *filepath, bool_t unsupported_format, bool_t seeking_test, int timeout) {
François Grisez's avatar
François Grisez committed
65 66
	bool_t succeed;
	Eof eof;
67
	MSMediaPlayer *file_player = NULL;
François Grisez's avatar
François Grisez committed
68
	MSSndCard *snd_card = ms_snd_card_manager_get_default_card(ms_snd_card_manager_get());
François Grisez's avatar
François Grisez committed
69 70 71 72
	const char *display_name = video_stream_get_default_video_renderer();

	eof_init(&eof);

73
	file_player = ms_media_player_new(snd_card, display_name, NULL);
François Grisez's avatar
François Grisez committed
74 75 76
	CU_ASSERT_PTR_NOT_NULL(file_player);
	if(file_player == NULL) return;

77
	ms_media_player_set_eof_callback(file_player, eof_callback, &eof);
François Grisez's avatar
François Grisez committed
78

79
	succeed = ms_media_player_open(file_player, filepath);
François Grisez's avatar
François Grisez committed
80 81 82 83 84 85
	if(unsupported_format) {
		CU_ASSERT_FALSE(succeed);
	} else {
		CU_ASSERT_TRUE(succeed);
	}
	if(!succeed) {
86
		ms_media_player_free(file_player);
François Grisez's avatar
François Grisez committed
87 88 89
		return;
	}

90
	succeed = ms_media_player_start(file_player);
François Grisez's avatar
François Grisez committed
91 92
	CU_ASSERT_TRUE(succeed);

93
	if(seeking_test) {
94
		CU_ASSERT_TRUE(ms_media_player_seek(file_player, 5000));
95 96
	}

François Grisez's avatar
François Grisez committed
97
	if(succeed) {
98
		wait_for_eof(&eof, 100, timeout);
François Grisez's avatar
François Grisez committed
99 100
	}

101 102
	ms_media_player_close(file_player);
	ms_media_player_free(file_player);
François Grisez's avatar
François Grisez committed
103 104 105 106
	CU_ASSERT_TRUE(eof.eof);
}

static void play_hello_8000_wav(void) {
107
	play_file("./sounds/hello8000.wav", FALSE, FALSE, 20000);
François Grisez's avatar
François Grisez committed
108 109 110
}

static void play_hello_16000_wav(void) {
111
	play_file("./sounds/hello16000.wav", FALSE, FALSE, 20000);
François Grisez's avatar
François Grisez committed
112 113 114
}

static void play_hello_pcmu_mka(void) {
115
	play_file("./sounds/hello_pcmu.mka", !ms_media_player_matroska_supported(), FALSE, 20000);
François Grisez's avatar
François Grisez committed
116 117 118
}

static void play_hello_opus_mka(void) {
119
	play_file("./sounds/hello_opus.mka", !ms_media_player_matroska_supported(), FALSE, 20000);
François Grisez's avatar
François Grisez committed
120 121 122
}

static void play_hello_pcmu_h264_mkv(void) {
123
	play_file("./sounds/hello_pcmu_h264.mkv", !ms_media_player_matroska_supported(), FALSE, 20000);
François Grisez's avatar
François Grisez committed
124 125 126
}

static void play_hello_opus_h264_mkv(void) {
127
	play_file("./sounds/hello_opus_h264.mkv", !ms_media_player_matroska_supported(), FALSE, 20000);
128 129
}

130
static void seeking_test(void) {
131
	play_file("./sounds/hello_opus_h264.mkv", !ms_media_player_matroska_supported(), TRUE, 15000);
François Grisez's avatar
François Grisez committed
132 133 134
}

static test_t tests[] = {
135 136 137 138 139 140
	{	"Play hello8000.wav"                ,	play_hello_8000_wav               },
	{	"Play hello16000.wav"               ,	play_hello_16000_wav              },
	{	"Play hello_pcmu.mka"               ,	play_hello_pcmu_mka               },
	{	"Play hello_opus.mka"               ,	play_hello_opus_mka               },
	{	"Play hello_pcmu_h264.mkv"          ,	play_hello_pcmu_h264_mkv          },
	{	"Play hello_opus_h264.mkv"          ,	play_hello_opus_h264_mkv          },
141
	{	"Seeking"                           ,	seeking_test                      }
François Grisez's avatar
François Grisez committed
142 143 144 145 146 147 148 149 150
};

test_suite_t player_test_suite = {
	"Player",
	tester_init,
	tester_cleanup,
	sizeof(tests)/sizeof(test_t),
	tests
};