From 83ba91425f5d9f41d417daab54edc393d412d2d2 Mon Sep 17 00:00:00 2001 From: evazion Date: Fri, 28 Oct 2022 03:41:13 -0500 Subject: [PATCH] uploads: fix .mp4 filetype detection. Fix a bug where MP4 files with major brand "iso4" weren't detected as MP4, so they couldn't be uploaded. This switches our MP4 detection code to something very similar to Firefox's MP4 sniffing algorithm. Ours is slightly wrong because a) we only check the major_brand, not the minor_brands, and b) we falsely detect certain 3GP videos as MP4. 3GP is a very similar format to MP4, close enough that it can be played by Chrome (but not Firefox), but it's technically not MP4 and should not have a .mp4 file extension. We leave it alone because we have two existing 3GP media assets that were falsely detected as MP4. https://danbooru.donmai.us/forum_topics/22356 https://github.com/mozilla/gecko-dev/blob/master/toolkit/components/mediasniffer/nsMediaSniffer.cpp#L78 https://mimesniff.spec.whatwg.org/#signature-for-mp4 --- app/logical/media_file.rb | 10 ++++++++-- test/files/mp4/test-300x300-3gp5.mp4 | Bin 0 -> 18770 bytes test/files/mp4/test-300x300-iso4.mp4 | Bin 0 -> 24015 bytes test/functional/uploads_controller_test.rb | 2 ++ test/unit/media_file_test.rb | 3 +++ 5 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 test/files/mp4/test-300x300-3gp5.mp4 create mode 100644 test/files/mp4/test-300x300-iso4.mp4 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 0000000000000000000000000000000000000000..e94c1b75ca9a3b910bbddab003977e5a696376f9 GIT binary patch literal 18770 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 literal 0 HcmV?d00001 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?)