diff --git a/app/logical/media_file.rb b/app/logical/media_file.rb index 9b74ef336..4c87a9fce 100644 --- a/app/logical/media_file.rb +++ b/app/logical/media_file.rb @@ -67,14 +67,20 @@ class MediaFile :webp # https://www.ftyps.com + # https://cconcolato.github.io/mp4ra/filetype.html + # https://github.com/mozilla/gecko-dev/blob/master/toolkit/components/mediasniffer/nsMediaSniffer.cpp#L78 + # https://mimesniff.spec.whatwg.org/#signature-for-mp4 + # # isom (common) - MP4 Base Media v1 [IS0 14496-12:2003] # mp42 (common) - MP4 v2 [ISO 14496-14] + # iso4 (rare) - MP4 Base Media v4 # iso5 (rare) - MP4 Base Media v5 (used by Twitter) - # 3gp5 (rare) - 3GPP Media (.3GP) Release 5 + # 3gp5 (rare) - 3GPP Media (.3GP) Release 5 (XXX technically this should be .3gp, not .mp4. Supported by Chrome but not Firefox) # avc1 (rare) - MP4 Base w/ AVC ext [ISO 14496-12:2005] # M4V (rare) - Apple iTunes Video (https://en.wikipedia.org/wiki/M4V) - when /\A....ftyp(?:isom|iso5|3gp5|mp42|avc1|M4V)/ + when /\A....ftyp(?:mp4|avc|iso|3gp5|M4V)/ :mp4 + # https://aomediacodec.github.io/av1-avif/#brands-overview when /\A....ftyp(?:avif|avis)/ :avif diff --git a/test/files/mp4/test-300x300-3gp5.mp4 b/test/files/mp4/test-300x300-3gp5.mp4 new file mode 100644 index 000000000..e94c1b75c Binary files /dev/null and b/test/files/mp4/test-300x300-3gp5.mp4 differ diff --git a/test/files/mp4/test-300x300-iso4.mp4 b/test/files/mp4/test-300x300-iso4.mp4 new file mode 100644 index 000000000..c0f354d3c Binary files /dev/null and b/test/files/mp4/test-300x300-iso4.mp4 differ diff --git a/test/functional/uploads_controller_test.rb b/test/functional/uploads_controller_test.rb index d480ec790..c000b65d1 100644 --- a/test/functional/uploads_controller_test.rb +++ b/test/functional/uploads_controller_test.rb @@ -372,8 +372,10 @@ class UploadsControllerTest < ActionDispatch::IntegrationTest should_upload_successfully("test/files/mp4/test-300x300.mp4") should_upload_successfully("test/files/mp4/test-300x300-vp9.mp4") should_upload_successfully("test/files/mp4/test-300x300-yuvj420p-h264.mp4") + should_upload_successfully("test/files/mp4/test-300x300-iso4.mp4") should_upload_successfully("test/files/mp4/test-audio.mp4") should_upload_successfully("test/files/mp4/test-audio.m4v") + should_upload_successfully("test/files/mp4/test-iso5.mp4") should_upload_successfully("test/files/webm/test-512x512.webm") should_upload_successfully("test/files/webm/test-gbrp-vp9.webm") # should_upload_successfully("test/files/compressed.swf") diff --git a/test/unit/media_file_test.rb b/test/unit/media_file_test.rb index e79e5d2e3..6bf8efa56 100644 --- a/test/unit/media_file_test.rb +++ b/test/unit/media_file_test.rb @@ -221,6 +221,7 @@ class MediaFileTest < ActiveSupport::TestCase assert_equal("yuv420p", MediaFile.open("test/files/mp4/test-300x300.mp4").pix_fmt) assert_equal("yuv420p", MediaFile.open("test/files/mp4/test-audio.m4v").pix_fmt) assert_equal("yuv420p", MediaFile.open("test/files/mp4/test-audio.mp4").pix_fmt) + assert_equal("yuv420p", MediaFile.open("test/files/mp4/test-300x300-iso4.mp4").pix_fmt) assert_equal("yuv420p", MediaFile.open("test/files/mp4/test-iso5.mp4").pix_fmt) assert_equal("yuv444p", MediaFile.open("test/files/mp4/test-300x300-yuv444p-h264.mp4").pix_fmt) assert_equal("yuvj420p", MediaFile.open("test/files/mp4/test-300x300-yuvj420p-h264.mp4").pix_fmt) @@ -237,6 +238,8 @@ class MediaFileTest < ActiveSupport::TestCase assert_equal(true, MediaFile.open("test/files/mp4/test-300x300.mp4").is_supported?) assert_equal(true, MediaFile.open("test/files/mp4/test-300x300-vp9.mp4").is_supported?) assert_equal(true, MediaFile.open("test/files/mp4/test-300x300-yuvj420p-h264.mp4").is_supported?) + assert_equal(true, MediaFile.open("test/files/mp4/test-300x300-iso4.mp4").is_supported?) + assert_equal(true, MediaFile.open("test/files/mp4/test-300x300-3gp5.mp4").is_supported?) assert_equal(false, MediaFile.open("test/files/mp4/test-300x300-h265.mp4").is_supported?) assert_equal(false, MediaFile.open("test/files/mp4/test-300x300-av1.mp4").is_supported?)