Skip to content

Commit

Permalink
Added player:didSetupRenderer: in SCPlayer delegate.
Browse files Browse the repository at this point in the history
  • Loading branch information
rFlex committed Jun 17, 2015
1 parent e167b67 commit e3fc720
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 12 deletions.
6 changes: 6 additions & 0 deletions Library/Sources/SCPlayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,12 @@
*/
- (void)player:(SCPlayer *)player itemReadyToPlay:(AVPlayerItem *)item;

/**
Called when the player has setup the renderer so it can receive the image in the
proper orientation.
*/
- (void)player:(SCPlayer *)player didSetupRenderer:(id<CIImageRenderer>)renderer;

@end

/**
Expand Down
46 changes: 34 additions & 12 deletions Library/Sources/SCPlayer.m
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ @interface SCPlayer() <AVPlayerItemOutputPullDelegate, AVPlayerItemOutputPushDel
AVPlayerItem *_oldItem;
Float64 _itemsLoopLength;
id _timeObserver;
BOOL _rendererWasSetup;
CGAffineTransform _rendererTransform;
}

@end
Expand Down Expand Up @@ -138,18 +140,36 @@ - (void)renderVideo:(CFTimeInterval)hostFrameTime {
CMTime outputItemTime = [_videoOutput itemTimeForHostTime:hostFrameTime];

if ([_videoOutput hasNewPixelBufferForItemTime:outputItemTime]) {
CMTime time;
CVPixelBufferRef pixelBuffer = [_videoOutput copyPixelBufferForItemTime:outputItemTime itemTimeForDisplay:&time];

if (pixelBuffer != nil) {
CIImage *inputImage = [CIImage imageWithCVPixelBuffer:pixelBuffer];
id<CIImageRenderer> renderer = self.CIImageRenderer;

if (renderer != nil) {
if (!_rendererWasSetup) {
if ([renderer respondsToSelector:@selector(setPreferredCIImageTransform:)]) {
[renderer setPreferredCIImageTransform:_rendererTransform];
}

id<SCPlayerDelegate> delegate = self.delegate;
if ([delegate respondsToSelector:@selector(player:didSetupRenderer:)]) {
[delegate player:self didSetupRenderer:renderer];
}

_rendererWasSetup = YES;
}

id<CIImageRenderer> renderer = self.CIImageRenderer;
renderer.CIImageTime = CMTimeGetSeconds(outputItemTime);
renderer.CIImage = inputImage;
CMTime time;
CVPixelBufferRef pixelBuffer = [_videoOutput copyPixelBufferForItemTime:outputItemTime itemTimeForDisplay:&time];

CFRelease(pixelBuffer);
if (pixelBuffer != nil) {
CIImage *inputImage = [CIImage imageWithCVPixelBuffer:pixelBuffer];

renderer.CIImageTime = CMTimeGetSeconds(outputItemTime);
renderer.CIImage = inputImage;

CFRelease(pixelBuffer);
}
}

}
}

Expand Down Expand Up @@ -184,6 +204,7 @@ - (void)setupDisplayLink {

[self suspendDisplay];
}
_rendererWasSetup = NO;
}

- (void)unsetupDisplayLink {
Expand All @@ -208,15 +229,16 @@ - (void)setupVideoOutputToItem:(AVPlayerItem *)item {

_displayLink.paused = NO;

CGAffineTransform transform = CGAffineTransformIdentity;
id<CIImageRenderer> renderer = self.CIImageRenderer;

if ([renderer respondsToSelector:@selector(frame)] && [renderer respondsToSelector:@selector(setPreferredCIImageTransform:)]) {
if ([renderer respondsToSelector:@selector(frame)]) {
NSArray *videoTracks = [item.asset tracksWithMediaType:AVMediaTypeVideo];

if (videoTracks.count > 0) {
AVAssetTrack *track = videoTracks.firstObject;

CGAffineTransform transform = track.preferredTransform;
transform = track.preferredTransform;

// Return the video if it is upside down
if (transform.b == 1 && transform.c == -1) {
Expand All @@ -235,10 +257,10 @@ - (void)setupVideoOutputToItem:(AVPlayerItem *)item {
transform = CGAffineTransformRotate(transform, M_PI_2);
}
}

[renderer setPreferredCIImageTransform:transform];
}
}
_rendererTransform = transform;
_rendererWasSetup = NO;
}
}

Expand Down

0 comments on commit e3fc720

Please sign in to comment.