Various fixes

This commit is contained in:
Ilya Laktyushin 2023-09-18 00:30:50 +04:00
parent 25ddb78040
commit 4bf1e830c8
4 changed files with 31 additions and 12 deletions

View File

@ -470,8 +470,6 @@ class ChatTimerScreenNode: ViewControllerTracingNode, UIScrollViewDelegate, UIPi
self.contentContainerNode.view.addSubview(pickerView) self.contentContainerNode.view.addSubview(pickerView)
self.pickerView = pickerView self.pickerView = pickerView
pickerView.selectRow(1, inComponent: 0, animated: false)
case .autoremove: case .autoremove:
let pickerView = TimerCustomPickerView() let pickerView = TimerCustomPickerView()
pickerView.dataSource = self pickerView.dataSource = self

View File

@ -1087,10 +1087,10 @@ public extension MediaEditorValues {
} }
var requiresComposing: Bool { var requiresComposing: Bool {
if self.originalDimensions.width > 0 && abs((Double(self.originalDimensions.height) / Double(self.originalDimensions.width)) - 1.7777778) > 0.001 { if abs(1.0 - self.cropScale) > 0.0 {
return true return true
} }
if abs(1.0 - self.cropScale) > 0.0 { if self.cropRect != nil {
return true return true
} }
if self.cropOffset != .zero { if self.cropOffset != .zero {

View File

@ -15,7 +15,7 @@ enum ExportWriterStatus {
protocol MediaEditorVideoExportWriter { protocol MediaEditorVideoExportWriter {
func setup(configuration: MediaEditorVideoExport.Configuration, outputPath: String) func setup(configuration: MediaEditorVideoExport.Configuration, outputPath: String)
func setupVideoInput(configuration: MediaEditorVideoExport.Configuration, sourceFrameRate: Float) func setupVideoInput(configuration: MediaEditorVideoExport.Configuration, preferredTransform: CGAffineTransform?, sourceFrameRate: Float)
func setupAudioInput(configuration: MediaEditorVideoExport.Configuration) func setupAudioInput(configuration: MediaEditorVideoExport.Configuration)
func startWriting() -> Bool func startWriting() -> Bool
@ -62,25 +62,38 @@ public final class MediaEditorVideoAVAssetWriter: MediaEditorVideoExportWriter {
Logger.shared.log("VideoExport", "Did setup asset writer") Logger.shared.log("VideoExport", "Did setup asset writer")
} }
func setupVideoInput(configuration: MediaEditorVideoExport.Configuration, sourceFrameRate: Float) { func setupVideoInput(configuration: MediaEditorVideoExport.Configuration, preferredTransform: CGAffineTransform?, sourceFrameRate: Float) {
guard let writer = self.writer else { guard let writer = self.writer else {
return return
} }
Logger.shared.log("VideoExport", "Will setup video input") Logger.shared.log("VideoExport", "Will setup video input")
var dimensions = configuration.dimensions
var videoSettings = configuration.videoSettings var videoSettings = configuration.videoSettings
if var compressionSettings = videoSettings[AVVideoCompressionPropertiesKey] as? [String: Any] { if var compressionSettings = videoSettings[AVVideoCompressionPropertiesKey] as? [String: Any] {
compressionSettings[AVVideoExpectedSourceFrameRateKey] = sourceFrameRate compressionSettings[AVVideoExpectedSourceFrameRateKey] = sourceFrameRate
videoSettings[AVVideoCompressionPropertiesKey] = compressionSettings videoSettings[AVVideoCompressionPropertiesKey] = compressionSettings
} }
if let preferredTransform {
if (preferredTransform.b == -1 && preferredTransform.c == 1) || (preferredTransform.b == 1 && preferredTransform.c == -1) {
dimensions = CGSize(width: dimensions.height, height: dimensions.width)
}
videoSettings[AVVideoWidthKey] = Int(dimensions.width)
videoSettings[AVVideoHeightKey] = Int(dimensions.height)
}
let videoInput = AVAssetWriterInput(mediaType: .video, outputSettings: videoSettings) let videoInput = AVAssetWriterInput(mediaType: .video, outputSettings: videoSettings)
if let preferredTransform {
videoInput.transform = preferredTransform
}
videoInput.expectsMediaDataInRealTime = false videoInput.expectsMediaDataInRealTime = false
let sourcePixelBufferAttributes = [ let sourcePixelBufferAttributes = [
kCVPixelBufferPixelFormatTypeKey as String: kCVPixelFormatType_32BGRA, kCVPixelBufferPixelFormatTypeKey as String: kCVPixelFormatType_32BGRA,
kCVPixelBufferWidthKey as String: UInt32(configuration.dimensions.width), kCVPixelBufferWidthKey as String: UInt32(dimensions.width),
kCVPixelBufferHeightKey as String: UInt32(configuration.dimensions.height) kCVPixelBufferHeightKey as String: UInt32(dimensions.height)
] ]
self.adaptor = AVAssetWriterInputPixelBufferAdaptor(assetWriterInput: videoInput, sourcePixelBufferAttributes: sourcePixelBufferAttributes) self.adaptor = AVAssetWriterInputPixelBufferAdaptor(assetWriterInput: videoInput, sourcePixelBufferAttributes: sourcePixelBufferAttributes)
@ -483,7 +496,15 @@ public final class MediaEditorVideoExport {
kCVPixelBufferMetalCompatibilityKey as String: true, kCVPixelBufferMetalCompatibilityKey as String: true,
AVVideoColorPropertiesKey: colorProperties AVVideoColorPropertiesKey: colorProperties
] ]
if let videoTrack = videoTracks.first, videoTrack.preferredTransform.isIdentity && !self.configuration.values.requiresComposing {
let originalDimensions = self.configuration.values.originalDimensions
var isNotFullscreen = false
if case .video(_, true) = self.subject, originalDimensions.width > 0 && abs((Double(originalDimensions.height) / Double(originalDimensions.width)) - 1.7777778) > 0.001 {
isNotFullscreen = true
}
var preferredTransform: CGAffineTransform?
if let videoTrack = videoTracks.first, !self.configuration.values.requiresComposing && !isNotFullscreen {
preferredTransform = videoTrack.preferredTransform
} else { } else {
self.setupComposer() self.setupComposer()
} }
@ -517,7 +538,7 @@ public final class MediaEditorVideoExport {
} else { } else {
sourceFrameRate = 30.0 sourceFrameRate = 30.0
} }
writer.setupVideoInput(configuration: self.configuration, sourceFrameRate: sourceFrameRate) writer.setupVideoInput(configuration: self.configuration, preferredTransform: preferredTransform, sourceFrameRate: sourceFrameRate)
} else { } else {
self.videoOutput = nil self.videoOutput = nil
} }
@ -558,7 +579,7 @@ public final class MediaEditorVideoExport {
return return
} }
writer.setup(configuration: self.configuration, outputPath: self.outputPath) writer.setup(configuration: self.configuration, outputPath: self.outputPath)
writer.setupVideoInput(configuration: self.configuration, sourceFrameRate: 30.0) writer.setupVideoInput(configuration: self.configuration, preferredTransform: nil, sourceFrameRate: 30.0)
if let audioData = self.configuration.values.audioTrack { if let audioData = self.configuration.values.audioTrack {
let mixComposition = AVMutableComposition() let mixComposition = AVMutableComposition()

View File

@ -510,7 +510,7 @@ public func fetchLocalFileVideoMediaResource(postbox: Postbox, resource: LocalFi
} else { } else {
if alwaysUseModernPipeline && !isImage, let track = avAsset.tracks(withMediaType: .video).first { if alwaysUseModernPipeline && !isImage, let track = avAsset.tracks(withMediaType: .video).first {
let dimensions = track.naturalSize.applying(track.preferredTransform) let dimensions = track.naturalSize.applying(track.preferredTransform)
mediaEditorValues = MediaEditorValues(dimensions: PixelDimensions(dimensions), qualityPreset: qualityPreset) mediaEditorValues = MediaEditorValues(dimensions: PixelDimensions(width: Int32(abs(dimensions.width)), height: Int32(abs(dimensions.height))), qualityPreset: qualityPreset)
} }
} }
let tempFile = EngineTempBox.shared.tempFile(fileName: "video.mp4") let tempFile = EngineTempBox.shared.tempFile(fileName: "video.mp4")