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-Commit-Position: refs/heads/master@{#19602}
This commit is contained in:
kthelgason 2017-08-30 04:47:10 -07:00 committed by Commit Bot
parent 16adf03d25
commit f8084d485b
4 changed files with 8 additions and 9 deletions

View File

@ -664,10 +664,10 @@ CFStringRef ExtractProfile(const cricket::VideoCodec &codec) {
std::unique_ptr<rtc::Buffer> buffer(new rtc::Buffer()); std::unique_ptr<rtc::Buffer> buffer(new rtc::Buffer());
RTCRtpFragmentationHeader *header; RTCRtpFragmentationHeader *header;
{ {
webrtc::RTPFragmentationHeader *header_cpp; std::unique_ptr<webrtc::RTPFragmentationHeader> header_cpp;
bool result = bool result =
H264CMSampleBufferToAnnexBBuffer(sampleBuffer, isKeyframe, buffer.get(), &header_cpp); H264CMSampleBufferToAnnexBBuffer(sampleBuffer, isKeyframe, buffer.get(), &header_cpp);
header = [[RTCRtpFragmentationHeader alloc] initWithNativeFragmentationHeader:header_cpp]; header = [[RTCRtpFragmentationHeader alloc] initWithNativeFragmentationHeader:header_cpp.get()];
if (!result) { if (!result) {
return; return;
} }

View File

@ -33,10 +33,10 @@ bool H264CMSampleBufferToAnnexBBuffer(
CMSampleBufferRef avcc_sample_buffer, CMSampleBufferRef avcc_sample_buffer,
bool is_keyframe, bool is_keyframe,
rtc::Buffer* annexb_buffer, rtc::Buffer* annexb_buffer,
webrtc::RTPFragmentationHeader** out_header) { std::unique_ptr<RTPFragmentationHeader> *out_header) {
RTC_DCHECK(avcc_sample_buffer); RTC_DCHECK(avcc_sample_buffer);
RTC_DCHECK(out_header); RTC_DCHECK(out_header);
*out_header = nullptr; out_header->reset(nullptr);
// Get format description from the sample buffer. // Get format description from the sample buffer.
CMVideoFormatDescriptionRef description = CMVideoFormatDescriptionRef description =
@ -143,8 +143,7 @@ bool H264CMSampleBufferToAnnexBBuffer(
} }
RTC_DCHECK_EQ(bytes_remaining, (size_t)0); RTC_DCHECK_EQ(bytes_remaining, (size_t)0);
std::unique_ptr<webrtc::RTPFragmentationHeader> header; std::unique_ptr<RTPFragmentationHeader> header(new RTPFragmentationHeader());
header.reset(new webrtc::RTPFragmentationHeader());
header->VerifyAndAllocateFragmentationHeader(frag_offsets.size()); header->VerifyAndAllocateFragmentationHeader(frag_offsets.size());
RTC_DCHECK_EQ(frag_lengths.size(), frag_offsets.size()); RTC_DCHECK_EQ(frag_lengths.size(), frag_offsets.size());
for (size_t i = 0; i < frag_offsets.size(); ++i) { for (size_t i = 0; i < frag_offsets.size(); ++i) {
@ -153,7 +152,7 @@ bool H264CMSampleBufferToAnnexBBuffer(
header->fragmentationPlType[i] = 0; header->fragmentationPlType[i] = 0;
header->fragmentationTimeDiff[i] = 0; header->fragmentationTimeDiff[i] = 0;
} }
*out_header = header.release(); *out_header = std::move(header);
CFRelease(contiguous_buffer); CFRelease(contiguous_buffer);
return true; return true;
} }

View File

@ -33,7 +33,7 @@ bool H264CMSampleBufferToAnnexBBuffer(
CMSampleBufferRef avcc_sample_buffer, CMSampleBufferRef avcc_sample_buffer,
bool is_keyframe, bool is_keyframe,
rtc::Buffer* annexb_buffer, 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 // 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 // VideoToolbox decoder. The RTP buffer is in annex b format whereas the sample

View File

@ -78,7 +78,7 @@ class ObjCVideoEncoder : public VideoEncoder {
std::unique_ptr<RTPFragmentationHeader> fragmentationHeader = std::unique_ptr<RTPFragmentationHeader> fragmentationHeader =
[header createNativeFragmentationHeader]; [header createNativeFragmentationHeader];
EncodedImageCallback::Result res = EncodedImageCallback::Result res =
callback->OnEncodedImage(encodedImage, &codecSpecificInfo, fragmentationHeader.release()); callback->OnEncodedImage(encodedImage, &codecSpecificInfo, fragmentationHeader.get());
return res.error == EncodedImageCallback::Result::OK; return res.error == EncodedImageCallback::Result::OK;
}]; }];