xref: /haiku/src/add-ons/media/plugins/ffmpeg/CodecTable.cpp (revision 52c4471a3024d2eb81fe88e2c3982b9f8daa5e56)
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 
9 extern "C" {
10 	#include "avcodec.h"
11 	#include "avformat.h"
12 }
13 
14 
15 struct 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 
23 static const int32 sMaxFormatCount = 1024;
24 media_format gAVCodecFormats[sMaxFormatCount];
25 
26 
27 status_t
28 build_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