From ff2e215bcd060528a1f2a3ac76d609f80f7d8627 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20M=C3=B6ller?= Date: Fri, 27 Sep 2019 10:29:30 +0200 Subject: [PATCH] Change FrameBuffer::CombineAndDeleteFrames to allocate a new buffer Modifying buffers passed in to the frame buffer breaks sharing. This cl is also a preparation for deleting VCMEncodedFrame::VerifyAndAllocate and EncodedImage::Allocate. Bug: None Change-Id: I4e14bc4708bbcbcd91af2d4b764cb9b8271ec090 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/154569 Reviewed-by: Ilya Nikolaevskiy Reviewed-by: Philip Eliasson Commit-Queue: Niels Moller Cr-Commit-Position: refs/heads/master@{#29336} --- modules/video_coding/frame_buffer2.cc | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/modules/video_coding/frame_buffer2.cc b/modules/video_coding/frame_buffer2.cc index ad776b6faa..f76b957dc6 100644 --- a/modules/video_coding/frame_buffer2.cc +++ b/modules/video_coding/frame_buffer2.cc @@ -750,6 +750,8 @@ void FrameBuffer::ClearFramesAndHistory() { decoded_frames_history_.Clear(); } +// TODO(philipel): Avoid the concatenation of frames here, by replacing +// NextFrame and GetNextFrame with methods returning multiple frames. EncodedFrame* FrameBuffer::CombineAndDeleteFrames( const std::vector& frames) const { RTC_DCHECK(!frames.empty()); @@ -759,10 +761,12 @@ EncodedFrame* FrameBuffer::CombineAndDeleteFrames( for (size_t i = 0; i < frames.size(); ++i) { total_length += frames[i]->size(); } - first_frame->VerifyAndAllocate(total_length); - + auto encoded_image_buffer = EncodedImageBuffer::Create(total_length); + uint8_t* buffer = encoded_image_buffer->data(); first_frame->SetSpatialLayerFrameSize(first_frame->id.spatial_layer, first_frame->size()); + memcpy(buffer, first_frame->data(), first_frame->size()); + buffer += first_frame->size(); // Spatial index of combined frame is set equal to spatial index of its top // spatial layer. @@ -775,7 +779,6 @@ EncodedFrame* FrameBuffer::CombineAndDeleteFrames( last_frame->video_timing().receive_finish_ms; // Append all remaining frames to the first one. - uint8_t* buffer = first_frame->data() + first_frame->size(); for (size_t i = 1; i < frames.size(); ++i) { EncodedFrame* next_frame = frames[i]; first_frame->SetSpatialLayerFrameSize(next_frame->id.spatial_layer, @@ -784,7 +787,7 @@ EncodedFrame* FrameBuffer::CombineAndDeleteFrames( buffer += next_frame->size(); delete next_frame; } - first_frame->set_size(total_length); + first_frame->SetEncodedData(encoded_image_buffer); return first_frame; }