|  | // Copyright 2017 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef MEDIA_BASE_ANDROID_ANDROID_OVERLAY_H_ | 
|  | #define MEDIA_BASE_ANDROID_ANDROID_OVERLAY_H_ | 
|  |  | 
|  | #include <list> | 
|  |  | 
|  | #include "base/android/scoped_java_ref.h" | 
|  | #include "base/callback.h" | 
|  | #include "base/macros.h" | 
|  | #include "base/memory/weak_ptr.h" | 
|  | #include "media/base/android_overlay_config.h" | 
|  | #include "media/base/media_export.h" | 
|  | #include "ui/gfx/geometry/rect.h" | 
|  | #include "ui/gl/android/scoped_java_surface.h" | 
|  |  | 
|  | namespace media { | 
|  |  | 
|  | // Client interface to an AndroidOverlay.  Once constructed, you can expect to | 
|  | // receive either a call to ReadyCB or a call to FailedCB to indicate whether | 
|  | // the overlay is ready, or isn't going to be ready.  If one does get ReadyCB, | 
|  | // then one may GetJavaSurface() to retrieve the java Surface object.  One | 
|  | // will get DestroyedCB eventually after ReadyCB, assuming that one doesn't | 
|  | // delete the overlay before that. | 
|  | // When DestroyedCB arrives, you should stop using the Android Surface and | 
|  | // delete the AndroidOverlay instance.  Currently, the exact contract depends | 
|  | // on the concrete implementation.  Once ContentVideoView is deprecated, it will | 
|  | // be: it is not guaranteed that any AndroidOverlay instances will operate until | 
|  | // the destroyed instance is deleted.  This must happen on the thread that was | 
|  | // used to create it.  It does not have to happen immediately, or before the | 
|  | // callback returns. | 
|  | // With CVV, one must still delete the overlay on the main thread, and it | 
|  | // doesn't have to happen before this returns.  However, one must signal the | 
|  | // CVV onSurfaceDestroyed handler on some thread before returning from the | 
|  | // callback.  AVDACodecAllocator::ReleaseMediaCodec handles signaling.  The | 
|  | // fundamental difference is that CVV blocks the UI thread in the browser, which | 
|  | // makes it unsafe to let the gpu main thread proceed without risk of deadlock | 
|  | // AndroidOverlay isn't technically supposed to do that. | 
|  | class MEDIA_EXPORT AndroidOverlay { | 
|  | public: | 
|  | AndroidOverlay(const AndroidOverlay&) = delete; | 
|  | AndroidOverlay& operator=(const AndroidOverlay&) = delete; | 
|  |  | 
|  | virtual ~AndroidOverlay(); | 
|  |  | 
|  | // Schedules a relayout of this overlay.  If called before the client is | 
|  | // notified that the surface is created, then the call will be ignored. | 
|  | virtual void ScheduleLayout(const gfx::Rect& rect) = 0; | 
|  |  | 
|  | // May be called during / after ReadyCB and before DestroyedCB. | 
|  | virtual const base::android::JavaRef<jobject>& GetJavaSurface() const = 0; | 
|  |  | 
|  | // Add a destruction callback that will be called if the surface is destroyed. | 
|  | // Note that this refers to the destruction of the Android Surface, caused by | 
|  | // Android.  It is not reporting the destruction of |this|. | 
|  | // | 
|  | // Destroying |this| prevents any further destroyed callbacks.  This includes | 
|  | // cases in which an earlier callback out of multiple registred ones deletes | 
|  | // |this|.  None of the later callbacks will be called. | 
|  | // | 
|  | // These will be called in the same order that they're added. | 
|  | virtual void AddSurfaceDestroyedCallback( | 
|  | AndroidOverlayConfig::DestroyedCB cb); | 
|  |  | 
|  | // Add a callback to notify when |this| has been deleted. | 
|  | void AddOverlayDeletedCallback(AndroidOverlayConfig::DeletedCB cb); | 
|  |  | 
|  | protected: | 
|  | AndroidOverlay(); | 
|  |  | 
|  | void RunSurfaceDestroyedCallbacks(); | 
|  |  | 
|  | std::list<AndroidOverlayConfig::DestroyedCB> destruction_cbs_; | 
|  | std::list<AndroidOverlayConfig::DeletedCB> deletion_cbs_; | 
|  |  | 
|  | base::WeakPtrFactory<AndroidOverlay> weak_factory_{this}; | 
|  | }; | 
|  |  | 
|  | }  // namespace media | 
|  |  | 
|  | #endif  // MEDIA_BASE_ANDROID_ANDROID_OVERLAY_H_ |