1 // Copyright 2018 The Chromium Authors. All rights reserved.
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/callback.h"
11 #include "base/memory/ref_counted.h"
12 #include "base/memory/weak_ptr.h"
13 #include "base/single_thread_task_runner.h"
14 #include "media/base/pipeline.h"
15 #include "media/base/renderer.h"
16 
17 namespace media {
18 
19 class CdmContext;
20 class DemuxerStream;
21 class MediaLog;
22 class MediaResource;
23 class DecryptingMediaResource;
24 class RendererClient;
25 
26 // DecryptingRenderer is used as a wrapper around a Renderer
27 // implementation that decrypts streams when an AesDecryptor is available. In
28 // this case only clear streams are passed on to the internally owned renderer
29 // implementation.
30 //
31 // All methods are pass-through except Initialize() and SetCdm().
32 //
33 // The caller must guarantee that DecryptingRenderer will never be initialized
34 // with a |media_resource| of type MediaResource::Type::URL.
35 class MEDIA_EXPORT DecryptingRenderer : public Renderer {
36  public:
37   DecryptingRenderer(
38       std::unique_ptr<Renderer> renderer,
39       MediaLog* media_log,
40       const scoped_refptr<base::SingleThreadTaskRunner> media_task_runner);
41   ~DecryptingRenderer() override;
42 
43   // Renderer implementation:
44   void Initialize(MediaResource* media_resource,
45                   RendererClient* client,
46                   PipelineStatusCallback init_cb) override;
47   void SetCdm(CdmContext* cdm_context, CdmAttachedCB cdm_attached_cb) override;
48   void SetLatencyHint(base::Optional<base::TimeDelta> latency_hint) override;
49 
50   void Flush(base::OnceClosure flush_cb) override;
51   void StartPlayingFrom(base::TimeDelta time) override;
52   void SetPlaybackRate(double playback_rate) override;
53   void SetVolume(float volume) override;
54   base::TimeDelta GetMediaTime() override;
55   void OnSelectedVideoTracksChanged(
56       const std::vector<DemuxerStream*>& enabled_tracks,
57       base::OnceClosure change_completed_cb) override;
58   void OnEnabledAudioTracksChanged(
59       const std::vector<DemuxerStream*>& enabled_tracks,
60       base::OnceClosure change_completed_cb) override;
61 
62   bool HasDecryptingMediaResourceForTesting() const;
63 
64  private:
65   friend class DecryptingRendererTest;
66 
67   // Cannot be called before Initialize() has been called.
68   void CreateAndInitializeDecryptingMediaResource();
69 
70   // Invoked as a callback after |decrypting_media_resource_| has been
71   // initialized.
72   void InitializeRenderer(bool success);
73   bool HasEncryptedStream();
74   void OnWaiting(WaitingReason reason);
75 
76   const std::unique_ptr<Renderer> renderer_;
77   MediaLog* const media_log_;
78   const scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
79 
80   bool waiting_for_cdm_ = false;
81   CdmContext* cdm_context_ = nullptr;
82   RendererClient* client_;
83   MediaResource* media_resource_;
84   PipelineStatusCallback init_cb_;
85 
86   std::unique_ptr<DecryptingMediaResource> decrypting_media_resource_;
87 
88   base::WeakPtrFactory<DecryptingRenderer> weak_factory_{this};
89 
90   DISALLOW_COPY_AND_ASSIGN(DecryptingRenderer);
91 };
92 
93 }  // namespace media
94 
95 #endif  // MEDIA_RENDERERS_DECRYPTING_RENDERER_H_
96