最近我在使用WebRTC开源库播放视频时,遇到了一个让我比较头疼的问题:视频码流的回调会造成内存越界。在这里我要和大家分享如何定位和解决这个问题。
首先看代码:
void WebRTCVideoRenderer::OnFrame(const webrtc::VideoFrame& frame) {
if (!frame.video_frame_buffer()->type() == webrtc::VideoFrameBuffer::Type::kNative) {
return;
}
const uint8_t* buffer = frame.video_frame_buffer()->GetI420()->DataY();
int size = frame.video_frame_buffer()->GetI420()->StrideY() * frame.height();
processVideoFrame(buffer, size, frame.width(), frame.height());
}
这个代码段是我在WebRTC的视频播放页面里的回调。视频每一帧回来时,代码会调用OnFrame函数。
在这段代码中,我们获取到帧里的Y数据,以及Y的大小。这场景下以Y作为判断回调数据大小应该是没有问题的,因为是对于YUV视频的处理。所以从代码上的逻辑来看,是没有问题的。
但是,在我的测试中,仍然会出现内存越界的问题,主要是由于一些意外的数据导致的。
那么问题出在哪里呢?我们来看看WebRTC的源码。
源码里有一个函数如下:
rtc::scoped_refptr<webrtc::VideoFrameBuffer> I420Buffer::Crea