From 6c5c1420ac608a8e14bd830cc04bee6eca9733db Mon Sep 17 00:00:00 2001 From: ShihChang Hsiung Date: Thu, 30 May 2019 09:32:21 -0700 Subject: [PATCH 1/7] [video_player] [iOS] Fixed a memory leak in the video player plugin. --- packages/video_player/ios/Classes/VideoPlayerPlugin.m | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/video_player/ios/Classes/VideoPlayerPlugin.m b/packages/video_player/ios/Classes/VideoPlayerPlugin.m index 4aea59f34e8b..436f4f903115 100644 --- a/packages/video_player/ios/Classes/VideoPlayerPlugin.m +++ b/packages/video_player/ios/Classes/VideoPlayerPlugin.m @@ -41,6 +41,7 @@ @interface FLTVideoPlayer : NSObject @property(nonatomic, readonly) bool isPlaying; @property(nonatomic) bool isLooping; @property(nonatomic, readonly) bool isInitialized; +@property(nonatomic, assign) id notificationObserverId; - (instancetype)initWithURL:(NSURL*)url frameUpdater:(FLTFrameUpdater*)frameUpdater; - (void)play; - (void)pause; @@ -82,14 +83,14 @@ - (void)addObservers:(AVPlayerItem*)item { options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew context:playbackBufferFullContext]; + _notificationObserverId = [[NSNotificationCenter defaultCenter] addObserverForName:AVPlayerItemDidPlayToEndTimeNotification object:[_player currentItem] queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification* note) { if (self->_isLooping) { AVPlayerItem* p = [note object]; - [p seekToTime:kCMTimeZero - completionHandler:nil]; + [p seekToTime:kCMTimeZero]; } else { if (self->_eventSink) { self->_eventSink(@{@"event" : @"completed"}); @@ -395,7 +396,7 @@ - (void)dispose { forKeyPath:@"playbackBufferFull" context:playbackBufferFullContext]; [_player replaceCurrentItemWithPlayerItem:nil]; - [[NSNotificationCenter defaultCenter] removeObserver:self]; + [[NSNotificationCenter defaultCenter] removeObserver:_notificationObserverId]; [_eventChannel setStreamHandler:nil]; } From fb7fb8284f609bc26787a7461dcab12e47054b9c Mon Sep 17 00:00:00 2001 From: ShihChang Hsiung Date: Thu, 30 May 2019 10:52:41 -0700 Subject: [PATCH 2/7] Fix format issue --- packages/video_player/ios/Classes/VideoPlayerPlugin.m | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/video_player/ios/Classes/VideoPlayerPlugin.m b/packages/video_player/ios/Classes/VideoPlayerPlugin.m index 436f4f903115..641b1371369a 100644 --- a/packages/video_player/ios/Classes/VideoPlayerPlugin.m +++ b/packages/video_player/ios/Classes/VideoPlayerPlugin.m @@ -83,8 +83,7 @@ - (void)addObservers:(AVPlayerItem*)item { options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew context:playbackBufferFullContext]; - _notificationObserverId = - [[NSNotificationCenter defaultCenter] addObserverForName:AVPlayerItemDidPlayToEndTimeNotification + _notificationObserverId = [[NSNotificationCenter defaultCenter] addObserverForName:AVPlayerItemDidPlayToEndTimeNotification object:[_player currentItem] queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification* note) { From e822967f7d2f3db0e9b6cfe540e96ea6a1847c51 Mon Sep 17 00:00:00 2001 From: ShihChang Hsiung Date: Mon, 15 Jul 2019 11:22:54 -0700 Subject: [PATCH 3/7] [video_player] [iOS] Fixed a memory leak in the video player plugin. --- .../ios/Classes/VideoPlayerPlugin.m | 42 ++++++++++++------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/packages/video_player/ios/Classes/VideoPlayerPlugin.m b/packages/video_player/ios/Classes/VideoPlayerPlugin.m index 641b1371369a..a14ddaa39e87 100644 --- a/packages/video_player/ios/Classes/VideoPlayerPlugin.m +++ b/packages/video_player/ios/Classes/VideoPlayerPlugin.m @@ -41,7 +41,6 @@ @interface FLTVideoPlayer : NSObject @property(nonatomic, readonly) bool isPlaying; @property(nonatomic) bool isLooping; @property(nonatomic, readonly) bool isInitialized; -@property(nonatomic, assign) id notificationObserverId; - (instancetype)initWithURL:(NSURL*)url frameUpdater:(FLTFrameUpdater*)frameUpdater; - (void)play; - (void)pause; @@ -83,19 +82,32 @@ - (void)addObservers:(AVPlayerItem*)item { options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew context:playbackBufferFullContext]; - _notificationObserverId = [[NSNotificationCenter defaultCenter] addObserverForName:AVPlayerItemDidPlayToEndTimeNotification - object:[_player currentItem] - queue:[NSOperationQueue mainQueue] - usingBlock:^(NSNotification* note) { - if (self->_isLooping) { - AVPlayerItem* p = [note object]; - [p seekToTime:kCMTimeZero]; - } else { - if (self->_eventSink) { - self->_eventSink(@{@"event" : @"completed"}); - } - } - }]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(itemDidPlayToEndTime:) + name:AVPlayerItemDidPlayToEndTimeNotification + object:item]; +} + +- (void)itemDidPlayToEndTime:(NSNotification*)note { + AVPlayerItem* p = [note object]; + if (self->_isLooping) { + [p seekToTime:CMTIMERANGE_IS_VALID(self->_range) ? self->_range.start : kCMTimeZero + toleranceBefore:kCMTimeZero + toleranceAfter:kCMTimeZero + completionHandler:nil]; + } else { + [self pause]; + if (self->_eventSink) { + self->_eventSink(@{ + @"event" : @"completed", + @"position" : + [NSNumber numberWithLongLong:FLTCMTimeToMillis( + CMTIMERANGE_IS_VALID(self->_range) + ? CMTimeSubtract(p.currentTime, self->_range.start) + : p.currentTime)] + }); + } + } } static inline CGFloat radiansToDegrees(CGFloat radians) { @@ -395,7 +407,7 @@ - (void)dispose { forKeyPath:@"playbackBufferFull" context:playbackBufferFullContext]; [_player replaceCurrentItemWithPlayerItem:nil]; - [[NSNotificationCenter defaultCenter] removeObserver:_notificationObserverId]; + [[NSNotificationCenter defaultCenter] removeObserver:self]; [_eventChannel setStreamHandler:nil]; } From 16bd8751a739741b82f3729c812fdf0c2717603b Mon Sep 17 00:00:00 2001 From: ShihChang Hsiung Date: Mon, 15 Jul 2019 15:48:36 -0700 Subject: [PATCH 4/7] [video_player] [iOS] Fixed a memory leak in the video player plugin. --- .../ios/Classes/VideoPlayerPlugin.m | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/packages/video_player/ios/Classes/VideoPlayerPlugin.m b/packages/video_player/ios/Classes/VideoPlayerPlugin.m index a14ddaa39e87..f0669db41d43 100644 --- a/packages/video_player/ios/Classes/VideoPlayerPlugin.m +++ b/packages/video_player/ios/Classes/VideoPlayerPlugin.m @@ -82,6 +82,7 @@ - (void)addObservers:(AVPlayerItem*)item { options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew context:playbackBufferFullContext]; + // Add an observer that will respond to itemDidPlayToEndTime [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidPlayToEndTime:) name:AVPlayerItemDidPlayToEndTimeNotification @@ -91,21 +92,11 @@ - (void)addObservers:(AVPlayerItem*)item { - (void)itemDidPlayToEndTime:(NSNotification*)note { AVPlayerItem* p = [note object]; if (self->_isLooping) { - [p seekToTime:CMTIMERANGE_IS_VALID(self->_range) ? self->_range.start : kCMTimeZero - toleranceBefore:kCMTimeZero - toleranceAfter:kCMTimeZero - completionHandler:nil]; + AVPlayerItem* p = [note object]; + [p seekToTime:kCMTimeZero completionHandler:nil]; } else { - [self pause]; if (self->_eventSink) { - self->_eventSink(@{ - @"event" : @"completed", - @"position" : - [NSNumber numberWithLongLong:FLTCMTimeToMillis( - CMTIMERANGE_IS_VALID(self->_range) - ? CMTimeSubtract(p.currentTime, self->_range.start) - : p.currentTime)] - }); + self->_eventSink(@{@"event" : @"completed"}); } } } From 704969859afeaedfdaa6b5b93ce012749321e758 Mon Sep 17 00:00:00 2001 From: ShihChang Hsiung Date: Mon, 15 Jul 2019 20:11:37 -0700 Subject: [PATCH 5/7] bump version to 0.10.1+5 --- packages/video_player/CHANGELOG.md | 4 ++++ packages/video_player/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/video_player/CHANGELOG.md b/packages/video_player/CHANGELOG.md index 46f766ace4e1..2e9f8d90ebb3 100644 --- a/packages/video_player/CHANGELOG.md +++ b/packages/video_player/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.10.1+5 + +* [iOS] Fixed a memory leak in the video player plugin. + ## 0.10.1+4 * Fixed syntax error in README.md. diff --git a/packages/video_player/pubspec.yaml b/packages/video_player/pubspec.yaml index dd5d0b5a75f5..bbb2dcda02ef 100644 --- a/packages/video_player/pubspec.yaml +++ b/packages/video_player/pubspec.yaml @@ -2,7 +2,7 @@ name: video_player description: Flutter plugin for displaying inline video with other Flutter widgets on Android and iOS. author: Flutter Team -version: 0.10.1+4 +version: 0.10.1+5 homepage: https://github.com/flutter/plugins/tree/master/packages/video_player flutter: From a9df1ae59d01bb543cc7baf0df0251e0f28f75c2 Mon Sep 17 00:00:00 2001 From: ShihChang Hsiung Date: Tue, 16 Jul 2019 11:31:28 -0700 Subject: [PATCH 6/7] Update with cyanglaz's feedback --- packages/video_player/CHANGELOG.md | 2 +- packages/video_player/ios/Classes/VideoPlayerPlugin.m | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/video_player/CHANGELOG.md b/packages/video_player/CHANGELOG.md index 2e9f8d90ebb3..d53caf441582 100644 --- a/packages/video_player/CHANGELOG.md +++ b/packages/video_player/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.10.1+5 -* [iOS] Fixed a memory leak in the video player plugin. +* [iOS] Fixed a memory leak with notification observing. ## 0.10.1+4 diff --git a/packages/video_player/ios/Classes/VideoPlayerPlugin.m b/packages/video_player/ios/Classes/VideoPlayerPlugin.m index f0669db41d43..bf449ec0e8e2 100644 --- a/packages/video_player/ios/Classes/VideoPlayerPlugin.m +++ b/packages/video_player/ios/Classes/VideoPlayerPlugin.m @@ -89,14 +89,13 @@ - (void)addObservers:(AVPlayerItem*)item { object:item]; } -- (void)itemDidPlayToEndTime:(NSNotification*)note { - AVPlayerItem* p = [note object]; - if (self->_isLooping) { - AVPlayerItem* p = [note object]; +- (void)itemDidPlayToEndTime:(NSNotification*)notification { + if (_isLooping) { + AVPlayerItem* p = [notification object]; [p seekToTime:kCMTimeZero completionHandler:nil]; } else { - if (self->_eventSink) { - self->_eventSink(@{@"event" : @"completed"}); + if (_eventSink) { + _eventSink(@{@"event" : @"completed"}); } } } From 01e04c7da96a3a5411e9cf10d1f2f46d898e0219 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Mon, 29 Jul 2019 14:29:22 -0700 Subject: [PATCH 7/7] Update pubspec.yaml --- packages/video_player/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/video_player/pubspec.yaml b/packages/video_player/pubspec.yaml index bbb2dcda02ef..218c50f64349 100644 --- a/packages/video_player/pubspec.yaml +++ b/packages/video_player/pubspec.yaml @@ -2,7 +2,7 @@ name: video_player description: Flutter plugin for displaying inline video with other Flutter widgets on Android and iOS. author: Flutter Team -version: 0.10.1+5 +version: 0.10.1+6 homepage: https://github.com/flutter/plugins/tree/master/packages/video_player flutter: