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}
This commit is contained in:
@ -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<EncodedFrame*>& 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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user