You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
2.3 KiB
68 lines
2.3 KiB
//
|
|
// SCStillImageDepthBlurFilter.m
|
|
// Snapchat
|
|
//
|
|
// Created by Brian Ng on 10/11/17.
|
|
//
|
|
|
|
#import "SCStillImageDepthBlurFilter.h"
|
|
|
|
#import "SCCameraTweaks.h"
|
|
#import "SCProcessingModuleUtils.h"
|
|
|
|
@import CoreMedia;
|
|
|
|
@implementation SCStillImageDepthBlurFilter {
|
|
CIContext *_context;
|
|
CIFilter *_filter;
|
|
CVPixelBufferPoolRef _bufferPool;
|
|
}
|
|
|
|
- (instancetype)init
|
|
{
|
|
if (self = [super init]) {
|
|
_context = [CIContext contextWithOptions:@{ kCIContextWorkingFormat : @(kCIFormatRGBAh) }];
|
|
_filter = [CIFilter filterWithName:@"CIDepthBlurEffect"];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)dealloc
|
|
{
|
|
CVPixelBufferPoolFlush(_bufferPool, kCVPixelBufferPoolFlushExcessBuffers);
|
|
CVPixelBufferPoolRelease(_bufferPool);
|
|
}
|
|
|
|
- (NSData *)renderWithPhotoData:(NSData *)photoData renderData:(RenderData)renderData NS_AVAILABLE_IOS(11_0)
|
|
{
|
|
CIImage *mainImage = [CIImage imageWithData:photoData];
|
|
CVPixelBufferRef disparityImagePixelBuffer = renderData.depthDataMap;
|
|
CIImage *disparityImage = [CIImage imageWithCVPixelBuffer:disparityImagePixelBuffer];
|
|
if (!disparityImage) {
|
|
return photoData;
|
|
}
|
|
[_filter setValue:mainImage forKey:kCIInputImageKey];
|
|
[_filter setValue:disparityImage forKey:kCIInputDisparityImageKey];
|
|
if (renderData.depthBlurPointOfInterest && SCCameraTweaksEnableFilterInputFocusRect()) {
|
|
CGPoint pointOfInterest = *renderData.depthBlurPointOfInterest;
|
|
[_filter setValue:[CIVector vectorWithX:pointOfInterest.x Y:pointOfInterest.y Z:1 W:1]
|
|
forKey:@"inputFocusRect"];
|
|
}
|
|
CIImage *result = [_filter outputImage];
|
|
if (!result) {
|
|
return photoData;
|
|
}
|
|
CGColorSpaceRef deviceRGBColorSpace = CGColorSpaceCreateDeviceRGB();
|
|
NSData *processedPhotoData = [_context JPEGRepresentationOfImage:result colorSpace:deviceRGBColorSpace options:@{}];
|
|
CGColorSpaceRelease(deviceRGBColorSpace);
|
|
if (!processedPhotoData) {
|
|
return photoData;
|
|
}
|
|
renderData.sampleBuffer = [SCProcessingModuleUtils sampleBufferFromImage:result
|
|
oldSampleBuffer:renderData.sampleBuffer
|
|
bufferPool:_bufferPool
|
|
context:_context];
|
|
return processedPhotoData;
|
|
}
|
|
|
|
@end
|