| Index: talk/app/webrtc/java/jni/peerconnection_jni.cc | 
| diff --git a/talk/app/webrtc/java/jni/peerconnection_jni.cc b/talk/app/webrtc/java/jni/peerconnection_jni.cc | 
| index c326ccff6bede1e3e93e5605be72be86a672df7d..124c681978e9aa13dcd6e2b51d38284151e1abf1 100644 | 
| --- a/talk/app/webrtc/java/jni/peerconnection_jni.cc | 
| +++ b/talk/app/webrtc/java/jni/peerconnection_jni.cc | 
| @@ -743,10 +743,10 @@ class JavaVideoRendererWrapper : public VideoRendererInterface { | 
| j_frame_class_(jni, | 
| FindClass(jni, "org/webrtc/VideoRenderer$I420Frame")), | 
| j_i420_frame_ctor_id_(GetMethodID( | 
| -            jni, *j_frame_class_, "<init>", "(III[I[Ljava/nio/ByteBuffer;)V")), | 
| +            jni, *j_frame_class_, "<init>", "(III[I[Ljava/nio/ByteBuffer;J)V")), | 
| j_texture_frame_ctor_id_(GetMethodID( | 
| jni, *j_frame_class_, "<init>", | 
| -            "(IIILjava/lang/Object;I)V")), | 
| +            "(IIILjava/lang/Object;IJ)V")), | 
| j_byte_buffer_class_(jni, FindClass(jni, "java/nio/ByteBuffer")) { | 
| CHECK_EXCEPTION(jni); | 
| } | 
| @@ -755,6 +755,9 @@ class JavaVideoRendererWrapper : public VideoRendererInterface { | 
|  | 
| void RenderFrame(const cricket::VideoFrame* video_frame) override { | 
| ScopedLocalRefFrame local_ref_frame(jni()); | 
| +    // Make a shallow copy. |j_callbacks_| is responsible for releasing the | 
| +    // copy by calling VideoRenderer.renderFrameDone(). | 
| +    video_frame = video_frame->Copy(); | 
| jobject j_frame = (video_frame->GetNativeHandle() != nullptr) | 
| ? CricketToJavaTextureFrame(video_frame) | 
| : CricketToJavaI420Frame(video_frame); | 
| @@ -790,7 +793,7 @@ class JavaVideoRendererWrapper : public VideoRendererInterface { | 
| *j_frame_class_, j_i420_frame_ctor_id_, | 
| frame->GetWidth(), frame->GetHeight(), | 
| static_cast<int>(frame->GetVideoRotation()), | 
| -        strides, planes); | 
| +        strides, planes, frame); | 
| } | 
|  | 
| // Return a VideoRenderer.I420Frame referring texture object in |frame|. | 
| @@ -803,7 +806,7 @@ class JavaVideoRendererWrapper : public VideoRendererInterface { | 
| *j_frame_class_, j_texture_frame_ctor_id_, | 
| frame->GetWidth(), frame->GetHeight(), | 
| static_cast<int>(frame->GetVideoRotation()), | 
| -        texture_object, texture_id); | 
| +        texture_object, texture_id, frame); | 
| } | 
|  | 
| JNIEnv* jni() { | 
| @@ -924,6 +927,11 @@ JOW(void, VideoRenderer_freeWrappedVideoRenderer)(JNIEnv*, jclass, jlong j_p) { | 
| delete reinterpret_cast<JavaVideoRendererWrapper*>(j_p); | 
| } | 
|  | 
| +JOW(void, VideoRenderer_releaseNativeFrame)( | 
| +    JNIEnv* jni, jclass, jlong j_frame_ptr) { | 
| +  delete reinterpret_cast<const cricket::VideoFrame*>(j_frame_ptr); | 
| +} | 
| + | 
| JOW(void, MediaStreamTrack_free)(JNIEnv*, jclass, jlong j_p) { | 
| CHECK_RELEASE(reinterpret_cast<MediaStreamTrackInterface*>(j_p)); | 
| } | 
|  |