         }
     }
     
-    private let tracks: [AVAssetTrack]
+    private struct Track {
+        let id: CMPersistentTrackID
+        let preferredTransform: CGAffineTransform
+        init(track: AVAssetTrack) {
+            self.id = track.trackID
+            self.preferredTransform = track.preferredTransform
+        }
+    }
+    
+    private let tracks: [Track]
     private let context: MTIContext
     private let filter: (Request) throws -> MTIImage
     private let queue: DispatchQueue?

    /// If the `queue` is nil, the `filter` block runs directly on the queue where `handle(request:)` is called.
    public init(context: MTIContext, tracks: [AVAssetTrack], on queue: DispatchQueue?, filter: @escaping (Request) throws -> MTIImage) {
        assert(tracks.count > 0)
        self.tracks = tracks
        self.context = context
        self.filter = filter
        self.queue = queue
    }
    
    private static func makeTransformedSourceImage(from request: MTIMutableVideoCompositionRequest, track: AVAssetTrack) -> MTIImage? {
        guard let pixelBuffer = request.sourceFrame(byTrackID: track.trackID) else {
            return nil
        }
        assert(request.renderContext.renderTransform.isIdentity == true)

    @available(*, deprecated, message: "Use init(context:tracks:on:filter:) instead.")
    public init(context: MTIContext, tracks: [AVAssetTrack], queue: DispatchQueue = .main, filter: @escaping (Request) throws -> MTIImage) {
        assert(tracks.count > 0)
        self.tracks = tracks.map(Track.init(track:))
        self.context = context
        self.filter = filter
        self.queue = queue
