VTDecompressionSession-IOSurface分配逐渐增加

问题描述 投票:1回答:1

我正在使用VTDecompressionSession解码.h264流。解码器按预期工作,我得到正确解码的缓冲区。但是,我看到XCode工具“分配”中的“创建且持久”分配逐渐增加。如屏幕截图所示,这些可以归因于解码器在内部分配的IOSurface缓冲区,即使在释放VTDecompressionSession之后也不会释放这些缓冲区。我在同步解码和异步回调decompressionSessionDecodeFrameCallback中都看到了这些情况。剩余的帧数在发生和时间上是随机的。这些缓冲区的大小完全等于解码帧的大小。在使解码器会话无效之前,我确实调用了VTDecompressionSessionWaitForAsynchronousFrames,但是这些分配不会消失。 当解码器会话结束时,有没有一种释放这些IOSurface缓冲区的方法?]

这是我的解码器运行的轮廓。创建解码器会话

const void *values[] = { CFNumberCreate(NULL, kCFNumberSInt32Type, &v) };       
attrs                = CFDictionaryCreate(NULL, keys, values, 1, NULL, NULL);


VTDecompressionOutputCallbackRecord callBackRecord;
callBackRecord.decompressionOutputCallback = decompressionSessionDecodeFrameCallback;
callBackRecord.decompressionOutputRefCon = (__bridge void *)self;
VTDecompressionSessionCreate(kCFAllocatorDefault,
                                          _decoderFormatDescription,
                                          NULL,   
                                          attrs,
                                          &callBackRecord,
                                          &_decoderSession);

在NALU数据包准备好时调用进行解码

CMSampleBufferRef sampleBuffer = nil;
const size_t sampleSizeArray[] = {packetLen};    
CMSampleTimingInfo sampleTimeinfo ={CMTimeMake(1,FPS), CMTimeMake(presentationTS, 1000000), kCMTimeInvalid};
CMSampleBufferCreateReady(kCFAllocatorDefault, blockBuffer, _decoderFormatDescription ,
                                       1, 1, &sampleTimeinfo, 1, sampleSizeArray, &sampleBuffer);
flags = kVTDecodeFrame_EnableAsynchronousDecompression;

VTDecompressionSessionDecodeFrame(_decoderSession,
                                          sampleBuffer,
                                          flags,
                                          &sampleBuffer,
                                          &flagOut);

回叫

void decompressionSessionDecodeFrameCallback{

    CVPixelBufferLockBaseAddress(imageBuffer,0);
    .... 
    send to display
    ....
    CVPixelBufferUnlockBaseAddress(imageBuffer,0);
}

结束解码器会话

VTDecompressionSessionWaitForAsynchronousFrames(_decoderSession);
VTDecompressionSessionInvalidate(_decoderSession);
CFRelease(_decoderSession);

enter image description here

我正在使用VTDecompressionSession解码.h264流。解码器按预期工作,我得到正确解码的缓冲区。但是,我看到“创建且持久”的数量逐渐增加...

ios objective-c xcode10 decoder iosurface
1个回答
0
投票

这不正常,您的代码中肯定存在泄漏。

© www.soinside.com 2019 - 2024. All rights reserved.