xref: /haiku/src/add-ons/media/plugins/ffmpeg/DemuxerTable.cpp (revision 40e20c10768c3dcfc54074b8886e3e91455332e1)
1 /*
2  * Copyright 2009-2010 Stephan Aßmus <superstippi@gmx.de>
3  * All rights reserved. Distributed under the terms of the MIT license.
4  */
5 
6 #include "DemuxerTable.h"
7 
8 extern "C" {
9 	#include "avformat.h"
10 }
11 
12 
13 // NOTE: AVFormatReader uses this table only for better pretty names and
14 // the MIME type info, the latter which is unavailable from AVInputFormat.
15 
16 
17 static const DemuxerFormat gDemuxerTable[] = {
18 	{
19 		// Tested with a limited number of streams. Some videos show bad
20 		// artifacts on keyframes with our own ASF Reader, while they play
21 		// fine with this Reader. But seeking seems to be a problem.
22 		"asf", "ASF Movie", "video/x-asf",
23 		B_WAV_FORMAT_FAMILY, B_AVI_FORMAT_FAMILY
24 	},
25 	{
26 		// Tested with many streams and works very well, with many older
27 		// files, the native AVI reader does not work.
28 		"avi", "AVI (Audio Video Interleaved)", "video/x-msvideo",
29 		B_WAV_FORMAT_FAMILY, B_AVI_FORMAT_FAMILY
30 	},
31 	{
32 		"dv", "DV Movie", "video/dv",
33 		B_WAV_FORMAT_FAMILY, B_QUICKTIME_FORMAT_FAMILY
34 	},
35 	{
36 		"flac", "Free Lossless Audio", "audio/x-flac",
37 		B_WAV_FORMAT_FAMILY, B_ANY_FORMAT_FAMILY
38 	},
39 	{
40 		"flv", "Flash video", "video/x-flv",
41 		B_QUICKTIME_FORMAT_FAMILY, B_QUICKTIME_FORMAT_FAMILY
42 	},
43 	{
44 		"swf", "Shockwave video", "application/x-shockwave-flash",
45 		B_QUICKTIME_FORMAT_FAMILY, B_QUICKTIME_FORMAT_FAMILY
46 	},
47 	{
48 		// Tested and appears to work ok with regards to video,
49 		// audio seems a problem.
50 		"matroska", "Matroska movie", "video/x-matroska",
51 		B_MISC_FORMAT_FAMILY, B_QUICKTIME_FORMAT_FAMILY
52 	},
53 	{
54 		// Plays the limited amount of files I could test with.
55 		"mov", "Quicktime Movie", "video/x-mov",
56 		B_QUICKTIME_FORMAT_FAMILY, B_QUICKTIME_FORMAT_FAMILY
57 	},
58 	{
59 		// Plays all files I could test with perfectly.
60 		"mp4", "MPEG-4 movie", "video/x-mp4",
61 		B_QUICKTIME_FORMAT_FAMILY, B_QUICKTIME_FORMAT_FAMILY
62 	},
63 	{
64  		// Works very well with all files I tested.
65 		"mp3", "MPEG-3", "audio/mpg",
66 		B_MPEG_FORMAT_FAMILY, B_MPEG_FORMAT_FAMILY
67 	},
68 	{
69 		// NOTE: Tested with a couple of files and only audio works ok.
70 		// On some files, the duration and time_base is detected incorrectly
71 		// by libavformat and those streams don't play at all.
72 		"mpg", "MPEG", "video/mpeg",
73 		B_MPEG_FORMAT_FAMILY, B_MPEG_FORMAT_FAMILY
74 	},
75 	{
76 		// NOTE: keep this before "mpeg" so it detects "mpegts" first.
77 		"mpegts", "MPEG TS", "video/mpeg",
78 		B_WAV_FORMAT_FAMILY, B_AVI_FORMAT_FAMILY
79 	},
80 	{
81 		// TODO: Also covers "mpegvideo", plus see mpegts.
82 		"mpeg", "MPEG", "video/mpeg",
83 		B_MPEG_FORMAT_FAMILY, B_MPEG_FORMAT_FAMILY
84 	},
85 	{
86 		// TODO: untested!
87 		"nsv", "NSV (NullSoft video file)", "video/nsv",
88 		B_QUICKTIME_FORMAT_FAMILY, B_QUICKTIME_FORMAT_FAMILY
89 	},
90 	{
91 		// Works fine, expect for seeking in clips generated by
92 		// native software when the video and audio stream are
93 		// not interleaved.
94 		"ogg", "Ogg", "video/ogg",
95 		B_MISC_FORMAT_FAMILY, B_MISC_FORMAT_FAMILY
96 	},
97 	{
98 		// TODO: untested!
99 		"rm", "RM (RealVideo clip)", "video/vnd.rn-realvideo",
100 		B_WAV_FORMAT_FAMILY, B_AVI_FORMAT_FAMILY
101 	},
102 	{
103 		"vob", "VOB movie", "video/x-vob",
104 		B_MPEG_FORMAT_FAMILY, B_MPEG_FORMAT_FAMILY
105 	},
106 	{
107 		"ac3", "AC3", "audio/ac3",
108 		B_WAV_FORMAT_FAMILY, B_ANY_FORMAT_FAMILY
109 	},
110 };
111 
112 
113 const DemuxerFormat*
114 demuxer_format_for(AVInputFormat* format)
115 {
116 	int32 demuxerFormatCount = sizeof(gDemuxerTable) / sizeof(DemuxerFormat);
117 	for (int32 i = 0; i < demuxerFormatCount; i++) {
118 		const DemuxerFormat* demuxerFormat = &gDemuxerTable[i];
119 		if (strstr(format->name, demuxerFormat->demuxer_name) != NULL)
120 			return demuxerFormat;
121 	}
122 	return NULL;
123 }
124 
125