Revert "Try to fix a possible retain cycle"

This reverts commit 2dac7d58dc.
This commit is contained in:
Sami Samhuri 2025-01-19 15:19:21 -08:00
parent 2dac7d58dc
commit 865e524be6
No known key found for this signature in database

View file

@ -41,8 +41,8 @@ actor SampleWriter {
// MARK: Internal state // MARK: Internal state
private var reader: AVAssetReader? private let reader: AVAssetReader
private var writer: AVAssetWriter? private let writer: AVAssetWriter
private var audioOutput: AVAssetReaderAudioMixOutput? private var audioOutput: AVAssetReaderAudioMixOutput?
private var audioInput: AVAssetWriterInput? private var audioInput: AVAssetWriterInput?
private var videoOutput: AVAssetReaderVideoCompositionOutput? private var videoOutput: AVAssetReaderVideoCompositionOutput?
@ -111,15 +111,15 @@ actor SampleWriter {
progressContinuation.yield(0.0) progressContinuation.yield(0.0)
writer?.startWriting() writer.startWriting()
writer?.startSession(atSourceTime: timeRange.start) writer.startSession(atSourceTime: timeRange.start)
reader?.startReading() reader.startReading()
try Task.checkCancellation() try Task.checkCancellation()
startEncodingAudioTracks() startEncodingAudioTracks()
startEncodingVideoTracks() startEncodingVideoTracks()
while reader?.status == .reading, writer?.status == .writing { while reader.status == .reading, writer.status == .writing {
guard !Task.isCancelled else { guard !Task.isCancelled else {
// Flag so that we stop writing samples // Flag so that we stop writing samples
isCancelled = true isCancelled = true
@ -129,31 +129,26 @@ actor SampleWriter {
try await Task.sleep(for: .milliseconds(10)) try await Task.sleep(for: .milliseconds(10))
} }
defer { guard !isCancelled, reader.status != .cancelled, writer.status != .cancelled else {
cleanUp()
}
guard !isCancelled, reader?.status != .cancelled, writer?.status != .cancelled else {
log.debug("Cancelled before writing samples") log.debug("Cancelled before writing samples")
cancelReaderAndWriter() reader.cancelReading()
writer.cancelWriting()
throw CancellationError() throw CancellationError()
} }
guard writer?.status != .failed else { guard writer.status != .failed else {
reader?.cancelReading() reader.cancelReading()
throw Error.writeFailure(writer?.error) throw Error.writeFailure(writer.error)
} }
guard reader?.status != .failed else { guard reader.status != .failed else {
writer?.cancelWriting() writer.cancelWriting()
throw Error.readFailure(reader?.error) throw Error.readFailure(reader.error)
} }
if let writer {
await withCheckedContinuation { continuation in await withCheckedContinuation { continuation in
writer.finishWriting { writer.finishWriting {
continuation.resume(returning: ()) continuation.resume(returning: ())
} }
} }
}
progressContinuation.yield(1.0) progressContinuation.yield(1.0)
@ -174,7 +169,7 @@ actor SampleWriter {
let audioOutput = AVAssetReaderAudioMixOutput(audioTracks: audioTracks, audioSettings: nil) let audioOutput = AVAssetReaderAudioMixOutput(audioTracks: audioTracks, audioSettings: nil)
audioOutput.alwaysCopiesSampleData = false audioOutput.alwaysCopiesSampleData = false
audioOutput.audioMix = audioMix audioOutput.audioMix = audioMix
guard let reader, reader.canAdd(audioOutput) else { guard reader.canAdd(audioOutput) else {
throw Error.setupFailure(.cannotAddAudioOutput) throw Error.setupFailure(.cannotAddAudioOutput)
} }
reader.add(audioOutput) reader.add(audioOutput)
@ -182,7 +177,7 @@ actor SampleWriter {
let audioInput = AVAssetWriterInput(mediaType: .audio, outputSettings: audioOutputSettings) let audioInput = AVAssetWriterInput(mediaType: .audio, outputSettings: audioOutputSettings)
audioInput.expectsMediaDataInRealTime = false audioInput.expectsMediaDataInRealTime = false
guard let writer, writer.canAdd(audioInput) else { guard writer.canAdd(audioInput) else {
throw Error.setupFailure(.cannotAddAudioInput) throw Error.setupFailure(.cannotAddAudioInput)
} }
writer.add(audioInput) writer.add(audioInput)
@ -198,7 +193,7 @@ actor SampleWriter {
) )
videoOutput.alwaysCopiesSampleData = false videoOutput.alwaysCopiesSampleData = false
videoOutput.videoComposition = videoComposition videoOutput.videoComposition = videoComposition
guard let reader, reader.canAdd(videoOutput) else { guard reader.canAdd(videoOutput) else {
throw Error.setupFailure(.cannotAddVideoOutput) throw Error.setupFailure(.cannotAddVideoOutput)
} }
reader.add(videoOutput) reader.add(videoOutput)
@ -206,7 +201,7 @@ actor SampleWriter {
let videoInput = AVAssetWriterInput(mediaType: .video, outputSettings: videoOutputSettings) let videoInput = AVAssetWriterInput(mediaType: .video, outputSettings: videoOutputSettings)
videoInput.expectsMediaDataInRealTime = false videoInput.expectsMediaDataInRealTime = false
guard let writer, writer.canAdd(videoInput) else { guard writer.canAdd(videoInput) else {
throw Error.setupFailure(.cannotAddVideoInput) throw Error.setupFailure(.cannotAddVideoInput)
} }
writer.add(videoInput) writer.add(videoInput)
@ -238,25 +233,11 @@ actor SampleWriter {
} }
} }
private func cancelReaderAndWriter() {
reader?.cancelReading()
writer?.cancelWriting()
cleanUp()
}
private func cleanUp() {
reader = nil
writer = nil
audioInput = nil
audioOutput = nil
videoInput = nil
videoOutput = nil
}
private func writeAllReadySamples() { private func writeAllReadySamples() {
guard !isCancelled else { guard !isCancelled else {
log.debug("Cancelled while writing samples") log.debug("Cancelled while writing samples")
cancelReaderAndWriter() reader.cancelReading()
writer.cancelWriting()
return return
} }
@ -273,10 +254,11 @@ actor SampleWriter {
while input.isReadyForMoreMediaData { while input.isReadyForMoreMediaData {
guard !isCancelled else { guard !isCancelled else {
log.debug("Cancelled while writing samples") log.debug("Cancelled while writing samples")
cancelReaderAndWriter() reader.cancelReading()
writer.cancelWriting()
return false return false
} }
guard reader?.status == .reading && writer?.status == .writing, guard reader.status == .reading && writer.status == .writing,
let sampleBuffer = output.copyNextSampleBuffer() else { let sampleBuffer = output.copyNextSampleBuffer() else {
input.markAsFinished() input.markAsFinished()
return false return false