xref: /haiku/src/add-ons/media/media-add-ons/demultiplexer/misc.cpp (revision 68ea01249e1e2088933cb12f9c28d4e5c5d1c9ef)
1 // misc.cpp
2 //
3 // Andrew Bachmann, 2002
4 //
5 // Some functions for general debugging and
6 // working around be media kit bugs.
7 
8 #include "misc.h"
9 #include <stdio.h>
10 
11 // -------------------------------------------------------- //
12 // lib functions
13 // -------------------------------------------------------- //
14 
15 void print_multistream_format(media_multistream_format * format) {
16 	fprintf(stderr,"[");
17 	switch (format->format) {
18 	case media_multistream_format::B_ANY:			fprintf(stderr,"ANY"); break;
19 	case media_multistream_format::B_VID:			fprintf(stderr,"VID"); break;
20 	case media_multistream_format::B_AVI:			fprintf(stderr,"AVI"); break;
21 	case media_multistream_format::B_MPEG1:		fprintf(stderr,"MPEG1"); break;
22 	case media_multistream_format::B_MPEG2:		fprintf(stderr,"MPEG2"); break;
23 	case media_multistream_format::B_QUICKTIME:	fprintf(stderr,"QUICKTIME"); break;
24 	default:			fprintf(stderr,"????"); break;
25 	}
26 	fprintf(stderr," avg_bit_rate(%f) max_bit_rate(%f)",
27 			format->avg_bit_rate,format->max_bit_rate);
28 	fprintf(stderr," avg_chunk_size(%i) max_chunk_size(%i)",
29 			format->avg_chunk_size,format->max_chunk_size);
30 }
31 
32 void print_media_format(media_format * format) {
33 	fprintf(stderr,"{");
34 	switch (format->type) {
35 	case B_MEDIA_NO_TYPE:		fprintf(stderr,"NO_TYPE"); break;
36 	case B_MEDIA_UNKNOWN_TYPE:	fprintf(stderr,"UNKNOWN_TYPE"); break;
37 	case B_MEDIA_RAW_AUDIO:		fprintf(stderr,"RAW_AUDIO"); break;
38 	case B_MEDIA_RAW_VIDEO:		fprintf(stderr,"RAW_VIDEO"); break;
39 	case B_MEDIA_VBL:			fprintf(stderr,"VBL"); break;
40 	case B_MEDIA_TIMECODE:		fprintf(stderr,"TIMECODE"); break;
41 	case B_MEDIA_MIDI:			fprintf(stderr,"MIDI"); break;
42 	case B_MEDIA_TEXT:			fprintf(stderr,"TEXT"); break;
43 	case B_MEDIA_HTML:			fprintf(stderr,"HTML"); break;
44 	case B_MEDIA_MULTISTREAM:	fprintf(stderr,"MULTISTREAM"); break;
45 	case B_MEDIA_PARAMETERS:	fprintf(stderr,"PARAMETERS"); break;
46 	case B_MEDIA_ENCODED_AUDIO:	fprintf(stderr,"ENCODED_AUDIO"); break;
47 	case B_MEDIA_ENCODED_VIDEO:	fprintf(stderr,"ENCODED_VIDEO"); break;
48 	default:					fprintf(stderr,"????"); break;
49 	}
50 	fprintf(stderr,":");
51 	switch (format->type) {
52 	case B_MEDIA_RAW_AUDIO:		fprintf(stderr,"RAW_AUDIO"); break;
53 	case B_MEDIA_RAW_VIDEO:		fprintf(stderr,"RAW_VIDEO"); break;
54 	case B_MEDIA_MULTISTREAM:	print_multistream_format(&format->u.multistream); break;
55 	case B_MEDIA_ENCODED_AUDIO:	fprintf(stderr,"ENCODED_AUDIO"); break;
56 	case B_MEDIA_ENCODED_VIDEO:	fprintf(stderr,"ENCODED_VIDEO"); break;
57 	default:					fprintf(stderr,"????"); break;
58 	}
59 	fprintf(stderr,"}");
60 }
61 
62 bool multistream_format_is_acceptible(
63 						const media_multistream_format & producer_format,
64 						const media_multistream_format & consumer_format)
65 {
66 	// first check the format, if necessary
67 	if (consumer_format.format != media_multistream_format::B_ANY) {
68 		if (consumer_format.format != producer_format.format) {
69 			return false;
70 		}
71 	}
72 	// then check the average bit rate
73 	if (consumer_format.avg_bit_rate != media_multistream_format::wildcard.avg_bit_rate) {
74 		if (consumer_format.avg_bit_rate != producer_format.avg_bit_rate) {
75 			// do they have to match exactly?  I don't know.  assume yes.
76 			return false;
77 		}
78 	}
79 	// then check the maximum bit rate
80 	if (consumer_format.max_bit_rate != media_multistream_format::wildcard.max_bit_rate) {
81 		if (consumer_format.max_bit_rate != producer_format.max_bit_rate) {
82 			// do they have to match exactly?  I don't know.  assume yes.
83 			return false;
84 		}
85 	}
86 	// then check the average chunk size
87 	if (consumer_format.avg_chunk_size != media_multistream_format::wildcard.avg_chunk_size) {
88 		if (consumer_format.avg_chunk_size != producer_format.avg_chunk_size) {
89 			// do they have to match exactly?  I don't know.  assume yes.
90 			return false;
91 		}
92 	}
93 	// then check the maximum bit rate
94 	if (consumer_format.max_chunk_size != media_multistream_format::wildcard.max_chunk_size) {
95 		if (consumer_format.max_chunk_size != producer_format.max_chunk_size) {
96 			// do they have to match exactly?  I don't know.  assume yes.
97 			return false;
98 		}
99 	}
100 	// should also check format specific fields, and others?
101 	return true;
102 }
103 
104 bool format_is_acceptible(
105 						const media_format & producer_format,
106 						const media_format & consumer_format)
107 {
108 	// first check the type, if necessary
109 	if (consumer_format.type != B_MEDIA_UNKNOWN_TYPE) {
110 		if (consumer_format.type != producer_format.type) {
111 			return false;
112 		}
113 		switch (consumer_format.type) {
114 			case B_MEDIA_MULTISTREAM:
115 				if (!multistream_format_is_acceptible(producer_format.u.multistream,
116 													  consumer_format.u.multistream)) {
117 					return false;
118 				}
119 				break;
120 			default:
121 				fprintf(stderr,"format_is_acceptible : unimplemented type.\n");
122 				return format_is_compatible(producer_format,consumer_format);
123 				break;
124 		}
125 	}
126 	// should also check non-type fields?
127 	return true;
128 }
129 
130