xref: /haiku/src/tests/kits/media/mediaFormats.cpp (revision 268f99dd7dc4bd7474a8bd2742d3f1ec1de6752a)
173ff0e8fSAxel Dörfler /*
273ff0e8fSAxel Dörfler ** Copyright 2004, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
3b6f76ebeSAugustin Cavalier ** Distributed under the terms of the MIT License.
473ff0e8fSAxel Dörfler */
573ff0e8fSAxel Dörfler 
673ff0e8fSAxel Dörfler 
773ff0e8fSAxel Dörfler #include <MediaFormats.h>
873ff0e8fSAxel Dörfler 
973ff0e8fSAxel Dörfler #include <stdio.h>
1073ff0e8fSAxel Dörfler #include <string.h>
1173ff0e8fSAxel Dörfler 
1273ff0e8fSAxel Dörfler 
1373ff0e8fSAxel Dörfler static const char *
get_family_string(media_format_family family)1473ff0e8fSAxel Dörfler get_family_string(media_format_family family)
1573ff0e8fSAxel Dörfler {
1673ff0e8fSAxel Dörfler 	switch (family) {
1773ff0e8fSAxel Dörfler 		case B_BEOS_FORMAT_FAMILY:
1873ff0e8fSAxel Dörfler 			return "BeOS";
1973ff0e8fSAxel Dörfler 		case B_ANY_FORMAT_FAMILY:
2073ff0e8fSAxel Dörfler 			return "any";
2173ff0e8fSAxel Dörfler 		case B_QUICKTIME_FORMAT_FAMILY:
2273ff0e8fSAxel Dörfler 			return "QuickTime";
2373ff0e8fSAxel Dörfler 		case B_AVI_FORMAT_FAMILY:
2473ff0e8fSAxel Dörfler 			return "AVI";
2573ff0e8fSAxel Dörfler 		case B_ASF_FORMAT_FAMILY:
2673ff0e8fSAxel Dörfler 			return "ASF";
2773ff0e8fSAxel Dörfler 		case B_MPEG_FORMAT_FAMILY:
2873ff0e8fSAxel Dörfler 			return "MPEG";
2973ff0e8fSAxel Dörfler 		case B_WAV_FORMAT_FAMILY:
3073ff0e8fSAxel Dörfler 			return "WAV";
3173ff0e8fSAxel Dörfler 		case B_AIFF_FORMAT_FAMILY:
3273ff0e8fSAxel Dörfler 			return "AIFF";
3373ff0e8fSAxel Dörfler 		case B_AVR_FORMAT_FAMILY:
3473ff0e8fSAxel Dörfler 			return "AVR";
3573ff0e8fSAxel Dörfler 		case B_MISC_FORMAT_FAMILY:
3673ff0e8fSAxel Dörfler 			return "misc";
37*2ca13760SColdfirex // these are Haiku specific:
3873ff0e8fSAxel Dörfler //		case B_OGG_FORMAT_FAMILY:
3973ff0e8fSAxel Dörfler //			return "OGG";
4073ff0e8fSAxel Dörfler //		case B_META_FORMAT_FAMILY:
4173ff0e8fSAxel Dörfler //			return "meta";
4273ff0e8fSAxel Dörfler 		default:
4373ff0e8fSAxel Dörfler 			return "unknown";
4473ff0e8fSAxel Dörfler 	}
4573ff0e8fSAxel Dörfler }
4673ff0e8fSAxel Dörfler 
4773ff0e8fSAxel Dörfler 
4873ff0e8fSAxel Dörfler static const char *
get_mpeg_string(int32 id)4973ff0e8fSAxel Dörfler get_mpeg_string(int32 id)
5073ff0e8fSAxel Dörfler {
5173ff0e8fSAxel Dörfler 	switch (id) {
5273ff0e8fSAxel Dörfler 		case B_MPEG_ANY:
5373ff0e8fSAxel Dörfler 			return "any";
5473ff0e8fSAxel Dörfler 		case B_MPEG_1_AUDIO_LAYER_1:
5573ff0e8fSAxel Dörfler 			return "mpeg 1 audio layer 1";
5673ff0e8fSAxel Dörfler 		case B_MPEG_1_AUDIO_LAYER_2:
5773ff0e8fSAxel Dörfler 			return "mpeg 1 audio layer 2";
5873ff0e8fSAxel Dörfler 		case B_MPEG_1_AUDIO_LAYER_3:
5973ff0e8fSAxel Dörfler 			return "mpeg 1 audio layer 3 (mp3)";
6073ff0e8fSAxel Dörfler 		case B_MPEG_1_VIDEO:
6173ff0e8fSAxel Dörfler 			return "mpeg 1 video";
62*2ca13760SColdfirex // these are Haiku specific:
6373ff0e8fSAxel Dörfler /*		case B_MPEG_2_AUDIO_LAYER_1:
6473ff0e8fSAxel Dörfler 			return "mpeg 2 audio layer 1";
6573ff0e8fSAxel Dörfler 		case B_MPEG_2_AUDIO_LAYER_2:
6673ff0e8fSAxel Dörfler 			return "mpeg 2 audio layer 2";
6773ff0e8fSAxel Dörfler 		case B_MPEG_2_AUDIO_LAYER_3:
6873ff0e8fSAxel Dörfler 			return "mpeg 2 audio layer 3";
6973ff0e8fSAxel Dörfler 		case B_MPEG_2_VIDEO:
7073ff0e8fSAxel Dörfler 			return "mpeg 2 video";
7173ff0e8fSAxel Dörfler 		case B_MPEG_2_5_AUDIO_LAYER_1:
7273ff0e8fSAxel Dörfler 			return "mpeg 2.5 audio layer 1";
7373ff0e8fSAxel Dörfler 		case B_MPEG_2_5_AUDIO_LAYER_2:
7473ff0e8fSAxel Dörfler 			return "mpeg 2.5 audio layer 2";
7573ff0e8fSAxel Dörfler 		case B_MPEG_2_5_AUDIO_LAYER_3:
7673ff0e8fSAxel Dörfler 			return "mpeg 2.5 audio layer 3";
7773ff0e8fSAxel Dörfler */		default:
7873ff0e8fSAxel Dörfler 			return "unknown";
7973ff0e8fSAxel Dörfler 	}
8073ff0e8fSAxel Dörfler }
8173ff0e8fSAxel Dörfler 
8273ff0e8fSAxel Dörfler 
8373ff0e8fSAxel Dörfler static void
print_fourcc(uint32 id)8473ff0e8fSAxel Dörfler print_fourcc(uint32 id)
8573ff0e8fSAxel Dörfler {
8673ff0e8fSAxel Dörfler 	char string[5];
8773ff0e8fSAxel Dörfler 	for (int32 i = 0; i < 4; i++) {
8873ff0e8fSAxel Dörfler 		uint8 c = uint8((id >> (24 - i * 8)) & 0xff);
8973ff0e8fSAxel Dörfler 		if (c < ' ' || c > 0x7f)
9073ff0e8fSAxel Dörfler 			string[i] = '.';
9173ff0e8fSAxel Dörfler 		else
9273ff0e8fSAxel Dörfler 			string[i] = (char)c;
9373ff0e8fSAxel Dörfler 	}
9473ff0e8fSAxel Dörfler 	string[4] = '\0';
9573ff0e8fSAxel Dörfler 	printf("%s (0x%lx)\n", string, id);
9673ff0e8fSAxel Dörfler }
9773ff0e8fSAxel Dörfler 
9873ff0e8fSAxel Dörfler 
9973ff0e8fSAxel Dörfler void
dump_media_format_description(media_format_description & description)10073ff0e8fSAxel Dörfler dump_media_format_description(media_format_description &description)
10173ff0e8fSAxel Dörfler {
10273ff0e8fSAxel Dörfler 	printf("media_format_description:\n");
10373ff0e8fSAxel Dörfler 	printf("\tfamily:\t%s\n", get_family_string(description.family));
10473ff0e8fSAxel Dörfler 
10573ff0e8fSAxel Dörfler 	switch (description.family) {
10673ff0e8fSAxel Dörfler 		case B_BEOS_FORMAT_FAMILY:
10773ff0e8fSAxel Dörfler 			printf("\tformat:\t");
10873ff0e8fSAxel Dörfler 			print_fourcc(description.u.beos.format);
10973ff0e8fSAxel Dörfler 			break;
11073ff0e8fSAxel Dörfler 		case B_AVI_FORMAT_FAMILY:
11173ff0e8fSAxel Dörfler 		case B_AIFF_FORMAT_FAMILY:
11273ff0e8fSAxel Dörfler 		case B_WAV_FORMAT_FAMILY:
11373ff0e8fSAxel Dörfler 			printf("\tcodec:\t");
11473ff0e8fSAxel Dörfler 			print_fourcc(description.u.avi.codec);
11573ff0e8fSAxel Dörfler 			break;
11673ff0e8fSAxel Dörfler 		case B_AVR_FORMAT_FAMILY:
11773ff0e8fSAxel Dörfler 			printf("\tid:\t");
11873ff0e8fSAxel Dörfler 			print_fourcc(description.u.avr.id);
11973ff0e8fSAxel Dörfler 			break;
12073ff0e8fSAxel Dörfler 		case B_QUICKTIME_FORMAT_FAMILY:
12173ff0e8fSAxel Dörfler 			printf("\tcodec:\t");
12273ff0e8fSAxel Dörfler 			print_fourcc(description.u.quicktime.codec);
12373ff0e8fSAxel Dörfler 			printf("\tvendor:\t");
12473ff0e8fSAxel Dörfler 			print_fourcc(description.u.quicktime.vendor);
12573ff0e8fSAxel Dörfler 			break;
12673ff0e8fSAxel Dörfler 		case B_MISC_FORMAT_FAMILY:
12773ff0e8fSAxel Dörfler 			printf("\tcodec:\t\t");
12873ff0e8fSAxel Dörfler 			print_fourcc(description.u.misc.file_format);
12973ff0e8fSAxel Dörfler 			printf("\tfile format:\t");
13073ff0e8fSAxel Dörfler 			print_fourcc(description.u.misc.codec);
13173ff0e8fSAxel Dörfler 			break;
13273ff0e8fSAxel Dörfler 		case B_MPEG_FORMAT_FAMILY:
13373ff0e8fSAxel Dörfler 			printf("\ttype:\t%s\n", get_mpeg_string(description.u.mpeg.id));
13473ff0e8fSAxel Dörfler 			break;
13573ff0e8fSAxel Dörfler 		case B_ASF_FORMAT_FAMILY:
13673ff0e8fSAxel Dörfler 			// note, this is endian depended - you shouldn't do it this way for real...
13773ff0e8fSAxel Dörfler 			printf("\tguid:\t0x%Lx%Lx\n", *(uint64 *)&description.u.asf.guid.data[0], *(uint64 *)&description.u.asf.guid.data[8]);
13873ff0e8fSAxel Dörfler 		default:
13973ff0e8fSAxel Dörfler 			break;
14073ff0e8fSAxel Dörfler 	}
14173ff0e8fSAxel Dörfler }
14273ff0e8fSAxel Dörfler 
14373ff0e8fSAxel Dörfler 
14473ff0e8fSAxel Dörfler int
main(int argc,char ** argv)14573ff0e8fSAxel Dörfler main(int argc, char **argv)
14673ff0e8fSAxel Dörfler {
14773ff0e8fSAxel Dörfler 	BMediaFormats formats;
14873ff0e8fSAxel Dörfler 
14973ff0e8fSAxel Dörfler 	status_t status = formats.InitCheck();
15073ff0e8fSAxel Dörfler 	if (status != B_OK) {
15173ff0e8fSAxel Dörfler 		fprintf(stderr, "BMediaFormats::InitCheck() failed: %s\n", strerror(status));
15273ff0e8fSAxel Dörfler 		return -1;
15373ff0e8fSAxel Dörfler 	}
15473ff0e8fSAxel Dörfler 
15573ff0e8fSAxel Dörfler 	media_format format;
15673ff0e8fSAxel Dörfler 	status = formats.GetAVIFormatFor('DIVX', &format, B_MEDIA_ENCODED_VIDEO);
15773ff0e8fSAxel Dörfler 	if (status != B_OK) {
15873ff0e8fSAxel Dörfler 		fprintf(stderr, "BMediaFormats::GetAVIFormatFor() failed: %s\n", strerror(status));
15973ff0e8fSAxel Dörfler 		return -1;
16073ff0e8fSAxel Dörfler 	}
16173ff0e8fSAxel Dörfler 
16273ff0e8fSAxel Dörfler 	media_format_description description;
16373ff0e8fSAxel Dörfler 	status = formats.GetCodeFor(format, B_AVI_FORMAT_FAMILY, &description);
16473ff0e8fSAxel Dörfler 	if (status != B_OK) {
16573ff0e8fSAxel Dörfler 		fprintf(stderr, "BMediaFormats::GetCodeFor() failed: %s\n", strerror(status));
16673ff0e8fSAxel Dörfler 		return -1;
16773ff0e8fSAxel Dörfler 	}
16873ff0e8fSAxel Dörfler 	dump_media_format_description(description);
16973ff0e8fSAxel Dörfler 
17073ff0e8fSAxel Dörfler 	char desc[256];
17173ff0e8fSAxel Dörfler 	string_for_format(format, desc, sizeof(desc));
17273ff0e8fSAxel Dörfler 	printf("\tformat:\t%s\n", desc);
17373ff0e8fSAxel Dörfler 
17473ff0e8fSAxel Dörfler 	status = formats.GetCodeFor(format, B_MPEG_FORMAT_FAMILY, &description);
17573ff0e8fSAxel Dörfler 	if (status == B_OK) {
17673ff0e8fSAxel Dörfler 		fprintf(stderr, "BMediaFormats::GetCodeFor() succeded with wrong family!\n");
17773ff0e8fSAxel Dörfler 		return -1;
17873ff0e8fSAxel Dörfler 	}
17973ff0e8fSAxel Dörfler 
18073ff0e8fSAxel Dörfler 	puts("\n***** all supported formats *****");
18173ff0e8fSAxel Dörfler 
18273ff0e8fSAxel Dörfler 	// Rewind() should only work when the formats object is locked
18373ff0e8fSAxel Dörfler 	status = formats.RewindFormats();
18473ff0e8fSAxel Dörfler 	if (status == B_OK) {
18573ff0e8fSAxel Dörfler 		fprintf(stderr, "BMediaFormats::RewindFormats() succeded unlocked!\n");
18673ff0e8fSAxel Dörfler 		return -1;
18773ff0e8fSAxel Dörfler 	}
18873ff0e8fSAxel Dörfler 
18973ff0e8fSAxel Dörfler 	if (!formats.Lock()) {
19073ff0e8fSAxel Dörfler 		fprintf(stderr, "BMediaFormats::Lock() failed!\n");
19173ff0e8fSAxel Dörfler 		return -1;
19273ff0e8fSAxel Dörfler 	}
19373ff0e8fSAxel Dörfler 
19473ff0e8fSAxel Dörfler 	status = formats.RewindFormats();
19573ff0e8fSAxel Dörfler 	if (status != B_OK) {
19673ff0e8fSAxel Dörfler 		fprintf(stderr, "BMediaFormats::RewindFormats() failed: %s\n", strerror(status));
19773ff0e8fSAxel Dörfler 		return -1;
19873ff0e8fSAxel Dörfler 	}
19973ff0e8fSAxel Dörfler 
20073ff0e8fSAxel Dörfler 	int32 count = 0;
20173ff0e8fSAxel Dörfler 	while ((status = formats.GetNextFormat(&format, &description)) == B_OK) {
20273ff0e8fSAxel Dörfler 		dump_media_format_description(description);
20373ff0e8fSAxel Dörfler 		string_for_format(format, desc, sizeof(desc));
20473ff0e8fSAxel Dörfler 		printf("\tformat:\t%s\n", desc);
20573ff0e8fSAxel Dörfler 		count++;
20673ff0e8fSAxel Dörfler 	}
20773ff0e8fSAxel Dörfler 	if (status != B_BAD_INDEX)
20873ff0e8fSAxel Dörfler 		fprintf(stderr, "BMediaFormats::GetNextFormat() failed: %s\n", strerror(status));
20973ff0e8fSAxel Dörfler 
21073ff0e8fSAxel Dörfler 	printf("***** %ld supported formats *****\n", count);
21173ff0e8fSAxel Dörfler 
21273ff0e8fSAxel Dörfler 	formats.Unlock();
21373ff0e8fSAxel Dörfler 	return 0;
21473ff0e8fSAxel Dörfler }
215