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
15void 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(%" B_PRId32
29			") max_chunk_size(%"  B_PRId32 ")",
30			format->avg_chunk_size,format->max_chunk_size);
31}
32
33void print_media_format(media_format * format) {
34	fprintf(stderr,"{");
35	switch (format->type) {
36	case B_MEDIA_NO_TYPE:		fprintf(stderr,"NO_TYPE"); break;
37	case B_MEDIA_UNKNOWN_TYPE:	fprintf(stderr,"UNKNOWN_TYPE"); break;
38	case B_MEDIA_RAW_AUDIO:		fprintf(stderr,"RAW_AUDIO"); break;
39	case B_MEDIA_RAW_VIDEO:		fprintf(stderr,"RAW_VIDEO"); break;
40	case B_MEDIA_VBL:			fprintf(stderr,"VBL"); break;
41	case B_MEDIA_TIMECODE:		fprintf(stderr,"TIMECODE"); break;
42	case B_MEDIA_MIDI:			fprintf(stderr,"MIDI"); break;
43	case B_MEDIA_TEXT:			fprintf(stderr,"TEXT"); break;
44	case B_MEDIA_HTML:			fprintf(stderr,"HTML"); break;
45	case B_MEDIA_MULTISTREAM:	fprintf(stderr,"MULTISTREAM"); break;
46	case B_MEDIA_PARAMETERS:	fprintf(stderr,"PARAMETERS"); break;
47	case B_MEDIA_ENCODED_AUDIO:	fprintf(stderr,"ENCODED_AUDIO"); break;
48	case B_MEDIA_ENCODED_VIDEO:	fprintf(stderr,"ENCODED_VIDEO"); break;
49	default:					fprintf(stderr,"????"); break;
50	}
51	fprintf(stderr,":");
52	switch (format->type) {
53	case B_MEDIA_RAW_AUDIO:		fprintf(stderr,"RAW_AUDIO"); break;
54	case B_MEDIA_RAW_VIDEO:		fprintf(stderr,"RAW_VIDEO"); break;
55	case B_MEDIA_MULTISTREAM:	print_multistream_format(&format->u.multistream); break;
56	case B_MEDIA_ENCODED_AUDIO:	fprintf(stderr,"ENCODED_AUDIO"); break;
57	case B_MEDIA_ENCODED_VIDEO:	fprintf(stderr,"ENCODED_VIDEO"); break;
58	default:					fprintf(stderr,"????"); break;
59	}
60	fprintf(stderr,"}");
61}
62
63bool multistream_format_is_acceptible(
64						const media_multistream_format & producer_format,
65						const media_multistream_format & consumer_format)
66{
67	// first check the format, if necessary
68	if (consumer_format.format != media_multistream_format::B_ANY) {
69		if (consumer_format.format != producer_format.format) {
70			return false;
71		}
72	}
73	// then check the average bit rate
74	if (consumer_format.avg_bit_rate != media_multistream_format::wildcard.avg_bit_rate) {
75		if (consumer_format.avg_bit_rate != producer_format.avg_bit_rate) {
76			// do they have to match exactly?  I don't know.  assume yes.
77			return false;
78		}
79	}
80	// then check the maximum bit rate
81	if (consumer_format.max_bit_rate != media_multistream_format::wildcard.max_bit_rate) {
82		if (consumer_format.max_bit_rate != producer_format.max_bit_rate) {
83			// do they have to match exactly?  I don't know.  assume yes.
84			return false;
85		}
86	}
87	// then check the average chunk size
88	if (consumer_format.avg_chunk_size != media_multistream_format::wildcard.avg_chunk_size) {
89		if (consumer_format.avg_chunk_size != producer_format.avg_chunk_size) {
90			// do they have to match exactly?  I don't know.  assume yes.
91			return false;
92		}
93	}
94	// then check the maximum bit rate
95	if (consumer_format.max_chunk_size != media_multistream_format::wildcard.max_chunk_size) {
96		if (consumer_format.max_chunk_size != producer_format.max_chunk_size) {
97			// do they have to match exactly?  I don't know.  assume yes.
98			return false;
99		}
100	}
101	// should also check format specific fields, and others?
102	return true;
103}
104
105bool format_is_acceptible(
106						const media_format & producer_format,
107						const media_format & consumer_format)
108{
109	// first check the type, if necessary
110	if (consumer_format.type != B_MEDIA_UNKNOWN_TYPE) {
111		if (consumer_format.type != producer_format.type) {
112			return false;
113		}
114		switch (consumer_format.type) {
115			case B_MEDIA_MULTISTREAM:
116				if (!multistream_format_is_acceptible(producer_format.u.multistream,
117													  consumer_format.u.multistream)) {
118					return false;
119				}
120				break;
121			default:
122				fprintf(stderr,"format_is_acceptible : unimplemented type.\n");
123				return format_is_compatible(producer_format,consumer_format);
124				break;
125		}
126	}
127	// should also check non-type fields?
128	return true;
129}
130
131