Upload upstream chromium 120.0.6099.5
[platform/framework/web/chromium-efl.git] / media / renderers / decrypting_renderer.h
1 // Copyright 2018 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef MEDIA_RENDERERS_DECRYPTING_RENDERER_H_
6 #define MEDIA_RENDERERS_DECRYPTING_RENDERER_H_
7
8 #include <memory>
9
10 #include "base/functional/callback.h"
11 #include "base/memory/raw_ptr.h"
12 #include "base/memory/scoped_refptr.h"
13 #include "base/memory/weak_ptr.h"
14 #include "base/task/sequenced_task_runner.h"
15 #include "base/task/single_thread_task_runner.h"
16 #include "media/base/pipeline.h"
17 #include "media/base/renderer.h"
18
19 namespace media {
20
21 class CdmContext;
22 class DemuxerStream;
23 class MediaLog;
24 class MediaResource;
25 class DecryptingMediaResource;
26 class RendererClient;
27
28 // DecryptingRenderer is used as a wrapper around a Renderer
29 // implementation that decrypts streams when an AesDecryptor is available. In
30 // this case only clear streams are passed on to the internally owned renderer
31 // implementation.
32 //
33 // All methods are pass-through except Initialize() and SetCdm().
34 //
35 // The caller must guarantee that DecryptingRenderer will never be initialized
36 // with a |media_resource| of type MediaResource::Type::URL.
37 class MEDIA_EXPORT DecryptingRenderer : public Renderer {
38  public:
39   DecryptingRenderer(
40       std::unique_ptr<Renderer> renderer,
41       MediaLog* media_log,
42       const scoped_refptr<base::SequencedTaskRunner> media_task_runner);
43
44   DecryptingRenderer(const DecryptingRenderer&) = delete;
45   DecryptingRenderer& operator=(const DecryptingRenderer&) = delete;
46
47   ~DecryptingRenderer() override;
48
49   // Renderer implementation:
50   void Initialize(MediaResource* media_resource,
51                   RendererClient* client,
52                   PipelineStatusCallback init_cb) override;
53   void SetCdm(CdmContext* cdm_context, CdmAttachedCB cdm_attached_cb) override;
54   void SetLatencyHint(absl::optional<base::TimeDelta> latency_hint) override;
55   void SetPreservesPitch(bool preserves_pitch) override;
56   void SetWasPlayedWithUserActivation(
57       bool was_played_with_user_activation) override;
58
59   void Flush(base::OnceClosure flush_cb) override;
60   void StartPlayingFrom(base::TimeDelta time) override;
61   void SetPlaybackRate(double playback_rate) override;
62   void SetVolume(float volume) override;
63   base::TimeDelta GetMediaTime() override;
64   void OnSelectedVideoTracksChanged(
65       const std::vector<DemuxerStream*>& enabled_tracks,
66       base::OnceClosure change_completed_cb) override;
67   void OnEnabledAudioTracksChanged(
68       const std::vector<DemuxerStream*>& enabled_tracks,
69       base::OnceClosure change_completed_cb) override;
70   RendererType GetRendererType() override;
71
72   bool HasDecryptingMediaResourceForTesting() const;
73
74  private:
75   friend class DecryptingRendererTest;
76
77   // Cannot be called before Initialize() has been called.
78   void CreateAndInitializeDecryptingMediaResource();
79
80   // Invoked as a callback after |decrypting_media_resource_| has been
81   // initialized.
82   void InitializeRenderer(bool success);
83   bool HasEncryptedStream();
84   void OnWaiting(WaitingReason reason);
85
86   const std::unique_ptr<Renderer> renderer_;
87   const raw_ptr<MediaLog> media_log_;
88   const scoped_refptr<base::SequencedTaskRunner> media_task_runner_;
89   bool waiting_for_cdm_ = false;
90   raw_ptr<CdmContext> cdm_context_ = nullptr;
91   raw_ptr<RendererClient> client_;
92   raw_ptr<MediaResource> media_resource_;
93   PipelineStatusCallback init_cb_;
94
95   std::unique_ptr<DecryptingMediaResource> decrypting_media_resource_;
96
97   base::WeakPtrFactory<DecryptingRenderer> weak_factory_{this};
98 };
99
100 }  // namespace media
101
102 #endif  // MEDIA_RENDERERS_DECRYPTING_RENDERER_H_