title: Using AVAssetWriter to create a movie from images is not working as expected on a 3GS device
body: <p>The call to appendPixelBuffer is returning NO on 3GS device (IOS 4.1), but is working well on iPhone 4 devices.  </p>
  
  <p>The following call to appendPixelBuffer is the source of the problem:</p>
  
  <pre><code>CVPixelBufferRef buffer = NULL;
  buffer = [self pixelBufferFromCGImage:[[UIImage imageNamed:@"frame1.png"] CGImage]];
  BOOL result = [adaptor appendPixelBuffer:buffer withPresentationTime:kCMTimeZero];
  
  if (result == NO) //failes on 3GS, but works on iphone 4
      NSLog(@"failed to append buffer");
  </code></pre>
  
  <p>}</p>
  
  <p>Full Code:</p>
  
  <pre><code>-(void)writeImagesAsMovie:(NSArray *)array toPath:(NSString*)path {
  
  
  NSLog(path);
  
  NSError *error = nil;
  AVAssetWriter *videoWriter = [[AVAssetWriter alloc] initWithURL:
                                [NSURL fileURLWithPath:path] fileType:AVFileTypeQuickTimeMovie
                                                            error:&amp;error];
  
  if(error) {
      NSLog(@"error creating AssetWriter: %@",[error description]);
  }
  </code></pre>
  
  <p><strong>The error (ONLY ON 3GS, iphone 4 is fine) is</strong> </p>
  
  <blockquote>
    <p>Error Domain=AVFoundationErrorDomain
    Code=-11800 "The operation couldn’t be
    completed. (AVFoundationErrorDomain
    error -11800.)" UserInfo=0x4970530
    {NSUnderlyingError=0x496d2c0 "The
    operation couldn’t be completed.
    (OSStatus error -12908.)"}</p>
  </blockquote>
  
  <pre><code>NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAndKeys:
                                 AVVideoCodecH264, AVVideoCodecKey,
                                 [NSNumber numberWithInt:frameSize.width], AVVideoWidthKey,
                                 [NSNumber numberWithInt:frameSize.height], AVVideoHeightKey,
                                 nil];
  
  
  
  AVAssetWriterInput* writerInput = [[AVAssetWriterInput
                                      assetWriterInputWithMediaType:AVMediaTypeVideo
                                      outputSettings:videoSettings] retain];
  
  NSMutableDictionary *attributes = [[NSMutableDictionary alloc]init];
  [attributes setObject:[NSNumber numberWithUnsignedInt:kCVPixelFormatType_32ARGB] forKey:(NSString*)kCVPixelBufferPixelFormatTypeKey];
  [attributes setObject:[NSNumber numberWithUnsignedInt:frameSize.width] forKey:(NSString*)kCVPixelBufferWidthKey];
  [attributes setObject:[NSNumber numberWithUnsignedInt:frameSize.height] forKey:(NSString*)kCVPixelBufferHeightKey];
  
  AVAssetWriterInputPixelBufferAdaptor *adaptor = [AVAssetWriterInputPixelBufferAdaptor
                                                   assetWriterInputPixelBufferAdaptorWithAssetWriterInput:writerInput
                                                   sourcePixelBufferAttributes:attributes];
  
  [videoWriter addInput:writerInput];
  
  // fixes all errors
  writerInput.expectsMediaDataInRealTime = YES;
  
  //Start a session:
  BOOL start = [videoWriter startWriting];
  NSLog(@"Session started? %d", start);
  
  [videoWriter startSessionAtSourceTime:kCMTimeZero];
  
  CVPixelBufferRef buffer = NULL;
  buffer = [self pixelBufferFromCGImage:[[UIImage imageNamed:@"frame1.png"] CGImage]];
  BOOL result = [adaptor appendPixelBuffer:buffer withPresentationTime:kCMTimeZero];
  
  if (result == NO) //failes on 3GS, but works on iphone 4
      NSLog(@"failed to append buffer");
  
  if(buffer)
      CVBufferRelease(buffer);
  
  [NSThread sleepForTimeInterval:0.05];
  //for (int i = 1;i&lt;[array count]; i++)
  for (int i = 1;i&lt;20; i++)
  {
      if (adaptor.assetWriterInput.readyForMoreMediaData) 
      {
          NSLog(@"inside for loop %d",i);
          CMTime frameTime = CMTimeMake(1, 15);
          CMTime lastTime=CMTimeMake(i, 15); 
          CMTime presentTime=CMTimeAdd(lastTime, frameTime);
          NSString *imgName = [NSString stringWithFormat:@"frame%d.png",i];
          UIImage *imgFrame = [UIImage imageNamed:imgName] ;
          buffer = [self pixelBufferFromCGImage:[imgFrame CGImage]];
          BOOL result = [adaptor appendPixelBuffer:buffer withPresentationTime:presentTime];
  
          if (result == NO) //failes on 3GS, but works on iphone 4
          {
              NSLog(@"failed to append buffer");
              NSLog(@"The error is %@", [videoWriter error]);
          }
          if(buffer)
              CVBufferRelease(buffer);
          [NSThread sleepForTimeInterval:0.05];
      }
      else
      {
          NSLog(@"error");
          i--;
      }
  }
  
  //Finish the session:
  [writerInput markAsFinished];
  [videoWriter finishWriting];
  CVPixelBufferPoolRelease(adaptor.pixelBufferPool);
  [videoWriter release];
  [writerInput release];
  
  NSLog(@"Movie created successfully");
  
  }
  
  - (CVPixelBufferRef) pixelBufferFromCGImage: (CGImageRef) image
  {
      NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                               [NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey,
                               [NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey,
                               nil];
      CVPixelBufferRef pxbuffer = NULL;
  
      CVPixelBufferCreate(kCFAllocatorDefault, self.view.frame.size.width,
                          self.view.frame.size.height, kCVPixelFormatType_32ARGB, (CFDictionaryRef) options, 
                          &amp;pxbuffer);
  
      CVPixelBufferLockBaseAddress(pxbuffer, 0);
      void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer);
  
      CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
      CGContextRef context = CGBitmapContextCreate(pxdata, self.view.frame.size.width,
                                                   self.view.frame.size.height, 8, 4*self.view.frame.size.width, rgbColorSpace, 
                                                   kCGImageAlphaNoneSkipFirst);
  
      CGContextConcatCTM(context, CGAffineTransformMakeRotation(0));
      CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image), 
                                             CGImageGetHeight(image)), image);
      CGColorSpaceRelease(rgbColorSpace);
      CGContextRelease(context);
  
      CVPixelBufferUnlockBaseAddress(pxbuffer, 0);
  
      return pxbuffer;
  }
  </code></pre>