Fix memory leak in VideoToolbox encoder.
We were leaking a fragmentation header object on each frame.
BUG=webrtc:8132
Review-Url: https://codereview.webrtc.org/3004013002
Cr-Original-Commit-Position: refs/heads/master@{#19602}
Cr-Mirrored-From: https://chromium.googlesource.com/external/webrtc
Cr-Mirrored-Commit: f8084d485b87e49a68ff8e46e07bc01d375586be
diff --git a/sdk/objc/Framework/Classes/VideoToolbox/RTCVideoEncoderH264.mm b/sdk/objc/Framework/Classes/VideoToolbox/RTCVideoEncoderH264.mm
index 44983be..a410e27 100644
--- a/sdk/objc/Framework/Classes/VideoToolbox/RTCVideoEncoderH264.mm
+++ b/sdk/objc/Framework/Classes/VideoToolbox/RTCVideoEncoderH264.mm
@@ -664,10 +664,10 @@
std::unique_ptr<rtc::Buffer> buffer(new rtc::Buffer());
RTCRtpFragmentationHeader *header;
{
- webrtc::RTPFragmentationHeader *header_cpp;
+ std::unique_ptr<webrtc::RTPFragmentationHeader> header_cpp;
bool result =
H264CMSampleBufferToAnnexBBuffer(sampleBuffer, isKeyframe, buffer.get(), &header_cpp);
- header = [[RTCRtpFragmentationHeader alloc] initWithNativeFragmentationHeader:header_cpp];
+ header = [[RTCRtpFragmentationHeader alloc] initWithNativeFragmentationHeader:header_cpp.get()];
if (!result) {
return;
}
diff --git a/sdk/objc/Framework/Classes/VideoToolbox/nalu_rewriter.cc b/sdk/objc/Framework/Classes/VideoToolbox/nalu_rewriter.cc
index 47afe95..2804254 100644
--- a/sdk/objc/Framework/Classes/VideoToolbox/nalu_rewriter.cc
+++ b/sdk/objc/Framework/Classes/VideoToolbox/nalu_rewriter.cc
@@ -33,10 +33,10 @@
CMSampleBufferRef avcc_sample_buffer,
bool is_keyframe,
rtc::Buffer* annexb_buffer,
- webrtc::RTPFragmentationHeader** out_header) {
+ std::unique_ptr<RTPFragmentationHeader> *out_header) {
RTC_DCHECK(avcc_sample_buffer);
RTC_DCHECK(out_header);
- *out_header = nullptr;
+ out_header->reset(nullptr);
// Get format description from the sample buffer.
CMVideoFormatDescriptionRef description =
@@ -143,8 +143,7 @@
}
RTC_DCHECK_EQ(bytes_remaining, (size_t)0);
- std::unique_ptr<webrtc::RTPFragmentationHeader> header;
- header.reset(new webrtc::RTPFragmentationHeader());
+ std::unique_ptr<RTPFragmentationHeader> header(new RTPFragmentationHeader());
header->VerifyAndAllocateFragmentationHeader(frag_offsets.size());
RTC_DCHECK_EQ(frag_lengths.size(), frag_offsets.size());
for (size_t i = 0; i < frag_offsets.size(); ++i) {
@@ -153,7 +152,7 @@
header->fragmentationPlType[i] = 0;
header->fragmentationTimeDiff[i] = 0;
}
- *out_header = header.release();
+ *out_header = std::move(header);
CFRelease(contiguous_buffer);
return true;
}
diff --git a/sdk/objc/Framework/Classes/VideoToolbox/nalu_rewriter.h b/sdk/objc/Framework/Classes/VideoToolbox/nalu_rewriter.h
index 4685f08..3d7a88f 100644
--- a/sdk/objc/Framework/Classes/VideoToolbox/nalu_rewriter.h
+++ b/sdk/objc/Framework/Classes/VideoToolbox/nalu_rewriter.h
@@ -33,7 +33,7 @@
CMSampleBufferRef avcc_sample_buffer,
bool is_keyframe,
rtc::Buffer* annexb_buffer,
- webrtc::RTPFragmentationHeader** out_header);
+ std::unique_ptr<RTPFragmentationHeader> *out_header);
// Converts a buffer received from RTP into a sample buffer suitable for the
// VideoToolbox decoder. The RTP buffer is in annex b format whereas the sample
diff --git a/sdk/objc/Framework/Classes/VideoToolbox/objc_video_encoder_factory.mm b/sdk/objc/Framework/Classes/VideoToolbox/objc_video_encoder_factory.mm
index c3de9ae..75b4a34 100644
--- a/sdk/objc/Framework/Classes/VideoToolbox/objc_video_encoder_factory.mm
+++ b/sdk/objc/Framework/Classes/VideoToolbox/objc_video_encoder_factory.mm
@@ -78,7 +78,7 @@
std::unique_ptr<RTPFragmentationHeader> fragmentationHeader =
[header createNativeFragmentationHeader];
EncodedImageCallback::Result res =
- callback->OnEncodedImage(encodedImage, &codecSpecificInfo, fragmentationHeader.release());
+ callback->OnEncodedImage(encodedImage, &codecSpecificInfo, fragmentationHeader.get());
return res.error == EncodedImageCallback::Result::OK;
}];