title: AVFoundation: Read RAW single frames from mov file (v210, Uncompressed 10-bit 4:2:2)
body: <p>For extracting the RAW image buffer from an uncompressed v210 (with pixel format kCVPixelFormatType_422YpCbCr10) I tried to follow this great post:
  <a href="https://stackoverflow.com/questions/4049207/reading-samples-via-avassetreader">Reading samples via AVAssetReader</a></p>
  
  <p>The problem is, that when it comes to <strong>startReading</strong> of my <strong>assetReader</strong> I got an <strong>AVAssetReaderStatusFailed</strong> (with setting NSMutableDictionary object kCVPixelBufferPixelFormatTypeKey for the output settings to kCVPixelFormatType_422YpCbCr10). If I leave the <strong>outputSettings</strong> be nil, it parses each frame, but the CMSampleBufferRef buffers are empty.</p>
  
  <p>I tried lots of the pixel formats such as</p>
  
  <ul>
  <li>kCVPixelFormatType_422YpCbCr10</li>
  <li>kCVPixelFormatType_422YpCbCr8</li>
  <li>kCVPixelFormatType_422YpCbCr16</li>
  <li>kCVPixelFormatType_422YpCbCr8_yuvs</li>
  <li>kCVPixelFormatType_422YpCbCr8FullRange</li>
  <li>kCVPixelFormatType_422YpCbCr_4A_8BiPlanar</li>
  </ul>
  
  <p>but none of them work.</p>
  
  <p>What am I doing wrong?</p>
  
  <p>Any comments welcome...</p>
  
  <p>Here is my code:</p>
  
  <pre><code>/* construct an AVAssetReader based on an file based URL */
  NSError *error=[[NSError alloc]init];
  NSString *filePathString=[[NSString alloc]
                            initWithString:@"/Users/johann/Raw12bit.mov"];
  
  NSURL *movieUrl=[[NSURL alloc] initFileURLWithPath:filePathString];
  AVURLAsset *movieAsset=[[AVURLAsset alloc] initWithURL:movieUrl options:nil]; 
  
  /* determine image dimensions of images stored in movie asset */
  CGSize size=[movieAsset naturalSize];  
  NSLog(@"movie asset natual size: size.width=%f size.height=%f", 
        size.width, size.height);
  
  /* allocate assetReader */
  AVAssetReader *assetReader=[[AVAssetReader alloc] initWithAsset:movieAsset
                                                            error:&amp;error];
  
  /* get video track(s) from movie asset */
  NSArray *videoTracks=[movieAsset tracksWithMediaType:AVMediaTypeVideo];
  
  /* get first video track, if there is any */
  AVAssetTrack *videoTrack0=[videoTracks objectAtIndex:0];
  
  /* set the desired video frame format into attribute dictionary */
  NSMutableDictionary* dictionary=[NSDictionary dictionaryWithObjectsAndKeys:
    [NSNumber numberWithInt:kCVPixelFormatType_422YpCbCr10], 
    (NSString*)kCVPixelBufferPixelFormatTypeKey,
    nil];
  
  /* construct the actual track output and add it to the asset reader */
  AVAssetReaderTrackOutput* assetReaderOutput=[[AVAssetReaderTrackOutput alloc] 
                                               initWithTrack:videoTrack0 
                                               outputSettings:dictionary]; //nil or dictionary
  /* main parser loop */
  NSInteger i=0;
  if([assetReader canAddOutput:assetReaderOutput]){
    [assetReader addOutput:assetReaderOutput];
  
    NSLog(@"asset added to output.");
  
    /* start asset reader */
    if([assetReader startReading]==YES){
      /* read off the samples */
      CMSampleBufferRef buffer;
      while([assetReader status]==AVAssetReaderStatusReading){
        buffer=[assetReaderOutput copyNextSampleBuffer];
        i++;
        NSLog(@"decoding frame #%ld done.", i);
      }
    }
    else {
      NSLog(@"could not start reading asset.");
      NSLog(@"reader status: %ld", [assetReader status]);
    }
  }
  else {
    NSLog(@"could not add asset to output.");
  }
  </code></pre>
  
  <p>Best Regards,
  Johann</p>