Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/common/gpu/media/android_video_decode_accelerator.h" | 5 #include "content/common/gpu/media/android_video_decode_accelerator.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include "base/android/build_info.h" | 9 #include "base/android/build_info.h" |
| 10 #include "base/auto_reset.h" | 10 #include "base/auto_reset.h" |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 31 #include "media/base/limits.h" | 31 #include "media/base/limits.h" |
| 32 #include "media/base/media.h" | 32 #include "media/base/media.h" |
| 33 #include "media/base/timestamp_constants.h" | 33 #include "media/base/timestamp_constants.h" |
| 34 #include "media/base/video_decoder_config.h" | 34 #include "media/base/video_decoder_config.h" |
| 35 #include "media/video/picture.h" | 35 #include "media/video/picture.h" |
| 36 #include "ui/gl/android/scoped_java_surface.h" | 36 #include "ui/gl/android/scoped_java_surface.h" |
| 37 #include "ui/gl/android/surface_texture.h" | 37 #include "ui/gl/android/surface_texture.h" |
| 38 #include "ui/gl/gl_bindings.h" | 38 #include "ui/gl/gl_bindings.h" |
| 39 | 39 |
| 40 #if defined(ENABLE_MOJO_MEDIA_IN_GPU_PROCESS) | 40 #if defined(ENABLE_MOJO_MEDIA_IN_GPU_PROCESS) |
| 41 #include "media/base/media_keys.h" | |
| 42 #include "media/mojo/services/mojo_cdm_service.h" | 41 #include "media/mojo/services/mojo_cdm_service.h" |
| 43 #endif | 42 #endif |
| 44 | 43 |
| 45 #define POST_ERROR(error_code, error_message) \ | 44 #define POST_ERROR(error_code, error_message) \ |
| 46 do { \ | 45 do { \ |
| 47 DLOG(ERROR) << error_message; \ | 46 DLOG(ERROR) << error_message; \ |
| 48 PostError(FROM_HERE, media::VideoDecodeAccelerator::error_code); \ | 47 PostError(FROM_HERE, media::VideoDecodeAccelerator::error_code); \ |
| 49 } while (0) | 48 } while (0) |
| 50 | 49 |
| 51 namespace content { | 50 namespace content { |
| (...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 278 DVLOG(1) << __FUNCTION__ << ", using copy back strategy."; | 277 DVLOG(1) << __FUNCTION__ << ", using copy back strategy."; |
| 279 strategy_.reset(new AndroidCopyingBackingStrategy(this)); | 278 strategy_.reset(new AndroidCopyingBackingStrategy(this)); |
| 280 } | 279 } |
| 281 } | 280 } |
| 282 | 281 |
| 283 AndroidVideoDecodeAccelerator::~AndroidVideoDecodeAccelerator() { | 282 AndroidVideoDecodeAccelerator::~AndroidVideoDecodeAccelerator() { |
| 284 DCHECK(thread_checker_.CalledOnValidThread()); | 283 DCHECK(thread_checker_.CalledOnValidThread()); |
| 285 g_avda_timer.Pointer()->StopTimer(this); | 284 g_avda_timer.Pointer()->StopTimer(this); |
| 286 | 285 |
| 287 #if defined(ENABLE_MOJO_MEDIA_IN_GPU_PROCESS) | 286 #if defined(ENABLE_MOJO_MEDIA_IN_GPU_PROCESS) |
| 288 if (cdm_) { | 287 if (!cdm_) |
| 289 DCHECK(cdm_registration_id_); | 288 return; |
| 290 static_cast<media::MediaDrmBridge*>(cdm_.get()) | 289 |
| 291 ->UnregisterPlayer(cdm_registration_id_); | 290 DCHECK(cdm_registration_id_); |
| 292 } | 291 static_cast<media::MediaDrmBridgeCdmContext*>(cdm_->GetCdmContext()) |
|
ddorwin
2016/03/21 21:40:25
It would be nice to only cast once.
Also, we shoul
xhwang
2016/03/22 17:08:32
Done.
| |
| 292 ->UnregisterPlayer(cdm_registration_id_); | |
| 293 #endif // defined(ENABLE_MOJO_MEDIA_IN_GPU_PROCESS) | 293 #endif // defined(ENABLE_MOJO_MEDIA_IN_GPU_PROCESS) |
| 294 } | 294 } |
| 295 | 295 |
| 296 bool AndroidVideoDecodeAccelerator::Initialize(const Config& config, | 296 bool AndroidVideoDecodeAccelerator::Initialize(const Config& config, |
| 297 Client* client) { | 297 Client* client) { |
| 298 DCHECK(!media_codec_); | 298 DCHECK(!media_codec_); |
| 299 DCHECK(thread_checker_.CalledOnValidThread()); | 299 DCHECK(thread_checker_.CalledOnValidThread()); |
| 300 TRACE_EVENT0("media", "AVDA::Initialize"); | 300 TRACE_EVENT0("media", "AVDA::Initialize"); |
| 301 | 301 |
| 302 DVLOG(1) << __FUNCTION__ << ": " << config.AsHumanReadableString(); | 302 DVLOG(1) << __FUNCTION__ << ": " << config.AsHumanReadableString(); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 358 if (is_encrypted_) | 358 if (is_encrypted_) |
| 359 return true; | 359 return true; |
| 360 | 360 |
| 361 return ConfigureMediaCodec(); | 361 return ConfigureMediaCodec(); |
| 362 } | 362 } |
| 363 | 363 |
| 364 void AndroidVideoDecodeAccelerator::SetCdm(int cdm_id) { | 364 void AndroidVideoDecodeAccelerator::SetCdm(int cdm_id) { |
| 365 DVLOG(2) << __FUNCTION__ << ": " << cdm_id; | 365 DVLOG(2) << __FUNCTION__ << ": " << cdm_id; |
| 366 | 366 |
| 367 #if defined(ENABLE_MOJO_MEDIA_IN_GPU_PROCESS) | 367 #if defined(ENABLE_MOJO_MEDIA_IN_GPU_PROCESS) |
| 368 using media::MediaDrmBridge; | |
| 369 | |
| 370 DCHECK(client_) << "SetCdm() must be called after Initialize()."; | 368 DCHECK(client_) << "SetCdm() must be called after Initialize()."; |
| 371 | 369 |
| 372 if (cdm_) { | 370 if (cdm_) { |
| 373 NOTREACHED() << "We do not support resetting CDM."; | 371 NOTREACHED() << "We do not support resetting CDM."; |
| 374 NotifyCdmAttached(false); | 372 NotifyCdmAttached(false); |
| 375 return; | 373 return; |
| 376 } | 374 } |
| 377 | 375 |
| 378 cdm_ = media::MojoCdmService::LegacyGetCdm(cdm_id); | 376 cdm_ = media::MojoCdmService::LegacyGetCdm(cdm_id); |
| 379 DCHECK(cdm_); | 377 DCHECK(cdm_); |
| 380 | 378 |
| 381 // On Android platform the MediaKeys will be its subclass MediaDrmBridge. | 379 // On Android platform the CdmContext must be a MediaDrmBridgeCdmContext. |
| 382 MediaDrmBridge* drm_bridge = static_cast<MediaDrmBridge*>(cdm_.get()); | 380 media::MediaDrmBridgeCdmContext* media_drm_bridge_cdm_context = |
| 381 static_cast<media::MediaDrmBridgeCdmContext*>(cdm_->GetCdmContext()); | |
| 383 | 382 |
| 384 // Register CDM callbacks. The callbacks registered will be posted back to | 383 // Register CDM callbacks. The callbacks registered will be posted back to |
| 385 // this thread via BindToCurrentLoop. | 384 // this thread via BindToCurrentLoop. |
| 386 | 385 |
| 387 // Since |this| holds a reference to the |cdm_|, by the time the CDM is | 386 // Since |this| holds a reference to the |cdm_|, by the time the CDM is |
| 388 // destructed, UnregisterPlayer() must have been called and |this| has been | 387 // destructed, UnregisterPlayer() must have been called and |this| has been |
| 389 // destructed as well. So the |cdm_unset_cb| will never have a chance to be | 388 // destructed as well. So the |cdm_unset_cb| will never have a chance to be |
| 390 // called. | 389 // called. |
| 391 // TODO(xhwang): Remove |cdm_unset_cb| after it's not used on all platforms. | 390 // TODO(xhwang): Remove |cdm_unset_cb| after it's not used on all platforms. |
| 392 cdm_registration_id_ = | 391 cdm_registration_id_ = media_drm_bridge_cdm_context->RegisterPlayer( |
| 393 drm_bridge->RegisterPlayer(media::BindToCurrentLoop(base::Bind( | 392 media::BindToCurrentLoop( |
| 394 &AndroidVideoDecodeAccelerator::OnKeyAdded, | 393 base::Bind(&AndroidVideoDecodeAccelerator::OnKeyAdded, |
| 395 weak_this_factory_.GetWeakPtr())), | 394 weak_this_factory_.GetWeakPtr())), |
| 396 base::Bind(&base::DoNothing)); | 395 base::Bind(&base::DoNothing)); |
| 397 | 396 |
| 398 drm_bridge->SetMediaCryptoReadyCB(media::BindToCurrentLoop( | 397 media_drm_bridge_cdm_context->SetMediaCryptoReadyCB(media::BindToCurrentLoop( |
| 399 base::Bind(&AndroidVideoDecodeAccelerator::OnMediaCryptoReady, | 398 base::Bind(&AndroidVideoDecodeAccelerator::OnMediaCryptoReady, |
| 400 weak_this_factory_.GetWeakPtr()))); | 399 weak_this_factory_.GetWeakPtr()))); |
| 401 | 400 |
| 402 // Postpone NotifyCdmAttached() call till we create the MediaCodec after | 401 // Postpone NotifyCdmAttached() call till we create the MediaCodec after |
| 403 // OnMediaCryptoReady(). | 402 // OnMediaCryptoReady(). |
| 404 | 403 |
| 405 #else | 404 #else |
| 406 | 405 |
| 407 NOTIMPLEMENTED(); | 406 NOTIMPLEMENTED(); |
| 408 NotifyCdmAttached(false); | 407 NotifyCdmAttached(false); |
| (...skipping 655 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1064 media::VideoDecodeAccelerator::Error error) { | 1063 media::VideoDecodeAccelerator::Error error) { |
| 1065 base::MessageLoop::current()->PostDelayedTask( | 1064 base::MessageLoop::current()->PostDelayedTask( |
| 1066 from_here, | 1065 from_here, |
| 1067 base::Bind(&AndroidVideoDecodeAccelerator::NotifyError, | 1066 base::Bind(&AndroidVideoDecodeAccelerator::NotifyError, |
| 1068 weak_this_factory_.GetWeakPtr(), error, error_sequence_token_), | 1067 weak_this_factory_.GetWeakPtr(), error, error_sequence_token_), |
| 1069 (defer_errors_ ? ErrorPostingDelay() : base::TimeDelta())); | 1068 (defer_errors_ ? ErrorPostingDelay() : base::TimeDelta())); |
| 1070 state_ = ERROR; | 1069 state_ = ERROR; |
| 1071 } | 1070 } |
| 1072 | 1071 |
| 1073 void AndroidVideoDecodeAccelerator::OnMediaCryptoReady( | 1072 void AndroidVideoDecodeAccelerator::OnMediaCryptoReady( |
| 1074 media::MediaDrmBridge::JavaObjectPtr media_crypto, | 1073 media::MediaDrmBridgeCdmContext::JavaObjectPtr media_crypto, |
| 1075 bool needs_protected_surface) { | 1074 bool needs_protected_surface) { |
| 1076 DVLOG(1) << __FUNCTION__; | 1075 DVLOG(1) << __FUNCTION__; |
| 1077 | 1076 |
| 1078 if (!media_crypto) { | 1077 if (!media_crypto) { |
| 1079 LOG(ERROR) << "MediaCrypto is not available, can't play encrypted stream."; | 1078 LOG(ERROR) << "MediaCrypto is not available, can't play encrypted stream."; |
| 1080 NotifyCdmAttached(false); | 1079 NotifyCdmAttached(false); |
| 1081 return; | 1080 return; |
| 1082 } | 1081 } |
| 1083 | 1082 |
| 1084 DCHECK(!media_crypto->is_null()); | 1083 DCHECK(!media_crypto->is_null()); |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1200 capabilities.flags = media::VideoDecodeAccelerator::Capabilities:: | 1199 capabilities.flags = media::VideoDecodeAccelerator::Capabilities:: |
| 1201 NEEDS_ALL_PICTURE_BUFFERS_TO_DECODE | | 1200 NEEDS_ALL_PICTURE_BUFFERS_TO_DECODE | |
| 1202 media::VideoDecodeAccelerator::Capabilities:: | 1201 media::VideoDecodeAccelerator::Capabilities:: |
| 1203 SUPPORTS_EXTERNAL_OUTPUT_SURFACE; | 1202 SUPPORTS_EXTERNAL_OUTPUT_SURFACE; |
| 1204 } | 1203 } |
| 1205 | 1204 |
| 1206 return capabilities; | 1205 return capabilities; |
| 1207 } | 1206 } |
| 1208 | 1207 |
| 1209 } // namespace content | 1208 } // namespace content |
| OLD | NEW |