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