diff --git a/src/add-ons/media/plugins/ffmpeg/AVFormatReader.cpp b/src/add-ons/media/plugins/ffmpeg/AVFormatReader.cpp index 7669a9aef7..aeed534f12 100644 --- a/src/add-ons/media/plugins/ffmpeg/AVFormatReader.cpp +++ b/src/add-ons/media/plugins/ffmpeg/AVFormatReader.cpp @@ -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; diff --git a/src/add-ons/media/plugins/ffmpeg/DemuxerTable.cpp b/src/add-ons/media/plugins/ffmpeg/DemuxerTable.cpp index f95d9a1e6e..dcbebff43e 100644 --- a/src/add-ons/media/plugins/ffmpeg/DemuxerTable.cpp +++ b/src/add-ons/media/plugins/ffmpeg/DemuxerTable.cpp @@ -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; diff --git a/src/add-ons/media/plugins/ffmpeg/DemuxerTable.h b/src/add-ons/media/plugins/ffmpeg/DemuxerTable.h index 9c8d4feeb0..80bd197f35 100644 --- a/src/add-ons/media/plugins/ffmpeg/DemuxerTable.h +++ b/src/add-ons/media/plugins/ffmpeg/DemuxerTable.h @@ -9,18 +9,9 @@ #include -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 diff --git a/src/add-ons/media/plugins/ffmpeg/MuxerTable.cpp b/src/add-ons/media/plugins/ffmpeg/MuxerTable.cpp index 31c0df10a3..e9db5b0bd6 100644 --- a/src/add-ons/media/plugins/ffmpeg/MuxerTable.cpp +++ b/src/add-ons/media/plugins/ffmpeg/MuxerTable.cpp @@ -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",