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 6fe2c61473bfeb45e08eae1e5bae01c3d84939f3..43d2b51e886cabe832a3cfd519305c597dc1a557 100644 |
--- a/talk/app/webrtc/java/jni/peerconnection_jni.cc |
+++ b/talk/app/webrtc/java/jni/peerconnection_jni.cc |
@@ -776,17 +776,23 @@ 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); |
+ // |j_callbacks_| is responsible for releasing |j_frame| with |
+ // VideoRenderer.renderFrameDone(). |
jni()->CallVoidMethod(*j_callbacks_, j_render_frame_id_, j_frame); |
CHECK_EXCEPTION(jni()); |
} |
private: |
+ // Make a shallow copy of |frame| to be used with Java. The callee has |
+ // ownership of the frame, and the frame should be released with |
+ // VideoRenderer.releaseNativeFrame(). |
+ static jlong javaShallowCopy(const cricket::VideoFrame* frame) { |
+ return jlongFromPointer(frame->Copy()); |
+ } |
+ |
// Return a VideoRenderer.I420Frame referring to the data in |frame|. |
jobject CricketToJavaI420Frame(const cricket::VideoFrame* frame) { |
jintArray strides = jni()->NewIntArray(3); |
@@ -810,7 +816,7 @@ class JavaVideoRendererWrapper : public VideoRendererInterface { |
*j_frame_class_, j_i420_frame_ctor_id_, |
frame->GetWidth(), frame->GetHeight(), |
static_cast<int>(frame->GetVideoRotation()), |
- strides, planes, frame); |
+ strides, planes, javaShallowCopy(frame)); |
perkj_webrtc
2015/09/29 12:56:04
Even if this is shallow, it allocates memory. Who
magjed_webrtc
2015/09/29 13:16:16
It's documented in the comment of javaShallowCopy(
|
} |
// Return a VideoRenderer.I420Frame referring texture object in |frame|. |
@@ -823,7 +829,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, frame); |
+ texture_object, texture_id, javaShallowCopy(frame)); |
} |
JNIEnv* jni() { |