Skip to content

[video_player] foundation - reduce seek accuracy to fix seek to end bug #3784

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 20 commits into from
May 11, 2023

Conversation

tarrinneal
Copy link
Contributor

@tarrinneal tarrinneal commented Apr 20, 2023

Reduces avplayer seek accuracy when seeking to end of video to fix seekToTime never running completion handler.

fixes flutter/flutter#124475

Pre-launch Checklist

  • I read the Contributor Guide and followed the process outlined there for submitting PRs.
  • I read the Tree Hygiene wiki page, which explains my responsibilities.
  • I read and followed the relevant style guides and ran the auto-formatter. (Unlike the flutter/flutter repo, the flutter/packages repo does use dart format.)
  • I signed the CLA.
  • The title of the PR starts with the name of the package surrounded by square brackets, e.g. [shared_preferences]
  • I listed at least one issue that this PR fixes in the description above.
  • I updated pubspec.yaml with an appropriate new version according to the pub versioning philosophy, or this PR is exempt from version changes.
  • I updated CHANGELOG.md to add a description of the change, following repository CHANGELOG style.
  • I updated/added relevant documentation (doc comments with ///).
  • I added new tests to check the change I am making, or this PR is test-exempt.
  • All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel on Discord.

@tarrinneal tarrinneal marked this pull request as ready for review April 21, 2023 00:25
@tarrinneal tarrinneal changed the title [video_player] foundation - remove seek accuracy to fix seek to end bug [video_player] foundation - reduce seek accuracy to fix seek to end bug Apr 21, 2023
@flutter-dashboard
Copy link

It looks like this pull request may not have tests. Please make sure to add tests before merging. If you need an exemption to this rule, contact Hixie on the #hackers channel in Chat (don't just cc him here, he won't see it! He's on Discord!).

If you are not sure if you need tests, consider this rule of thumb: the purpose of a test is to make sure someone doesn't accidentally revert the fix. Ask yourself, is there anything in your PR that you feel it is important we not accidentally revert back to how it was before your fix?

Reviewers: Read the Tree Hygiene page and make sure this patch meets those guidelines before LGTMing.

@tarrinneal
Copy link
Contributor Author

Having a hard time writing tests that fail with the old code...

@tarrinneal tarrinneal force-pushed the video-player-seekToEnd-bug branch from b6c7651 to 041dcb3 Compare April 24, 2023 16:27
// Without adding tolerance when seeking to duration,
// seekToTime will never complete, and this call will hang.
// see issue https://github.com/flutter/flutter/issues/124475.
CMTime tolerance = location == duration ? CMTimeMake(1, 1000) : kCMTimeZero;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you write a unit test (XCTest) for this behavior?

Copy link
Contributor

@stuartmorgan-g stuartmorgan-g Apr 25, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have no idea what I didn't think of that when @tarrinneal and I were talking about testing for this 🤦🏻

It looks like we don't currently have a way to mock out the underlying AVPlayer, which significantly reduces testability. I would suggest wrapping the current call to [AVPlayer playerWithPlayerItem:] in a factory object, and do DI of that factory. So you'd make a test-only header that declared:

  • A protocol for the AVPlayer instance factory (which it looks like would just be a single method)
  • A new init that takes an instance of the factory protocol.

The, similar to the other DI you did recently, you'd have a private implementation of that protocol that's the default version, just wrapping [AVPlayer playerWithPlayerItem:], but tests could replace it with something vending mock AVPlayer instances where you could validate the tolerance parameter.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can also try stubbing the constructor directly if it's easier:

id mockPlayer = OCMClassMock([AVPlayer class]);
OCMStub([AVPlayer playerWithPlayerItem:OCMOCM_ANY]).andReturn(mockPlayer);

Copy link
Contributor

@stuartmorgan-g stuartmorgan-g Apr 26, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please don't. OCMock class mocking is giant foot-gun; it's incredibly easy to accidentally leak mocking across tests.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

gotcha. i did that a few times for camera plugin iirc. i should clean that up sometime.

@tarrinneal
Copy link
Contributor Author

@stuartmorgan Tests are written, I'm certain the objc code can be better. So I'd love to get some thorough feedback, if you have time.

@tarrinneal tarrinneal requested a review from stuartmorgan-g May 10, 2023 08:12
Copy link
Contributor

@stuartmorgan-g stuartmorgan-g left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM with nits

Copy link
Contributor

@stuartmorgan-g stuartmorgan-g left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@tarrinneal tarrinneal added the autosubmit Merge PR when tree becomes green via auto submit App label May 11, 2023
@auto-submit
Copy link
Contributor

auto-submit bot commented May 11, 2023

auto label is removed for flutter/packages, pr: 3784, due to - The status or check suite repo_checks has failed. Please fix the issues identified (or deflake) before re-applying this label.

@auto-submit auto-submit bot removed the autosubmit Merge PR when tree becomes green via auto submit App label May 11, 2023
@tarrinneal tarrinneal added the autosubmit Merge PR when tree becomes green via auto submit App label May 11, 2023
@auto-submit auto-submit bot merged commit 2323aa4 into flutter:main May 11, 2023
engine-flutter-autoroll added a commit to engine-flutter-autoroll/flutter that referenced this pull request May 15, 2023
engine-flutter-autoroll added a commit to engine-flutter-autoroll/flutter that referenced this pull request May 15, 2023
engine-flutter-autoroll added a commit to engine-flutter-autoroll/flutter that referenced this pull request May 15, 2023
auto-submit bot pushed a commit to flutter/flutter that referenced this pull request May 15, 2023
flutter/packages@6328cfb...6608b60

2023-05-15 stuartmorgan@google.com [ci] Remove unnecessary Linux libraries (flutter/packages#3975)
2023-05-15 stuartmorgan@google.com [ci] Enforce a minimum Kotlin version in examples (flutter/packages#3979)
2023-05-15 stuartmorgan@google.com [ci] Disable Windows repo tool tests (flutter/packages#3980)
2023-05-12 stuartmorgan@google.com [ci] Add LUCI repo tool tests (flutter/packages#3964)
2023-05-12 reidbaker@google.com [url_launcher] Set broadcast reciever visability as required by target api 34 (flutter/packages#3973)
2023-05-12 reidbaker@google.com Update build.gradle with a comment explaining version (flutter/packages#3972)
2023-05-12 engine-flutter-autoroll@skia.org Roll Flutter from 8c5a1ea to a76dbe4 (12 revisions) (flutter/packages#3958)
2023-05-12 stuartmorgan@google.com [image_picker] Fix Android lints (flutter/packages#3887)
2023-05-12 stuartmorgan@google.com [various] Update minimum Flutter version to 3.3 (flutter/packages#3967)
2023-05-12 stuartmorgan@google.com [tool] Target specific Android unit tests (flutter/packages#3955)
2023-05-12 34871572+gmackall@users.noreply.github.com [camerax] Add a dependency on kotlin-bom to align versions of kotlin-stdlib (flutter/packages#3960)
2023-05-12 stuartmorgan@google.com [local_auth] Improve iOS test DI (flutter/packages#3959)
2023-05-12 stuartmorgan@google.com [ci] Ensure scripts fail if a command fails (flutter/packages#3963)
2023-05-11 stuartmorgan@google.com [ci] Pin the Flutter version for `release` (flutter/packages#3965)
2023-05-11 tarrinneal@gmail.com [video_player] foundation - reduce seek accuracy to fix seek to end bug (flutter/packages#3784)
2023-05-11 stuartmorgan@google.com [image_picker] Fix use_build_context_synchronously violations (flutter/packages#3969)
2023-05-11 stuartmorgan@google.com [tool] Ensure that publish credential path is available (flutter/packages#3970)
2023-05-11 63286031+ahmednfwela@users.noreply.github.com [go_router] change `fix_data.yaml` uris to be absolute to fix lints (flutter/packages#3877)
2023-05-11 stuartmorgan@google.com [tool] Use new pub cache location for publish (flutter/packages#3962)
2023-05-10 engine-flutter-autoroll@skia.org Roll Flutter (stable) from f72efea to 84a1e90 (1920 revisions) (flutter/packages#3961)
2023-05-10 andrelvsousa@gmail.com [image_picker_android] Improved Bitmap resize on Android (flutter/packages#3423)
2023-05-10 43054281+camsim99@users.noreply.github.com [camerax] Add Kotlin duplicate classes known error to README.md (flutter/packages#3957)

If this roll has caused a breakage, revert this CL and stop the roller
using the controls here:
https://autoroll.skia.org/r/flutter-packages-flutter-autoroll
Please CC flutter-ecosystem@google.com,rmistry@google.com on the revert to ensure that a human
is aware of the problem.

To file a bug in Flutter: https://github.com/flutter/flutter/issues/new/choose

To report a problem with the AutoRoller itself, please file a bug:
https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug

Documentation for the AutoRoller is here:
https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
CaseyHillers pushed a commit to CaseyHillers/flutter that referenced this pull request May 24, 2023
flutter/packages@6328cfb...6608b60

2023-05-15 stuartmorgan@google.com [ci] Remove unnecessary Linux libraries (flutter/packages#3975)
2023-05-15 stuartmorgan@google.com [ci] Enforce a minimum Kotlin version in examples (flutter/packages#3979)
2023-05-15 stuartmorgan@google.com [ci] Disable Windows repo tool tests (flutter/packages#3980)
2023-05-12 stuartmorgan@google.com [ci] Add LUCI repo tool tests (flutter/packages#3964)
2023-05-12 reidbaker@google.com [url_launcher] Set broadcast reciever visability as required by target api 34 (flutter/packages#3973)
2023-05-12 reidbaker@google.com Update build.gradle with a comment explaining version (flutter/packages#3972)
2023-05-12 engine-flutter-autoroll@skia.org Roll Flutter from 8c5a1ea to a76dbe4 (12 revisions) (flutter/packages#3958)
2023-05-12 stuartmorgan@google.com [image_picker] Fix Android lints (flutter/packages#3887)
2023-05-12 stuartmorgan@google.com [various] Update minimum Flutter version to 3.3 (flutter/packages#3967)
2023-05-12 stuartmorgan@google.com [tool] Target specific Android unit tests (flutter/packages#3955)
2023-05-12 34871572+gmackall@users.noreply.github.com [camerax] Add a dependency on kotlin-bom to align versions of kotlin-stdlib (flutter/packages#3960)
2023-05-12 stuartmorgan@google.com [local_auth] Improve iOS test DI (flutter/packages#3959)
2023-05-12 stuartmorgan@google.com [ci] Ensure scripts fail if a command fails (flutter/packages#3963)
2023-05-11 stuartmorgan@google.com [ci] Pin the Flutter version for `release` (flutter/packages#3965)
2023-05-11 tarrinneal@gmail.com [video_player] foundation - reduce seek accuracy to fix seek to end bug (flutter/packages#3784)
2023-05-11 stuartmorgan@google.com [image_picker] Fix use_build_context_synchronously violations (flutter/packages#3969)
2023-05-11 stuartmorgan@google.com [tool] Ensure that publish credential path is available (flutter/packages#3970)
2023-05-11 63286031+ahmednfwela@users.noreply.github.com [go_router] change `fix_data.yaml` uris to be absolute to fix lints (flutter/packages#3877)
2023-05-11 stuartmorgan@google.com [tool] Use new pub cache location for publish (flutter/packages#3962)
2023-05-10 engine-flutter-autoroll@skia.org Roll Flutter (stable) from f72efea to 84a1e90 (1920 revisions) (flutter/packages#3961)
2023-05-10 andrelvsousa@gmail.com [image_picker_android] Improved Bitmap resize on Android (flutter/packages#3423)
2023-05-10 43054281+camsim99@users.noreply.github.com [camerax] Add Kotlin duplicate classes known error to README.md (flutter/packages#3957)

If this roll has caused a breakage, revert this CL and stop the roller
using the controls here:
https://autoroll.skia.org/r/flutter-packages-flutter-autoroll
Please CC flutter-ecosystem@google.com,rmistry@google.com on the revert to ensure that a human
is aware of the problem.

To file a bug in Flutter: https://github.com/flutter/flutter/issues/new/choose

To report a problem with the AutoRoller itself, please file a bug:
https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug

Documentation for the AutoRoller is here:
https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
nploi pushed a commit to nploi/packages that referenced this pull request Jul 16, 2023
…ug (flutter#3784)

Reduces avplayer seek accuracy when seeking to end of video to fix `seekToTime` never running completion handler.

fixes flutter/flutter#124475
Comment on lines +442 to +447
CMTime locationCMT = CMTimeMake(location, 1000);
CMTimeValue duration = _player.currentItem.asset.duration.value;
// Without adding tolerance when seeking to duration,
// seekToTime will never complete, and this call will hang.
// see issue https://github.com/flutter/flutter/issues/124475.
CMTime tolerance = location == duration ? CMTimeMake(1, 1000) : kCMTimeZero;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What if _player.currentItem.asset.duration.timescale is not 1000? This comparison compares just numerators of fractions.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Video https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4 from tests gives 2422 and 600 for _player.currentItem.asset.duration value and timescale.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@misos1 This is a PR that landed a year and a half ago; comments here aren't actionable. If there's a bug, please file an issue with details.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
autosubmit Merge PR when tree becomes green via auto submit App p: video_player platform-ios
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[video_player][iOS] VideoPlayerController.value.position not updating on video completion for video_player_avfoundation > 2.4.2
4 participants