xref: /haiku/src/tests/kits/media/mediaFormats.cpp (revision 73ff0e8f0231ffd1c5df9122d3aaf5684110443f)
1*73ff0e8fSAxel Dörfler /*
2*73ff0e8fSAxel Dörfler ** Copyright 2004, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
3*73ff0e8fSAxel Dörfler ** Distributed under the terms of the OpenBeOS License.
4*73ff0e8fSAxel Dörfler */
5*73ff0e8fSAxel Dörfler 
6*73ff0e8fSAxel Dörfler 
7*73ff0e8fSAxel Dörfler #include <MediaFormats.h>
8*73ff0e8fSAxel Dörfler 
9*73ff0e8fSAxel Dörfler #include <stdio.h>
10*73ff0e8fSAxel Dörfler #include <string.h>
11*73ff0e8fSAxel Dörfler 
12*73ff0e8fSAxel Dörfler 
13*73ff0e8fSAxel Dörfler static const char *
14*73ff0e8fSAxel Dörfler get_family_string(media_format_family family)
15*73ff0e8fSAxel Dörfler {
16*73ff0e8fSAxel Dörfler 	switch (family) {
17*73ff0e8fSAxel Dörfler 		case B_BEOS_FORMAT_FAMILY:
18*73ff0e8fSAxel Dörfler 			return "BeOS";
19*73ff0e8fSAxel Dörfler 		case B_ANY_FORMAT_FAMILY:
20*73ff0e8fSAxel Dörfler 			return "any";
21*73ff0e8fSAxel Dörfler 		case B_QUICKTIME_FORMAT_FAMILY:
22*73ff0e8fSAxel Dörfler 			return "QuickTime";
23*73ff0e8fSAxel Dörfler 		case B_AVI_FORMAT_FAMILY:
24*73ff0e8fSAxel Dörfler 			return "AVI";
25*73ff0e8fSAxel Dörfler 		case B_ASF_FORMAT_FAMILY:
26*73ff0e8fSAxel Dörfler 			return "ASF";
27*73ff0e8fSAxel Dörfler 		case B_MPEG_FORMAT_FAMILY:
28*73ff0e8fSAxel Dörfler 			return "MPEG";
29*73ff0e8fSAxel Dörfler 		case B_WAV_FORMAT_FAMILY:
30*73ff0e8fSAxel Dörfler 			return "WAV";
31*73ff0e8fSAxel Dörfler 		case B_AIFF_FORMAT_FAMILY:
32*73ff0e8fSAxel Dörfler 			return "AIFF";
33*73ff0e8fSAxel Dörfler 		case B_AVR_FORMAT_FAMILY:
34*73ff0e8fSAxel Dörfler 			return "AVR";
35*73ff0e8fSAxel Dörfler 		case B_MISC_FORMAT_FAMILY:
36*73ff0e8fSAxel Dörfler 			return "misc";
37*73ff0e8fSAxel Dörfler // these are OpenBeOS specific:
38*73ff0e8fSAxel Dörfler //		case B_OGG_FORMAT_FAMILY:
39*73ff0e8fSAxel Dörfler //			return "OGG";
40*73ff0e8fSAxel Dörfler //		case B_META_FORMAT_FAMILY:
41*73ff0e8fSAxel Dörfler //			return "meta";
42*73ff0e8fSAxel Dörfler 		default:
43*73ff0e8fSAxel Dörfler 			return "unknown";
44*73ff0e8fSAxel Dörfler 	}
45*73ff0e8fSAxel Dörfler }
46*73ff0e8fSAxel Dörfler 
47*73ff0e8fSAxel Dörfler 
48*73ff0e8fSAxel Dörfler static const char *
49*73ff0e8fSAxel Dörfler get_mpeg_string(int32 id)
50*73ff0e8fSAxel Dörfler {
51*73ff0e8fSAxel Dörfler 	switch (id) {
52*73ff0e8fSAxel Dörfler 		case B_MPEG_ANY:
53*73ff0e8fSAxel Dörfler 			return "any";
54*73ff0e8fSAxel Dörfler 		case B_MPEG_1_AUDIO_LAYER_1:
55*73ff0e8fSAxel Dörfler 			return "mpeg 1 audio layer 1";
56*73ff0e8fSAxel Dörfler 		case B_MPEG_1_AUDIO_LAYER_2:
57*73ff0e8fSAxel Dörfler 			return "mpeg 1 audio layer 2";
58*73ff0e8fSAxel Dörfler 		case B_MPEG_1_AUDIO_LAYER_3:
59*73ff0e8fSAxel Dörfler 			return "mpeg 1 audio layer 3 (mp3)";
60*73ff0e8fSAxel Dörfler 		case B_MPEG_1_VIDEO:
61*73ff0e8fSAxel Dörfler 			return "mpeg 1 video";
62*73ff0e8fSAxel Dörfler // these are OpenBeOS specific:
63*73ff0e8fSAxel Dörfler /*		case B_MPEG_2_AUDIO_LAYER_1:
64*73ff0e8fSAxel Dörfler 			return "mpeg 2 audio layer 1";
65*73ff0e8fSAxel Dörfler 		case B_MPEG_2_AUDIO_LAYER_2:
66*73ff0e8fSAxel Dörfler 			return "mpeg 2 audio layer 2";
67*73ff0e8fSAxel Dörfler 		case B_MPEG_2_AUDIO_LAYER_3:
68*73ff0e8fSAxel Dörfler 			return "mpeg 2 audio layer 3";
69*73ff0e8fSAxel Dörfler 		case B_MPEG_2_VIDEO:
70*73ff0e8fSAxel Dörfler 			return "mpeg 2 video";
71*73ff0e8fSAxel Dörfler 		case B_MPEG_2_5_AUDIO_LAYER_1:
72*73ff0e8fSAxel Dörfler 			return "mpeg 2.5 audio layer 1";
73*73ff0e8fSAxel Dörfler 		case B_MPEG_2_5_AUDIO_LAYER_2:
74*73ff0e8fSAxel Dörfler 			return "mpeg 2.5 audio layer 2";
75*73ff0e8fSAxel Dörfler 		case B_MPEG_2_5_AUDIO_LAYER_3:
76*73ff0e8fSAxel Dörfler 			return "mpeg 2.5 audio layer 3";
77*73ff0e8fSAxel Dörfler */		default:
78*73ff0e8fSAxel Dörfler 			return "unknown";
79*73ff0e8fSAxel Dörfler 	}
80*73ff0e8fSAxel Dörfler }
81*73ff0e8fSAxel Dörfler 
82*73ff0e8fSAxel Dörfler 
83*73ff0e8fSAxel Dörfler static void
84*73ff0e8fSAxel Dörfler print_fourcc(uint32 id)
85*73ff0e8fSAxel Dörfler {
86*73ff0e8fSAxel Dörfler 	char string[5];
87*73ff0e8fSAxel Dörfler 	for (int32 i = 0; i < 4; i++) {
88*73ff0e8fSAxel Dörfler 		uint8 c = uint8((id >> (24 - i * 8)) & 0xff);
89*73ff0e8fSAxel Dörfler 		if (c < ' ' || c > 0x7f)
90*73ff0e8fSAxel Dörfler 			string[i] = '.';
91*73ff0e8fSAxel Dörfler 		else
92*73ff0e8fSAxel Dörfler 			string[i] = (char)c;
93*73ff0e8fSAxel Dörfler 	}
94*73ff0e8fSAxel Dörfler 	string[4] = '\0';
95*73ff0e8fSAxel Dörfler 	printf("%s (0x%lx)\n", string, id);
96*73ff0e8fSAxel Dörfler }
97*73ff0e8fSAxel Dörfler 
98*73ff0e8fSAxel Dörfler 
99*73ff0e8fSAxel Dörfler void
100*73ff0e8fSAxel Dörfler dump_media_format_description(media_format_description &description)
101*73ff0e8fSAxel Dörfler {
102*73ff0e8fSAxel Dörfler 	printf("media_format_description:\n");
103*73ff0e8fSAxel Dörfler 	printf("\tfamily:\t%s\n", get_family_string(description.family));
104*73ff0e8fSAxel Dörfler 
105*73ff0e8fSAxel Dörfler 	switch (description.family) {
106*73ff0e8fSAxel Dörfler 		case B_BEOS_FORMAT_FAMILY:
107*73ff0e8fSAxel Dörfler 			printf("\tformat:\t");
108*73ff0e8fSAxel Dörfler 			print_fourcc(description.u.beos.format);
109*73ff0e8fSAxel Dörfler 			break;
110*73ff0e8fSAxel Dörfler 		case B_AVI_FORMAT_FAMILY:
111*73ff0e8fSAxel Dörfler 		case B_AIFF_FORMAT_FAMILY:
112*73ff0e8fSAxel Dörfler 		case B_WAV_FORMAT_FAMILY:
113*73ff0e8fSAxel Dörfler 			printf("\tcodec:\t");
114*73ff0e8fSAxel Dörfler 			print_fourcc(description.u.avi.codec);
115*73ff0e8fSAxel Dörfler 			break;
116*73ff0e8fSAxel Dörfler 		case B_AVR_FORMAT_FAMILY:
117*73ff0e8fSAxel Dörfler 			printf("\tid:\t");
118*73ff0e8fSAxel Dörfler 			print_fourcc(description.u.avr.id);
119*73ff0e8fSAxel Dörfler 			break;
120*73ff0e8fSAxel Dörfler 		case B_QUICKTIME_FORMAT_FAMILY:
121*73ff0e8fSAxel Dörfler 			printf("\tcodec:\t");
122*73ff0e8fSAxel Dörfler 			print_fourcc(description.u.quicktime.codec);
123*73ff0e8fSAxel Dörfler 			printf("\tvendor:\t");
124*73ff0e8fSAxel Dörfler 			print_fourcc(description.u.quicktime.vendor);
125*73ff0e8fSAxel Dörfler 			break;
126*73ff0e8fSAxel Dörfler 		case B_MISC_FORMAT_FAMILY:
127*73ff0e8fSAxel Dörfler 			printf("\tcodec:\t\t");
128*73ff0e8fSAxel Dörfler 			print_fourcc(description.u.misc.file_format);
129*73ff0e8fSAxel Dörfler 			printf("\tfile format:\t");
130*73ff0e8fSAxel Dörfler 			print_fourcc(description.u.misc.codec);
131*73ff0e8fSAxel Dörfler 			break;
132*73ff0e8fSAxel Dörfler 		case B_MPEG_FORMAT_FAMILY:
133*73ff0e8fSAxel Dörfler 			printf("\ttype:\t%s\n", get_mpeg_string(description.u.mpeg.id));
134*73ff0e8fSAxel Dörfler 			break;
135*73ff0e8fSAxel Dörfler 		case B_ASF_FORMAT_FAMILY:
136*73ff0e8fSAxel Dörfler 			// note, this is endian depended - you shouldn't do it this way for real...
137*73ff0e8fSAxel Dörfler 			printf("\tguid:\t0x%Lx%Lx\n", *(uint64 *)&description.u.asf.guid.data[0], *(uint64 *)&description.u.asf.guid.data[8]);
138*73ff0e8fSAxel Dörfler 		default:
139*73ff0e8fSAxel Dörfler 			break;
140*73ff0e8fSAxel Dörfler 	}
141*73ff0e8fSAxel Dörfler }
142*73ff0e8fSAxel Dörfler 
143*73ff0e8fSAxel Dörfler 
144*73ff0e8fSAxel Dörfler int
145*73ff0e8fSAxel Dörfler main(int argc, char **argv)
146*73ff0e8fSAxel Dörfler {
147*73ff0e8fSAxel Dörfler 	BMediaFormats formats;
148*73ff0e8fSAxel Dörfler 
149*73ff0e8fSAxel Dörfler 	status_t status = formats.InitCheck();
150*73ff0e8fSAxel Dörfler 	if (status != B_OK) {
151*73ff0e8fSAxel Dörfler 		fprintf(stderr, "BMediaFormats::InitCheck() failed: %s\n", strerror(status));
152*73ff0e8fSAxel Dörfler 		return -1;
153*73ff0e8fSAxel Dörfler 	}
154*73ff0e8fSAxel Dörfler 
155*73ff0e8fSAxel Dörfler 	media_format format;
156*73ff0e8fSAxel Dörfler 	status = formats.GetAVIFormatFor('DIVX', &format, B_MEDIA_ENCODED_VIDEO);
157*73ff0e8fSAxel Dörfler 	if (status != B_OK) {
158*73ff0e8fSAxel Dörfler 		fprintf(stderr, "BMediaFormats::GetAVIFormatFor() failed: %s\n", strerror(status));
159*73ff0e8fSAxel Dörfler 		return -1;
160*73ff0e8fSAxel Dörfler 	}
161*73ff0e8fSAxel Dörfler 
162*73ff0e8fSAxel Dörfler 	media_format_description description;
163*73ff0e8fSAxel Dörfler 	status = formats.GetCodeFor(format, B_AVI_FORMAT_FAMILY, &description);
164*73ff0e8fSAxel Dörfler 	if (status != B_OK) {
165*73ff0e8fSAxel Dörfler 		fprintf(stderr, "BMediaFormats::GetCodeFor() failed: %s\n", strerror(status));
166*73ff0e8fSAxel Dörfler 		return -1;
167*73ff0e8fSAxel Dörfler 	}
168*73ff0e8fSAxel Dörfler 	dump_media_format_description(description);
169*73ff0e8fSAxel Dörfler 
170*73ff0e8fSAxel Dörfler 	char desc[256];
171*73ff0e8fSAxel Dörfler 	string_for_format(format, desc, sizeof(desc));
172*73ff0e8fSAxel Dörfler 	printf("\tformat:\t%s\n", desc);
173*73ff0e8fSAxel Dörfler 
174*73ff0e8fSAxel Dörfler 	status = formats.GetCodeFor(format, B_MPEG_FORMAT_FAMILY, &description);
175*73ff0e8fSAxel Dörfler 	if (status == B_OK) {
176*73ff0e8fSAxel Dörfler 		fprintf(stderr, "BMediaFormats::GetCodeFor() succeded with wrong family!\n");
177*73ff0e8fSAxel Dörfler 		return -1;
178*73ff0e8fSAxel Dörfler 	}
179*73ff0e8fSAxel Dörfler 
180*73ff0e8fSAxel Dörfler 	puts("\n***** all supported formats *****");
181*73ff0e8fSAxel Dörfler 
182*73ff0e8fSAxel Dörfler 	// Rewind() should only work when the formats object is locked
183*73ff0e8fSAxel Dörfler 	status = formats.RewindFormats();
184*73ff0e8fSAxel Dörfler 	if (status == B_OK) {
185*73ff0e8fSAxel Dörfler 		fprintf(stderr, "BMediaFormats::RewindFormats() succeded unlocked!\n");
186*73ff0e8fSAxel Dörfler 		return -1;
187*73ff0e8fSAxel Dörfler 	}
188*73ff0e8fSAxel Dörfler 
189*73ff0e8fSAxel Dörfler 	if (!formats.Lock()) {
190*73ff0e8fSAxel Dörfler 		fprintf(stderr, "BMediaFormats::Lock() failed!\n");
191*73ff0e8fSAxel Dörfler 		return -1;
192*73ff0e8fSAxel Dörfler 	}
193*73ff0e8fSAxel Dörfler 
194*73ff0e8fSAxel Dörfler 	status = formats.RewindFormats();
195*73ff0e8fSAxel Dörfler 	if (status != B_OK) {
196*73ff0e8fSAxel Dörfler 		fprintf(stderr, "BMediaFormats::RewindFormats() failed: %s\n", strerror(status));
197*73ff0e8fSAxel Dörfler 		return -1;
198*73ff0e8fSAxel Dörfler 	}
199*73ff0e8fSAxel Dörfler 
200*73ff0e8fSAxel Dörfler 	int32 count = 0;
201*73ff0e8fSAxel Dörfler 	while ((status = formats.GetNextFormat(&format, &description)) == B_OK) {
202*73ff0e8fSAxel Dörfler 		dump_media_format_description(description);
203*73ff0e8fSAxel Dörfler 		string_for_format(format, desc, sizeof(desc));
204*73ff0e8fSAxel Dörfler 		printf("\tformat:\t%s\n", desc);
205*73ff0e8fSAxel Dörfler 		count++;
206*73ff0e8fSAxel Dörfler 	}
207*73ff0e8fSAxel Dörfler 	if (status != B_BAD_INDEX)
208*73ff0e8fSAxel Dörfler 		fprintf(stderr, "BMediaFormats::GetNextFormat() failed: %s\n", strerror(status));
209*73ff0e8fSAxel Dörfler 
210*73ff0e8fSAxel Dörfler 	printf("***** %ld supported formats *****\n", count);
211*73ff0e8fSAxel Dörfler 
212*73ff0e8fSAxel Dörfler 	formats.Unlock();
213*73ff0e8fSAxel Dörfler 	return 0;
214*73ff0e8fSAxel Dörfler }
215