Android: Make VideoCapturer an interface for all VideoCapturers to implement

This CL factors out the interface that AndroidVideoCapturerJni is using to communicate with the Java counterpart. This interface is moved into VideoCapturer. The interface is not touched in this CL, and a follow-up CL is planned to simplify and improve it.

Another change is that the native part of VideoCapturer is created in PeerConnectionFactory.createVideoSource() instead of doing it immediately in the ctor.

BUG=webrtc:5519
R=perkj@webrtc.org

Review URL: https://codereview.webrtc.org/1696553003 .

Cr-Commit-Position: refs/heads/master@{#11606}
diff --git a/webrtc/api/java/jni/peerconnection_jni.cc b/webrtc/api/java/jni/peerconnection_jni.cc
index 3997805..f7b9e90 100644
--- a/webrtc/api/java/jni/peerconnection_jni.cc
+++ b/webrtc/api/java/jni/peerconnection_jni.cc
@@ -910,10 +910,6 @@
   CHECK_RELEASE(reinterpret_cast<MediaSourceInterface*>(j_p));
 }
 
-JOW(void, VideoCapturer_free)(JNIEnv*, jclass, jlong j_p) {
-  delete reinterpret_cast<cricket::VideoCapturer*>(j_p);
-}
-
 JOW(void, VideoRenderer_freeWrappedVideoRenderer)(JNIEnv*, jclass, jlong j_p) {
   delete reinterpret_cast<JavaVideoRendererWrapper*>(j_p);
 }
@@ -1216,16 +1212,27 @@
 }
 
 JOW(jlong, PeerConnectionFactory_nativeCreateVideoSource)(
-    JNIEnv* jni, jclass, jlong native_factory, jlong native_capturer,
+    JNIEnv* jni, jclass, jlong native_factory, jobject j_video_capturer,
     jobject j_constraints) {
+  // Create a cricket::VideoCapturer from |j_video_capturer|.
+  jobject j_surface_texture_helper = jni->CallObjectMethod(
+      j_video_capturer,
+      GetMethodID(jni, FindClass(jni, "org/webrtc/VideoCapturer"),
+                  "getSurfaceTextureHelper",
+                  "()Lorg/webrtc/SurfaceTextureHelper;"));
+  rtc::scoped_refptr<webrtc::AndroidVideoCapturerDelegate> delegate =
+      new rtc::RefCountedObject<AndroidVideoCapturerJni>(
+          jni, j_video_capturer, j_surface_texture_helper);
+  rtc::scoped_ptr<cricket::VideoCapturer> capturer(
+      new webrtc::AndroidVideoCapturer(delegate));
+  // Create a webrtc::VideoSourceInterface from the cricket::VideoCapturer,
+  // native factory and constraints.
   scoped_ptr<ConstraintsWrapper> constraints(
       new ConstraintsWrapper(jni, j_constraints));
   rtc::scoped_refptr<PeerConnectionFactoryInterface> factory(
       factoryFromJava(native_factory));
   rtc::scoped_refptr<VideoSourceInterface> source(
-      factory->CreateVideoSource(
-          reinterpret_cast<cricket::VideoCapturer*>(native_capturer),
-          constraints.get()));
+      factory->CreateVideoSource(capturer.release(), constraints.get()));
   return (jlong)source.release();
 }