Skip to content

Commit 28562ab

Browse files
committed
fix: crashes caused by video frame conversion
1 parent 0fec611 commit 28562ab

File tree

2 files changed

+14
-3
lines changed

2 files changed

+14
-3
lines changed

webrtc-jni/src/main/cpp/src/api/VideoTrackSink.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,21 @@ namespace jni
3838
rtc::scoped_refptr<webrtc::VideoFrameBuffer> buffer = frame.video_frame_buffer();
3939
rtc::scoped_refptr<webrtc::I420BufferInterface> i420Buffer = buffer->ToI420();
4040

41+
if (i420Buffer == nullptr) {
42+
return;
43+
}
44+
45+
rtc::scoped_refptr<webrtc::I420Buffer> i420BufferCopy = webrtc::I420Buffer::Copy(*i420Buffer);
46+
i420BufferCopy->AddRef();
47+
4148
// if (frame.rotation() != webrtc::kVideoRotation_0) {
4249
// i420Buffer = webrtc::I420Buffer::Rotate(*i420Buffer, frame.rotation());
4350
// }
4451

4552
jint rotation = static_cast<jint>(frame.rotation());
4653
jlong timestamp = frame.timestamp_us() * rtc::kNumNanosecsPerMicrosec;
4754

48-
JavaLocalRef<jobject> jBuffer = I420Buffer::toJava(env, i420Buffer);
55+
JavaLocalRef<jobject> jBuffer = I420Buffer::toJava(env, i420BufferCopy);
4956
jobject jFrame = env->NewObject(javaFrameClass->cls, javaFrameClass->ctor, jBuffer.get(), rotation, timestamp);
5057

5158
env->CallVoidMethod(sink, javaClass->onFrame, jFrame);

webrtc/src/main/java/dev/onvoid/webrtc/media/video/NativeI420Buffer.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,13 +165,17 @@ private static VideoFrameBuffer cropAndScale(final I420Buffer buffer, int cropX,
165165
buffer.getStrideU(), dataV.slice(), buffer.getStrideV());
166166
}
167167

168+
buffer.retain();
169+
168170
I420Buffer newBuffer = allocate(scaleWidth, scaleHeight);
169-
171+
170172
cropAndScale(buffer.getDataY(), buffer.getStrideY(), buffer.getDataU(), buffer.getStrideU(),
171173
buffer.getDataV(), buffer.getStrideV(), cropX, cropY, cropWidth, cropHeight,
172174
newBuffer.getDataY(), newBuffer.getStrideY(), newBuffer.getDataU(), newBuffer.getStrideU(),
173175
newBuffer.getDataV(), newBuffer.getStrideV(), scaleWidth, scaleHeight);
174-
176+
177+
buffer.release();
178+
175179
return newBuffer;
176180
}
177181

0 commit comments

Comments
 (0)