[go: nahoru, domu]

blob: 1154fb2540862a3e58d0eac6934c5c5a4a72d256 [file] [log] [blame]
Avi Drissmand387f0922022-09-14 20:51:311// Copyright 2018 The Chromium Authors
Chad Duffin9062d332019-01-04 21:51:302// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "media/filters/decrypting_media_resource.h"
6
7#include <memory>
8#include <utility>
9
Avi Drissmand70f89a2023-01-11 23:52:5510#include "base/functional/bind.h"
11#include "base/functional/callback_helpers.h"
Chad Duffin9062d332019-01-04 21:51:3012#include "base/logging.h"
Ali Hijazie63cbaf62023-12-20 19:29:3513#include "base/memory/raw_ptr.h"
Sean Mahere672a662023-01-09 21:42:2814#include "base/task/sequenced_task_runner.h"
Chad Duffin9062d332019-01-04 21:51:3015#include "media/base/cdm_context.h"
16#include "media/base/demuxer_stream.h"
17#include "media/base/media_log.h"
18#include "media/base/pipeline_status.h"
19#include "media/filters/decrypting_demuxer_stream.h"
20
21namespace media {
22
23DecryptingMediaResource::DecryptingMediaResource(
24 MediaResource* media_resource,
25 CdmContext* cdm_context,
26 MediaLog* media_log,
Frank Liberatoa36c4bb2020-11-06 23:33:0427 scoped_refptr<base::SequencedTaskRunner> task_runner)
Chad Duffin9062d332019-01-04 21:51:3028 : media_resource_(media_resource),
29 cdm_context_(cdm_context),
30 media_log_(media_log),
Jeremy Roman32948392019-07-09 18:34:3731 task_runner_(task_runner) {
Chad Duffin9062d332019-01-04 21:51:3032 DCHECK(media_resource);
Rahul Yadav2e767f62023-08-09 17:32:0433 DCHECK_EQ(MediaResource::Type::kStream, media_resource->GetType());
Chad Duffin9062d332019-01-04 21:51:3034 DCHECK(cdm_context_);
35 DCHECK(cdm_context_->GetDecryptor());
36 DCHECK(cdm_context_->GetDecryptor()->CanAlwaysDecrypt());
37 DCHECK(media_log_);
Frank Liberatoa36c4bb2020-11-06 23:33:0438 DCHECK(task_runner->RunsTasksInCurrentSequence());
Chad Duffin9062d332019-01-04 21:51:3039}
40
41DecryptingMediaResource::~DecryptingMediaResource() = default;
42
43MediaResource::Type DecryptingMediaResource::GetType() const {
Rahul Yadav2e767f62023-08-09 17:32:0444 DCHECK_EQ(MediaResource::Type::kStream, media_resource_->GetType());
45 return MediaResource::Type::kStream;
Chad Duffin9062d332019-01-04 21:51:3046}
47
Ali Hijazie63cbaf62023-12-20 19:29:3548std::vector<raw_ptr<DemuxerStream, VectorExperimental>>
49DecryptingMediaResource::GetAllStreams() {
Chad Duffin9062d332019-01-04 21:51:3050 if (streams_.size())
51 return streams_;
52
53 return media_resource_->GetAllStreams();
54}
55
Chad Duffined9a55e2019-01-08 03:19:1356void DecryptingMediaResource::Initialize(InitCB init_cb, WaitingCB waiting_cb) {
Chad Duffin9062d332019-01-04 21:51:3057 DCHECK(init_cb);
58
59 auto streams = media_resource_->GetAllStreams();
60
61 // Save the callback so that we can invoke it when the
62 // DecryptingDemuxerStreams have finished initialization.
63 init_cb_ = std::move(init_cb);
64 num_dds_pending_init_ = streams.size();
65
Ali Hijazie63cbaf62023-12-20 19:29:3566 for (media::DemuxerStream* stream : streams) {
Chad Duffin9062d332019-01-04 21:51:3067 auto decrypting_demuxer_stream = std::make_unique<DecryptingDemuxerStream>(
Chad Duffined9a55e2019-01-08 03:19:1368 task_runner_, media_log_, waiting_cb);
Chad Duffin9062d332019-01-04 21:51:3069
70 // DecryptingDemuxerStream always invokes the callback asynchronously so
71 // that we have no reentrancy issues. "All public APIs and callbacks are
72 // trampolined to the |task_runner_|."
73 decrypting_demuxer_stream->Initialize(
74 stream, cdm_context_,
Jose Lopes25ba7b32020-03-12 16:01:2775 base::BindOnce(&DecryptingMediaResource::OnDecryptingDemuxerInitialized,
76 weak_factory_.GetWeakPtr()));
Chad Duffin9062d332019-01-04 21:51:3077
78 streams_.push_back(decrypting_demuxer_stream.get());
79 owned_streams_.push_back(std::move(decrypting_demuxer_stream));
80 }
81}
82
83int DecryptingMediaResource::DecryptingDemuxerStreamCountForTesting() const {
84 return owned_streams_.size();
85}
86
87void DecryptingMediaResource::OnDecryptingDemuxerInitialized(
88 PipelineStatus status) {
89 DVLOG(2) << __func__ << ": DecryptingDemuxerStream initialization ended "
Xiaohan Wang866b0cd2019-10-31 16:57:5190 << "with the status: " << status;
Chad Duffin9062d332019-01-04 21:51:3091
92 // Decrement the count of DecryptingDemuxerStreams that need to be
93 // initialized.
94 --num_dds_pending_init_;
95
96 if (!init_cb_)
97 return;
98
99 if (status != PIPELINE_OK)
100 std::move(init_cb_).Run(false);
101 else if (num_dds_pending_init_ == 0)
102 std::move(init_cb_).Run(true);
103}
104
105} // namespace media