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