| 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 bf0f0066294c5c9d77a5ebabc0ef2bf5d16a788b..cebe8ca9be9b93845fa109a59db3539920e46f62 100644
 | 
| --- a/talk/app/webrtc/java/jni/peerconnection_jni.cc
 | 
| +++ b/talk/app/webrtc/java/jni/peerconnection_jni.cc
 | 
| @@ -746,10 +746,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")),
 | 
|          can_apply_rotation_set_(false),
 | 
|          can_apply_rotation_(false) {
 | 
| @@ -767,6 +767,9 @@ class JavaVideoRendererWrapper : public VideoRendererInterface {
 | 
|      const cricket::VideoFrame* frame =
 | 
|          can_apply_rotation_ ? video_frame
 | 
|                              : video_frame->GetCopyWithRotationApplied();
 | 
| +    // Make a shallow copy. |j_callbacks_| is responsible for releasing the
 | 
| +    // copy by calling VideoRenderer.renderFrameDone().
 | 
| +    frame = frame->Copy();
 | 
|      if (frame->GetNativeHandle() != NULL) {
 | 
|        jobject j_frame = CricketToJavaTextureFrame(frame);
 | 
|        jni()->CallVoidMethod(*j_callbacks_, j_render_frame_id_, j_frame);
 | 
| @@ -817,7 +820,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|.
 | 
| @@ -830,7 +833,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() {
 | 
| @@ -954,6 +957,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));
 | 
|  }
 | 
| 
 |