From 0d247729a68766f75389a80bea4c361a9ae324b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A1ri=20Tristan=20Helgason?= Date: Fri, 26 Oct 2018 10:59:28 +0200 Subject: [PATCH] Allocate CMBlockBuffers using a memory pool. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: webrtc:5258 Change-Id: Iae7549d618f797f4dc413671f0f2e53ed23be3e7 Reviewed-on: https://webrtc-review.googlesource.com/c/107738 Reviewed-by: Anders Carlsson Commit-Queue: Kári Helgason Cr-Commit-Position: refs/heads/master@{#25383} --- .../video_codec/RTCVideoDecoderH264.mm | 14 ++++++++++++- .../components/video_codec/nalu_rewriter.cc | 20 ++++++++++--------- .../components/video_codec/nalu_rewriter.h | 3 ++- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/sdk/objc/components/video_codec/RTCVideoDecoderH264.mm b/sdk/objc/components/video_codec/RTCVideoDecoderH264.mm index a6edbc8474..3bfb918bf6 100644 --- a/sdk/objc/components/video_codec/RTCVideoDecoderH264.mm +++ b/sdk/objc/components/video_codec/RTCVideoDecoderH264.mm @@ -71,12 +71,23 @@ void decompressionOutputCallback(void *decoderRef, // Decoder. @implementation RTCVideoDecoderH264 { CMVideoFormatDescriptionRef _videoFormat; + CMMemoryPoolRef _memoryPool; VTDecompressionSessionRef _decompressionSession; RTCVideoDecoderCallback _callback; OSStatus _error; } +- (instancetype)init { + self = [super init]; + if (self) { + _memoryPool = CMMemoryPoolCreate(nil); + } + return self; +} + - (void)dealloc { + CMMemoryPoolInvalidate(_memoryPool); + CFRelease(_memoryPool); [self destroyDecompressionSession]; [self setVideoFormat:nullptr]; } @@ -129,7 +140,8 @@ void decompressionOutputCallback(void *decoderRef, if (!webrtc::H264AnnexBBufferToCMSampleBuffer((uint8_t *)inputImage.buffer.bytes, inputImage.buffer.length, _videoFormat, - &sampleBuffer)) { + &sampleBuffer, + _memoryPool)) { return WEBRTC_VIDEO_CODEC_ERROR; } RTC_DCHECK(sampleBuffer); diff --git a/sdk/objc/components/video_codec/nalu_rewriter.cc b/sdk/objc/components/video_codec/nalu_rewriter.cc index a849d3f053..55ed1c2b4c 100644 --- a/sdk/objc/components/video_codec/nalu_rewriter.cc +++ b/sdk/objc/components/video_codec/nalu_rewriter.cc @@ -160,7 +160,8 @@ bool H264CMSampleBufferToAnnexBBuffer( bool H264AnnexBBufferToCMSampleBuffer(const uint8_t* annexb_buffer, size_t annexb_buffer_size, CMVideoFormatDescriptionRef video_format, - CMSampleBufferRef* out_sample_buffer) { + CMSampleBufferRef* out_sample_buffer, + CMMemoryPoolRef memory_pool) { RTC_DCHECK(annexb_buffer); RTC_DCHECK(out_sample_buffer); RTC_DCHECK(video_format); @@ -185,11 +186,11 @@ bool H264AnnexBBufferToCMSampleBuffer(const uint8_t* annexb_buffer, } // Allocate memory as a block buffer. - // TODO(tkchin): figure out how to use a pool. CMBlockBufferRef block_buffer = nullptr; + CFAllocatorRef block_allocator = CMMemoryPoolGetAllocator(memory_pool); OSStatus status = CMBlockBufferCreateWithMemoryBlock( - nullptr, nullptr, reader.BytesRemaining(), nullptr, nullptr, 0, - reader.BytesRemaining(), kCMBlockBufferAssureMemoryNowFlag, + kCFAllocatorDefault, nullptr, reader.BytesRemaining(), block_allocator, + nullptr, 0, reader.BytesRemaining(), kCMBlockBufferAssureMemoryNowFlag, &block_buffer); if (status != kCMBlockBufferNoErr) { RTC_LOG(LS_ERROR) << "Failed to create block buffer."; @@ -199,8 +200,9 @@ bool H264AnnexBBufferToCMSampleBuffer(const uint8_t* annexb_buffer, // Make sure block buffer is contiguous. CMBlockBufferRef contiguous_buffer = nullptr; if (!CMBlockBufferIsRangeContiguous(block_buffer, 0, 0)) { - status = CMBlockBufferCreateContiguous( - nullptr, block_buffer, nullptr, nullptr, 0, 0, 0, &contiguous_buffer); + status = CMBlockBufferCreateContiguous(kCFAllocatorDefault, block_buffer, + block_allocator, nullptr, 0, 0, 0, + &contiguous_buffer); if (status != noErr) { RTC_LOG(LS_ERROR) << "Failed to flatten non-contiguous block buffer: " << status; @@ -236,9 +238,9 @@ bool H264AnnexBBufferToCMSampleBuffer(const uint8_t* annexb_buffer, } // Create sample buffer. - status = CMSampleBufferCreate(nullptr, contiguous_buffer, true, nullptr, - nullptr, video_format, 1, 0, nullptr, 0, - nullptr, out_sample_buffer); + status = CMSampleBufferCreate(kCFAllocatorDefault, contiguous_buffer, true, + nullptr, nullptr, video_format, 1, 0, nullptr, + 0, nullptr, out_sample_buffer); if (status != noErr) { RTC_LOG(LS_ERROR) << "Failed to create sample buffer."; CFRelease(contiguous_buffer); diff --git a/sdk/objc/components/video_codec/nalu_rewriter.h b/sdk/objc/components/video_codec/nalu_rewriter.h index cd5a51079a..a0c1aa90af 100644 --- a/sdk/objc/components/video_codec/nalu_rewriter.h +++ b/sdk/objc/components/video_codec/nalu_rewriter.h @@ -44,7 +44,8 @@ bool H264CMSampleBufferToAnnexBBuffer( bool H264AnnexBBufferToCMSampleBuffer(const uint8_t* annexb_buffer, size_t annexb_buffer_size, CMVideoFormatDescriptionRef video_format, - CMSampleBufferRef* out_sample_buffer); + CMSampleBufferRef* out_sample_buffer, + CMMemoryPoolRef memory_pool); // Returns a video format description created from the sps/pps information in // the Annex B buffer. If there is no such information, nullptr is returned.