mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-23 22:55:00 +00:00
Use modern pipeline for video conversion
This commit is contained in:
@@ -121,9 +121,9 @@ final class MediaEditorComposer {
|
||||
if let pixelBuffer {
|
||||
processImage(inputImage: ciImage, time: time, completion: { compositedImage in
|
||||
if var compositedImage {
|
||||
let scale = self.outputDimensions.width / self.dimensions.width
|
||||
let scale = self.outputDimensions.width / compositedImage.extent.width
|
||||
compositedImage = compositedImage.transformed(by: CGAffineTransform(scaleX: scale, y: scale))
|
||||
|
||||
|
||||
self.ciContext?.render(compositedImage, to: pixelBuffer)
|
||||
completion(pixelBuffer)
|
||||
} else {
|
||||
@@ -160,9 +160,9 @@ final class MediaEditorComposer {
|
||||
if let pixelBuffer, let context = self.ciContext {
|
||||
makeEditorImageFrameComposition(context: context, inputImage: image, gradientImage: self.gradientImage, drawingImage: self.drawingImage, dimensions: self.dimensions, outputDimensions: self.outputDimensions, values: self.values, entities: self.entities, time: time, completion: { compositedImage in
|
||||
if var compositedImage {
|
||||
let scale = self.outputDimensions.width / self.dimensions.width
|
||||
let scale = self.outputDimensions.width / compositedImage.extent.width
|
||||
compositedImage = compositedImage.samplingLinear().transformed(by: CGAffineTransform(scaleX: scale, y: scale))
|
||||
|
||||
|
||||
self.ciContext?.render(compositedImage, to: pixelBuffer)
|
||||
completion(pixelBuffer)
|
||||
} else {
|
||||
@@ -218,24 +218,38 @@ public func makeEditorImageComposition(context: CIContext, postbox: Postbox, inp
|
||||
|
||||
private func makeEditorImageFrameComposition(context: CIContext, inputImage: CIImage, gradientImage: CIImage, drawingImage: CIImage?, dimensions: CGSize, outputDimensions: CGSize, values: MediaEditorValues, entities: [MediaEditorComposerEntity], time: CMTime, textScale: CGFloat = 1.0, completion: @escaping (CIImage?) -> Void) {
|
||||
var resultImage = CIImage(color: .black).cropped(to: CGRect(origin: .zero, size: dimensions)).transformed(by: CGAffineTransform(translationX: -dimensions.width / 2.0, y: -dimensions.height / 2.0))
|
||||
resultImage = gradientImage.composited(over: resultImage)
|
||||
if values.isStory {
|
||||
resultImage = gradientImage.composited(over: resultImage)
|
||||
}
|
||||
|
||||
var mediaImage = inputImage.samplingLinear().transformed(by: CGAffineTransform(translationX: -inputImage.extent.midX, y: -inputImage.extent.midY))
|
||||
|
||||
var initialScale: CGFloat
|
||||
if mediaImage.extent.height > mediaImage.extent.width {
|
||||
if mediaImage.extent.height > mediaImage.extent.width && values.isStory {
|
||||
initialScale = max(dimensions.width / mediaImage.extent.width, dimensions.height / mediaImage.extent.height)
|
||||
} else {
|
||||
initialScale = dimensions.width / mediaImage.extent.width
|
||||
}
|
||||
|
||||
var cropTransform = CGAffineTransform(translationX: values.cropOffset.x, y: values.cropOffset.y * -1.0)
|
||||
cropTransform = cropTransform.rotated(by: -values.cropRotation)
|
||||
cropTransform = cropTransform.scaledBy(x: initialScale * values.cropScale, y: initialScale * values.cropScale)
|
||||
mediaImage = mediaImage.transformed(by: cropTransform)
|
||||
resultImage = mediaImage.composited(over: resultImage)
|
||||
if values.isStory {
|
||||
var cropTransform: CGAffineTransform = CGAffineTransform(translationX: values.cropOffset.x, y: values.cropOffset.y * -1.0)
|
||||
cropTransform = cropTransform.rotated(by: -values.cropRotation)
|
||||
cropTransform = cropTransform.scaledBy(x: initialScale * values.cropScale, y: initialScale * values.cropScale)
|
||||
mediaImage = mediaImage.transformed(by: cropTransform)
|
||||
resultImage = mediaImage.composited(over: resultImage)
|
||||
} else {
|
||||
var horizontalScale = initialScale
|
||||
if values.cropMirroring {
|
||||
horizontalScale *= -1.0
|
||||
}
|
||||
mediaImage = mediaImage.transformed(by: CGAffineTransformMakeScale(horizontalScale, initialScale))
|
||||
resultImage = mediaImage.composited(over: resultImage)
|
||||
}
|
||||
|
||||
if let drawingImage {
|
||||
if var drawingImage {
|
||||
if values.isStory {
|
||||
drawingImage = drawingImage.transformed(by: CGAffineTransformMakeScale(initialScale, initialScale))
|
||||
}
|
||||
resultImage = drawingImage.samplingLinear().composited(over: resultImage)
|
||||
}
|
||||
|
||||
@@ -254,7 +268,26 @@ private func makeEditorImageFrameComposition(context: CIContext, inputImage: CII
|
||||
}
|
||||
|
||||
resultImage = resultImage.transformed(by: CGAffineTransform(translationX: dimensions.width / 2.0, y: dimensions.height / 2.0))
|
||||
resultImage = resultImage.cropped(to: CGRect(origin: .zero, size: dimensions))
|
||||
if values.isStory {
|
||||
resultImage = resultImage.cropped(to: CGRect(origin: .zero, size: dimensions))
|
||||
} else {
|
||||
let originalDimensions = values.originalDimensions.cgSize
|
||||
var cropRect = values.cropRect ?? .zero
|
||||
if cropRect.isEmpty {
|
||||
cropRect = CGRect(origin: .zero, size: originalDimensions)
|
||||
}
|
||||
let scale = dimensions.width / originalDimensions.width
|
||||
let scaledCropRect = CGRect(origin: CGPoint(x: cropRect.minX * scale, y: dimensions.height - cropRect.maxY * scale), size: CGSize(width: cropRect.width * scale, height: cropRect.height * scale))
|
||||
resultImage = resultImage.cropped(to: scaledCropRect)
|
||||
resultImage = resultImage.transformed(by: CGAffineTransformMakeTranslation(-scaledCropRect.minX, -scaledCropRect.minY))
|
||||
|
||||
if let orientation = values.cropOrientation, orientation != .up {
|
||||
let rotation = orientation.rotation
|
||||
resultImage = resultImage.transformed(by: CGAffineTransformMakeTranslation(-resultImage.extent.width / 2.0, -resultImage.extent.height / 2.0))
|
||||
resultImage = resultImage.transformed(by: CGAffineTransformMakeRotation(rotation))
|
||||
resultImage = resultImage.transformed(by: CGAffineTransformMakeTranslation(resultImage.extent.width / 2.0, resultImage.extent.height / 2.0))
|
||||
}
|
||||
}
|
||||
completion(resultImage)
|
||||
}
|
||||
}
|
||||
@@ -273,7 +306,6 @@ private func makeEditorImageFrameComposition(context: CIContext, inputImage: CII
|
||||
if let scale = entity.baseScale {
|
||||
baseScale = scale
|
||||
} else if let _ = entity.baseDrawingSize {
|
||||
// baseScale = textScale
|
||||
} else if let baseSize = entity.baseSize {
|
||||
baseScale = baseSize.width / image.extent.width
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user