Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(377)

Side by Side Diff: media/base/mime_util.cc

Issue 1684853003: WIP: allow to play Youtube if use_proprieraty_codecs=1 and ffmpeg_branding=Chromium (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « media/base/media.cc ('k') | media/base/mime_util_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <stddef.h> 5 #include <stddef.h>
6 #include <stdint.h> 6 #include <stdint.h>
7 7
8 #include <map> 8 #include <map>
9 9
10 #include "base/containers/hash_tables.h" 10 #include "base/containers/hash_tables.h"
11 #include "base/lazy_instance.h" 11 #include "base/lazy_instance.h"
12 #include "base/macros.h" 12 #include "base/macros.h"
13 #include "base/strings/string_number_conversions.h" 13 #include "base/strings/string_number_conversions.h"
14 #include "base/strings/string_split.h" 14 #include "base/strings/string_split.h"
15 #include "base/strings/string_util.h" 15 #include "base/strings/string_util.h"
16 #include "build/build_config.h" 16 #include "build/build_config.h"
17 #include "media/base/media.h"
17 #include "media/base/mime_util.h" 18 #include "media/base/mime_util.h"
18 #include "media/media_features.h" 19 #include "media/media_features.h"
19 20
20 #if defined(OS_ANDROID) 21 #if defined(OS_ANDROID)
21 #include "base/android/build_info.h" 22 #include "base/android/build_info.h"
22 #endif 23 #endif
23 24
24 namespace media { 25 namespace media {
25 26
26 // Singleton utility class for mime types. 27 // Singleton utility class for mime types.
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 // Returns true if this method was able to map |codec_id| to a specific 94 // Returns true if this method was able to map |codec_id| to a specific
94 // Codec enum value. |codec| and |is_ambiguous| are only valid if true 95 // Codec enum value. |codec| and |is_ambiguous| are only valid if true
95 // is returned. Otherwise their value is undefined after the call. 96 // is returned. Otherwise their value is undefined after the call.
96 // |is_ambiguous| is true if |codec_id| did not have enough information to 97 // |is_ambiguous| is true if |codec_id| did not have enough information to
97 // unambiguously determine the proper Codec enum value. If |is_ambiguous| 98 // unambiguously determine the proper Codec enum value. If |is_ambiguous|
98 // is true |codec| contains the best guess for the intended Codec enum value. 99 // is true |codec| contains the best guess for the intended Codec enum value.
99 bool StringToCodec(const std::string& codec_id, 100 bool StringToCodec(const std::string& codec_id,
100 Codec* codec, 101 Codec* codec,
101 bool* is_ambiguous) const; 102 bool* is_ambiguous) const;
102 103
104 media::AudioCodec MediaCodecToAudioCodec(Codec codec) const;
105 media::VideoCodec MediaCodecToVideoCodec(Codec codec) const;
106
103 // Returns true if |codec| is supported by the platform. 107 // Returns true if |codec| is supported by the platform.
104 // Note: This method will return false if the platform supports proprietary 108 // Note: This method will return false if the platform supports proprietary
105 // codecs but |allow_proprietary_codecs_| is set to false. 109 // codecs but |allow_proprietary_codecs_| is set to false.
106 bool IsCodecSupported(Codec codec) const; 110 bool IsCodecSupported(Codec codec) const;
107 111
108 // Returns true if |codec| refers to a proprietary codec. 112 // Returns true if |codec| refers to a proprietary codec.
109 bool IsCodecProprietary(Codec codec) const; 113 bool IsCodecProprietary(Codec codec) const;
110 114
111 // Returns true and sets |*default_codec| if |mime_type| has a default codec 115 // Returns true and sets |*default_codec| if |mime_type| has a default codec
112 // associated with it. Returns false otherwise and the value of 116 // associated with it. Returns false otherwise and the value of
(...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after
485 489
486 SupportsType MimeUtil::IsSupportedMediaFormat( 490 SupportsType MimeUtil::IsSupportedMediaFormat(
487 const std::string& mime_type, 491 const std::string& mime_type,
488 const std::vector<std::string>& codecs) const { 492 const std::vector<std::string>& codecs) const {
489 const std::string mime_type_lower_case = base::ToLowerASCII(mime_type); 493 const std::string mime_type_lower_case = base::ToLowerASCII(mime_type);
490 MediaFormatMappings::const_iterator it_media_format_map = 494 MediaFormatMappings::const_iterator it_media_format_map =
491 media_format_map_.find(mime_type_lower_case); 495 media_format_map_.find(mime_type_lower_case);
492 if (it_media_format_map == media_format_map_.end()) 496 if (it_media_format_map == media_format_map_.end())
493 return IsNotSupported; 497 return IsNotSupported;
494 498
499 // TODO: implement and use media::IsMediaContainerSupported
500 // similar to IsVideoCodecSupported
501
495 if (it_media_format_map->second.empty()) { 502 if (it_media_format_map->second.empty()) {
496 // We get here if the mimetype does not expect a codecs parameter. 503 // We get here if the mimetype does not expect a codecs parameter.
497 return (codecs.empty() && 504 return (codecs.empty() &&
498 IsDefaultCodecSupportedLowerCase(mime_type_lower_case)) 505 IsDefaultCodecSupportedLowerCase(mime_type_lower_case))
499 ? IsSupported 506 ? IsSupported
500 : IsNotSupported; 507 : IsNotSupported;
501 } 508 }
502 509
503 if (codecs.empty()) { 510 if (codecs.empty()) {
504 // We get here if the mimetype expects to get a codecs parameter, 511 // We get here if the mimetype expects to get a codecs parameter,
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
648 // either H.264 or HEVC/H.265 codec ID because currently those are the only 655 // either H.264 or HEVC/H.265 codec ID because currently those are the only
649 // ones that are not added to the |string_to_codec_map_| and require parsing. 656 // ones that are not added to the |string_to_codec_map_| and require parsing.
650 #if BUILDFLAG(ENABLE_HEVC_DEMUXING) 657 #if BUILDFLAG(ENABLE_HEVC_DEMUXING)
651 if (ParseHEVCCodecID(codec_id, codec, is_ambiguous)) { 658 if (ParseHEVCCodecID(codec_id, codec, is_ambiguous)) {
652 return true; 659 return true;
653 } 660 }
654 #endif 661 #endif
655 return ParseH264CodecID(codec_id, codec, is_ambiguous); 662 return ParseH264CodecID(codec_id, codec, is_ambiguous);
656 } 663 }
657 664
665 media::AudioCodec MimeUtil::MediaCodecToAudioCodec(Codec codec) const {
666 switch (codec) {
667 case PCM:
668 return kCodecPCM_S16BE; // kCodecPCM_S24BE
669 case MP3:
670 return kCodecMP3;
671 case AC3:
672 return kCodecAC3;
673 case EAC3:
674 return kCodecEAC3;
675 case MPEG2_AAC_LC:
676 case MPEG2_AAC_MAIN:
677 case MPEG2_AAC_SSR:
678 case MPEG4_AAC_LC:
679 case MPEG4_AAC_SBR_v1:
680 case MPEG4_AAC_SBR_PS_v2:
681 return kCodecAAC;
682 case VORBIS:
683 return kCodecVorbis;
684 case OPUS:
685 return kCodecOpus;
686 /*
687 case ?
688 return kCodecFLAC;
689 case ?
690 return kCodecAMR_NB;
691 case ?
692 return kCodecAMR_WB;
693 case ?
694 return kCodecPCM_ALAW;
695 return kCodecPCM_MULAW;
696 case ?
697 return kCodecGSM_MS;
698 case ?
699 return kCodecALAC;;
700 */
701
702 default:
703 DVLOG(1) << "Unknown Codec: " << codec;
704 }
705 return kUnknownAudioCodec;
706 }
707
708 VideoCodec MimeUtil::MediaCodecToVideoCodec(Codec codec) const {
709 switch (codec) {
710 case H264_BASELINE:
711 case H264_MAIN:
712 case H264_HIGH:
713 return kCodecH264;
714 case HEVC_MAIN:
715 return kCodecHEVC;
716 case VP8:
717 return kCodecVP8;
718 case VP9:
719 return kCodecVP9;
720 case THEORA:
721 return kCodecTheora;
722 /*
723 case ?:
724 return kCodecVC1;
725 case ?:
726 return kCodecMPEG2;
727 case ?:
728 return kCodecMPEG4;
729 */
730 default:
731 DVLOG(1) << "Unknown Codec: " << codec;
732 }
733 return kUnknownVideoCodec;
734 }
735
658 bool MimeUtil::IsCodecSupported(Codec codec) const { 736 bool MimeUtil::IsCodecSupported(Codec codec) const {
659 DCHECK_NE(codec, INVALID_CODEC); 737 DCHECK_NE(codec, INVALID_CODEC);
660 738
661 #if defined(OS_ANDROID) 739 #if defined(OS_ANDROID)
662 if (!IsCodecSupportedOnAndroid(codec)) 740 if (!IsCodecSupportedOnAndroid(codec))
663 return false; 741 return false;
664 #endif 742 #endif
665 743
666 return allow_proprietary_codecs_ || !IsCodecProprietary(codec); 744 bool allow = allow_proprietary_codecs_ || !IsCodecProprietary(codec);
745
746 // Not allowed because of build configuration.
747 if (!allow)
748 return false;
749
750 // Check if the underlying media library actually supports the codec. Useful
751 // when the build configuration allows proprietary codecs but not the
752 // underlying media library.
753
754 AudioCodec audio_codec = MediaCodecToAudioCodec(codec);
755 if (audio_codec != kUnknownAudioCodec &&
756 media::IsAudioCodecSupported(audio_codec))
757 return true;
758
759 media::VideoCodec video_codec = MediaCodecToVideoCodec(codec);
760 if (video_codec != kUnknownVideoCodec &&
761 media::IsVideoCodecSupported(video_codec))
762 return true;
763
764 return false;
667 } 765 }
668 766
669 bool MimeUtil::IsCodecProprietary(Codec codec) const { 767 bool MimeUtil::IsCodecProprietary(Codec codec) const {
670 switch (codec) { 768 switch (codec) {
671 case INVALID_CODEC: 769 case INVALID_CODEC:
672 case AC3: 770 case AC3:
673 case EAC3: 771 case EAC3:
674 case MP3: 772 case MP3:
675 case MPEG2_AAC_LC: 773 case MPEG2_AAC_LC:
676 case MPEG2_AAC_MAIN: 774 case MPEG2_AAC_MAIN:
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
734 std::vector<std::string>* codecs_out, 832 std::vector<std::string>* codecs_out,
735 const bool strip) { 833 const bool strip) {
736 g_media_mime_util.Get().ParseCodecString(codecs, codecs_out, strip); 834 g_media_mime_util.Get().ParseCodecString(codecs, codecs_out, strip);
737 } 835 }
738 836
739 void RemoveProprietaryMediaTypesAndCodecsForTests() { 837 void RemoveProprietaryMediaTypesAndCodecsForTests() {
740 g_media_mime_util.Get().RemoveProprietaryMediaTypesAndCodecsForTests(); 838 g_media_mime_util.Get().RemoveProprietaryMediaTypesAndCodecsForTests();
741 } 839 }
742 840
743 } // namespace media 841 } // namespace media
OLDNEW
« no previous file with comments | « media/base/media.cc ('k') | media/base/mime_util_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698