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 <ilnik@webrtc.org>
Reviewed-by: Philip Eliasson <philipel@webrtc.org>
Commit-Queue: Niels Moller <nisse@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#29336}
diff --git a/modules/video_coding/frame_buffer2.cc b/modules/video_coding/frame_buffer2.cc
index ad776b6..f76b957 100644
--- a/modules/video_coding/frame_buffer2.cc
+++ b/modules/video_coding/frame_buffer2.cc
@@ -750,6 +750,8 @@
   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<EncodedFrame*>& frames) const {
   RTC_DCHECK(!frames.empty());
@@ -759,10 +761,12 @@
   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 @@
       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 @@
     buffer += next_frame->size();
     delete next_frame;
   }
-  first_frame->set_size(total_length);
+  first_frame->SetEncodedData(encoded_image_buffer);
   return first_frame;
 }