1/*
2 * Copyright 2010 Stephan A��mus <superstippi@gmx.de>. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7#include "CodecTable.h"
8
9extern "C" {
10	#include "avcodec.h"
11	#include "avformat.h"
12}
13
14
15struct AVInputFamily gAVInputFamilies[] = {
16	{ B_AIFF_FORMAT_FAMILY, "aiff" },
17	{ B_AVI_FORMAT_FAMILY, "avi" },
18	{ B_MPEG_FORMAT_FAMILY, "mpeg" },
19	{ B_QUICKTIME_FORMAT_FAMILY, "mov" },
20	{ B_ANY_FORMAT_FAMILY, NULL}
21};
22
23static const int32 sMaxFormatCount = 1024;
24media_format gAVCodecFormats[sMaxFormatCount];
25
26
27status_t
28build_decoder_formats(media_format** _formats, size_t* _count)
29{
30	BMediaFormats mediaFormats;
31	if (mediaFormats.InitCheck() != B_OK)
32		return B_ERROR;
33
34	int32 index = 0;
35	void* cookie = NULL;
36	const AVCodec* codec = NULL;
37	while ((codec = av_codec_iterate(&cookie)) != NULL) {
38		if (index >= sMaxFormatCount) {
39			fprintf(stderr, "Maximum format count reached for auto-generated "
40				"AVCodec to media_format mapping, but there are still more "
41				"AVCodecs compiled into libavcodec!\n");
42			break;
43		}
44		media_format format;
45		// Determine media type
46		switch (codec->type) {
47			case AVMEDIA_TYPE_VIDEO:
48				format.type = B_MEDIA_ENCODED_VIDEO;
49				break;
50			case AVMEDIA_TYPE_AUDIO:
51				format.type = B_MEDIA_ENCODED_AUDIO;
52				break;
53			default:
54				// ignore this AVCodec
55				continue;
56		}
57
58		media_format_description description;
59		memset(description._reserved_, 0, sizeof(description._reserved_));
60		memset(description.u._reserved_, 0, sizeof(description.u._reserved_));
61
62		// Hard-code everything to B_MISC_FORMAT_FAMILY to ease matching
63		// later on.
64		description.family = B_MISC_FORMAT_FAMILY;
65		description.u.misc.file_format = 'ffmp';
66		description.u.misc.codec = codec->id;
67
68		format.require_flags = 0;
69		format.deny_flags = B_MEDIA_MAUI_UNDEFINED_FLAGS;
70
71		if (mediaFormats.MakeFormatFor(&description, 1, &format) != B_OK)
72			return B_ERROR;
73
74		gAVCodecFormats[index] = format;
75
76		index++;
77	}
78
79	*_formats = gAVCodecFormats;
80	*_count = index;
81
82	return B_OK;
83}
84
85