Relax threading requirements in VideoEncoder.
Previous strict threading requirements we not always followed and this
causes crashes in some scenarios.
Bug: webrtc:7760
Change-Id: I4808edfff19c63a9c4a9585834d46f9c73bb1c4b
Reviewed-on: https://webrtc-review.googlesource.com/13660
Reviewed-by: Oleh Prypin <oprypin@webrtc.org>
Commit-Queue: Oleh Prypin <oprypin@webrtc.org>
Commit-Queue: Sami Kalliomäki <sakal@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#20353}
diff --git a/sdk/android/api/org/webrtc/VideoDecoder.java b/sdk/android/api/org/webrtc/VideoDecoder.java
index f5d8850..76b030c 100644
--- a/sdk/android/api/org/webrtc/VideoDecoder.java
+++ b/sdk/android/api/org/webrtc/VideoDecoder.java
@@ -68,6 +68,9 @@
* infinite number of frames before the decoded frame is consumed.
*/
boolean getPrefersLateDecoding();
- /** Should return a descriptive name for the implementation. */
+ /**
+ * Should return a descriptive name for the implementation. Gets called once and cached. May be
+ * called from arbitrary thread.
+ */
String getImplementationName();
}
diff --git a/sdk/android/api/org/webrtc/VideoEncoder.java b/sdk/android/api/org/webrtc/VideoEncoder.java
index 1fb9601..2708846 100644
--- a/sdk/android/api/org/webrtc/VideoEncoder.java
+++ b/sdk/android/api/org/webrtc/VideoEncoder.java
@@ -12,7 +12,8 @@
/**
* Interface for a video encoder that can be used with WebRTC. All calls will be made on the
- * encoding thread.
+ * encoding thread. The encoder may be constructed on a different thread and changing thread after
+ * calling release is allowed.
*/
public interface VideoEncoder {
/** Settings passed to the encoder by WebRTC. */
@@ -143,6 +144,9 @@
VideoCodecStatus setRateAllocation(BitrateAllocation allocation, int framerate);
/** Any encoder that wants to use WebRTC provided quality scaler must implement this method. */
ScalingSettings getScalingSettings();
- /** Should return a descriptive name for the implementation. Gets called once and cached. */
+ /**
+ * Should return a descriptive name for the implementation. Gets called once and cached. May be
+ * called from arbitrary thread.
+ */
String getImplementationName();
}
diff --git a/sdk/android/src/java/org/webrtc/HardwareVideoEncoder.java b/sdk/android/src/java/org/webrtc/HardwareVideoEncoder.java
index e9df705..e0cd6b1 100644
--- a/sdk/android/src/java/org/webrtc/HardwareVideoEncoder.java
+++ b/sdk/android/src/java/org/webrtc/HardwareVideoEncoder.java
@@ -141,6 +141,9 @@
this.forcedKeyFrameNs = TimeUnit.MILLISECONDS.toNanos(forceKeyFrameIntervalMs);
this.bitrateAdjuster = bitrateAdjuster;
this.sharedContext = sharedContext;
+
+ // Allow construction on a different thread.
+ encodeThreadChecker.detachThread();
}
@Override
@@ -263,6 +266,9 @@
codec = null;
outputThread = null;
+ // Allow changing thread after release.
+ encodeThreadChecker.detachThread();
+
return returnValue;
}
@@ -414,7 +420,6 @@
@Override
public String getImplementationName() {
- encodeThreadChecker.checkIsOnValidThread();
return "HardwareVideoEncoder: " + codecName;
}