Video avatar fixes

This commit is contained in:
Ilya Laktyushin 2020-07-02 16:20:46 +03:00
parent 5c1263ff12
commit fb5c983f04
6 changed files with 36 additions and 22 deletions

View File

@ -131,7 +131,7 @@
{ {
for (GPUImageOutput<GPUImageInput> *currentFilter in _initialFilters) for (GPUImageOutput<GPUImageInput> *currentFilter in _initialFilters)
{ {
[currentFilter setInputRotation:newInputRotation atIndex:(NSInteger)textureIndex]; [currentFilter setInputRotation:newInputRotation atIndex:(NSInteger)textureIndex];
} }
} }

View File

@ -194,11 +194,11 @@ NSString *const kGPUImageThreeInputTextureVertexShaderString = SHADER_STRING
{ {
inputRotation = newInputRotation; inputRotation = newInputRotation;
} }
else if (textureIndex == 1) else if (textureIndex == 1 && !self.rotateOnlyFirstTexture)
{ {
inputRotation2 = newInputRotation; inputRotation2 = newInputRotation;
} }
else else if (textureIndex == 2 && !self.rotateOnlyFirstTexture)
{ {
inputRotation3 = newInputRotation; inputRotation3 = newInputRotation;
} }

View File

@ -15,6 +15,8 @@ extern NSString *const kGPUImageTwoInputTextureVertexShaderString;
BOOL firstFrameCheckDisabled, secondFrameCheckDisabled; BOOL firstFrameCheckDisabled, secondFrameCheckDisabled;
} }
@property (nonatomic, assign) bool rotateOnlyFirstTexture;
- (void)disableFirstFrameCheck; - (void)disableFirstFrameCheck;
- (void)disableSecondFrameCheck; - (void)disableSecondFrameCheck;

View File

@ -176,7 +176,7 @@ NSString *const kGPUImageTwoInputTextureVertexShaderString = SHADER_STRING
{ {
inputRotation = newInputRotation; inputRotation = newInputRotation;
} }
else else if (textureIndex == 1 && !_rotateOnlyFirstTexture)
{ {
inputRotation2 = newInputRotation; inputRotation2 = newInputRotation;
} }

View File

@ -1837,17 +1837,21 @@
if (adjustments.toolsApplied) { if (adjustments.toolsApplied) {
image = [PGPhotoEditor resultImageForImage:image adjustments:adjustments]; image = [PGPhotoEditor resultImageForImage:image adjustments:adjustments];
CGSize fillSize = TGScaleToFillSize(videoDimensions, image.size); if ([self presentedForAvatarCreation]) {
fullImage = TGPhotoEditorVideoCrop(image, paintingImage, adjustments.cropOrientation, adjustments.cropRotation, adjustments.cropRect, adjustments.cropMirrored, CGSizeMake(640, 640), item.originalSize, true, false);
} else {
CGSize fillSize = TGScaleToFillSize(videoDimensions, image.size);
UIGraphicsBeginImageContextWithOptions(fillSize, true, 0.0f); UIGraphicsBeginImageContextWithOptions(fillSize, true, 0.0f);
CGContextRef context = UIGraphicsGetCurrentContext(); CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetInterpolationQuality(context, kCGInterpolationMedium); CGContextSetInterpolationQuality(context, kCGInterpolationMedium);
[image drawInRect:CGRectMake(0, 0, fillSize.width, fillSize.height)]; [image drawInRect:CGRectMake(0, 0, fillSize.width, fillSize.height)];
[paintingImage drawInRect:CGRectMake(0, 0, fillSize.width, fillSize.height)]; [paintingImage drawInRect:CGRectMake(0, 0, fillSize.width, fillSize.height)];
fullImage = UIGraphicsGetImageFromCurrentImageContext(); fullImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext(); UIGraphicsEndImageContext();
}
} else { } else {
fullImage = TGPhotoEditorVideoCrop(image, paintingImage, adjustments.cropOrientation, adjustments.cropRotation, adjustments.cropRect, adjustments.cropMirrored, CGSizeMake(640, 640), item.originalSize, true, false); fullImage = TGPhotoEditorVideoCrop(image, paintingImage, adjustments.cropOrientation, adjustments.cropRotation, adjustments.cropRect, adjustments.cropMirrored, CGSizeMake(640, 640), item.originalSize, true, false);
} }
@ -2320,14 +2324,16 @@
if (self.requestOriginalScreenSizeImage == nil) if (self.requestOriginalScreenSizeImage == nil)
return; return;
SSignal *cachedSignal = [[self.editingContext facesForItem:item] mapToSignal:^SSignal *(id result) SSignal *cachedFaces = self.editingContext != nil ? [self.editingContext facesForItem:item] : [SSignal single:nil];
SSignal *cachedSignal = [cachedFaces mapToSignal:^SSignal *(id result)
{ {
if (result == nil) if (result == nil)
return [SSignal fail:nil]; return [SSignal fail:nil];
return [SSignal single:result]; return [SSignal single:result];
}]; }];
SSignal *imageSignal = [self.requestOriginalScreenSizeImage(item, 0) take:1]; SSignal *imageSignal = self.requestOriginalScreenSizeImage(item, 0);
SSignal *detectSignal = [[imageSignal filter:^bool(UIImage *image) SSignal *detectSignal = [[[imageSignal filter:^bool(UIImage *image)
{ {
if (![image isKindOfClass:[UIImage class]]) if (![image isKindOfClass:[UIImage class]])
return false; return false;
@ -2336,7 +2342,7 @@
return false; return false;
return true; return true;
}] mapToSignal:^SSignal *(UIImage *image) { }] take:1] mapToSignal:^SSignal *(UIImage *image) {
return [[TGPaintFaceDetector detectFacesInImage:image originalSize:originalSize] startOn:[SQueue concurrentDefaultQueue]]; return [[TGPaintFaceDetector detectFacesInImage:image originalSize:originalSize] startOn:[SQueue concurrentDefaultQueue]];
}]; }];

View File

@ -60,7 +60,7 @@ SHADER_STRING
void main() { void main() {
vec4 image = texture2D(sourceImage, texCoord); vec4 image = texture2D(sourceImage, texCoord);
vec4 blurredImage = texture2D(inputImageTexture2, texCoord); vec4 blurredImage = texture2D(inputImageTexture2, texCoord2);
gl_FragColor = vec4((image.rgb - blurredImage.rgb + vec3(0.5,0.5,0.5)), image.a); gl_FragColor = vec4((image.rgb - blurredImage.rgb + vec3(0.5,0.5,0.5)), image.a);
} }
); );
@ -202,8 +202,8 @@ SHADER_STRING
void main() { void main() {
vec4 image = texture2D(sourceImage, texCoord); vec4 image = texture2D(sourceImage, texCoord);
vec4 toneCurvedImage = texture2D(inputImageTexture2, texCoord); vec4 toneCurvedImage = texture2D(inputImageTexture2, texCoord2);
vec4 mask = texture2D(inputImageTexture3, texCoord); vec4 mask = texture2D(inputImageTexture3, texCoord3);
gl_FragColor = vec4(mix(image.rgb,toneCurvedImage.rgb,1.0 - mask.b),1.0); gl_FragColor = vec4(mix(image.rgb,toneCurvedImage.rgb,1.0 - mask.b),1.0);
} }
); );
@ -240,12 +240,14 @@ SHADER_STRING
self.skinToneCurveFilter = skinToneCurveFilter; self.skinToneCurveFilter = skinToneCurveFilter;
GPUImageDissolveBlendFilter *dissolveFilter = [[GPUImageDissolveBlendFilter alloc] init]; GPUImageDissolveBlendFilter *dissolveFilter = [[GPUImageDissolveBlendFilter alloc] init];
dissolveFilter.rotateOnlyFirstTexture = true;
[self addFilter:dissolveFilter]; [self addFilter:dissolveFilter];
self.dissolveFilter = dissolveFilter; self.dissolveFilter = dissolveFilter;
[skinToneCurveFilter addTarget:dissolveFilter atTextureLocation:1]; [skinToneCurveFilter addTarget:dissolveFilter atTextureLocation:1];
GPUImageThreeInputFilter *composeFilter = [[GPUImageThreeInputFilter alloc] initWithFragmentShaderFromString:YUGPUImageHighpassSkinSmoothingCompositingFilterFragmentShaderString]; GPUImageThreeInputFilter *composeFilter = [[GPUImageThreeInputFilter alloc] initWithFragmentShaderFromString:YUGPUImageHighpassSkinSmoothingCompositingFilterFragmentShaderString];
composeFilter.rotateOnlyFirstTexture = true;
[self addFilter:composeFilter]; [self addFilter:composeFilter];
[maskGenerator addTarget:composeFilter atTextureLocation:2]; [maskGenerator addTarget:composeFilter atTextureLocation:2];
@ -281,6 +283,10 @@ SHADER_STRING
[self updateHighPassRadius]; [self updateHighPassRadius];
} }
- (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex {
[super setInputRotation:newInputRotation atIndex:textureIndex];
}
- (void)updateHighPassRadius { - (void)updateHighPassRadius {
CGSize inputSize = self.currentInputSize; CGSize inputSize = self.currentInputSize;
if (inputSize.width * inputSize.height > 0) { if (inputSize.width * inputSize.height > 0) {