Hold a reference to AndroidVideoTrackSource while calling onFrameCaptured.
This makes it safe to deliver frames to the sink from VideoProcessor even after setSink has been called with null reference without danger of use after free. Bug: b/148063550 Change-Id: Ib78f75ac49fc6117f744c55da1a4e671bbdcdf22 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/168160 Reviewed-by: Paulina Hensman <phensman@webrtc.org> Commit-Queue: Sami Kalliomäki <sakal@webrtc.org> Cr-Commit-Position: refs/heads/master@{#30455}
This commit is contained in:
committed by
Commit Bot
parent
215963c759
commit
0f6bcd18b2
@ -25,9 +25,11 @@ public class MediaSource {
|
||||
}
|
||||
}
|
||||
|
||||
private final RefCountDelegate refCountDelegate;
|
||||
private long nativeSource;
|
||||
|
||||
public MediaSource(long nativeSource) {
|
||||
refCountDelegate = new RefCountDelegate(() -> JniCommon.nativeReleaseRef(nativeSource));
|
||||
this.nativeSource = nativeSource;
|
||||
}
|
||||
|
||||
@ -38,7 +40,7 @@ public class MediaSource {
|
||||
|
||||
public void dispose() {
|
||||
checkMediaSourceExists();
|
||||
JniCommon.nativeReleaseRef(nativeSource);
|
||||
refCountDelegate.release();
|
||||
nativeSource = 0;
|
||||
}
|
||||
|
||||
@ -48,6 +50,20 @@ public class MediaSource {
|
||||
return nativeSource;
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs code in {@code runnable} holding a reference to the media source. If the object has
|
||||
* already been released, does nothing.
|
||||
*/
|
||||
void runWithReference(Runnable runnable) {
|
||||
if (refCountDelegate.safeRetain()) {
|
||||
try {
|
||||
runnable.run();
|
||||
} finally {
|
||||
refCountDelegate.release();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void checkMediaSourceExists() {
|
||||
if (nativeSource == 0) {
|
||||
throw new IllegalStateException("MediaSource has been disposed.");
|
||||
|
||||
Reference in New Issue
Block a user