1/*
2 * Copyright 2009, Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT license.
4 */
5#ifndef _MEDIA_TYPES_H
6#define _MEDIA_TYPES_H
7
8
9#include <MediaDefs.h>
10
11#include <Messenger.h>
12#include <List.h>
13#include <Locker.h>
14
15
16struct media_codec_info {
17	char	pretty_name[96];   /* eg: "SuperSqueeze Encoder by Foo Inc" */
18	char	short_name[32];    /* eg: "SuperSqueeze" */
19
20	int32	id;                /* opaque id passed to
21								  BMediaFile::CreateTrack() */
22	int32	sub_id;
23
24	int32	pad[63];
25};
26
27/*!	\brief	Use this to iterate through the available encoders for a given file
28			format.
29	\param cookie		A pointer to a preallocated cookie, which you need
30						to initialize to \c 0 before calling this function
31						the first time.
32	\param fileFormat	A pointer to a valid media_file_format structure
33						as can be obtained through get_next_file_format().
34	\param inputFormat	This is the type of data given to the encoder.
35	\param _outputFormat This is the type of data the encoder will output.
36	\param _codecInfo	Pointer to a preallocated media_codec_info structure,
37						information about the encoder is placed there.
38
39	\return
40	- \c B_OK: Everything went fine.
41	- \c B_BAD_INDEX: There are no more encoders.
42 */
43status_t get_next_encoder(int32* cookie, const media_file_format* fileFormat,
44	const media_format* inputFormat, media_format* _outputFormat,
45	media_codec_info* _codecInfo);
46
47/*!	\brief	Use this to iterate through the available encoders with
48			restrictions to the input and output media_format while the
49			encoders can specialize wildcards in the media_formats.
50
51	\param cookie		A pointer to a preallocated cookie, which you need
52						to initialize to \c 0 before calling this function
53						the first time.
54	\param fileFormat	A pointer to a valid media_file_format structure
55						as can be obtained through get_next_file_format().
56						You can pass \c NULL if you don't care.
57	\param inputFormat	This is the type of data given to the encoder,
58						wildcards are accepted.
59	\param outputFormat	This is the type of data you want the encoder to
60						output. Wildcards are accepted.
61	\param _codecInfo	Pointer to a preallocated media_codec_info structure,
62						information about the encoder is placed there.
63	\param _acceptedInputFormat This is the type of data that the encoder will
64						accept as input. Wildcards in \a inFormat will be
65						specialized here.
66	\param _acceptedOutputFormat This is the type of data that the encoder will
67						output. Wildcards in \a _outFormat will be specialized
68						here.
69
70	\return
71	- \c B_OK: Everything went fine.
72	- \c B_BAD_INDEX: There are no more encoders.
73*/
74status_t get_next_encoder(int32* cookie, const media_file_format* fileFormat,
75	const media_format* inputFormat, const media_format* outputFormat,
76	media_codec_info* _codecInfo, media_format* _acceptedInputFormat,
77	media_format* _acceptedOutputFormat);
78
79
80/*!	\brief	Iterate over the all the available encoders without media_format
81			restrictions.
82
83	\param cookie		A pointer to a preallocated cookie, which you need
84						to initialize to \c 0 before calling this function
85						the first time.
86	\param _codecInfo	Pointer to a preallocated media_codec_info structure,
87						information about the encoder is placed there.
88
89	\return
90	- \c B_OK: Everything went fine.
91	- \c B_BAD_INDEX: There are no more encoders.
92*/
93status_t get_next_encoder(int32* cookie, media_codec_info* _codecInfo);
94
95
96enum media_file_accept_format_flags {
97	B_MEDIA_REJECT_WILDCARDS = 0x1
98};
99
100bool does_file_accept_format(const media_file_format* fileFormat,
101	media_format* format, uint32 flags = 0);
102
103
104typedef struct {
105	uint8 data[16];
106} GUID;
107
108
109enum beos_format {
110	B_BEOS_FORMAT_RAW_AUDIO = 'rawa',
111	B_BEOS_FORMAT_RAW_VIDEO = 'rawv'
112};
113
114
115typedef struct {
116	int32 format;
117} media_beos_description;
118
119
120typedef struct {
121	uint32 codec;
122	uint32 vendor;
123} media_quicktime_description;
124
125
126typedef struct {
127	uint32 codec;
128} media_avi_description;
129
130
131typedef struct {
132	uint32 id;
133} media_avr_description;
134
135
136typedef struct {
137	GUID guid;
138} media_asf_description;
139
140
141enum mpeg_id {
142	B_MPEG_ANY = 0,
143	B_MPEG_1_AUDIO_LAYER_1 = 0x101,
144	B_MPEG_1_AUDIO_LAYER_2 = 0x102,
145	B_MPEG_1_AUDIO_LAYER_3 = 0x103,		/* "MP3" */
146	B_MPEG_1_VIDEO = 0x111,
147	B_MPEG_2_AUDIO_LAYER_1 = 0x201,
148	B_MPEG_2_AUDIO_LAYER_2 = 0x202,
149	B_MPEG_2_AUDIO_LAYER_3 = 0x203,
150	B_MPEG_2_VIDEO = 0x211,
151	B_MPEG_2_5_AUDIO_LAYER_1 = 0x301,
152	B_MPEG_2_5_AUDIO_LAYER_2 = 0x302,
153	B_MPEG_2_5_AUDIO_LAYER_3 = 0x303,
154};
155
156
157typedef struct {
158	uint32 id;
159} media_mpeg_description;
160
161
162typedef struct {
163	uint32 codec;
164} media_wav_description;
165
166
167typedef struct {
168	uint32 codec;
169} media_aiff_description;
170
171
172typedef struct {
173	uint32 file_format;
174	uint32 codec;
175} media_misc_description;
176
177
178typedef struct _media_format_description {
179								_media_format_description();
180								~_media_format_description();
181								_media_format_description(
182									const _media_format_description& other);
183	_media_format_description&	operator=(
184									const _media_format_description& other);
185
186	media_format_family family;
187	uint32 _reserved_[3];
188	union {
189		media_beos_description beos;
190		media_quicktime_description quicktime;
191		media_avi_description avi;
192		media_asf_description asf;
193		media_mpeg_description mpeg;
194		media_wav_description wav;
195		media_aiff_description aiff;
196		media_misc_description misc;
197		media_avr_description avr;
198		uint32 _reserved_[12];
199	} u;
200} media_format_description;
201
202
203class BMediaFormats {
204public:
205								BMediaFormats();
206	virtual						~BMediaFormats();
207
208			status_t			InitCheck();
209
210	// Make sure you memset() your descs to 0 before you start filling
211	// them in! Else you may register some bogus value.
212	enum make_format_flags {
213		B_EXCLUSIVE = 0x1,		// Fail if this format has already been
214								// registered.
215
216		B_NO_MERGE = 0x2,		// Don't re-number any formats if there are
217								// multiple clashing previous registrations,
218								// but fail instead.
219
220		B_SET_DEFAULT = 0x4		// Set the first format to be the default for
221								// the format family (when registering more
222								// than one in the same family). Only use in
223								// Encoder add-ons.
224	};
225
226			status_t			MakeFormatFor(const media_format_description*
227									descriptions, int32 descriptionCount,
228									media_format* _inOutFormat,
229									uint32 flags = 0, void* _reserved = 0);
230
231			status_t			GetFormatFor(const media_format_description&
232									description, media_format* _outFormat);
233
234			status_t			GetCodeFor(const media_format& format,
235									media_format_family family,
236									media_format_description* _outDescription);
237
238			status_t			RewindFormats();
239			status_t			GetNextFormat(media_format* _outFormat,
240									media_format_description* _outDescription);
241
242	// You need to lock/unlock (only) when using
243	// RewindFormats()/GetNextFormat().
244			bool				Lock();
245			void				Unlock();
246
247	//	convenience functions
248	static	status_t			GetBeOSFormatFor(uint32 fourcc,
249									media_format* _outFormat,
250									media_type type = B_MEDIA_UNKNOWN_TYPE);
251	static	status_t			GetAVIFormatFor(uint32 fourcc,
252									media_format* _outFormat,
253									media_type type = B_MEDIA_UNKNOWN_TYPE);
254	static	status_t			GetQuicktimeFormatFor(uint32 vendor,
255									uint32 fourcc, media_format* _outFormat,
256									media_type type = B_MEDIA_UNKNOWN_TYPE);
257
258	// Deprecated:
259			status_t			MakeFormatFor(const media_format_description&
260									description, const media_format& inFormat,
261									media_format* _outFormat);
262
263private:
264			int32				fIteratorIndex;
265
266			uint32				_reserved[30];
267};
268
269
270bool operator==(const media_format_description& a,
271	const media_format_description& b);
272
273bool operator<(const media_format_description& a,
274	const media_format_description& b);
275
276
277bool operator==(const GUID& a, const GUID& b);
278
279bool operator<(const GUID& a, const GUID& b);
280
281
282#endif	// _MEDIA_TYPES_H
283