content/media/fmp4/MP4Decoder.cpp

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     2 /* vim:set ts=2 sw=2 sts=2 et cindent: */
     3 /* This Source Code Form is subject to the terms of the Mozilla Public
     4  * License, v. 2.0. If a copy of the MPL was not distributed with this
     5  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     7 #include "MP4Decoder.h"
     8 #include "MP4Reader.h"
     9 #include "MediaDecoderStateMachine.h"
    10 #include "mozilla/Preferences.h"
    12 #ifdef XP_WIN
    13 #include "mozilla/WindowsVersion.h"
    14 #endif
    15 #ifdef MOZ_FFMPEG
    16 #include "FFmpegDecoderModule.h"
    17 #endif
    19 namespace mozilla {
    21 MediaDecoderStateMachine* MP4Decoder::CreateStateMachine()
    22 {
    23   return new MediaDecoderStateMachine(this, new MP4Reader(this));
    24 }
    26 bool
    27 MP4Decoder::GetSupportedCodecs(const nsACString& aType,
    28                                char const *const ** aCodecList)
    29 {
    30   if (!IsEnabled()) {
    31     return false;
    32   }
    34   // AAC in M4A.
    35   static char const *const aacAudioCodecs[] = {
    36     "mp4a.40.2",    // AAC-LC
    37     // TODO: AAC-HE ?
    38     nullptr
    39   };
    40   if (aType.EqualsASCII("audio/mp4") ||
    41       aType.EqualsASCII("audio/x-m4a")) {
    42     if (aCodecList) {
    43       *aCodecList = aacAudioCodecs;
    44     }
    45     return true;
    46   }
    48   // H.264 + AAC in MP4.
    49   static char const *const h264Codecs[] = {
    50     "avc1.42E01E",  // H.264 Constrained Baseline Profile Level 3.0
    51     "avc1.42001E",  // H.264 Baseline Profile Level 3.0
    52     "avc1.58A01E",  // H.264 Extended Profile Level 3.0
    53     "avc1.4D401E",  // H.264 Main Profile Level 3.0
    54     "avc1.64001E",  // H.264 High Profile Level 3.0
    55     "avc1.64001F",  // H.264 High Profile Level 3.1
    56     "mp4a.40.2",    // AAC-LC
    57     // TODO: There must be more profiles here?
    58     nullptr
    59   };
    60   if (aType.EqualsASCII("video/mp4")) {
    61     if (aCodecList) {
    62       *aCodecList = h264Codecs;
    63     }
    64     return true;
    65   }
    67   return false;
    68 }
    70 static bool
    71 IsFFmpegAvailable()
    72 {
    73 #ifndef MOZ_FFMPEG
    74   return false;
    75 #else
    76   if (!Preferences::GetBool("media.fragmented-mp4.ffmpeg.enabled", false)) {
    77     return false;
    78   }
    80   // If we can link to FFmpeg, then we can almost certainly play H264 and AAC
    81   // with it.
    82   return FFmpegDecoderModule::Link();
    83 #endif
    84 }
    86 static bool
    87 HavePlatformMPEGDecoders()
    88 {
    89   return Preferences::GetBool("media.fragmented-mp4.use-blank-decoder") ||
    90 #ifdef XP_WIN
    91          // We have H.264/AAC platform decoders on Windows Vista and up.
    92          IsVistaOrLater() ||
    93 #endif
    94          IsFFmpegAvailable() ||
    95          // TODO: Other platforms...
    96          false;
    97 }
    99 /* static */
   100 bool
   101 MP4Decoder::IsEnabled()
   102 {
   103   return HavePlatformMPEGDecoders() &&
   104          Preferences::GetBool("media.fragmented-mp4.enabled");
   105 }
   107 } // namespace mozilla

mercurial