         
         let sourceFrames = self.tracks.reduce(into: [CMPersistentTrackID: MTIImage]()) { (frames, track) in
             if let image = MTIAsyncVideoCompositionRequestHandler.makeTransformedSourceImage(from: request, track: track) {
-                frames[track.trackID] = image
+                frames[track.id] = image
             }
         }
         guard let pixelBuffer = request.renderContext.newPixelBuffer() else {

    @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
        self.context = context
        self.filter = filter
        self.queue = queue

    /// 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.map(Track.init(track:))
        self.context = context
        self.filter = filter
        self.queue = queue
    }
    
    private static func makeTransformedSourceImage(from request: MTIMutableVideoCompositionRequest, track: Track) -> MTIImage? {
        guard let pixelBuffer = request.sourceFrame(byTrackID: track.id) else {
            return nil
        }
        assert(request.renderContext.renderTransform.isIdentity == true)
