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:
parent
16adf03d25
commit
f8084d485b
@ -664,10 +664,10 @@ CFStringRef ExtractProfile(const cricket::VideoCodec &codec) {
|
||||
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;
|
||||
}
|
||||
|
||||
@ -33,10 +33,10 @@ bool H264CMSampleBufferToAnnexBBuffer(
|
||||
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 @@ bool H264CMSampleBufferToAnnexBBuffer(
|
||||
}
|
||||
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 @@ bool H264CMSampleBufferToAnnexBBuffer(
|
||||
header->fragmentationPlType[i] = 0;
|
||||
header->fragmentationTimeDiff[i] = 0;
|
||||
}
|
||||
*out_header = header.release();
|
||||
*out_header = std::move(header);
|
||||
CFRelease(contiguous_buffer);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -33,7 +33,7 @@ bool H264CMSampleBufferToAnnexBBuffer(
|
||||
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
|
||||
|
||||
@ -78,7 +78,7 @@ class ObjCVideoEncoder : public VideoEncoder {
|
||||
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;
|
||||
}];
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user