Skip to content

Commit

Permalink
Migrate CDM created callback.
Browse files Browse the repository at this point in the history
This is meant to be called at most once if the CDM creation fails:
https://cs.chromium.org/chromium/src/media/base/cdm_factory.h?rcl=35ac0b549d21e712319c0bc304fd9de6cba74ecf&l=20

This is part of the base::Callback migration.

Context: https://cs.chromium.org/chromium/src/docs/callback.md?rcl=9fcc3764aea8f97e9f6de4a9ee61d554e67edcda&l=40

Bug: 714018
Change-Id: I1e7bfb134fe90a9f3e239b8dd45a69d6253347d3
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2047188
Auto-Submit: Jose Lopes <jabolopes@google.com>
Commit-Queue: John Abd-El-Malek <jam@chromium.org>
Reviewed-by: John Abd-El-Malek <jam@chromium.org>
Reviewed-by: danakj <danakj@chromium.org>
Reviewed-by: Xiaohan Wang <xhwang@chromium.org>
Cr-Commit-Position: refs/heads/master@{#743206}
  • Loading branch information
Jose Lopes authored and Commit Bot committed Feb 20, 2020
1 parent 0f23ea4 commit 405155d
Show file tree
Hide file tree
Showing 26 changed files with 87 additions and 77 deletions.
9 changes: 5 additions & 4 deletions chromecast/media/cdm/cast_cdm_factory.cc
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,10 @@ void CastCdmFactory::Create(
const ::media::SessionClosedCB& session_closed_cb,
const ::media::SessionKeysChangeCB& session_keys_change_cb,
const ::media::SessionExpirationUpdateCB& session_expiration_update_cb,
const ::media::CdmCreatedCB& cdm_created_cb) {
::media::CdmCreatedCB cdm_created_cb) {
// Bound |cdm_created_cb| so we always fire it asynchronously.
::media::CdmCreatedCB bound_cdm_created_cb =
::media::BindToCurrentLoop(cdm_created_cb);
::media::BindToCurrentLoop(std::move(cdm_created_cb));

CastKeySystem cast_key_system(GetKeySystemByName(key_system));

Expand All @@ -51,7 +51,8 @@ void CastCdmFactory::Create(

if (!cast_cdm) {
LOG(INFO) << "No matching key system found: " << cast_key_system;
bound_cdm_created_cb.Run(nullptr, "No matching key system found.");
std::move(bound_cdm_created_cb)
.Run(nullptr, "No matching key system found.");
return;
}

Expand All @@ -68,7 +69,7 @@ void CastCdmFactory::Create(
::media::BindToCurrentLoop(session_closed_cb),
::media::BindToCurrentLoop(session_keys_change_cb),
::media::BindToCurrentLoop(session_expiration_update_cb)));
bound_cdm_created_cb.Run(cast_cdm, "");
std::move(bound_cdm_created_cb).Run(cast_cdm, "");
}

scoped_refptr<CastCdm> CastCdmFactory::CreatePlatformBrowserCdm(
Expand Down
2 changes: 1 addition & 1 deletion chromecast/media/cdm/cast_cdm_factory.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ class CastCdmFactory : public ::media::CdmFactory {
const ::media::SessionClosedCB& session_closed_cb,
const ::media::SessionKeysChangeCB& session_keys_change_cb,
const ::media::SessionExpirationUpdateCB& session_expiration_update_cb,
const ::media::CdmCreatedCB& cdm_created_cb) override;
::media::CdmCreatedCB cdm_created_cb) override;

// Provides a platform-specific BrowserCdm instance.
virtual scoped_refptr<CastCdm> CreatePlatformBrowserCdm(
Expand Down
25 changes: 14 additions & 11 deletions media/base/android/android_cdm_factory.cc
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,8 @@ AndroidCdmFactory::AndroidCdmFactory(const CreateFetcherCB& create_fetcher_cb,
AndroidCdmFactory::~AndroidCdmFactory() {
weak_factory_.InvalidateWeakPtrs();
for (auto& pending_creation : pending_creations_) {
auto& cdm_created_cb = pending_creation.second.second;
cdm_created_cb.Run(nullptr, "CDM creation aborted");
CdmCreatedCB cdm_created_cb = std::move(pending_creation.second.second);
std::move(cdm_created_cb).Run(nullptr, "CDM creation aborted");
}
}

Expand All @@ -49,14 +49,15 @@ void AndroidCdmFactory::Create(
const SessionClosedCB& session_closed_cb,
const SessionKeysChangeCB& session_keys_change_cb,
const SessionExpirationUpdateCB& session_expiration_update_cb,
const CdmCreatedCB& cdm_created_cb) {
CdmCreatedCB cdm_created_cb) {
DVLOG(1) << __func__;

// Bound |cdm_created_cb| so we always fire it asynchronously.
CdmCreatedCB bound_cdm_created_cb = BindToCurrentLoop(cdm_created_cb);
CdmCreatedCB bound_cdm_created_cb =
BindToCurrentLoop(std::move(cdm_created_cb));

if (security_origin.opaque()) {
bound_cdm_created_cb.Run(nullptr, "Invalid origin.");
std::move(bound_cdm_created_cb).Run(nullptr, "Invalid origin.");
return;
}

Expand All @@ -67,16 +68,16 @@ void AndroidCdmFactory::Create(
scoped_refptr<ContentDecryptionModule> cdm(
new AesDecryptor(session_message_cb, session_closed_cb,
session_keys_change_cb, session_expiration_update_cb));
bound_cdm_created_cb.Run(cdm, "");
std::move(bound_cdm_created_cb).Run(cdm, "");
return;
}

std::string error_message;

if (!MediaDrmBridge::IsKeySystemSupported(key_system)) {
ReportMediaDrmBridgeKeySystemSupport(false);
bound_cdm_created_cb.Run(
nullptr, "Key system not supported unexpectedly: " + key_system);
std::move(bound_cdm_created_cb)
.Run(nullptr, "Key system not supported unexpectedly: " + key_system);
return;
}

Expand All @@ -88,7 +89,8 @@ void AndroidCdmFactory::Create(

creation_id_++;
pending_creations_.emplace(
creation_id_, PendingCreation(std::move(factory), bound_cdm_created_cb));
creation_id_,
PendingCreation(std::move(factory), std::move(bound_cdm_created_cb)));

raw_factory->Create(
key_system, security_origin, cdm_config, session_message_cb,
Expand All @@ -104,11 +106,12 @@ void AndroidCdmFactory::OnCdmCreated(
DVLOG(1) << __func__ << ": creation_id = " << creation_id;

DCHECK(pending_creations_.count(creation_id));
auto cdm_created_cb = pending_creations_[creation_id].second;
CdmCreatedCB cdm_created_cb =
std::move(pending_creations_[creation_id].second);
pending_creations_.erase(creation_id);

LOG_IF(ERROR, !cdm) << error_message;
cdm_created_cb.Run(cdm, error_message);
std::move(cdm_created_cb).Run(cdm, error_message);
}

} // namespace media
2 changes: 1 addition & 1 deletion media/base/android/android_cdm_factory.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ class MEDIA_EXPORT AndroidCdmFactory : public CdmFactory {
const SessionClosedCB& session_closed_cb,
const SessionKeysChangeCB& session_keys_change_cb,
const SessionExpirationUpdateCB& session_expiration_update_cb,
const CdmCreatedCB& cdm_created_cb) final;
CdmCreatedCB cdm_created_cb) final;

private:
// Callback for MediaDrmBridgeFactory::Create().
Expand Down
6 changes: 3 additions & 3 deletions media/base/android/media_drm_bridge_factory.cc
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ void MediaDrmBridgeFactory::Create(
const SessionClosedCB& session_closed_cb,
const SessionKeysChangeCB& session_keys_change_cb,
const SessionExpirationUpdateCB& session_expiration_update_cb,
const CdmCreatedCB& cdm_created_cb) {
CdmCreatedCB cdm_created_cb) {
DCHECK(MediaDrmBridge::IsKeySystemSupported(key_system));
DCHECK(MediaDrmBridge::IsAvailable());
DCHECK(!security_origin.opaque());
Expand All @@ -56,15 +56,15 @@ void MediaDrmBridgeFactory::Create(
key_system +
" may require use_video_overlay_for_embedded_encrypted_video";
NOTREACHED() << error_message;
cdm_created_cb.Run(nullptr, error_message);
std::move(cdm_created_cb).Run(nullptr, error_message);
return;
}

session_message_cb_ = session_message_cb;
session_closed_cb_ = session_closed_cb;
session_keys_change_cb_ = session_keys_change_cb;
session_expiration_update_cb_ = session_expiration_update_cb;
cdm_created_cb_ = cdm_created_cb;
cdm_created_cb_ = std::move(cdm_created_cb);

// MediaDrmStorage may be lazy created in MediaDrmStorageBridge.
storage_ = std::make_unique<MediaDrmStorageBridge>();
Expand Down
2 changes: 1 addition & 1 deletion media/base/android/media_drm_bridge_factory.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ class MEDIA_EXPORT MediaDrmBridgeFactory : public CdmFactory {
const SessionClosedCB& session_closed_cb,
const SessionKeysChangeCB& session_keys_change_cb,
const SessionExpirationUpdateCB& session_expiration_update_cb,
const CdmCreatedCB& cdm_created_cb) final;
CdmCreatedCB cdm_created_cb) final;

private:
// Callback for Initialize() on |storage_|.
Expand Down
6 changes: 3 additions & 3 deletions media/base/cdm_factory.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ namespace media {
// Callback used when CDM is created. |error_message| only used if
// ContentDecryptionModule is null (i.e. CDM can't be created).
using CdmCreatedCB =
base::Callback<void(const scoped_refptr<ContentDecryptionModule>&,
const std::string& error_message)>;
base::OnceCallback<void(const scoped_refptr<ContentDecryptionModule>&,
const std::string& error_message)>;

struct CdmConfig;

Expand All @@ -40,7 +40,7 @@ class MEDIA_EXPORT CdmFactory {
const SessionClosedCB& session_closed_cb,
const SessionKeysChangeCB& session_keys_change_cb,
const SessionExpirationUpdateCB& session_expiration_update_cb,
const CdmCreatedCB& cdm_created_cb) = 0;
CdmCreatedCB cdm_created_cb) = 0;

private:
DISALLOW_COPY_AND_ASSIGN(CdmFactory);
Expand Down
6 changes: 3 additions & 3 deletions media/base/mock_filters.cc
Original file line number Diff line number Diff line change
Expand Up @@ -220,10 +220,10 @@ void MockCdmFactory::Create(
const SessionClosedCB& session_closed_cb,
const SessionKeysChangeCB& session_keys_change_cb,
const SessionExpirationUpdateCB& session_expiration_update_cb,
const CdmCreatedCB& cdm_created_cb) {
CdmCreatedCB cdm_created_cb) {
// If no key system specified, notify that Create() failed.
if (key_system.empty()) {
cdm_created_cb.Run(nullptr, "CDM creation failed");
std::move(cdm_created_cb).Run(nullptr, "CDM creation failed");
return;
}

Expand All @@ -239,7 +239,7 @@ void MockCdmFactory::Create(
key_system, security_origin, session_message_cb, session_closed_cb,
session_keys_change_cb, session_expiration_update_cb);
created_cdm_ = cdm.get();
cdm_created_cb.Run(std::move(cdm), "");
std::move(cdm_created_cb).Run(std::move(cdm), "");
}

MockCdm* MockCdmFactory::GetCreatedCdm() {
Expand Down
2 changes: 1 addition & 1 deletion media/base/mock_filters.h
Original file line number Diff line number Diff line change
Expand Up @@ -644,7 +644,7 @@ class MockCdmFactory : public CdmFactory {
const SessionClosedCB& session_closed_cb,
const SessionKeysChangeCB& session_keys_change_cb,
const SessionExpirationUpdateCB& session_expiration_update_cb,
const CdmCreatedCB& cdm_created_cb) override;
CdmCreatedCB cdm_created_cb) override;

// Return a pointer to the created CDM.
MockCdm* GetCreatedCdm();
Expand Down
4 changes: 2 additions & 2 deletions media/blink/cdm_session_adapter.cc
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,8 @@ void CdmSessionAdapter::CreateCdm(CdmFactory* cdm_factory,
base::Bind(&CdmSessionAdapter::OnSessionClosed, weak_this),
base::Bind(&CdmSessionAdapter::OnSessionKeysChange, weak_this),
base::Bind(&CdmSessionAdapter::OnSessionExpirationUpdate, weak_this),
base::Bind(&CdmSessionAdapter::OnCdmCreated, this, key_system, cdm_config,
start_time));
base::BindOnce(&CdmSessionAdapter::OnCdmCreated, this, key_system,
cdm_config, start_time));
}

void CdmSessionAdapter::SetServerCertificate(
Expand Down
25 changes: 13 additions & 12 deletions media/cdm/aes_decryptor_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -283,18 +283,19 @@ class AesDecryptorTest : public testing::TestWithParam<TestType> {
std::unique_ptr<CdmAllocator> allocator(new SimpleCdmAllocator());
std::unique_ptr<CdmAuxiliaryHelper> cdm_helper(
new MockCdmAuxiliaryHelper(std::move(allocator)));
CdmAdapter::Create(
helper_->KeySystemName(), url::Origin::Create(GURL("http://foo.com")),
cdm_config, create_cdm_func, std::move(cdm_helper),
base::Bind(&MockCdmClient::OnSessionMessage,
base::Unretained(&cdm_client_)),
base::Bind(&MockCdmClient::OnSessionClosed,
base::Unretained(&cdm_client_)),
base::Bind(&MockCdmClient::OnSessionKeysChange,
base::Unretained(&cdm_client_)),
base::Bind(&MockCdmClient::OnSessionExpirationUpdate,
base::Unretained(&cdm_client_)),
base::Bind(&AesDecryptorTest::OnCdmCreated, base::Unretained(this)));
CdmAdapter::Create(helper_->KeySystemName(),
url::Origin::Create(GURL("http://foo.com")),
cdm_config, create_cdm_func, std::move(cdm_helper),
base::Bind(&MockCdmClient::OnSessionMessage,
base::Unretained(&cdm_client_)),
base::Bind(&MockCdmClient::OnSessionClosed,
base::Unretained(&cdm_client_)),
base::Bind(&MockCdmClient::OnSessionKeysChange,
base::Unretained(&cdm_client_)),
base::Bind(&MockCdmClient::OnSessionExpirationUpdate,
base::Unretained(&cdm_client_)),
base::BindOnce(&AesDecryptorTest::OnCdmCreated,
base::Unretained(this)));

base::RunLoop().RunUntilIdle();
#else
Expand Down
5 changes: 3 additions & 2 deletions media/cdm/cdm_adapter.cc
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ void CdmAdapter::Create(
const SessionClosedCB& session_closed_cb,
const SessionKeysChangeCB& session_keys_change_cb,
const SessionExpirationUpdateCB& session_expiration_update_cb,
const CdmCreatedCB& cdm_created_cb) {
CdmCreatedCB cdm_created_cb) {
DCHECK(!key_system.empty());
DCHECK(session_message_cb);
DCHECK(session_closed_cb);
Expand All @@ -192,7 +192,8 @@ void CdmAdapter::Create(
session_keys_change_cb, session_expiration_update_cb);

// |cdm| ownership passed to the promise.
cdm->Initialize(std::make_unique<CdmInitializedPromise>(cdm_created_cb, cdm));
cdm->Initialize(
std::make_unique<CdmInitializedPromise>(std::move(cdm_created_cb), cdm));
}

CdmAdapter::CdmAdapter(
Expand Down
2 changes: 1 addition & 1 deletion media/cdm/cdm_adapter.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ class MEDIA_EXPORT CdmAdapter : public ContentDecryptionModule,
const SessionClosedCB& session_closed_cb,
const SessionKeysChangeCB& session_keys_change_cb,
const SessionExpirationUpdateCB& session_expiration_update_cb,
const CdmCreatedCB& cdm_created_cb);
CdmCreatedCB cdm_created_cb);

// Returns the version of the CDM interface that the created CDM uses. Must
// only be called after the CDM is successfully initialized.
Expand Down
13 changes: 7 additions & 6 deletions media/cdm/cdm_adapter_factory.cc
Original file line number Diff line number Diff line change
Expand Up @@ -28,37 +28,38 @@ void CdmAdapterFactory::Create(
const SessionClosedCB& session_closed_cb,
const SessionKeysChangeCB& session_keys_change_cb,
const SessionExpirationUpdateCB& session_expiration_update_cb,
const CdmCreatedCB& cdm_created_cb) {
CdmCreatedCB cdm_created_cb) {
DVLOG(1) << __func__ << ": key_system=" << key_system;

if (security_origin.opaque()) {
LOG(ERROR) << "Invalid Origin: " << security_origin;
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::BindOnce(cdm_created_cb, nullptr, "Invalid origin."));
FROM_HERE,
base::BindOnce(std::move(cdm_created_cb), nullptr, "Invalid origin."));
return;
}

CdmAdapter::CreateCdmFunc create_cdm_func =
CdmModule::GetInstance()->GetCreateCdmFunc();
if (!create_cdm_func) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::BindOnce(cdm_created_cb, nullptr,
FROM_HERE, base::BindOnce(std::move(cdm_created_cb), nullptr,
"CreateCdmFunc not available."));
return;
}

std::unique_ptr<CdmAuxiliaryHelper> cdm_helper = helper_creation_cb_.Run();
if (!cdm_helper) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE,
base::BindOnce(cdm_created_cb, nullptr, "CDM helper creation failed."));
FROM_HERE, base::BindOnce(std::move(cdm_created_cb), nullptr,
"CDM helper creation failed."));
return;
}

CdmAdapter::Create(key_system, security_origin, cdm_config, create_cdm_func,
std::move(cdm_helper), session_message_cb,
session_closed_cb, session_keys_change_cb,
session_expiration_update_cb, cdm_created_cb);
session_expiration_update_cb, std::move(cdm_created_cb));
}

} // namespace media
2 changes: 1 addition & 1 deletion media/cdm/cdm_adapter_factory.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ class MEDIA_EXPORT CdmAdapterFactory final : public CdmFactory {
const SessionClosedCB& session_closed_cb,
const SessionKeysChangeCB& session_keys_change_cb,
const SessionExpirationUpdateCB& session_expiration_update_cb,
const CdmCreatedCB& cdm_created_cb) override;
CdmCreatedCB cdm_created_cb) override;

private:
// Callback to create CdmAuxiliaryHelper for the created CDM.
Expand Down
4 changes: 2 additions & 2 deletions media/cdm/cdm_adapter_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -151,8 +151,8 @@ class CdmAdapterTestBase : public testing::Test,
base::Unretained(&cdm_client_)),
base::Bind(&MockCdmClient::OnSessionExpirationUpdate,
base::Unretained(&cdm_client_)),
base::Bind(&CdmAdapterTestBase::OnCdmCreated,
base::Unretained(this), expected_result));
base::BindOnce(&CdmAdapterTestBase::OnCdmCreated,
base::Unretained(this), expected_result));
RunUntilIdle();
ASSERT_EQ(expected_result == SUCCESS, !!cdm_);
}
Expand Down
11 changes: 6 additions & 5 deletions media/cdm/default_cdm_factory.cc
Original file line number Diff line number Diff line change
Expand Up @@ -40,25 +40,26 @@ void DefaultCdmFactory::Create(
const SessionClosedCB& session_closed_cb,
const SessionKeysChangeCB& session_keys_change_cb,
const SessionExpirationUpdateCB& session_expiration_update_cb,
const CdmCreatedCB& cdm_created_cb) {
CdmCreatedCB cdm_created_cb) {
if (security_origin.opaque()) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::BindOnce(cdm_created_cb, nullptr, "Invalid origin."));
FROM_HERE,
base::BindOnce(std::move(cdm_created_cb), nullptr, "Invalid origin."));
return;
}

if (!ShouldCreateAesDecryptor(key_system)) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE,
base::BindOnce(cdm_created_cb, nullptr, "Unsupported key system."));
FROM_HERE, base::BindOnce(std::move(cdm_created_cb), nullptr,
"Unsupported key system."));
return;
}

scoped_refptr<ContentDecryptionModule> cdm(
new AesDecryptor(session_message_cb, session_closed_cb,
session_keys_change_cb, session_expiration_update_cb));
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::BindOnce(cdm_created_cb, cdm, ""));
FROM_HERE, base::BindOnce(std::move(cdm_created_cb), cdm, ""));
}

} // namespace media
2 changes: 1 addition & 1 deletion media/cdm/default_cdm_factory.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ class MEDIA_EXPORT DefaultCdmFactory : public CdmFactory {
const SessionClosedCB& session_closed_cb,
const SessionKeysChangeCB& session_keys_change_cb,
const SessionExpirationUpdateCB& session_expiration_update_cb,
const CdmCreatedCB& cdm_created_cb) final;
CdmCreatedCB cdm_created_cb) final;

private:
DISALLOW_COPY_AND_ASSIGN(DefaultCdmFactory);
Expand Down
Loading

0 comments on commit 405155d

Please sign in to comment.