1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
media / base / android / android_overlay.h [blame]
// Copyright 2017 The Chromium Authors
// 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/functional/callback.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 registered 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_