cdm_message_filter_android.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// found in the LICENSE file.
4d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "components/cdm/browser/cdm_message_filter_android.h"
6d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
7d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include <string>
8d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "components/cdm/common/cdm_messages_android.h"
10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ipc/ipc_message_macros.h"
11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "media/base/android/media_codec_bridge.h"
12d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "media/base/android/media_drm_bridge.h"
13d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)using content::BrowserThread;
155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuusing content::SupportedCodecs;
16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)using media::MediaCodecBridge;
17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)using media::MediaDrmBridge;
18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace cdm {
20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const size_t kMaxKeySystemLength = 256;
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochenum CodecType {
240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  CODEC_AUDIO,
250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  CODEC_VIDEO
260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch};
270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochstruct CodecInfo {
295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SupportedCodecs codec;
300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  CodecType codec_type;
310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  const char* codec_name;
320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  const char* container_mime_type;
330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch};
340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst CodecInfo kCodecsToQuery[] = {
365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  {content::EME_CODEC_WEBM_VORBIS, CODEC_AUDIO, "vorbis", "video/webm"},
375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  {content::EME_CODEC_WEBM_VP8, CODEC_VIDEO, "vp8", "video/webm"},
385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  {content::EME_CODEC_WEBM_VP9, CODEC_VIDEO, "vp9", "video/webm"},
390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#if defined(USE_PROPRIETARY_CODECS)
405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  {content::EME_CODEC_MP4_AAC, CODEC_AUDIO, "mp4a", "video/mp4"},
415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  {content::EME_CODEC_MP4_AVC1, CODEC_VIDEO, "avc1", "video/mp4"}
420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif  // defined(USE_PROPRIETARY_CODECS)
430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch};
440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic SupportedCodecs GetSupportedCodecs(
46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const SupportedKeySystemRequest& request,
47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    bool video_must_be_compositable) {
48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const std::string& key_system = request.key_system;
495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SupportedCodecs supported_codecs = content::EME_CODEC_NONE;
500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  for (size_t i = 0; i < arraysize(kCodecsToQuery); ++i) {
520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    const CodecInfo& info = kCodecsToQuery[i];
530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    // TODO(qinmin): Remove the composition logic when secure contents can be
540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    // composited.
550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    bool is_secure = (info.codec_type == CODEC_VIDEO)
560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                         ? (!video_must_be_compositable) : false;
570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    if ((request.codecs & info.codec) &&
580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        MediaDrmBridge::IsKeySystemSupportedWithType(
590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            key_system, info.container_mime_type) &&
600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        MediaCodecBridge::CanDecode(info.codec_name, is_secure)) {
615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      supported_codecs |= info.codec;
620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    }
63c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
64d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return supported_codecs;
66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)CdmMessageFilterAndroid::CdmMessageFilterAndroid()
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : BrowserMessageFilter(EncryptedMediaMsgStart) {}
70d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)CdmMessageFilterAndroid::~CdmMessageFilterAndroid() {}
72d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool CdmMessageFilterAndroid::OnMessageReceived(const IPC::Message& message) {
74d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool handled = true;
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(CdmMessageFilterAndroid, message)
76d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewHostMsg_GetSupportedKeySystems,
77d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                        OnGetSupportedKeySystems)
78d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
80d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return handled;
81d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
82d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void CdmMessageFilterAndroid::OverrideThreadForMessage(
84d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const IPC::Message& message, BrowserThread::ID* thread) {
85d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Move the IPC handling to FILE thread as it is not very cheap.
86d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (message.type() == ChromeViewHostMsg_GetSupportedKeySystems::ID)
87d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    *thread = BrowserThread::FILE;
88d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
89d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void CdmMessageFilterAndroid::OnGetSupportedKeySystems(
9168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    const SupportedKeySystemRequest& request,
9268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    SupportedKeySystemResponse* response) {
93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!response) {
94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    NOTREACHED() << "NULL response pointer provided.";
95d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return;
96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (request.key_system.size() > kMaxKeySystemLength) {
99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    NOTREACHED() << "Invalid key system: " << request.key_system;
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return;
101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
102d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!MediaDrmBridge::IsKeySystemSupported(request.key_system))
104d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return;
105d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DCHECK(request.codecs & content::EME_CODEC_ALL) << "unrecognized codec";
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  response->key_system = request.key_system;
108d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // TODO(qinmin): check composition is supported or not.
109c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  response->compositing_codecs = GetSupportedCodecs(request, true);
110c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  response->non_compositing_codecs = GetSupportedCodecs(request, false);
111d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
112d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}  // namespace cdm
114