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