swisspol/GCDWebServer

Memory pressure using streamed response using mp4 video

Closed this issue · 1 comments

I succeded serving a decrypted video file, bit I have a big memory pressure on my device (over 500mb!) for 30s video.
How can I release the memory?
I know I should not use Data response so i'm using GCDWebServerStreamedResponse.

[_webServer addDefaultHandlerForMethod:@"GET"
                                  requestClass:[GCDWebServerRequest class]
                             asyncProcessBlock:^(GCDWebServerRequest * _Nonnull request, GCDWebServerCompletionBlock  _Nonnull completionBlock) {
   
            NSDictionary *params = request.query;
            long long pts_start = [params[@"pts_start"] longLongValue];
            long long pts_end = [params[@"pts_end"] longLongValue];
            
            if([request hasByteRange]){
               //never :(
                NSLog(@"RANGE: %@", NSStringFromRange([request byteRange]));
            }
            
            __block VideoSegmenter *vs = [[VideoSegmenter alloc] initWithVideoName:weakSelf.filenameNoExtension start:pts_start end:pts_end];
            GCDWebServerStreamedResponse *response = [GCDWebServerStreamedResponse responseWithContentType:@"video/MP2T" asyncStreamBlock:^(GCDWebServerBodyReaderCompletionBlock  _Nonnull stream_completionBlock) {
                [vs generateDataBlock:^(NSData *data) {
                    stream_completionBlock(data, nil);
                    vs = nil;
                    stream_completionBlock([NSData data], nil);
                }];
            }];
            [response setValue:@"*" forAdditionalHeader:@"Access-Control-Allow-Origin"];
            completionBlock(response);            
        }];

My VideoSegmenter instances are all deallocated correctly (even without forcing to nil)
Probably GCDWebServerStreamedResponse is keeping the NSData alive?

Use Instruments to know which GCDWebServer objects remain alive after the HTTP request has been served.

You can also try to disable entirely your video segmenter code and see what happens.