1
votes

I am trying to decode Prores RAW video file to native bayer representation. But it doesn't work. I always got

Optional(Error Domain=AVFoundationErrorDomain Code=-11821 "Cannot Decode" UserInfo={NSLocalizedFailureReason=The media data could not be decoded. It may be damaged., NSLocalizedDescription=Cannot Decode, NSUnderlyingError=0x600002a982a0 {Error Domain=NSOSStatusErrorDomain Code=-12137 "(null)"}})

I have tried all possible bayer formats:

  • kCVPixelFormatType_14Bayer_GRBG
  • kCVPixelFormatType_14Bayer_RGGB
  • kCVPixelFormatType_14Bayer_BGGR
  • kCVPixelFormatType_14Bayer_GBRG
  • kCVPixelFormatType_16VersatileBayer
  • kCVPixelFormatType_64RGBA_DownscaledProResRAW

but same error. Here a full decoder:

class Decoder {

private let assetReader: AVAssetReader?
private let output: AVAssetReaderTrackOutput

init() throws {
    
    VTRegisterProfessionalVideoWorkflowVideoDecoders()
    VTRegisterProfessionalVideoWorkflowVideoEncoders()
    
    let movieUrl = URL(fileURLWithPath: "/Users/xxxx/ProresRAW_Video.MOV")
    let movieAsset = AVAsset(url: movieUrl)
    
    do {
        let assetReader = try AVAssetReader(asset: movieAsset)
        let tracks = movieAsset.tracks(withMediaType: .video)
        
        guard let firstTrack = tracks.first else {
            print("No video tracks found")
            throw NSError()
        }
        
        let outputSettings: [String: Any] = [kCVPixelBufferPixelFormatTypeKey as String: kCVPixelFormatType_16VersatileBayer]
        
        let out = AVAssetReaderTrackOutput(track: firstTrack, outputSettings: outputSettings)
        out.alwaysCopiesSampleData = true
        
        assetReader.add(out)
        
        self.assetReader = assetReader
        self.output = out
        
    } catch {
        print(error)
        throw error
    }
   
}

func run(){
    
    guard let assetReader = assetReader, assetReader.startReading() else {
        print("Failed to stard asset reader")
        return
    }
    

    while(assetReader.status == .reading) {
        guard let sampleBuffer = output.copyNextSampleBuffer() else {
            print(assetReader.status.rawValue)
            print(assetReader.error)
            continue
        }
          
        print("Decoding success!")
    }
}

}