Dead Zone

Stand alone.

firefox: unsupported media …やられた

2017-04-21 16:33:05 | 雑記

firefox: unsupported media - Dead Zone の続き...

QuickTimeだからダメというのもアレだなぁと思いつつ、少なくともFeature Requestくらいは見つかるんじゃなかろうかと、bugzillaを"QuickTime MP4 support"等で漁ってみたらば。
1244523 - Bring back support of the QuickTime container after the gstreamer removal
とか
1269260 - Video can't be played due to MP4 sniffing
とか
なんかサポートしててもよさげな気配だったので、エラーメッセージを頼りにソースを当たってみたら...
問題の箇所は

MoofParser::Metadata()
{
  MediaByteRange ftyp;
  MediaByteRange moov;
  ScanForMetadata(ftyp, moov);
  CheckedInt<MediaByteBuffer::size_type> ftypLength = ftyp.Length();
  CheckedInt<MediaByteBuffer::size_type> moovLength = moov.Length();
  if (!ftypLength.isValid() || !moovLength.isValid()
      || !ftypLength.value() || !moovLength.value()) {
    // No ftyp or moov, or they cannot be used as array size.
    return nullptr;
  }

と、

MoofParser::ScanForMetadata(mozilla::MediaByteRange& aFtyp,
                            mozilla::MediaByteRange& aMoov)
{
  int64_t length = std::numeric_limits<int64_t>::max();
  mSource->Length(&length);
  MediaByteRangeSet byteRanges;
  byteRanges += MediaByteRange(0, length);
  RefPtr<mp4_demuxer::BlockingStream> stream = new BlockingStream(mSource);

  BoxContext context(stream, byteRanges);
  for (Box box(&context, mOffset); box.IsAvailable(); box = box.Next()) {
    if (box.IsType("ftyp")) {
      aFtyp = box.Range();
      continue;
    }
    if (box.IsType("moov")) {
      aMoov = box.Range();
      break;
    }
  }

で。(<>は文字化けするので変えてあります)

再生できないMP4ファイルでは"moov"が先に来ていて、aFtypがセットされないままbreakしてしまい、!ftypLength.value()に引っかかってnullptrを返し、結果「Cannot parse metadata」に。

何が正しいのかは分かりませんが、IsType("moov")のbreakをcontinueに変えるか、あるいは「!ftypLength.isValid() || !moovLength.isValid() || !ftypLength.value() || !moovLength.value()」を「!ftypLength.isValid() && !moovLength.isValid() || !ftypLength.value() && !moovLength.value()」に変える(たぶんこれは正しくないんだろうけどこれでも動作する)かすれば、問題のファイルも再生できるようになります。というかなりました。

なのでこの件はバグの臭いが...

オマケ
--- a/media/libstagefright/binding/MoofParser.cpp
+++ b/media/libstagefright/binding/MoofParser.cpp
@@ -161,11 +161,14 @@ MoofParser::ScanForMetadata(mozilla::Med
   for (Box box(&context, mOffset); box.IsAvailable(); box = box.Next()) {
     if (box.IsType("ftyp")) {
       aFtyp = box.Range();
-      continue;
-    }
-    if (box.IsType("moov")) {
+      if (aMoov.Length()) {
+        break;
+      }
+    } else if (box.IsType("moov")) {
       aMoov = box.Range();
-      break;
+      if (aFtyp.Length()) {
+        break;
+      }
     }
   }
   mInitRange = aFtyp.Span(aMoov);

(ま、これも正しくはないんだろうけど -_-)

[追記]
う~ん。でもやっぱり
ISO BMFF Byte Stream Format
とか見るとftypが先頭にないと...
QuickTime container - MultimediaWiki
だから「フォーマット : QuickTime」なのかな...
先頭がftypでなくmoovならQuickTime containerとみなして処理を続行...とかできないもんかね?(^^;;

 

『ソフトウェア』 ジャンルのランキング
コメント   この記事についてブログを書く
この記事をはてなブックマークに追加
« 「Windows 10」のメジャーア... | トップ | firefox: page scrolling whi... »

コメントを投稿


コメント利用規約に同意の上コメント投稿を行ってください。

数字4桁を入力し、投稿ボタンを押してください。

あわせて読む

トラックバック

この記事のトラックバック  Ping-URL
  • 30日以上前の記事に対するトラックバックは受け取らないよう設定されております。
  • 送信元の記事内容が半角英数のみのトラックバックは受け取らないよう設定されております。
  • このブログへのリンクがない記事からのトラックバックは受け取らないよう設定されております。
  • ※ブログ管理者のみ、編集画面で設定の変更が可能です。