MOD: added malloc lcc shiznit

This commit is contained in:
JohnE 2026-01-27 01:00:21 -08:00
parent 2dcf7fa19b
commit a7bab3d8be
17 changed files with 23 additions and 397 deletions

View File

@ -1,3 +0,0 @@
## 0.0.1
* TODO: Describe initial release.

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2025 * Copyright (c) 2026 Malloc LLC (malloc.io)
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2025 * Copyright (c) 2026 Malloc LLC (malloc.io)
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2025 * Copyright (c) 2026 Malloc LLC (malloc.io)
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2025 * Copyright (c) 2026 Malloc LLC (malloc.io)
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2025 * Copyright (c) 2026 Malloc LLC (malloc.io)
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2025 * Copyright (c) 2026 Malloc LLC (malloc.io)
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2025 * Copyright (c) 2026 Malloc LLC (malloc.io)
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -98,9 +98,17 @@ class _SplashVideoPlayerState extends State<SplashVideoPlayer> {
// Attach player to controller if provided // Attach player to controller if provided
widget.controller?.attach(player); widget.controller?.attach(player);
// Resolve hwdec: use provided value, or smart default for Windows // Resolve hwdec: use provided value, or smart default per platform
final resolvedHwdec = videoConfig.hwdec?.value final String? resolvedHwdec;
?? (Platform.isWindows ? HwdecMode.autoSafe.value : null); if (videoConfig.hwdec != null) {
resolvedHwdec = videoConfig.hwdec!.value;
} else if (Platform.isWindows) {
resolvedHwdec = HwdecMode.windowsAuto.value;
} else if (Platform.isLinux) {
resolvedHwdec = HwdecMode.linuxAuto.value;
} else {
resolvedHwdec = null; // Use platform default for macOS, iOS, Android
}
// Create the VideoController with configuration // Create the VideoController with configuration
controller = VideoController( controller = VideoController(

View File

@ -1,379 +0,0 @@
============
splash_video
============
A Flutter package for creating smooth video splash screens using media_kit. Provides seamless transitions from native splash screens to video playback with flexible overlay support and manual controls.
Features
========
- ✨ **Smooth Transitions** - Defer first frame pattern prevents jank between native and video splash
- 🎬 **Media Kit Integration** - Cross-platform video playback with hardware acceleration
- 🎮 **Manual Controls** - Full controller access for play, pause, skip operations
- 🔄 **Looping Support** - Infinite video loops with user-controlled exit
- 📱 **Flexible Overlays** - Title, footer, and custom overlay widgets
- 🎯 **Auto-Navigation** - Automatic screen transitions or manual control
- 🎨 **Customizable** - Aspect ratio, fullscreen, volume, and more
Installation
============
Add to your ``pubspec.yaml``:
.. code-block:: yaml
dependencies:
splash_video: ^0.0.1
media_kit: ^1.2.6
media_kit_video: ^2.0.1
# Platform-specific video libraries
media_kit_libs_android_video: any
media_kit_libs_ios_video: any
media_kit_libs_macos_video: any
media_kit_libs_windows_video: any
media_kit_libs_linux: any
Quick Start
===========
1. Initialize in main()
-----------------------
.. code-block:: dart
import 'package:flutter/material.dart';
import 'package:media_kit/media_kit.dart';
import 'package:splash_video/splash_video.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
// Initialize SplashVideo (handles MediaKit and defers first frame)
SplashVideo.initialize();
runApp(MyApp());
}
2. Basic Usage (Auto-Navigate)
-------------------------------
.. code-block:: dart
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: SplashVideo(
source: AssetSource('assets/videos/splash.mp4'),
nextScreen: HomeScreen(),
backgroundColor: Colors.black,
),
);
}
}
Usage Examples
==============
Auto-Navigation
---------------
Video plays and automatically navigates to the next screen:
.. code-block:: dart
SplashVideo(
source: AssetSource('assets/videos/splash.mp4'),
nextScreen: HomeScreen(),
backgroundColor: Colors.black,
)
Manual Control
--------------
Use a callback for custom logic after video completes:
.. code-block:: dart
SplashVideo(
source: AssetSource('assets/videos/splash.mp4'),
onVideoComplete: () {
// Custom logic
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (_) => HomeScreen()),
);
},
)
Looping Video with Controller
------------------------------
Create an infinite loop that the user can manually exit:
.. code-block:: dart
class MyScreen extends StatefulWidget {
@override
State<MyScreen> createState() => _MyScreenState();
}
class _MyScreenState extends State<MyScreen> {
late final SplashVideoController controller;
@override
void initState() {
super.initState();
controller = SplashVideoController(loopVideo: true);
}
@override
void dispose() {
controller.dispose();
super.dispose();
}
void _onSkip() {
controller.skip();
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (_) => HomeScreen()),
);
}
@override
Widget build(BuildContext context) {
return SplashVideo(
source: AssetSource('assets/videos/splash.mp4'),
controller: controller,
footerWidget: ElevatedButton(
onPressed: _onSkip,
child: Text('Skip'),
),
);
}
}
With Overlays
-------------
Add title, footer, and custom overlays:
.. code-block:: dart
SplashVideo(
source: AssetSource('assets/videos/splash.mp4'),
nextScreen: HomeScreen(),
backgroundColor: Colors.black,
// Title at top
titleWidget: Padding(
padding: EdgeInsets.all(20),
child: Text(
'Welcome',
style: TextStyle(fontSize: 32, color: Colors.white),
),
),
// Footer at bottom
footerWidget: CircularProgressIndicator(),
// Custom overlay with full control
overlayBuilder: (context) => Positioned(
right: 20,
top: 100,
child: Text('v1.0.0', style: TextStyle(color: Colors.white)),
),
)
Network Video
-------------
Load video from URL:
.. code-block:: dart
SplashVideo(
source: NetworkFileSource('https://example.com/splash.mp4'),
nextScreen: HomeScreen(),
)
Custom Configuration
--------------------
.. code-block:: dart
SplashVideo(
source: AssetSource('assets/videos/splash.mp4'),
nextScreen: HomeScreen(),
videoConfig: VideoConfig(
playImmediately: true,
videoVisibilityEnum: VisibilityEnum.useAspectRatio,
useSafeArea: true,
volume: 50.0,
onPlayerInitialized: (player) {
print('Player ready: ${player.state.duration}');
},
),
)
API Reference
=============
SplashVideo
-----------
Main widget for video splash screen.
.. list-table::
:header-rows: 1
:widths: 20 25 10 45
* - Parameter
- Type
- Required
- Description
* - ``source``
- ``Source``
- ✅
- Video source (Asset, Network, DeviceFile, Bytes)
* - ``controller``
- ``SplashVideoController?``
- ⚠️
- Required when looping is enabled
* - ``videoConfig``
- ``VideoConfig?``
- ❌
- Playback configuration
* - ``backgroundColor``
- ``Color?``
- ❌
- Background color behind video
* - ``titleWidget``
- ``Widget?``
- ❌
- Widget at top of screen
* - ``footerWidget``
- ``Widget?``
- ❌
- Widget at bottom of screen
* - ``overlayBuilder``
- ``Widget Function(BuildContext)?``
- ❌
- Custom overlay builder
* - ``nextScreen``
- ``Widget?``
- ❌
- Screen to navigate to (auto-navigate)
* - ``onVideoComplete``
- ``VoidCallback?``
- ❌
- Callback when video completes (manual control)
* - ``onSourceLoaded``
- ``VoidCallback?``
- ❌
- Callback when video loads
**Validation Rules:**
- Cannot use both ``nextScreen`` and ``onVideoComplete``
- Looping videos require ``controller`` and cannot use ``nextScreen`` or ``onVideoComplete``
SplashVideoController
---------------------
Controls video playback.
.. code-block:: dart
final controller = SplashVideoController(loopVideo: true);
// Access media_kit Player
controller.player.play();
controller.player.pause();
controller.player.seek(Duration(seconds: 5));
// Controller methods
controller.play();
controller.pause();
controller.skip(); // Complete immediately
controller.dispose();
VideoConfig
-----------
Configuration for video playback.
.. code-block:: dart
VideoConfig(
playImmediately: true, // Auto-play on load
videoVisibilityEnum: VisibilityEnum.useFullScreen, // Display mode
useSafeArea: false, // Wrap in SafeArea
volume: 100.0, // Volume (0-100)
onPlayerInitialized: (player) { }, // Player callback
)
Source Types
------------
.. code-block:: dart
// Asset bundled with app
AssetSource('assets/videos/splash.mp4')
// Network URL
NetworkFileSource('https://example.com/video.mp4')
// Device file
DeviceFileSource('/path/to/video.mp4')
// Raw bytes
BytesSource(videoBytes)
VisibilityEnum
--------------
.. code-block:: dart
VisibilityEnum.useFullScreen // Fill entire screen
VisibilityEnum.useAspectRatio // Maintain aspect ratio
VisibilityEnum.none // No special sizing
Lifecycle Methods
=================
.. code-block:: dart
// Defer first frame (prevents jank)
SplashVideo.initialize();
// Resume Flutter rendering
SplashVideo.resume();
Platform Support
================
.. list-table::
:header-rows: 1
* - Platform
- Supported
* - Android
- ✅
* - iOS
- ✅
* - macOS
- ✅
* - Windows
- ✅
* - Linux
- ✅
* - Web
- ✅
License
=======
MIT License - see LICENSE file for details.

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2025 * Copyright (c) 2026 Malloc LLC (malloc.io)
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,7 +1,7 @@
// ignore_for_file: avoid_print // ignore_for_file: avoid_print
/* /*
* Copyright (c) 2025 * Copyright (c) 2026 Malloc LLC (malloc.io)
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2025 * Copyright (c) 2026 Malloc LLC (malloc.io)
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2025 * Copyright (c) 2026 Malloc LLC (malloc.io)
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2025 * Copyright (c) 2026 Malloc LLC (malloc.io)
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal