blob: 2bd39577f05f96b8935904a9651419492fc8ccd9 [file] [log] [blame]
// Copyright 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <map>
#include <string>
#include <vector>
#include "base/basictypes.h"
#include "base/hash_tables.h"
#include "cobalt/media/base/media_export.h"
#include "cobalt/media/base/mime_util.h"
#include "cobalt/media/base/video_codecs.h"
namespace cobalt {
namespace media {
namespace internal {
// Internal utility class for handling mime types. Should only be invoked by
// tests and the functions within -- NOT for direct use by others.
class MEDIA_EXPORT MimeUtil {
enum Codec {
// Platform configuration structure. Controls which codecs are supported at
// runtime. Also used by tests to simulate platform differences.
struct PlatformInfo {
bool has_platform_decoders;
bool has_platform_vp8_decoder;
bool has_platform_vp9_decoder;
bool supports_opus;
bool is_unified_media_pipeline_enabled;
: has_platform_decoders(false),
is_unified_media_pipeline_enabled(false) {}
// See mime_util.h for more information on these methods.
bool IsSupportedMediaMimeType(const std::string& mime_type) const;
void ParseCodecString(const std::string& codecs,
std::vector<std::string>* codecs_out, bool strip);
SupportsType IsSupportedMediaFormat(const std::string& mime_type,
const std::vector<std::string>& codecs,
bool is_encrypted) const;
void RemoveProprietaryMediaTypesAndCodecs();
// Checks special platform specific codec restrictions. Returns true if
// |codec| is supported when contained in |mime_type_lower_case|.
// |is_encrypted| means the codec will be used with encrypted blocks.
// |platform_info| describes the availability of various platform features;
// see PlatformInfo for more details.
static bool IsCodecSupportedOnPlatform(
Codec codec, const std::string& mime_type_lower_case, bool is_encrypted,
const PlatformInfo& platform_info);
typedef base::hash_set<int> CodecSet;
typedef std::map<std::string, CodecSet> MediaFormatMappings;
struct CodecEntry {
CodecEntry() : codec(INVALID_CODEC), is_ambiguous(true) {}
CodecEntry(Codec c, bool ambiguous) : codec(c), is_ambiguous(ambiguous) {}
Codec codec;
bool is_ambiguous;
typedef std::map<std::string, CodecEntry> StringToCodecMappings;
// Initializes the supported media types into hash sets for faster lookup.
void InitializeMimeTypeMaps();
// Initializes the supported media formats (|media_format_map_|).
void AddSupportedMediaFormats();
// Adds |mime_type| with the specified codecs to |media_format_map_|.
void AddContainerWithCodecs(const std::string& mime_type,
const CodecSet& codecs_list,
bool is_proprietary_mime_type);
// Returns IsSupported if all codec IDs in |codecs| are unambiguous and are
// supported in |mime_type_lower_case|. MayBeSupported is returned if at least
// one codec ID in |codecs| is ambiguous but all the codecs are supported.
// IsNotSupported is returned if |mime_type_lower_case| is not supported or at
// least one is not supported in |mime_type_lower_case|. |is_encrypted| means
// the codec will be used with encrypted blocks.
SupportsType AreSupportedCodecs(const CodecSet& supported_codecs,
const std::vector<std::string>& codecs,
const std::string& mime_type_lower_case,
bool is_encrypted) const;
// Converts a codec ID into an Codec enum value and indicates
// whether the conversion was ambiguous.
// Returns true if this method was able to map |codec_id| with
// |mime_type_lower_case| to a specific Codec enum value. |codec| and
// |is_ambiguous| are only valid if true is returned. Otherwise their value is
// undefined after the call.
// |is_ambiguous| is true if |codec_id| did not have enough information to
// unambiguously determine the proper Codec enum value. If |is_ambiguous|
// is true |codec| contains the best guess for the intended Codec enum value.
// |profile| and |level| indicate video codec profile and level (unused for
// audio codecs).
// |is_encrypted| means the codec will be used with encrypted blocks.
bool StringToCodec(const std::string& mime_type_lower_case,
const std::string& codec_id, Codec* codec,
bool* is_ambiguous, VideoCodecProfile* out_profile,
uint8_t* out_level, bool is_encrypted) const;
// Returns true if |codec| is supported when contained in
// |mime_type_lower_case|. Note: This method will always return false for
// proprietary codecs if |allow_proprietary_codecs_| is set to false.
// |is_encrypted| means the codec will be used with encrypted blocks.
bool IsCodecSupported(Codec codec, const std::string& mime_type_lower_case,
bool is_encrypted) const;
// Returns true if |codec| refers to a proprietary codec.
bool IsCodecProprietary(Codec codec) const;
// Returns true and sets |*default_codec| if |mime_type| has a default codec
// associated with it. Returns false otherwise and the value of
// |*default_codec| is undefined.
bool GetDefaultCodecLowerCase(const std::string& mime_type_lower_case,
Codec* default_codec) const;
// Returns true if |mime_type_lower_case| has a default codec associated with
// it and IsCodecSupported() returns true for that particular codec.
// |is_encrypted| means the codec will be used with encrypted blocks.
bool IsDefaultCodecSupportedLowerCase(const std::string& mime_type_lower_case,
bool is_encrypted) const;
#if defined(OS_ANDROID)
// Indicates the support of various codecs within the platform.
PlatformInfo platform_info_;
// A map of mime_types and hash map of the supported codecs for the mime_type.
MediaFormatMappings media_format_map_;
// List of proprietary containers in |media_format_map_|.
std::vector<std::string> proprietary_media_containers_;
// Whether proprietary codec support should be advertised to callers.
bool allow_proprietary_codecs_;
// Lookup table for string compare based string -> Codec mappings.
StringToCodecMappings string_to_codec_map_;
} // namespace internal
} // namespace media
} // namespace cobalt