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