Update video_player_platform_interface to latest pigeon (#3507)

See https://github.com/flutter/plugins/pull/3281 for context.
diff --git a/packages/video_player/video_player_platform_interface/CHANGELOG.md b/packages/video_player/video_player_platform_interface/CHANGELOG.md
index 446fffd..34df336 100644
--- a/packages/video_player/video_player_platform_interface/CHANGELOG.md
+++ b/packages/video_player/video_player_platform_interface/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 4.0.0-nullsafety.0
+
+* Update to latest Pigeon.
+  This includes a breaking change to how the test logic is exposed.
+
 ## 3.0.0-nullsafety.3
 
 * `messages.dart` sets Dart `2.12`.
diff --git a/packages/video_player/video_player_platform_interface/lib/messages.dart b/packages/video_player/video_player_platform_interface/lib/messages.dart
index 252cad6..3f2d78e 100644
--- a/packages/video_player/video_player_platform_interface/lib/messages.dart
+++ b/packages/video_player/video_player_platform_interface/lib/messages.dart
@@ -1,25 +1,24 @@
-// Autogenerated from Pigeon (v0.1.12), do not edit directly.
+// Autogenerated from Pigeon (v0.1.19), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 // ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import
 // @dart = 2.12
 import 'dart:async';
-import 'package:flutter/services.dart';
 import 'dart:typed_data' show Uint8List, Int32List, Int64List, Float64List;
 
+import 'package:flutter/services.dart';
+
 class TextureMessage {
   int? textureId;
-  // ignore: unused_element
-  Map<dynamic, dynamic> _toMap() {
-    final Map<dynamic, dynamic> pigeonMap = <dynamic, dynamic>{};
+
+  Object encode() {
+    final Map<Object?, Object?> pigeonMap = <Object?, Object?>{};
     pigeonMap['textureId'] = textureId;
     return pigeonMap;
   }
 
-  // ignore: unused_element
-  static TextureMessage _fromMap(Map<dynamic, dynamic> pigeonMap) {
-    final TextureMessage result = TextureMessage();
-    result.textureId = pigeonMap['textureId'];
-    return result;
+  static TextureMessage decode(Object message) {
+    final Map<Object?, Object?> pigeonMap = message as Map<Object?, Object?>;
+    return TextureMessage()..textureId = pigeonMap['textureId'] as int;
   }
 }
 
@@ -28,9 +27,9 @@
   String? uri;
   String? packageName;
   String? formatHint;
-  // ignore: unused_element
-  Map<dynamic, dynamic> _toMap() {
-    final Map<dynamic, dynamic> pigeonMap = <dynamic, dynamic>{};
+
+  Object encode() {
+    final Map<Object?, Object?> pigeonMap = <Object?, Object?>{};
     pigeonMap['asset'] = asset;
     pigeonMap['uri'] = uri;
     pigeonMap['packageName'] = packageName;
@@ -38,540 +37,382 @@
     return pigeonMap;
   }
 
-  // ignore: unused_element
-  static CreateMessage _fromMap(Map<dynamic, dynamic> pigeonMap) {
-    final CreateMessage result = CreateMessage();
-    result.asset = pigeonMap['asset'];
-    result.uri = pigeonMap['uri'];
-    result.packageName = pigeonMap['packageName'];
-    result.formatHint = pigeonMap['formatHint'];
-    return result;
+  static CreateMessage decode(Object message) {
+    final Map<Object?, Object?> pigeonMap = message as Map<Object?, Object?>;
+    return CreateMessage()
+      ..asset = pigeonMap['asset'] as String
+      ..uri = pigeonMap['uri'] as String
+      ..packageName = pigeonMap['packageName'] as String
+      ..formatHint = pigeonMap['formatHint'] as String;
   }
 }
 
 class LoopingMessage {
   int? textureId;
   bool? isLooping;
-  // ignore: unused_element
-  Map<dynamic, dynamic> _toMap() {
-    final Map<dynamic, dynamic> pigeonMap = <dynamic, dynamic>{};
+
+  Object encode() {
+    final Map<Object?, Object?> pigeonMap = <Object?, Object?>{};
     pigeonMap['textureId'] = textureId;
     pigeonMap['isLooping'] = isLooping;
     return pigeonMap;
   }
 
-  // ignore: unused_element
-  static LoopingMessage _fromMap(Map<dynamic, dynamic> pigeonMap) {
-    final LoopingMessage result = LoopingMessage();
-    result.textureId = pigeonMap['textureId'];
-    result.isLooping = pigeonMap['isLooping'];
-    return result;
+  static LoopingMessage decode(Object message) {
+    final Map<Object?, Object?> pigeonMap = message as Map<Object?, Object?>;
+    return LoopingMessage()
+      ..textureId = pigeonMap['textureId'] as int
+      ..isLooping = pigeonMap['isLooping'] as bool;
   }
 }
 
 class VolumeMessage {
   int? textureId;
   double? volume;
-  // ignore: unused_element
-  Map<dynamic, dynamic> _toMap() {
-    final Map<dynamic, dynamic> pigeonMap = <dynamic, dynamic>{};
+
+  Object encode() {
+    final Map<Object?, Object?> pigeonMap = <Object?, Object?>{};
     pigeonMap['textureId'] = textureId;
     pigeonMap['volume'] = volume;
     return pigeonMap;
   }
 
-  // ignore: unused_element
-  static VolumeMessage _fromMap(Map<dynamic, dynamic> pigeonMap) {
-    final VolumeMessage result = VolumeMessage();
-    result.textureId = pigeonMap['textureId'];
-    result.volume = pigeonMap['volume'];
-    return result;
+  static VolumeMessage decode(Object message) {
+    final Map<Object?, Object?> pigeonMap = message as Map<Object?, Object?>;
+    return VolumeMessage()
+      ..textureId = pigeonMap['textureId'] as int
+      ..volume = pigeonMap['volume'] as double;
   }
 }
 
 class PlaybackSpeedMessage {
   int? textureId;
   double? speed;
-  // ignore: unused_element
-  Map<dynamic, dynamic> _toMap() {
-    final Map<dynamic, dynamic> pigeonMap = <dynamic, dynamic>{};
+
+  Object encode() {
+    final Map<Object?, Object?> pigeonMap = <Object?, Object?>{};
     pigeonMap['textureId'] = textureId;
     pigeonMap['speed'] = speed;
     return pigeonMap;
   }
 
-  // ignore: unused_element
-  static PlaybackSpeedMessage _fromMap(Map<dynamic, dynamic> pigeonMap) {
-    final PlaybackSpeedMessage result = PlaybackSpeedMessage();
-    result.textureId = pigeonMap['textureId'];
-    result.speed = pigeonMap['speed'];
-    return result;
+  static PlaybackSpeedMessage decode(Object message) {
+    final Map<Object?, Object?> pigeonMap = message as Map<Object?, Object?>;
+    return PlaybackSpeedMessage()
+      ..textureId = pigeonMap['textureId'] as int
+      ..speed = pigeonMap['speed'] as double;
   }
 }
 
 class PositionMessage {
   int? textureId;
   int? position;
-  // ignore: unused_element
-  Map<dynamic, dynamic> _toMap() {
-    final Map<dynamic, dynamic> pigeonMap = <dynamic, dynamic>{};
+
+  Object encode() {
+    final Map<Object?, Object?> pigeonMap = <Object?, Object?>{};
     pigeonMap['textureId'] = textureId;
     pigeonMap['position'] = position;
     return pigeonMap;
   }
 
-  // ignore: unused_element
-  static PositionMessage _fromMap(Map<dynamic, dynamic> pigeonMap) {
-    final PositionMessage result = PositionMessage();
-    result.textureId = pigeonMap['textureId'];
-    result.position = pigeonMap['position'];
-    return result;
+  static PositionMessage decode(Object message) {
+    final Map<Object?, Object?> pigeonMap = message as Map<Object?, Object?>;
+    return PositionMessage()
+      ..textureId = pigeonMap['textureId'] as int
+      ..position = pigeonMap['position'] as int;
   }
 }
 
 class MixWithOthersMessage {
   bool? mixWithOthers;
-  // ignore: unused_element
-  Map<dynamic, dynamic> _toMap() {
-    final Map<dynamic, dynamic> pigeonMap = <dynamic, dynamic>{};
+
+  Object encode() {
+    final Map<Object?, Object?> pigeonMap = <Object?, Object?>{};
     pigeonMap['mixWithOthers'] = mixWithOthers;
     return pigeonMap;
   }
 
-  // ignore: unused_element
-  static MixWithOthersMessage _fromMap(Map<dynamic, dynamic> pigeonMap) {
-    final MixWithOthersMessage result = MixWithOthersMessage();
-    result.mixWithOthers = pigeonMap['mixWithOthers'];
-    return result;
+  static MixWithOthersMessage decode(Object message) {
+    final Map<Object?, Object?> pigeonMap = message as Map<Object?, Object?>;
+    return MixWithOthersMessage()
+      ..mixWithOthers = pigeonMap['mixWithOthers'] as bool;
   }
 }
 
 class VideoPlayerApi {
   Future<void> initialize() async {
-    const BasicMessageChannel<dynamic> channel = BasicMessageChannel<dynamic>(
+    const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
         'dev.flutter.pigeon.VideoPlayerApi.initialize', StandardMessageCodec());
-
-    final Map<dynamic, dynamic>? replyMap = await channel.send(null);
+    final Map<Object?, Object?>? replyMap =
+        await channel.send(null) as Map<Object?, Object?>?;
     if (replyMap == null) {
       throw PlatformException(
-          code: 'channel-error',
-          message: 'Unable to establish connection on channel.',
-          details: null);
+        code: 'channel-error',
+        message: 'Unable to establish connection on channel.',
+        details: null,
+      );
     } else if (replyMap['error'] != null) {
-      final Map<dynamic, dynamic> error = replyMap['error'];
+      final Map<Object?, Object?> error =
+          replyMap['error'] as Map<Object?, Object?>;
       throw PlatformException(
-          code: error['code'],
-          message: error['message'],
-          details: error['details']);
+        code: error['code'] as String,
+        message: error['message'] as String?,
+        details: error['details'],
+      );
     } else {
       // noop
     }
   }
 
   Future<TextureMessage> create(CreateMessage arg) async {
-    final Map<dynamic, dynamic> requestMap = arg._toMap();
-    const BasicMessageChannel<dynamic> channel = BasicMessageChannel<dynamic>(
+    final Object encoded = arg.encode();
+    const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
         'dev.flutter.pigeon.VideoPlayerApi.create', StandardMessageCodec());
-
-    final Map<dynamic, dynamic>? replyMap = await channel.send(requestMap);
+    final Map<Object?, Object?>? replyMap =
+        await channel.send(encoded) as Map<Object?, Object?>?;
     if (replyMap == null) {
       throw PlatformException(
-          code: 'channel-error',
-          message: 'Unable to establish connection on channel.',
-          details: null);
+        code: 'channel-error',
+        message: 'Unable to establish connection on channel.',
+        details: null,
+      );
     } else if (replyMap['error'] != null) {
-      final Map<dynamic, dynamic> error = replyMap['error'];
+      final Map<Object?, Object?> error =
+          replyMap['error'] as Map<Object?, Object?>;
       throw PlatformException(
-          code: error['code'],
-          message: error['message'],
-          details: error['details']);
+        code: error['code'] as String,
+        message: error['message'] as String?,
+        details: error['details'],
+      );
     } else {
-      return TextureMessage._fromMap(replyMap['result']);
+      return TextureMessage.decode(replyMap['result']!);
     }
   }
 
   Future<void> dispose(TextureMessage arg) async {
-    final Map<dynamic, dynamic> requestMap = arg._toMap();
-    const BasicMessageChannel<dynamic> channel = BasicMessageChannel<dynamic>(
+    final Object encoded = arg.encode();
+    const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
         'dev.flutter.pigeon.VideoPlayerApi.dispose', StandardMessageCodec());
-
-    final Map<dynamic, dynamic>? replyMap = await channel.send(requestMap);
+    final Map<Object?, Object?>? replyMap =
+        await channel.send(encoded) as Map<Object?, Object?>?;
     if (replyMap == null) {
       throw PlatformException(
-          code: 'channel-error',
-          message: 'Unable to establish connection on channel.',
-          details: null);
+        code: 'channel-error',
+        message: 'Unable to establish connection on channel.',
+        details: null,
+      );
     } else if (replyMap['error'] != null) {
-      final Map<dynamic, dynamic> error = replyMap['error'];
+      final Map<Object?, Object?> error =
+          replyMap['error'] as Map<Object?, Object?>;
       throw PlatformException(
-          code: error['code'],
-          message: error['message'],
-          details: error['details']);
+        code: error['code'] as String,
+        message: error['message'] as String?,
+        details: error['details'],
+      );
     } else {
       // noop
     }
   }
 
   Future<void> setLooping(LoopingMessage arg) async {
-    final Map<dynamic, dynamic> requestMap = arg._toMap();
-    const BasicMessageChannel<dynamic> channel = BasicMessageChannel<dynamic>(
+    final Object encoded = arg.encode();
+    const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
         'dev.flutter.pigeon.VideoPlayerApi.setLooping', StandardMessageCodec());
-
-    final Map<dynamic, dynamic>? replyMap = await channel.send(requestMap);
+    final Map<Object?, Object?>? replyMap =
+        await channel.send(encoded) as Map<Object?, Object?>?;
     if (replyMap == null) {
       throw PlatformException(
-          code: 'channel-error',
-          message: 'Unable to establish connection on channel.',
-          details: null);
+        code: 'channel-error',
+        message: 'Unable to establish connection on channel.',
+        details: null,
+      );
     } else if (replyMap['error'] != null) {
-      final Map<dynamic, dynamic> error = replyMap['error'];
+      final Map<Object?, Object?> error =
+          replyMap['error'] as Map<Object?, Object?>;
       throw PlatformException(
-          code: error['code'],
-          message: error['message'],
-          details: error['details']);
+        code: error['code'] as String,
+        message: error['message'] as String?,
+        details: error['details'],
+      );
     } else {
       // noop
     }
   }
 
   Future<void> setVolume(VolumeMessage arg) async {
-    final Map<dynamic, dynamic> requestMap = arg._toMap();
-    const BasicMessageChannel<dynamic> channel = BasicMessageChannel<dynamic>(
+    final Object encoded = arg.encode();
+    const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
         'dev.flutter.pigeon.VideoPlayerApi.setVolume', StandardMessageCodec());
-
-    final Map<dynamic, dynamic>? replyMap = await channel.send(requestMap);
+    final Map<Object?, Object?>? replyMap =
+        await channel.send(encoded) as Map<Object?, Object?>?;
     if (replyMap == null) {
       throw PlatformException(
-          code: 'channel-error',
-          message: 'Unable to establish connection on channel.',
-          details: null);
+        code: 'channel-error',
+        message: 'Unable to establish connection on channel.',
+        details: null,
+      );
     } else if (replyMap['error'] != null) {
-      final Map<dynamic, dynamic> error = replyMap['error'];
+      final Map<Object?, Object?> error =
+          replyMap['error'] as Map<Object?, Object?>;
       throw PlatformException(
-          code: error['code'],
-          message: error['message'],
-          details: error['details']);
+        code: error['code'] as String,
+        message: error['message'] as String?,
+        details: error['details'],
+      );
     } else {
       // noop
     }
   }
 
   Future<void> setPlaybackSpeed(PlaybackSpeedMessage arg) async {
-    final Map<dynamic, dynamic> requestMap = arg._toMap();
-    const BasicMessageChannel<dynamic> channel = BasicMessageChannel<dynamic>(
+    final Object encoded = arg.encode();
+    const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
         'dev.flutter.pigeon.VideoPlayerApi.setPlaybackSpeed',
         StandardMessageCodec());
-
-    final Map<dynamic, dynamic>? replyMap = await channel.send(requestMap);
+    final Map<Object?, Object?>? replyMap =
+        await channel.send(encoded) as Map<Object?, Object?>?;
     if (replyMap == null) {
       throw PlatformException(
-          code: 'channel-error',
-          message: 'Unable to establish connection on channel.',
-          details: null);
+        code: 'channel-error',
+        message: 'Unable to establish connection on channel.',
+        details: null,
+      );
     } else if (replyMap['error'] != null) {
-      final Map<dynamic, dynamic> error = replyMap['error'];
+      final Map<Object?, Object?> error =
+          replyMap['error'] as Map<Object?, Object?>;
       throw PlatformException(
-          code: error['code'],
-          message: error['message'],
-          details: error['details']);
+        code: error['code'] as String,
+        message: error['message'] as String?,
+        details: error['details'],
+      );
     } else {
       // noop
     }
   }
 
   Future<void> play(TextureMessage arg) async {
-    final Map<dynamic, dynamic> requestMap = arg._toMap();
-    const BasicMessageChannel<dynamic> channel = BasicMessageChannel<dynamic>(
+    final Object encoded = arg.encode();
+    const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
         'dev.flutter.pigeon.VideoPlayerApi.play', StandardMessageCodec());
-
-    final Map<dynamic, dynamic>? replyMap = await channel.send(requestMap);
+    final Map<Object?, Object?>? replyMap =
+        await channel.send(encoded) as Map<Object?, Object?>?;
     if (replyMap == null) {
       throw PlatformException(
-          code: 'channel-error',
-          message: 'Unable to establish connection on channel.',
-          details: null);
+        code: 'channel-error',
+        message: 'Unable to establish connection on channel.',
+        details: null,
+      );
     } else if (replyMap['error'] != null) {
-      final Map<dynamic, dynamic> error = replyMap['error'];
+      final Map<Object?, Object?> error =
+          replyMap['error'] as Map<Object?, Object?>;
       throw PlatformException(
-          code: error['code'],
-          message: error['message'],
-          details: error['details']);
+        code: error['code'] as String,
+        message: error['message'] as String?,
+        details: error['details'],
+      );
     } else {
       // noop
     }
   }
 
   Future<PositionMessage> position(TextureMessage arg) async {
-    final Map<dynamic, dynamic> requestMap = arg._toMap();
-    const BasicMessageChannel<dynamic> channel = BasicMessageChannel<dynamic>(
+    final Object encoded = arg.encode();
+    const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
         'dev.flutter.pigeon.VideoPlayerApi.position', StandardMessageCodec());
-
-    final Map<dynamic, dynamic>? replyMap = await channel.send(requestMap);
+    final Map<Object?, Object?>? replyMap =
+        await channel.send(encoded) as Map<Object?, Object?>?;
     if (replyMap == null) {
       throw PlatformException(
-          code: 'channel-error',
-          message: 'Unable to establish connection on channel.',
-          details: null);
+        code: 'channel-error',
+        message: 'Unable to establish connection on channel.',
+        details: null,
+      );
     } else if (replyMap['error'] != null) {
-      final Map<dynamic, dynamic> error = replyMap['error'];
+      final Map<Object?, Object?> error =
+          replyMap['error'] as Map<Object?, Object?>;
       throw PlatformException(
-          code: error['code'],
-          message: error['message'],
-          details: error['details']);
+        code: error['code'] as String,
+        message: error['message'] as String?,
+        details: error['details'],
+      );
     } else {
-      return PositionMessage._fromMap(replyMap['result']);
+      return PositionMessage.decode(replyMap['result']!);
     }
   }
 
   Future<void> seekTo(PositionMessage arg) async {
-    final Map<dynamic, dynamic> requestMap = arg._toMap();
-    const BasicMessageChannel<dynamic> channel = BasicMessageChannel<dynamic>(
+    final Object encoded = arg.encode();
+    const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
         'dev.flutter.pigeon.VideoPlayerApi.seekTo', StandardMessageCodec());
-
-    final Map<dynamic, dynamic>? replyMap = await channel.send(requestMap);
+    final Map<Object?, Object?>? replyMap =
+        await channel.send(encoded) as Map<Object?, Object?>?;
     if (replyMap == null) {
       throw PlatformException(
-          code: 'channel-error',
-          message: 'Unable to establish connection on channel.',
-          details: null);
+        code: 'channel-error',
+        message: 'Unable to establish connection on channel.',
+        details: null,
+      );
     } else if (replyMap['error'] != null) {
-      final Map<dynamic, dynamic> error = replyMap['error'];
+      final Map<Object?, Object?> error =
+          replyMap['error'] as Map<Object?, Object?>;
       throw PlatformException(
-          code: error['code'],
-          message: error['message'],
-          details: error['details']);
+        code: error['code'] as String,
+        message: error['message'] as String?,
+        details: error['details'],
+      );
     } else {
       // noop
     }
   }
 
   Future<void> pause(TextureMessage arg) async {
-    final Map<dynamic, dynamic> requestMap = arg._toMap();
-    const BasicMessageChannel<dynamic> channel = BasicMessageChannel<dynamic>(
+    final Object encoded = arg.encode();
+    const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
         'dev.flutter.pigeon.VideoPlayerApi.pause', StandardMessageCodec());
-
-    final Map<dynamic, dynamic>? replyMap = await channel.send(requestMap);
+    final Map<Object?, Object?>? replyMap =
+        await channel.send(encoded) as Map<Object?, Object?>?;
     if (replyMap == null) {
       throw PlatformException(
-          code: 'channel-error',
-          message: 'Unable to establish connection on channel.',
-          details: null);
+        code: 'channel-error',
+        message: 'Unable to establish connection on channel.',
+        details: null,
+      );
     } else if (replyMap['error'] != null) {
-      final Map<dynamic, dynamic> error = replyMap['error'];
+      final Map<Object?, Object?> error =
+          replyMap['error'] as Map<Object?, Object?>;
       throw PlatformException(
-          code: error['code'],
-          message: error['message'],
-          details: error['details']);
+        code: error['code'] as String,
+        message: error['message'] as String?,
+        details: error['details'],
+      );
     } else {
       // noop
     }
   }
 
   Future<void> setMixWithOthers(MixWithOthersMessage arg) async {
-    final Map<dynamic, dynamic> requestMap = arg._toMap();
-    const BasicMessageChannel<dynamic> channel = BasicMessageChannel<dynamic>(
+    final Object encoded = arg.encode();
+    const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
         'dev.flutter.pigeon.VideoPlayerApi.setMixWithOthers',
         StandardMessageCodec());
-
-    final Map<dynamic, dynamic>? replyMap = await channel.send(requestMap);
+    final Map<Object?, Object?>? replyMap =
+        await channel.send(encoded) as Map<Object?, Object?>?;
     if (replyMap == null) {
       throw PlatformException(
-          code: 'channel-error',
-          message: 'Unable to establish connection on channel.',
-          details: null);
+        code: 'channel-error',
+        message: 'Unable to establish connection on channel.',
+        details: null,
+      );
     } else if (replyMap['error'] != null) {
-      final Map<dynamic, dynamic> error = replyMap['error'];
+      final Map<Object?, Object?> error =
+          replyMap['error'] as Map<Object?, Object?>;
       throw PlatformException(
-          code: error['code'],
-          message: error['message'],
-          details: error['details']);
+        code: error['code'] as String,
+        message: error['message'] as String?,
+        details: error['details'],
+      );
     } else {
       // noop
     }
   }
 }
-
-abstract class TestHostVideoPlayerApi {
-  void initialize();
-  TextureMessage create(CreateMessage arg);
-  void dispose(TextureMessage arg);
-  void setLooping(LoopingMessage arg);
-  void setVolume(VolumeMessage arg);
-  void setPlaybackSpeed(PlaybackSpeedMessage arg);
-  void play(TextureMessage arg);
-  PositionMessage position(TextureMessage arg);
-  void seekTo(PositionMessage arg);
-  void pause(TextureMessage arg);
-  void setMixWithOthers(MixWithOthersMessage arg);
-  static void setup(TestHostVideoPlayerApi? api) {
-    {
-      const BasicMessageChannel<dynamic> channel = BasicMessageChannel<dynamic>(
-          'dev.flutter.pigeon.VideoPlayerApi.initialize',
-          StandardMessageCodec());
-      if (api == null) {
-        channel.setMockMessageHandler(null);
-      } else {
-        channel.setMockMessageHandler((dynamic message) async {
-          api.initialize();
-          return <dynamic, dynamic>{};
-        });
-      }
-    }
-    {
-      const BasicMessageChannel<dynamic> channel = BasicMessageChannel<dynamic>(
-          'dev.flutter.pigeon.VideoPlayerApi.create', StandardMessageCodec());
-      if (api == null) {
-        channel.setMockMessageHandler(null);
-      } else {
-        channel.setMockMessageHandler((dynamic message) async {
-          final Map<dynamic, dynamic> mapMessage =
-              message as Map<dynamic, dynamic>;
-          final CreateMessage input = CreateMessage._fromMap(mapMessage);
-          final TextureMessage output = api.create(input);
-          return <dynamic, dynamic>{'result': output._toMap()};
-        });
-      }
-    }
-    {
-      const BasicMessageChannel<dynamic> channel = BasicMessageChannel<dynamic>(
-          'dev.flutter.pigeon.VideoPlayerApi.dispose', StandardMessageCodec());
-      if (api == null) {
-        channel.setMockMessageHandler(null);
-      } else {
-        channel.setMockMessageHandler((dynamic message) async {
-          final Map<dynamic, dynamic> mapMessage =
-              message as Map<dynamic, dynamic>;
-          final TextureMessage input = TextureMessage._fromMap(mapMessage);
-          api.dispose(input);
-          return <dynamic, dynamic>{};
-        });
-      }
-    }
-    {
-      const BasicMessageChannel<dynamic> channel = BasicMessageChannel<dynamic>(
-          'dev.flutter.pigeon.VideoPlayerApi.setLooping',
-          StandardMessageCodec());
-      if (api == null) {
-        channel.setMockMessageHandler(null);
-      } else {
-        channel.setMockMessageHandler((dynamic message) async {
-          final Map<dynamic, dynamic> mapMessage =
-              message as Map<dynamic, dynamic>;
-          final LoopingMessage input = LoopingMessage._fromMap(mapMessage);
-          api.setLooping(input);
-          return <dynamic, dynamic>{};
-        });
-      }
-    }
-    {
-      const BasicMessageChannel<dynamic> channel = BasicMessageChannel<dynamic>(
-          'dev.flutter.pigeon.VideoPlayerApi.setVolume',
-          StandardMessageCodec());
-      if (api == null) {
-        channel.setMockMessageHandler(null);
-      } else {
-        channel.setMockMessageHandler((dynamic message) async {
-          final Map<dynamic, dynamic> mapMessage =
-              message as Map<dynamic, dynamic>;
-          final VolumeMessage input = VolumeMessage._fromMap(mapMessage);
-          api.setVolume(input);
-          return <dynamic, dynamic>{};
-        });
-      }
-    }
-    {
-      const BasicMessageChannel<dynamic> channel = BasicMessageChannel<dynamic>(
-          'dev.flutter.pigeon.VideoPlayerApi.setPlaybackSpeed',
-          StandardMessageCodec());
-      if (api == null) {
-        channel.setMockMessageHandler(null);
-      } else {
-        channel.setMockMessageHandler((dynamic message) async {
-          final Map<dynamic, dynamic> mapMessage =
-              message as Map<dynamic, dynamic>;
-          final PlaybackSpeedMessage input =
-              PlaybackSpeedMessage._fromMap(mapMessage);
-          api.setPlaybackSpeed(input);
-          return <dynamic, dynamic>{};
-        });
-      }
-    }
-    {
-      const BasicMessageChannel<dynamic> channel = BasicMessageChannel<dynamic>(
-          'dev.flutter.pigeon.VideoPlayerApi.play', StandardMessageCodec());
-      if (api == null) {
-        channel.setMockMessageHandler(null);
-      } else {
-        channel.setMockMessageHandler((dynamic message) async {
-          final Map<dynamic, dynamic> mapMessage =
-              message as Map<dynamic, dynamic>;
-          final TextureMessage input = TextureMessage._fromMap(mapMessage);
-          api.play(input);
-          return <dynamic, dynamic>{};
-        });
-      }
-    }
-    {
-      const BasicMessageChannel<dynamic> channel = BasicMessageChannel<dynamic>(
-          'dev.flutter.pigeon.VideoPlayerApi.position', StandardMessageCodec());
-      if (api == null) {
-        channel.setMockMessageHandler(null);
-      } else {
-        channel.setMockMessageHandler((dynamic message) async {
-          final Map<dynamic, dynamic> mapMessage =
-              message as Map<dynamic, dynamic>;
-          final TextureMessage input = TextureMessage._fromMap(mapMessage);
-          final PositionMessage output = api.position(input);
-          return <dynamic, dynamic>{'result': output._toMap()};
-        });
-      }
-    }
-    {
-      const BasicMessageChannel<dynamic> channel = BasicMessageChannel<dynamic>(
-          'dev.flutter.pigeon.VideoPlayerApi.seekTo', StandardMessageCodec());
-      if (api == null) {
-        channel.setMockMessageHandler(null);
-      } else {
-        channel.setMockMessageHandler((dynamic message) async {
-          final Map<dynamic, dynamic> mapMessage =
-              message as Map<dynamic, dynamic>;
-          final PositionMessage input = PositionMessage._fromMap(mapMessage);
-          api.seekTo(input);
-          return <dynamic, dynamic>{};
-        });
-      }
-    }
-    {
-      const BasicMessageChannel<dynamic> channel = BasicMessageChannel<dynamic>(
-          'dev.flutter.pigeon.VideoPlayerApi.pause', StandardMessageCodec());
-      if (api == null) {
-        channel.setMockMessageHandler(null);
-      } else {
-        channel.setMockMessageHandler((dynamic message) async {
-          final Map<dynamic, dynamic> mapMessage =
-              message as Map<dynamic, dynamic>;
-          final TextureMessage input = TextureMessage._fromMap(mapMessage);
-          api.pause(input);
-          return <dynamic, dynamic>{};
-        });
-      }
-    }
-    {
-      const BasicMessageChannel<dynamic> channel = BasicMessageChannel<dynamic>(
-          'dev.flutter.pigeon.VideoPlayerApi.setMixWithOthers',
-          StandardMessageCodec());
-      if (api == null) {
-        channel.setMockMessageHandler(null);
-      } else {
-        channel.setMockMessageHandler((dynamic message) async {
-          final Map<dynamic, dynamic> mapMessage =
-              message as Map<dynamic, dynamic>;
-          final MixWithOthersMessage input =
-              MixWithOthersMessage._fromMap(mapMessage);
-          api.setMixWithOthers(input);
-          return <dynamic, dynamic>{};
-        });
-      }
-    }
-  }
-}
diff --git a/packages/video_player/video_player_platform_interface/lib/test.dart b/packages/video_player/video_player_platform_interface/lib/test.dart
new file mode 100644
index 0000000..538e952
--- /dev/null
+++ b/packages/video_player/video_player_platform_interface/lib/test.dart
@@ -0,0 +1,196 @@
+// Autogenerated from Pigeon (v0.1.19), do not edit directly.
+// See also: https://pub.dev/packages/pigeon
+// ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import
+// @dart = 2.12
+import 'dart:async';
+import 'dart:typed_data' show Uint8List, Int32List, Int64List, Float64List;
+import 'package:flutter/services.dart';
+import 'package:flutter_test/flutter_test.dart';
+
+import 'messages.dart';
+
+abstract class TestHostVideoPlayerApi {
+  void initialize();
+  TextureMessage create(CreateMessage arg);
+  void dispose(TextureMessage arg);
+  void setLooping(LoopingMessage arg);
+  void setVolume(VolumeMessage arg);
+  void setPlaybackSpeed(PlaybackSpeedMessage arg);
+  void play(TextureMessage arg);
+  PositionMessage position(TextureMessage arg);
+  void seekTo(PositionMessage arg);
+  void pause(TextureMessage arg);
+  void setMixWithOthers(MixWithOthersMessage arg);
+  static void setup(TestHostVideoPlayerApi? api) {
+    {
+      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.VideoPlayerApi.initialize',
+          StandardMessageCodec());
+      if (api == null) {
+        channel.setMockMessageHandler(null);
+      } else {
+        channel.setMockMessageHandler((Object? message) async {
+          // ignore message
+          api.initialize();
+          return <Object?, Object?>{};
+        });
+      }
+    }
+    {
+      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.VideoPlayerApi.create', StandardMessageCodec());
+      if (api == null) {
+        channel.setMockMessageHandler(null);
+      } else {
+        channel.setMockMessageHandler((Object? message) async {
+          assert(message != null,
+              'Argument for dev.flutter.pigeon.VideoPlayerApi.create was null. Expected CreateMessage.');
+          final CreateMessage input = CreateMessage.decode(message!);
+          final TextureMessage output = api.create(input);
+          return <Object?, Object?>{'result': output.encode()};
+        });
+      }
+    }
+    {
+      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.VideoPlayerApi.dispose', StandardMessageCodec());
+      if (api == null) {
+        channel.setMockMessageHandler(null);
+      } else {
+        channel.setMockMessageHandler((Object? message) async {
+          assert(message != null,
+              'Argument for dev.flutter.pigeon.VideoPlayerApi.dispose was null. Expected TextureMessage.');
+          final TextureMessage input = TextureMessage.decode(message!);
+          api.dispose(input);
+          return <Object?, Object?>{};
+        });
+      }
+    }
+    {
+      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.VideoPlayerApi.setLooping',
+          StandardMessageCodec());
+      if (api == null) {
+        channel.setMockMessageHandler(null);
+      } else {
+        channel.setMockMessageHandler((Object? message) async {
+          assert(message != null,
+              'Argument for dev.flutter.pigeon.VideoPlayerApi.setLooping was null. Expected LoopingMessage.');
+          final LoopingMessage input = LoopingMessage.decode(message!);
+          api.setLooping(input);
+          return <Object?, Object?>{};
+        });
+      }
+    }
+    {
+      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.VideoPlayerApi.setVolume',
+          StandardMessageCodec());
+      if (api == null) {
+        channel.setMockMessageHandler(null);
+      } else {
+        channel.setMockMessageHandler((Object? message) async {
+          assert(message != null,
+              'Argument for dev.flutter.pigeon.VideoPlayerApi.setVolume was null. Expected VolumeMessage.');
+          final VolumeMessage input = VolumeMessage.decode(message!);
+          api.setVolume(input);
+          return <Object?, Object?>{};
+        });
+      }
+    }
+    {
+      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.VideoPlayerApi.setPlaybackSpeed',
+          StandardMessageCodec());
+      if (api == null) {
+        channel.setMockMessageHandler(null);
+      } else {
+        channel.setMockMessageHandler((Object? message) async {
+          assert(message != null,
+              'Argument for dev.flutter.pigeon.VideoPlayerApi.setPlaybackSpeed was null. Expected PlaybackSpeedMessage.');
+          final PlaybackSpeedMessage input =
+              PlaybackSpeedMessage.decode(message!);
+          api.setPlaybackSpeed(input);
+          return <Object?, Object?>{};
+        });
+      }
+    }
+    {
+      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.VideoPlayerApi.play', StandardMessageCodec());
+      if (api == null) {
+        channel.setMockMessageHandler(null);
+      } else {
+        channel.setMockMessageHandler((Object? message) async {
+          assert(message != null,
+              'Argument for dev.flutter.pigeon.VideoPlayerApi.play was null. Expected TextureMessage.');
+          final TextureMessage input = TextureMessage.decode(message!);
+          api.play(input);
+          return <Object?, Object?>{};
+        });
+      }
+    }
+    {
+      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.VideoPlayerApi.position', StandardMessageCodec());
+      if (api == null) {
+        channel.setMockMessageHandler(null);
+      } else {
+        channel.setMockMessageHandler((Object? message) async {
+          assert(message != null,
+              'Argument for dev.flutter.pigeon.VideoPlayerApi.position was null. Expected TextureMessage.');
+          final TextureMessage input = TextureMessage.decode(message!);
+          final PositionMessage output = api.position(input);
+          return <Object?, Object?>{'result': output.encode()};
+        });
+      }
+    }
+    {
+      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.VideoPlayerApi.seekTo', StandardMessageCodec());
+      if (api == null) {
+        channel.setMockMessageHandler(null);
+      } else {
+        channel.setMockMessageHandler((Object? message) async {
+          assert(message != null,
+              'Argument for dev.flutter.pigeon.VideoPlayerApi.seekTo was null. Expected PositionMessage.');
+          final PositionMessage input = PositionMessage.decode(message!);
+          api.seekTo(input);
+          return <Object?, Object?>{};
+        });
+      }
+    }
+    {
+      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.VideoPlayerApi.pause', StandardMessageCodec());
+      if (api == null) {
+        channel.setMockMessageHandler(null);
+      } else {
+        channel.setMockMessageHandler((Object? message) async {
+          assert(message != null,
+              'Argument for dev.flutter.pigeon.VideoPlayerApi.pause was null. Expected TextureMessage.');
+          final TextureMessage input = TextureMessage.decode(message!);
+          api.pause(input);
+          return <Object?, Object?>{};
+        });
+      }
+    }
+    {
+      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.VideoPlayerApi.setMixWithOthers',
+          StandardMessageCodec());
+      if (api == null) {
+        channel.setMockMessageHandler(null);
+      } else {
+        channel.setMockMessageHandler((Object? message) async {
+          assert(message != null,
+              'Argument for dev.flutter.pigeon.VideoPlayerApi.setMixWithOthers was null. Expected MixWithOthersMessage.');
+          final MixWithOthersMessage input =
+              MixWithOthersMessage.decode(message!);
+          api.setMixWithOthers(input);
+          return <Object?, Object?>{};
+        });
+      }
+    }
+  }
+}
diff --git a/packages/video_player/video_player_platform_interface/pubspec.yaml b/packages/video_player/video_player_platform_interface/pubspec.yaml
index ea8d317..e493eeb 100644
--- a/packages/video_player/video_player_platform_interface/pubspec.yaml
+++ b/packages/video_player/video_player_platform_interface/pubspec.yaml
@@ -3,16 +3,16 @@
 homepage: https://github.com/flutter/plugins/tree/master/packages/video_player/video_player_platform_interface
 # NOTE: We strongly prefer non-breaking changes, even at the expense of a
 # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes
-version: 3.0.0-nullsafety.3
+version: 4.0.0-nullsafety.0
 
 dependencies:
   flutter:
     sdk: flutter
   meta: ^1.3.0-nullsafety.3
-
-dev_dependencies:
   flutter_test:
     sdk: flutter
+
+dev_dependencies:
   mockito: ^4.1.1
   pedantic: ^1.10.0-nullsafety.1
 
diff --git a/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart b/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart
index 7f54c4f..669fd28 100644
--- a/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart
+++ b/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart
@@ -12,6 +12,7 @@
 import 'package:mockito/mockito.dart';
 import 'package:video_player_platform_interface/messages.dart';
 import 'package:video_player_platform_interface/method_channel_video_player.dart';
+import 'package:video_player_platform_interface/test.dart';
 import 'package:video_player_platform_interface/video_player_platform_interface.dart';
 
 class _ApiLogger implements TestHostVideoPlayerApi {