player_tester.c 4.05 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/*
    liblinphone_tester - liblinphone test suite
    Copyright (C) 2013  Belledonne Communications SARL

    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, see <http://www.gnu.org/licenses/>.
*/

19
#include "liblinphone_tester.h"
20
#include <mediastreamer2/mediastream.h>
21

22 23
static bool_t wait_for_eof(bool_t *eof, int *time,int time_refresh, int timeout) {
	while(*time < timeout && !*eof) {
Simon Morlat's avatar
Simon Morlat committed
24
		ms_usleep(time_refresh * 1000U);
25 26 27 28 29 30 31 32 33 34
		*time += time_refresh;
	}
	return *time < timeout;
}

static void eof_callback(LinphonePlayer *player, void *user_data) {
	bool_t *eof = (bool_t *)user_data;
	*eof = TRUE;
}

35
static void play_file(const char *filename, bool_t supported_format, const char *audio_mime, const char *video_mime) {
36 37 38 39
	LinphoneCoreManager *lc_manager;
	LinphonePlayer *player;
	int res, time = 0;
	bool_t eof = FALSE;
40 41
	bool_t audio_codec_supported;
	bool_t video_codec_supported;
42 43

	lc_manager = linphone_core_manager_new("marie_rc");
44
	BC_ASSERT_PTR_NOT_NULL(lc_manager);
45
	if(lc_manager == NULL) return;
46
	
47 48
	audio_codec_supported = (audio_mime && ms_factory_get_decoder(linphone_core_get_factory((void *)lc_manager->lc), audio_mime));
	video_codec_supported = (video_mime && ms_factory_get_decoder(linphone_core_get_factory((void *)lc_manager->lc), video_mime));
49

50 51 52
	player = linphone_core_create_local_player(lc_manager->lc,
											   ms_snd_card_manager_get_default_card(ms_factory_get_snd_manager(linphone_core_get_factory((void *)lc_manager->lc))),
																					video_stream_get_default_video_renderer(), 0);
53
	BC_ASSERT_PTR_NOT_NULL(player);
54 55
	if(player == NULL) goto fail;

56
	res = linphone_player_open(linphone_core_get_factory((void*)lc_manager->lc), player, filename, eof_callback, &eof);
57
	if(supported_format && (audio_codec_supported || video_codec_supported)) {
58
		BC_ASSERT_EQUAL(res, 0, int, "%d");
59 60
	} else {
		BC_ASSERT_EQUAL(res, -1, int, "%d");
61
	}
62
	
63 64
	if(res == -1) goto fail;

65
	res = linphone_player_start(player);
66
	BC_ASSERT_EQUAL(res, 0, int, "%d");
67 68
	if(res == -1) goto fail;

69
	BC_ASSERT_TRUE(wait_for_eof(&eof, &time, 100, (int)(linphone_player_get_duration(player) * 1.05)));
70 71 72 73

	linphone_player_close(player);

	fail:
74
	if(player) linphone_player_destroy(player);
75 76 77
	if(lc_manager) linphone_core_manager_destroy(lc_manager);
}

78
static void sintel_trailer_opus_h264_test(void) {
79
	char *filename = bc_tester_res("sounds/sintel_trailer_opus_h264.mkv");
80
	const char *audio_mime = "opus";
81
	const char *video_mime = "H264";
82
	play_file(filename, linphone_local_player_matroska_supported(), audio_mime, video_mime);
83 84 85 86 87 88 89
	ms_free(filename);
}

static void sintel_trailer_pcmu_h264_test(void) {
	char *filename = bc_tester_res("sounds/sintel_trailer_pcmu_h264.mkv");
	const char *audio_mime = "pcmu";
	const char *video_mime = "H264";
90
	play_file(filename, linphone_local_player_matroska_supported(), audio_mime, video_mime);
91 92 93 94 95 96 97
	ms_free(filename);
}

static void sintel_trailer_opus_vp8_test(void) {
	char *filename = bc_tester_res("sounds/sintel_trailer_opus_vp8.mkv");
	const char *audio_mime = "opus";
	const char *video_mime = "VP8";
98
	play_file(filename, linphone_local_player_matroska_supported(), audio_mime, video_mime);
99
	ms_free(filename);
100 101
}

102
test_t player_tests[] = {
103 104 105
	TEST_NO_TAG("Sintel trailer opus/h264", sintel_trailer_opus_h264_test),
	TEST_NO_TAG("Sintel trailer pcmu/h264", sintel_trailer_pcmu_h264_test),
	TEST_NO_TAG("Sintel trailer opus/VP8", sintel_trailer_opus_vp8_test)
106 107
};

108
test_suite_t player_test_suite = {"Player", NULL, NULL, liblinphone_tester_before_each, liblinphone_tester_after_each,
109
								  sizeof(player_tests) / sizeof(test_t), player_tests};