blob: 65fd5be75300951c1a37ed58578e1e7fa31853de [file] [log] [blame]
// Copyright 2019 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_FUCHSIA_CDM_FUCHSIA_CDM_H_
#define MEDIA_FUCHSIA_CDM_FUCHSIA_CDM_H_
#include <fuchsia/media/drm/cpp/fidl.h>
#include "base/containers/flat_map.h"
#include "base/macros.h"
#include "base/optional.h"
#include "media/base/cdm_context.h"
#include "media/base/cdm_promise_adapter.h"
#include "media/base/content_decryption_module.h"
#include "media/fuchsia/cdm/fuchsia_cdm_context.h"
#include "media/fuchsia/cdm/fuchsia_decryptor.h"
namespace media {
class FuchsiaCdm : public ContentDecryptionModule,
public CdmContext,
public FuchsiaCdmContext {
public:
struct SessionCallbacks {
SessionCallbacks();
SessionCallbacks(SessionCallbacks&&);
~SessionCallbacks();
SessionCallbacks& operator=(SessionCallbacks&&);
SessionMessageCB message_cb;
SessionClosedCB closed_cb;
SessionKeysChangeCB keys_change_cb;
SessionExpirationUpdateCB expiration_update_cb;
DISALLOW_COPY_AND_ASSIGN(SessionCallbacks);
};
FuchsiaCdm(fuchsia::media::drm::ContentDecryptionModulePtr cdm,
SessionCallbacks callbacks);
// ContentDecryptionModule implementation:
void SetServerCertificate(const std::vector<uint8_t>& certificate,
std::unique_ptr<SimpleCdmPromise> promise) override;
void CreateSessionAndGenerateRequest(
CdmSessionType session_type,
EmeInitDataType init_data_type,
const std::vector<uint8_t>& init_data,
std::unique_ptr<NewSessionCdmPromise> promise) override;
void LoadSession(CdmSessionType session_type,
const std::string& session_id,
std::unique_ptr<NewSessionCdmPromise> promise) override;
void UpdateSession(const std::string& session_id,
const std::vector<uint8_t>& response,
std::unique_ptr<SimpleCdmPromise> promise) override;
void CloseSession(const std::string& session_id,
std::unique_ptr<SimpleCdmPromise> promise) override;
void RemoveSession(const std::string& session_id,
std::unique_ptr<SimpleCdmPromise> promise) override;
CdmContext* GetCdmContext() override;
// CdmContext implementation:
std::unique_ptr<CallbackRegistration> RegisterEventCB(
EventCB event_cb) override;
Decryptor* GetDecryptor() override;
int GetCdmId() const override;
FuchsiaCdmContext* GetFuchsiaCdmContext() override;
// FuchsiaCdmContext implementation:
std::unique_ptr<FuchsiaSecureStreamDecryptor> CreateVideoDecryptor(
FuchsiaSecureStreamDecryptor::Client* client) override;
private:
class CdmSession;
~FuchsiaCdm() override;
void OnCreateSession(std::unique_ptr<CdmSession> session,
uint32_t promise_id,
const std::string& session_id);
void OnGenerateLicenseRequestStatus(
CdmSession* session,
uint32_t promise_id,
base::Optional<CdmPromise::Exception> exception);
void OnProcessLicenseServerMessageStatus(
uint32_t promise_id,
base::Optional<CdmPromise::Exception> exception);
// TODO(crbug.com/1012525): Remove |key_id| once fxb/38253 is resolved.
void OnNewKey(const std::string& key_id);
CdmPromiseAdapter promises_;
base::flat_map<std::string, std::unique_ptr<CdmSession>> session_map_;
fuchsia::media::drm::ContentDecryptionModulePtr cdm_;
SessionCallbacks session_callbacks_;
FuchsiaDecryptor decryptor_;
base::Lock new_key_cb_for_video_lock_;
FuchsiaSecureStreamDecryptor::NewKeyCB new_key_cb_for_video_
GUARDED_BY(new_key_cb_for_video_lock_);
DISALLOW_COPY_AND_ASSIGN(FuchsiaCdm);
};
} // namespace media
#endif // MEDIA_FUCHSIA_CDM_FUCHSIA_CDM_H_