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;
   }