blob: f0dcd5df9f49539bf1cc2189a51bb4388150dbf3 [file] [log] [blame]
// Copyright 2015 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.
#ifndef MEDIA_BLINK_KEY_SYSTEM_CONFIG_SELECTOR_H_
#define MEDIA_BLINK_KEY_SYSTEM_CONFIG_SELECTOR_H_
#include <memory>
#include <string>
#include <vector>
#include "base/bind.h"
#include "base/callback.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "media/base/eme_constants.h"
#include "media/blink/media_blink_export.h"
#include "third_party/blink/public/platform/web_media_key_system_media_capability.h"
#include "third_party/blink/public/platform/web_vector.h"
namespace blink {
struct WebMediaKeySystemConfiguration;
class WebString;
} // namespace blink
namespace media {
struct CdmConfig;
class KeySystems;
class MediaPermission;
class MEDIA_BLINK_EXPORT KeySystemConfigSelector {
public:
KeySystemConfigSelector(const KeySystems* key_systems,
MediaPermission* media_permission);
~KeySystemConfigSelector();
void SelectConfig(
const blink::WebString& key_system,
const blink::WebVector<blink::WebMediaKeySystemConfiguration>&
candidate_configurations,
base::Callback<void(const blink::WebMediaKeySystemConfiguration&,
const CdmConfig&)> succeeded_cb,
base::Closure not_supported_cb);
using IsSupportedMediaTypeCB =
base::RepeatingCallback<bool(const std::string& container_mime_type,
const std::string& codecs,
bool use_aes_decryptor)>;
void SetIsSupportedMediaTypeCBForTesting(IsSupportedMediaTypeCB cb) {
is_supported_media_type_cb_ = std::move(cb);
}
private:
struct SelectionRequest;
class ConfigState;
enum ConfigurationSupport {
CONFIGURATION_NOT_SUPPORTED,
CONFIGURATION_REQUIRES_PERMISSION,
CONFIGURATION_SUPPORTED,
};
void SelectConfigInternal(std::unique_ptr<SelectionRequest> request);
void OnPermissionResult(std::unique_ptr<SelectionRequest> request,
bool is_permission_granted);
ConfigurationSupport GetSupportedConfiguration(
const std::string& key_system,
const blink::WebMediaKeySystemConfiguration& candidate,
ConfigState* config_state,
blink::WebMediaKeySystemConfiguration* accumulated_configuration);
bool GetSupportedCapabilities(
const std::string& key_system,
EmeMediaType media_type,
const blink::WebVector<blink::WebMediaKeySystemMediaCapability>&
requested_media_capabilities,
ConfigState* config_state,
std::vector<blink::WebMediaKeySystemMediaCapability>*
supported_media_capabilities);
bool IsSupportedContentType(const std::string& key_system,
EmeMediaType media_type,
const std::string& container_mime_type,
const std::string& codecs,
ConfigState* config_state);
EmeConfigRule GetEncryptionSchemeConfigRule(
const std::string& key_system,
const blink::WebMediaKeySystemMediaCapability::EncryptionScheme
encryption_scheme);
const KeySystems* key_systems_;
MediaPermission* media_permission_;
// A callback used to check whether a media type is supported. Only set in
// tests. If null the implementation will check the support using MimeUtil.
IsSupportedMediaTypeCB is_supported_media_type_cb_;
base::WeakPtrFactory<KeySystemConfigSelector> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(KeySystemConfigSelector);
};
} // namespace media
#endif // MEDIA_BLINK_KEY_SYSTEM_CONFIG_SELECTOR_H_