• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 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 CONTENT_RENDERER_MEDIA_CRYPTO_RENDERER_CDM_MANAGER_H_
6 #define CONTENT_RENDERER_MEDIA_CRYPTO_RENDERER_CDM_MANAGER_H_
7 
8 #include <map>
9 #include <string>
10 #include <vector>
11 
12 #include "base/basictypes.h"
13 #include "content/common/media/cdm_messages_enums.h"
14 #include "content/public/renderer/render_frame_observer.h"
15 #include "media/base/media_keys.h"
16 #include "url/gurl.h"
17 
18 namespace blink {
19 class WebFrame;
20 }
21 
22 namespace content {
23 
24 class ProxyMediaKeys;
25 
26 // Class for managing all the CDM objects in the same RenderFrame.
27 class RendererCdmManager : public RenderFrameObserver {
28  public:
29   static const int kInvalidCdmId = 0;
30 
31   // Constructs a RendererCdmManager object for the |render_frame|.
32   explicit RendererCdmManager(RenderFrame* render_frame);
33   virtual ~RendererCdmManager();
34 
35   // RenderFrameObserver overrides.
36   virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE;
37 
38   // Encrypted media related methods.
39   void InitializeCdm(int cdm_id,
40                      ProxyMediaKeys* media_keys,
41                      const std::string& key_system,
42                      const GURL& security_origin);
43   void CreateSession(int cdm_id,
44                      uint32 session_id,
45                      CdmHostMsg_CreateSession_ContentType conent_type,
46                      const std::vector<uint8>& init_data);
47   void UpdateSession(int cdm_id,
48                      uint32 session_id,
49                      const std::vector<uint8>& response);
50   void ReleaseSession(int cdm_id, uint32 session_id);
51   void DestroyCdm(int cdm_id);
52 
53   // Registers a ProxyMediaKeys object. Returns allocated CDM ID.
54   int RegisterMediaKeys(ProxyMediaKeys* media_keys);
55 
56   // Unregisters a ProxyMediaKeys object identified by |cdm_id|.
57   void UnregisterMediaKeys(int cdm_id);
58 
59  private:
60   // Gets the pointer to ProxyMediaKeys given the |cdm_id|.
61   ProxyMediaKeys* GetMediaKeys(int cdm_id);
62 
63   // Message handlers.
64   void OnSessionCreated(int cdm_id,
65                         uint32 session_id,
66                         const std::string& web_session_id);
67   void OnSessionMessage(int cdm_id,
68                         uint32 session_id,
69                         const std::vector<uint8>& message,
70                         const GURL& destination_url);
71   void OnSessionReady(int cdm_id, uint32 session_id);
72   void OnSessionClosed(int cdm_id, uint32 session_id);
73   void OnSessionError(int cdm_id,
74                       uint32 session_id,
75                       media::MediaKeys::KeyError error_code,
76                       uint32 system_code);
77 
78   // CDM ID should be unique per renderer frame.
79   // TODO(xhwang): Use uint32 to prevent undefined overflow behavior.
80   int next_cdm_id_;
81 
82   // CDM ID to ProxyMediaKeys mapping.
83   std::map<int, ProxyMediaKeys*> proxy_media_keys_map_;
84 
85   DISALLOW_COPY_AND_ASSIGN(RendererCdmManager);
86 };
87 
88 }  // namespace content
89 
90 #endif  // CONTENT_RENDERER_MEDIA_CRYPTO_RENDERER_CDM_MANAGER_H_
91