ffmpeg media plugin: merge muxer and demuxer tables

* The media_file_format struct has B_READABLE and B_WRITABLE flags,
allowing us to tell which formats we support decoding and encoding
* This allows application to query for the supported decoding formats.
* Also adjust some of the MIME types to match what's actually used (eg.
in HTML5 audio).

This makes html5test.com detect which formats we declare we can decode.
This commit is contained in:
Adrien Destugues
2014-03-28 11:47:22 +01:00
parent 4626c49e32
commit 626d341c24
4 changed files with 214 additions and 127 deletions
@@ -1567,7 +1567,7 @@ AVFormatReader::GetFileFormatInfo(media_file_format* mff)
return;
}
const DemuxerFormat* format = demuxer_format_for(context->iformat);
const media_file_format* format = demuxer_format_for(context->iformat);
mff->capabilities = media_file_format::B_READABLE
| media_file_format::B_KNOWS_ENCODED_VIDEO
@@ -1575,9 +1575,7 @@ AVFormatReader::GetFileFormatInfo(media_file_format* mff)
| media_file_format::B_IMPERFECTLY_SEEKABLE;
if (format != NULL) {
// TODO: Check if AVInputFormat has audio only and then use
// format->audio_family!
mff->family = format->video_family;
mff->family = format->family;
} else {
TRACE(" no DemuxerFormat for AVInputFormat!\n");
mff->family = B_MISC_FORMAT_FAMILY;
@@ -4,6 +4,7 @@
*/
#include "DemuxerTable.h"
#include "MuxerTable.h"
extern "C" {
#include "avformat.h"
@@ -14,109 +15,16 @@ extern "C" {
// the MIME type info, the latter which is unavailable from AVInputFormat.
static const DemuxerFormat gDemuxerTable[] = {
{
// Tested with a limited number of streams. Some videos show bad
// artifacts on keyframes with our own ASF Reader, while they play
// fine with this Reader. But seeking seems to be a problem.
"asf", "ASF Movie", "video/x-asf",
B_WAV_FORMAT_FAMILY, B_AVI_FORMAT_FAMILY
},
{
// Tested with many streams and works very well, with many older
// files, the native AVI reader does not work.
"avi", "AVI (Audio Video Interleaved)", "video/x-msvideo",
B_WAV_FORMAT_FAMILY, B_AVI_FORMAT_FAMILY
},
{
"dv", "DV Movie", "video/dv",
B_WAV_FORMAT_FAMILY, B_QUICKTIME_FORMAT_FAMILY
},
{
"flac", "Free Lossless Audio", "audio/x-flac",
B_WAV_FORMAT_FAMILY, B_ANY_FORMAT_FAMILY
},
{
"flv", "Flash video", "video/x-flv",
B_QUICKTIME_FORMAT_FAMILY, B_QUICKTIME_FORMAT_FAMILY
},
{
"swf", "Shockwave video", "application/x-shockwave-flash",
B_QUICKTIME_FORMAT_FAMILY, B_QUICKTIME_FORMAT_FAMILY
},
{
// Tested and appears to work ok with regards to video,
// audio seems a problem.
"matroska", "Matroska movie", "video/x-matroska",
B_MISC_FORMAT_FAMILY, B_QUICKTIME_FORMAT_FAMILY
},
{
// Plays the limited amount of files I could test with.
"mov", "Quicktime Movie", "video/x-mov",
B_QUICKTIME_FORMAT_FAMILY, B_QUICKTIME_FORMAT_FAMILY
},
{
// Plays all files I could test with perfectly.
"mp4", "MPEG-4 movie", "video/x-mp4",
B_QUICKTIME_FORMAT_FAMILY, B_QUICKTIME_FORMAT_FAMILY
},
{
// Works very well with all files I tested.
"mp3", "MPEG-3", "audio/mpg",
B_MPEG_FORMAT_FAMILY, B_MPEG_FORMAT_FAMILY
},
{
// NOTE: Tested with a couple of files and only audio works ok.
// On some files, the duration and time_base is detected incorrectly
// by libavformat and those streams don't play at all.
"mpg", "MPEG", "video/mpeg",
B_MPEG_FORMAT_FAMILY, B_MPEG_FORMAT_FAMILY
},
{
// NOTE: keep this before "mpeg" so it detects "mpegts" first.
"mpegts", "MPEG TS", "video/mpeg",
B_WAV_FORMAT_FAMILY, B_AVI_FORMAT_FAMILY
},
{
// TODO: Also covers "mpegvideo", plus see mpegts.
"mpeg", "MPEG", "video/mpeg",
B_MPEG_FORMAT_FAMILY, B_MPEG_FORMAT_FAMILY
},
{
// TODO: untested!
"nsv", "NSV (NullSoft video file)", "video/nsv",
B_QUICKTIME_FORMAT_FAMILY, B_QUICKTIME_FORMAT_FAMILY
},
{
// Works fine, expect for seeking in clips generated by
// native software when the video and audio stream are
// not interleaved.
"ogg", "Ogg", "video/ogg",
B_MISC_FORMAT_FAMILY, B_MISC_FORMAT_FAMILY
},
{
// TODO: untested!
"rm", "RM (RealVideo clip)", "video/vnd.rn-realvideo",
B_WAV_FORMAT_FAMILY, B_AVI_FORMAT_FAMILY
},
{
"vob", "VOB movie", "video/x-vob",
B_MPEG_FORMAT_FAMILY, B_MPEG_FORMAT_FAMILY
},
{
"ac3", "AC3", "audio/ac3",
B_WAV_FORMAT_FAMILY, B_ANY_FORMAT_FAMILY
},
};
const DemuxerFormat*
const media_file_format*
demuxer_format_for(AVInputFormat* format)
{
int32 demuxerFormatCount = sizeof(gDemuxerTable) / sizeof(DemuxerFormat);
for (int32 i = 0; i < demuxerFormatCount; i++) {
const DemuxerFormat* demuxerFormat = &gDemuxerTable[i];
if (strstr(format->name, demuxerFormat->demuxer_name) != NULL)
for (uint32 i = 0; i < gMuxerCount; i++) {
const media_file_format* demuxerFormat = &gMuxerTable[i];
if (!(demuxerFormat->capabilities & media_file_format::B_READABLE))
continue;
if (strstr(format->name, demuxerFormat->short_name) != NULL)
return demuxerFormat;
}
return NULL;
@@ -9,18 +9,9 @@
#include <MediaDefs.h>
struct DemuxerFormat {
const char* demuxer_name;
const char* pretty_name;
const char* mime_type;
media_format_family audio_family;
media_format_family video_family;
};
struct AVInputFormat;
const DemuxerFormat* demuxer_format_for(AVInputFormat* format);
const media_file_format* demuxer_format_for(AVInputFormat* format);
#endif // DEMUXER_TABLE_H
+202 -12
View File
@@ -9,7 +9,37 @@
const media_file_format gMuxerTable[] = {
{
media_file_format::B_WRITABLE
media_file_format::B_READABLE
| media_file_format::B_KNOWS_RAW_AUDIO
| media_file_format::B_KNOWS_ENCODED_AUDIO,
{ 0 },
B_WAV_FORMAT_FAMILY,
100,
{ 0 },
"audio/ac3",
"AC3",
"ac3",
"ac3",
{ 0 }
},
{
media_file_format::B_READABLE
| media_file_format::B_KNOWS_RAW_VIDEO
| media_file_format::B_KNOWS_RAW_AUDIO
| media_file_format::B_KNOWS_ENCODED_VIDEO
| media_file_format::B_KNOWS_ENCODED_AUDIO,
{ 0 },
B_AVI_FORMAT_FAMILY,
100,
{ 0 },
"video/x-asf",
"ASF Movie",
"asf",
"asf",
{ 0 }
},
{
media_file_format::B_WRITABLE | media_file_format::B_READABLE
| media_file_format::B_KNOWS_RAW_VIDEO
| media_file_format::B_KNOWS_RAW_AUDIO
| media_file_format::B_KNOWS_ENCODED_VIDEO
@@ -25,39 +55,113 @@ const media_file_format gMuxerTable[] = {
{ 0 }
},
{
media_file_format::B_WRITABLE
media_file_format::B_WRITABLE | media_file_format::B_READABLE
| media_file_format::B_KNOWS_RAW_VIDEO
| media_file_format::B_KNOWS_RAW_AUDIO
| media_file_format::B_KNOWS_ENCODED_VIDEO
| media_file_format::B_KNOWS_ENCODED_AUDIO,
{ 0 },
B_MISC_FORMAT_FAMILY,
B_QUICKTIME_FORMAT_FAMILY,
100,
{ 0 },
"video/x-msvideo",
"DV video format",
"video/dv",
"DV Movie",
"dv",
"dv",
{ 0 }
},
{
media_file_format::B_WRITABLE
media_file_format::B_READABLE
| media_file_format::B_KNOWS_RAW_AUDIO
| media_file_format::B_KNOWS_ENCODED_AUDIO,
{ 0 },
B_WAV_FORMAT_FAMILY,
100,
{ 0 },
"audio/x-flac",
"Free Lossless Audio",
"flac",
"flac",
{ 0 }
},
{
media_file_format::B_READABLE
| media_file_format::B_KNOWS_RAW_VIDEO
| media_file_format::B_KNOWS_RAW_AUDIO
| media_file_format::B_KNOWS_ENCODED_VIDEO
| media_file_format::B_KNOWS_ENCODED_AUDIO,
{ 0 },
B_AVI_FORMAT_FAMILY,
B_QUICKTIME_FORMAT_FAMILY,
100,
{ 0 },
"video/x-flv",
"Flash video",
"flv",
"flv",
{ 0 }
},
{
media_file_format::B_WRITABLE | media_file_format::B_READABLE
| media_file_format::B_KNOWS_RAW_VIDEO
| media_file_format::B_KNOWS_RAW_AUDIO
| media_file_format::B_KNOWS_ENCODED_VIDEO
| media_file_format::B_KNOWS_ENCODED_AUDIO,
{ 0 },
B_QUICKTIME_FORMAT_FAMILY,
100,
{ 0 },
"video/x-matroska",
"Matroska file format",
"Matroska movie",
"mkv",
"mkv",
{ 0 }
},
{
media_file_format::B_WRITABLE
media_file_format::B_READABLE
| media_file_format::B_KNOWS_RAW_VIDEO
| media_file_format::B_KNOWS_RAW_AUDIO
| media_file_format::B_KNOWS_ENCODED_VIDEO
| media_file_format::B_KNOWS_ENCODED_AUDIO,
{ 0 },
B_QUICKTIME_FORMAT_FAMILY,
100,
{ 0 },
"video/x-mov",
"Quicktime movie",
"mov",
"mov",
{ 0 }
},
{
media_file_format::B_READABLE
| media_file_format::B_KNOWS_RAW_AUDIO
| media_file_format::B_KNOWS_ENCODED_AUDIO,
{ 0 },
B_MPEG_FORMAT_FAMILY,
100,
{ 0 },
"audio/mpeg",
"MPEG Layer 3",
"mp3",
"mp3",
{ 0 }
},
{
media_file_format::B_READABLE
| media_file_format::B_KNOWS_ENCODED_VIDEO
| media_file_format::B_KNOWS_ENCODED_AUDIO,
{ 0 },
B_QUICKTIME_FORMAT_FAMILY,
100,
{ 0 },
"video/mp4",
"MPEG (Motion Picture Experts Group) format 4",
"mp4",
"mp4",
{ 0 }
},
{
media_file_format::B_WRITABLE | media_file_format::B_READABLE
| media_file_format::B_KNOWS_ENCODED_VIDEO
| media_file_format::B_KNOWS_ENCODED_AUDIO,
{ 0 },
@@ -70,23 +174,109 @@ const media_file_format gMuxerTable[] = {
"mpg",
{ 0 }
},
{
media_file_format::B_READABLE
| media_file_format::B_KNOWS_ENCODED_VIDEO
| media_file_format::B_KNOWS_ENCODED_AUDIO,
{ 0 },
B_AVI_FORMAT_FAMILY,
100,
{ 0 },
"video/mpeg",
"MPEG TS",
"mpegts",
"mpegts",
{ 0 }
},
{
media_file_format::B_READABLE
| media_file_format::B_KNOWS_ENCODED_VIDEO
| media_file_format::B_KNOWS_ENCODED_AUDIO,
{ 0 },
B_MPEG_FORMAT_FAMILY,
100,
{ 0 },
"video/mpeg",
"MPEG",
"mpeg",
"mpeg",
{ 0 }
},
{
media_file_format::B_READABLE
| media_file_format::B_KNOWS_ENCODED_VIDEO
| media_file_format::B_KNOWS_ENCODED_AUDIO,
{ 0 },
B_QUICKTIME_FORMAT_FAMILY,
100,
{ 0 },
"video/nsv",
"NSV (NullSoft Video file)",
"nsv",
"nsv",
{ 0 }
},
// TODO: This one rejects unknown codecs. We probably need to define
// a media_format_family for it so that Encoders can announce their support
// for it specifically.
{
media_file_format::B_WRITABLE
media_file_format::B_WRITABLE | media_file_format::B_READABLE
| media_file_format::B_KNOWS_ENCODED_VIDEO
| media_file_format::B_KNOWS_ENCODED_AUDIO,
{ 0 },
B_MISC_FORMAT_FAMILY,
100,
{ 0 },
"application/ogg",
"audio/ogg",
"Ogg (Xiph.Org Foundation)",
"ogg",
"ogg",
{ 0 }
},
{
media_file_format::B_READABLE
| media_file_format::B_KNOWS_ENCODED_VIDEO
| media_file_format::B_KNOWS_ENCODED_AUDIO,
{ 0 },
B_AVI_FORMAT_FAMILY,
100,
{ 0 },
"video/vnd.rn-realvideo",
"RM (RealVideo clip)",
"rm",
"rm",
{ 0 }
},
{
media_file_format::B_READABLE
| media_file_format::B_KNOWS_RAW_VIDEO
| media_file_format::B_KNOWS_RAW_AUDIO
| media_file_format::B_KNOWS_ENCODED_VIDEO
| media_file_format::B_KNOWS_ENCODED_AUDIO,
{ 0 },
B_QUICKTIME_FORMAT_FAMILY,
100,
{ 0 },
"application/x-shockwave-flash",
"Shockwave video",
"swf",
"swf",
{ 0 }
},
{
media_file_format::B_READABLE
| media_file_format::B_KNOWS_ENCODED_VIDEO
| media_file_format::B_KNOWS_ENCODED_AUDIO,
{ 0 },
B_MPEG_FORMAT_FAMILY,
100,
{ 0 },
"video/x-vob",
"VOB movie",
"vob",
"vob",
{ 0 }
},
{
media_file_format::B_WRITABLE
| media_file_format::B_KNOWS_ENCODED_AUDIO,
@@ -94,7 +284,7 @@ const media_file_format gMuxerTable[] = {
B_WAV_FORMAT_FAMILY,
100,
{ 0 },
"audio/x-wav",
"audio/wav",
"WAV Format",
"wav",
"wav",