title: AVMutableVideoComposition rotated video captured in portrait mode
body: <p>I have used below code to add image overlay over video and then export the new generated video to document directory. But strangely,video gets rotated by 90 degrees. </p>
  
  <pre><code>- (void)buildTransitionComposition:(AVMutableComposition *)composition andVideoComposition:(AVMutableVideoComposition *)videoComposition
  {
      CMTime nextClipStartTime = kCMTimeZero;
      NSInteger i;
  
      // Make transitionDuration no greater than half the shortest clip duration.
      CMTime transitionDuration = self.transitionDuration;
      for (i = 0; i &lt; [_clips count]; i++ ) {
          NSValue *clipTimeRange = [_clipTimeRanges objectAtIndex:i];
          if (clipTimeRange) {
              CMTime halfClipDuration = [clipTimeRange CMTimeRangeValue].duration;
              halfClipDuration.timescale *= 2; // You can halve a rational by doubling its denominator.
              transitionDuration = CMTimeMinimum(transitionDuration, halfClipDuration);
          }
      }
  
      // Add two video tracks and two audio tracks.
      AVMutableCompositionTrack *compositionVideoTracks[2];
      AVMutableCompositionTrack *compositionAudioTracks[2];
      compositionVideoTracks[0] = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
      compositionVideoTracks[1] = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
      compositionAudioTracks[0] = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
      compositionAudioTracks[1] = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
  
      CMTimeRange *passThroughTimeRanges = alloca(sizeof(CMTimeRange) * [_clips count]);
      CMTimeRange *transitionTimeRanges = alloca(sizeof(CMTimeRange) * [_clips count]);
  
      // Place clips into alternating video &amp; audio tracks in composition, overlapped by transitionDuration.
      for (i = 0; i &lt; [_clips count]; i++ ) {
          NSInteger alternatingIndex = i % 2; // alternating targets: 0, 1, 0, 1, ...
          AVURLAsset *asset = [_clips objectAtIndex:i];
          NSValue *clipTimeRange = [_clipTimeRanges objectAtIndex:i];
          CMTimeRange timeRangeInAsset;
          if (clipTimeRange)
              timeRangeInAsset = [clipTimeRange CMTimeRangeValue];
          else
              timeRangeInAsset = CMTimeRangeMake(kCMTimeZero, [asset duration]);
  
          AVAssetTrack *clipVideoTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
          [compositionVideoTracks[alternatingIndex] insertTimeRange:timeRangeInAsset ofTrack:clipVideoTrack atTime:nextClipStartTime error:nil];
  
          /*
          CGAffineTransform t = clipVideoTrack.preferredTransform;
          NSLog(@"Transform1 : %@",t);
          */
          AVAssetTrack *clipAudioTrack = [[asset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
          [compositionAudioTracks[alternatingIndex] insertTimeRange:timeRangeInAsset ofTrack:clipAudioTrack atTime:nextClipStartTime error:nil];
  
          // Remember the time range in which this clip should pass through.
          // Every clip after the first begins with a transition.
          // Every clip before the last ends with a transition.
          // Exclude those transitions from the pass through time ranges.
          passThroughTimeRanges[i] = CMTimeRangeMake(nextClipStartTime, timeRangeInAsset.duration);
          if (i &gt; 0) {
              passThroughTimeRanges[i].start = CMTimeAdd(passThroughTimeRanges[i].start, transitionDuration);
              passThroughTimeRanges[i].duration = CMTimeSubtract(passThroughTimeRanges[i].duration, transitionDuration);
          }
          if (i+1 &lt; [_clips count]) {
              passThroughTimeRanges[i].duration = CMTimeSubtract(passThroughTimeRanges[i].duration, transitionDuration);
          }
  
          // The end of this clip will overlap the start of the next by transitionDuration.
          // (Note: this arithmetic falls apart if timeRangeInAsset.duration &lt; 2 * transitionDuration.)
          nextClipStartTime = CMTimeAdd(nextClipStartTime, timeRangeInAsset.duration);
          nextClipStartTime = CMTimeSubtract(nextClipStartTime, transitionDuration);
  
          // Remember the time range for the transition to the next item.
          transitionTimeRanges[i] = CMTimeRangeMake(nextClipStartTime, transitionDuration);
      }
  
      // Set up the video composition if we are to perform crossfade or push transitions between clips.
      NSMutableArray *instructions = [NSMutableArray array];
  
      // Cycle between "pass through A", "transition from A to B", "pass through B", "transition from B to A".
      for (i = 0; i &lt; [_clips count]; i++ ) {
          NSInteger alternatingIndex = i % 2; // alternating targets
  
          // Pass through clip i.
          AVMutableVideoCompositionInstruction *passThroughInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
          passThroughInstruction.timeRange = passThroughTimeRanges[i];
          AVMutableVideoCompositionLayerInstruction *passThroughLayer = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:compositionVideoTracks[alternatingIndex]];
          /*
          CGAffineTransform rotationTransform = CGAffineTransformMakeRotation(M_PI_2);
          CGAffineTransform rotateTranslate = CGAffineTransformTranslate(rotationTransform,320,0);
          [passThroughLayer setTransform:rotateTranslate atTime:kCMTimeZero];
           */
          passThroughInstruction.layerInstructions = [NSArray arrayWithObject:passThroughLayer];
          [instructions addObject:passThroughInstruction];
  
          if (i+1 &lt; [_clips count]) {
              // Add transition from clip i to clip i+1.
  
              AVMutableVideoCompositionInstruction *transitionInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
              transitionInstruction.timeRange = transitionTimeRanges[i];
              AVMutableVideoCompositionLayerInstruction *fromLayer = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:compositionVideoTracks[alternatingIndex]];
              AVMutableVideoCompositionLayerInstruction *toLayer = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:compositionVideoTracks[1-alternatingIndex]];
  
              if (self.transitionType == SimpleEditorTransitionTypeCrossFade) {
                  // Fade out the fromLayer by setting a ramp from 1.0 to 0.0.
                  [fromLayer setOpacityRampFromStartOpacity:1.0 toEndOpacity:0.0 timeRange:transitionTimeRanges[i]];
              }
              else if (self.transitionType == SimpleEditorTransitionTypePush) {
                  // Set a transform ramp on fromLayer from identity to all the way left of the screen.
                  [fromLayer setTransformRampFromStartTransform:CGAffineTransformIdentity toEndTransform:CGAffineTransformMakeTranslation(-composition.naturalSize.width, 0.0) timeRange:transitionTimeRanges[i]];
                  // Set a transform ramp on toLayer from all the way right of the screen to identity.
                  [toLayer setTransformRampFromStartTransform:CGAffineTransformMakeTranslation(+composition.naturalSize.width, 0.0) toEndTransform:CGAffineTransformIdentity timeRange:transitionTimeRanges[i]];
              }
  
              transitionInstruction.layerInstructions = [NSArray arrayWithObjects:fromLayer, toLayer, nil];
              [instructions addObject:transitionInstruction];
          }
      }
  
      videoComposition.instructions = instructions;
  
  
  }
  </code></pre>
  
  <p>Please help,as I am not able to export portrait video in proper mode.Any help appreciated.
  Thank you.</p>