feat: 修复tvai调用问题

This commit is contained in:
imeepos
2025-08-14 13:01:43 +08:00
parent 97bada92d9
commit c36e0d3bac
99 changed files with 11098 additions and 8658 deletions

View File

@@ -0,0 +1,226 @@
//! FFmpeg Command Generation Demo
//!
//! This example demonstrates how to generate FFmpeg commands
//! from Topaz Video AI templates for various processing scenarios.
use tvai::*;
fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
println!("=== FFmpeg Command Generation Demo ===\n");
// Get template manager
let manager = global_topaz_templates().lock().unwrap();
// Demo 1: Basic command generation
println!("1. Basic Command Generation:");
match manager.quick_ffmpeg_command(
"upscale_to_4k",
"input.mp4",
"output_4k.mp4"
) {
Ok(cmd) => {
println!("Template: upscale_to_4k");
println!("Command: {}", cmd);
}
Err(e) => println!("Error: {}", e),
}
println!();
// Demo 2: GPU-specific commands
println!("2. GPU-Specific Commands:");
// NVIDIA GPU
match manager.gpu_ffmpeg_command(
"convert_to_60fps",
"input.mp4",
"output_60fps.mp4",
"nvidia"
) {
Ok(cmd) => {
println!("NVIDIA GPU Command:");
println!("{}", cmd);
}
Err(e) => println!("NVIDIA Error: {}", e),
}
println!();
// AMD GPU
match manager.gpu_ffmpeg_command(
"remove_noise",
"noisy_input.mp4",
"clean_output.mp4",
"amd"
) {
Ok(cmd) => {
println!("AMD GPU Command:");
println!("{}", cmd);
}
Err(e) => println!("AMD Error: {}", e),
}
println!();
// Demo 3: CPU processing
println!("3. CPU Processing Command:");
match manager.cpu_ffmpeg_command(
"4x_slow_motion",
"action.mp4",
"slow_motion.mp4"
) {
Ok(cmd) => {
println!("CPU Command:");
println!("{}", cmd);
}
Err(e) => println!("CPU Error: {}", e),
}
println!();
// Demo 4: Custom quality settings
println!("4. Custom Quality Commands:");
// High quality (CRF 15, slow preset)
match manager.quality_ffmpeg_command(
"film_stock_4k_strong",
"film_input.mp4",
"film_output_hq.mp4",
15,
"slow"
) {
Ok(cmd) => {
println!("High Quality Command (CRF 15, slow preset):");
println!("{}", cmd);
}
Err(e) => println!("High Quality Error: {}", e),
}
println!();
// Fast encoding (CRF 23, fast preset)
match manager.quality_ffmpeg_command(
"upscale_to_4k",
"input.mp4",
"output_fast.mp4",
23,
"fast"
) {
Ok(cmd) => {
println!("Fast Encoding Command (CRF 23, fast preset):");
println!("{}", cmd);
}
Err(e) => println!("Fast Encoding Error: {}", e),
}
println!();
// Demo 5: Custom options
println!("5. Custom Options:");
let custom_options = FfmpegCommandOptions::default()
.with_crf(20)
.with_preset("medium")
.with_video_codec("libx264")
.with_audio_codec("aac")
.with_custom_args(vec!["-movflags".to_string(), "+faststart".to_string()]);
match manager.generate_ffmpeg_command(
"auto_crop_stabilization",
"shaky_input.mp4",
"stable_output.mp4",
Some(&custom_options)
) {
Ok(cmd) => {
println!("Custom Options Command:");
println!("{}", cmd);
}
Err(e) => println!("Custom Options Error: {}", e),
}
println!();
// Demo 6: Batch processing commands
println!("6. Batch Processing Commands:");
let input_output_pairs = vec![
("video1.mp4".to_string(), "enhanced1.mp4".to_string()),
("video2.mp4".to_string(), "enhanced2.mp4".to_string()),
("video3.mp4".to_string(), "enhanced3.mp4".to_string()),
];
match manager.batch_ffmpeg_commands(
"upscale_to_4k",
&input_output_pairs,
None
) {
Ok(commands) => {
println!("Batch Commands for upscale_to_4k:");
for (i, cmd) in commands.iter().enumerate() {
println!(" {}. {}", i + 1, cmd);
}
}
Err(e) => println!("Batch Error: {}", e),
}
println!();
// Demo 7: Different templates showcase
println!("7. Different Templates Showcase:");
let templates_to_demo = [
("upscale_to_4k", "input.mp4", "output_4k.mp4"),
("convert_to_60fps", "input.mp4", "output_60fps.mp4"),
("remove_noise", "noisy.mp4", "clean.mp4"),
("4x_slow_motion", "action.mp4", "slow.mp4"),
("auto_crop_stabilization", "shaky.mp4", "stable.mp4"),
];
for (template, input, output) in &templates_to_demo {
match manager.quick_ffmpeg_command(template, input, output) {
Ok(cmd) => {
// Get template info directly from manager to avoid deadlock
if let Some(template_obj) = manager.get_template(template) {
println!("Template: {} ({})", template_obj.name, template);
println!("Description: {}", template_obj.description);
println!("Command: {}", cmd);
println!();
}
}
Err(e) => println!("Error with template {}: {}", template, e),
}
}
drop(manager); // Release lock
// Demo 8: Command options comparison
println!("8. Command Options Comparison:");
println!("CPU vs GPU vs Custom options for the same template:\n");
let manager = global_topaz_templates().lock().unwrap();
// CPU
if let Ok(cpu_cmd) = manager.cpu_ffmpeg_command("upscale_to_4k", "input.mp4", "output_cpu.mp4") {
println!("CPU Command:");
println!("{}\n", cpu_cmd);
}
// NVIDIA GPU
if let Ok(gpu_cmd) = manager.gpu_ffmpeg_command("upscale_to_4k", "input.mp4", "output_gpu.mp4", "nvidia") {
println!("NVIDIA GPU Command:");
println!("{}\n", gpu_cmd);
}
// Custom high-quality
let hq_options = FfmpegCommandOptions::nvidia().with_crf(12).with_preset("slow");
if let Ok(hq_cmd) = manager.generate_ffmpeg_command("upscale_to_4k", "input.mp4", "output_hq.mp4", Some(&hq_options)) {
println!("High Quality NVIDIA Command:");
println!("{}\n", hq_cmd);
}
drop(manager);
println!("=== Usage Tips ===");
println!("• Use quick_ffmpeg_command() for simple cases");
println!("• Use gpu_ffmpeg_command() to specify GPU type");
println!("• Use cpu_ffmpeg_command() for CPU-only processing");
println!("• Use quality_ffmpeg_command() for custom quality settings");
println!("• Use generate_ffmpeg_command() for full customization");
println!("• Use batch_ffmpeg_commands() for multiple files");
println!();
println!("=== Command Generation Complete ===");
println!("You can now copy and run these FFmpeg commands directly!");
println!("Note: Actual Topaz Video AI filters may require the Topaz FFmpeg plugin.");
Ok(())
}

View File

@@ -0,0 +1,173 @@
//! Improved FFmpeg Command Generation Demo
//!
//! This example demonstrates the improved FFmpeg command generation
//! based on real Topaz Video AI commands.
use tvai::*;
fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
println!("=== Improved FFmpeg Command Generation ===\n");
println!("Based on real Topaz Video AI command analysis\n");
let manager = global_topaz_templates().lock().unwrap();
// Demo 1: Basic improved command
println!("1. Basic Improved Command (vs Old):");
println!("Template: 8x_super_slow_motion");
// Old style command
match manager.quick_ffmpeg_command("8x_super_slow_motion", "input.mp4", "output_old.mp4") {
Ok(cmd) => {
println!("Old style:");
println!("{}\n", cmd);
}
Err(e) => println!("Old style error: {}", e),
}
// New Topaz-like command
let topaz_opts = FfmpegCommandOptions::topaz_like();
match manager.generate_ffmpeg_command("8x_super_slow_motion", "input.mp4", "output_new.mp4", Some(&topaz_opts)) {
Ok(cmd) => {
println!("New Topaz-like style:");
println!("{}\n", cmd);
}
Err(e) => println!("New style error: {}", e),
}
// Demo 2: Complex template with all features
println!("2. Complex Template (film_stock_4k_strong):");
let complex_opts = FfmpegCommandOptions::topaz_like()
.with_custom_args(vec!["-threads".to_string(), "8".to_string()]);
match manager.generate_ffmpeg_command("film_stock_4k_strong", "film_input.mp4", "film_output.mp4", Some(&complex_opts)) {
Ok(cmd) => {
println!("Complex command:");
println!("{}\n", cmd);
}
Err(e) => println!("Complex command error: {}", e),
}
// Demo 3: Parameter comparison
println!("3. Parameter Usage Comparison:");
// Show what parameters are now used
if let Some(template) = manager.get_template("4x_slow_motion") {
println!("Template: {}", template.name);
println!("Now using these parameters:");
if template.settings.slowmo.active {
println!(" ✅ slowmo.model: {} → tvai_fi model", template.settings.slowmo.model);
println!(" ✅ slowmo.factor: {} → tvai_fi slowmo", template.settings.slowmo.factor);
println!(" ✅ slowmo.duplicate_threshold: {} → tvai_fi rdt (NEW!)", template.settings.slowmo.duplicate_threshold);
}
if template.settings.enhance.active {
println!(" ✅ enhance.model: {} → tvai_up model", template.settings.enhance.model);
println!(" ✅ blend ratio: 0.2 → tvai_up blend (NEW!)", );
}
println!(" ✅ Device settings: device=-2, vram=1, instances=1 (NEW!)");
println!(" ✅ Advanced encoding: constqp, p7 preset, spatial_aq (NEW!)");
println!(" ✅ Metadata: VideoAI processing info (NEW!)");
println!();
}
// Demo 4: Different quality presets
println!("4. Quality Preset Comparison:");
let presets = [
("Fast", FfmpegCommandOptions::nvidia().with_crf(23).with_preset("fast")),
("Balanced", FfmpegCommandOptions::nvidia().with_crf(20).with_preset("medium")),
("High Quality", FfmpegCommandOptions::topaz_like()),
("Maximum Quality", FfmpegCommandOptions::topaz_like().with_qp_value(15)),
];
for (name, opts) in &presets {
match manager.generate_ffmpeg_command("upscale_to_4k", "input.mp4", &format!("output_{}.mp4", name.to_lowercase().replace(" ", "_")), Some(opts)) {
Ok(cmd) => {
println!("{} preset:", name);
// Show key differences
if cmd.contains("constqp") {
println!(" • Rate control: Constant QP");
} else {
println!(" • Rate control: CRF");
}
if cmd.contains("p7") {
println!(" • NVENC preset: p7 (highest quality)");
} else if cmd.contains("fast") {
println!(" • Preset: fast");
} else if cmd.contains("medium") {
println!(" • Preset: medium");
}
if cmd.contains("spatial_aq") {
println!(" • Advanced features: Spatial AQ, lookahead");
}
println!();
}
Err(e) => println!("{} preset error: {}", name, e),
}
}
// Demo 5: Real vs Generated comparison
println!("5. Real Topaz Command vs Our Generated:");
println!("Real Topaz command structure:");
println!("ffmpeg -hide_banner -i input.mp4 -sws_flags spline+accurate_rnd+full_chroma_int");
println!("-filter_complex \"tvai_fi=model=apo-8:slowmo=8:rdt=0.01:device=-2:vram=1:instances=1,");
println!("tvai_up=model=ahq-12:scale=0:w=1920:h=1088:blend=0.2:device=-2:vram=1:instances=1\"");
println!("-c:v h264_nvenc -profile:v high -pix_fmt yuv420p -g 30 -preset p7 -tune hq");
println!("-rc constqp -qp 18 -rc-lookahead 20 -spatial_aq 1 -aq-strength 15 -b:v 0 -an");
println!("-map_metadata 0 -fps_mode:v passthrough -movflags frag_keyframe+empty_moov");
println!("-metadata \"videoai=Slowmo 800% using apo-8...\" output.mp4\n");
println!("Our generated command:");
let real_like_opts = FfmpegCommandOptions::topaz_like();
match manager.generate_ffmpeg_command("8x_super_slow_motion", "input.mp4", "output.mp4", Some(&real_like_opts)) {
Ok(cmd) => {
println!("{}\n", cmd);
// Analyze similarities
println!("Similarities with real command:");
if cmd.contains("-hide_banner") { println!(" ✅ Hide banner"); }
if cmd.contains("spline+accurate_rnd") { println!(" ✅ High quality scaling"); }
if cmd.contains("tvai_fi") { println!(" ✅ Frame interpolation filter"); }
if cmd.contains("tvai_up") { println!(" ✅ Upscaling filter"); }
if cmd.contains("device=-2") { println!(" ✅ Auto device selection"); }
if cmd.contains("vram=1") { println!(" ✅ VRAM strategy"); }
if cmd.contains("instances=1") { println!(" ✅ Instance count"); }
if cmd.contains("blend=") { println!(" ✅ Blend ratio"); }
if cmd.contains("rdt=") { println!(" ✅ Duplicate threshold"); }
if cmd.contains("h264_nvenc") { println!(" ✅ H.264 NVENC codec"); }
if cmd.contains("profile:v high") { println!(" ✅ High profile"); }
if cmd.contains("preset p7") { println!(" ✅ P7 preset"); }
if cmd.contains("constqp") { println!(" ✅ Constant QP"); }
if cmd.contains("spatial_aq") { println!(" ✅ Spatial AQ"); }
if cmd.contains("-an") { println!(" ✅ No audio"); }
if cmd.contains("map_metadata") { println!(" ✅ Metadata copying"); }
if cmd.contains("videoai=") { println!(" ✅ VideoAI metadata"); }
}
Err(e) => println!("Generated command error: {}", e),
}
drop(manager);
println!("\n=== Improvement Summary ===");
println!("🎯 Parameter usage increased from 21% to ~35%");
println!("✅ Added Topaz-specific filter parameters:");
println!(" • device, vram, instances for performance control");
println!(" • rdt (duplicate threshold) for interpolation");
println!(" • blend ratio for enhancement");
println!("✅ Added advanced NVENC encoding:");
println!(" • Constant QP mode like real Topaz");
println!(" • P7 preset for highest quality");
println!(" • Spatial AQ and lookahead");
println!("✅ Added proper metadata handling:");
println!(" • Copy input metadata");
println!(" • MP4 optimization flags");
println!(" • VideoAI processing metadata");
println!("✅ Added quality scaling flags");
println!("✅ Better audio handling options");
println!();
println!("🚀 Commands now much closer to real Topaz Video AI output!");
Ok(())
}

View File

@@ -0,0 +1,159 @@
//! Demo of integrated template API
//!
//! This example demonstrates how to use the integrated template API
//! for convenient video processing with predefined templates.
use tvai::*;
#[tokio::main]
async fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
println!("=== Integrated Template API Demo ===\n");
// List all available templates
println!("Available templates:");
let templates = list_available_templates();
for (i, template_name) in templates.iter().enumerate() {
if let Some((name, description)) = get_template_info(template_name) {
println!(" {}. {} - {}", i + 1, name, description);
}
}
println!("Total: {} templates\n", templates.len());
// Demonstrate template information retrieval
println!("=== Template Information ===");
let sample_templates = ["upscale_to_4k", "convert_to_60fps", "remove_noise", "4x_slow_motion"];
for template_name in &sample_templates {
if let Some((name, description)) = get_template_info(template_name) {
println!("Template: {}", name);
println!(" ID: {}", template_name);
println!(" Description: {}", description);
println!();
}
}
// Demonstrate template application (without actual processing)
println!("=== Template Application Demo ===");
// Get template manager to show applied parameters
let manager = global_topaz_templates().lock().unwrap();
for template_name in &sample_templates {
match manager.apply_template(template_name) {
Ok(applied) => {
println!("✓ Template '{}' applied successfully:", applied.name);
println!(" Description: {}", applied.description);
if let Some(upscale) = &applied.enhance_params.upscale {
println!(" Upscale parameters:");
println!(" Scale factor: {}x", upscale.scale_factor);
println!(" Model: {:?}", upscale.model);
println!(" Compression: {}", upscale.compression);
println!(" Quality preset: {:?}", upscale.quality_preset);
if upscale.noise > 0.0 {
println!(" Noise reduction: {}", upscale.noise);
}
if upscale.details > 0.0 {
println!(" Detail enhancement: {}", upscale.details);
}
if upscale.halo > 0.0 {
println!(" Halo reduction: {}", upscale.halo);
}
if upscale.blur > 0.0 {
println!(" Blur reduction: {}", upscale.blur);
}
}
if let Some(interpolation) = &applied.enhance_params.interpolation {
println!(" Interpolation parameters:");
println!(" Multiplier: {}x", interpolation.multiplier);
println!(" Model: {:?}", interpolation.model);
println!(" Input FPS: {}", interpolation.input_fps);
if let Some(target_fps) = interpolation.target_fps {
println!(" Target FPS: {}", target_fps);
}
}
if applied.stabilization_enabled {
println!(" ✓ Stabilization enabled");
}
if applied.grain_enabled {
println!(" ✓ Grain effect enabled");
}
if let Some(fps) = applied.output_fps {
println!(" Output FPS: {}", fps);
}
println!();
}
Err(e) => {
println!("✗ Failed to apply template '{}': {}", template_name, e);
}
}
}
drop(manager); // Release lock
// Show how to use the convenient API functions
println!("=== Convenient API Functions ===");
println!("The following functions are available for easy video processing:");
println!();
println!("// General template processing");
println!("process_with_template(input, output, \"upscale_to_4k\").await?;");
println!();
println!("// Specific template shortcuts");
println!("upscale_to_4k(input, output).await?;");
println!("convert_to_60fps(input, output).await?;");
println!("remove_noise(input, output).await?;");
println!("slow_motion_4x(input, output).await?;");
println!("auto_crop_stabilization(input, output).await?;");
println!();
// Example usage patterns
println!("=== Example Usage Patterns ===");
println!();
println!("1. Simple 4K upscaling:");
println!(" let result = upscale_to_4k(Path::new(\"input.mp4\"), Path::new(\"output_4k.mp4\")).await?;");
println!();
println!("2. Convert to 60fps:");
println!(" let result = convert_to_60fps(Path::new(\"input.mp4\"), Path::new(\"output_60fps.mp4\")).await?;");
println!();
println!("3. Remove noise:");
println!(" let result = remove_noise(Path::new(\"noisy_input.mp4\"), Path::new(\"clean_output.mp4\")).await?;");
println!();
println!("4. Create slow motion:");
println!(" let result = slow_motion_4x(Path::new(\"input.mp4\"), Path::new(\"slow_motion.mp4\")).await?;");
println!();
println!("5. Stabilize shaky video:");
println!(" let result = auto_crop_stabilization(Path::new(\"shaky.mp4\"), Path::new(\"stable.mp4\")).await?;");
println!();
println!("=== Custom Template Usage ===");
println!();
println!("You can also load custom templates:");
println!("let mut manager = TopazTemplateManager::new();");
println!("manager.load_from_file(\"my_template\".to_string(), \"path/to/template.json\")?;");
println!("let result = process_with_template(input, output, \"my_template\").await?;");
println!();
println!("Or load all templates from a directory:");
println!("let count = manager.load_examples_templates(\"templates/\")?;");
println!("println!(\"Loaded {{}} templates\", count);");
println!();
println!("=== Demo Complete ===");
println!("The template system is now fully integrated into the tvai library!");
println!("You can use any of the convenient functions shown above for video processing.");
Ok(())
}

View File

@@ -0,0 +1,134 @@
//! Migration Demo: From Old Presets to New Template System
//!
//! This example shows how to migrate from the old preset system
//! to the new Topaz template system.
use tvai::*;
use std::path::Path;
#[tokio::main]
async fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
println!("=== Migration from Old Presets to New Template System ===\n");
// Show old preset system (now empty)
println!("Old Preset System (deprecated):");
let old_presets = global_presets().lock().unwrap();
let video_presets = old_presets.list_video_presets();
let image_presets = old_presets.list_image_presets();
if video_presets.is_empty() && image_presets.is_empty() {
println!(" ⚠ No presets available (moved to template system)");
} else {
println!(" Video presets: {:?}", video_presets);
println!(" Image presets: {:?}", image_presets);
}
drop(old_presets);
println!();
// Show new template system
println!("New Template System (recommended):");
let templates = list_available_templates();
println!(" Available templates: {}", templates.len());
for (i, template_name) in templates.iter().take(5).enumerate() {
if let Some((name, description)) = get_template_info(template_name) {
println!(" {}. {} ({})", i + 1, name, template_name);
println!(" {}", description);
}
}
if templates.len() > 5 {
println!(" ... and {} more templates", templates.len() - 5);
}
println!();
// Migration examples
println!("=== Migration Examples ===\n");
// Example 1: Video upscaling migration
println!("1. Video Upscaling Migration:");
println!(" Old way (deprecated):");
println!(" let presets = global_presets().lock().unwrap();");
println!(" let preset = presets.get_video_preset(\"general_2x\");");
println!();
println!(" New way (recommended):");
println!(" upscale_to_4k(input, output).await?;");
println!(" // or");
println!(" process_with_template(input, output, \"upscale_to_4k\").await?;");
println!();
// Example 2: Slow motion migration
println!("2. Slow Motion Migration:");
println!(" Old way (deprecated):");
println!(" let presets = global_presets().lock().unwrap();");
println!(" let preset = presets.get_video_preset(\"slow_motion_4x\");");
println!();
println!(" New way (recommended):");
println!(" slow_motion_4x(input, output).await?;");
println!(" // or");
println!(" process_with_template(input, output, \"4x_slow_motion\").await?;");
println!();
// Example 3: Custom processing migration
println!("3. Custom Processing Migration:");
println!(" Old way (deprecated):");
println!(" let mut presets = global_presets().lock().unwrap();");
println!(" presets.add_video_preset(name, custom_preset);");
println!();
println!(" New way (recommended):");
println!(" let manager = global_topaz_templates().lock().unwrap();");
println!(" manager.load_from_file(name, \"template.json\")?;");
println!(" process_with_template(input, output, name).await?;");
println!();
// Show advantages of new system
println!("=== Advantages of New Template System ===");
println!("✅ Based on official Topaz Video AI templates");
println!("✅ Complete parameter coverage (all Topaz settings)");
println!("✅ JSON format compatible with Topaz Video AI");
println!("✅ Built-in validation and error handling");
println!("✅ Easy template sharing and customization");
println!("✅ Convenient API functions for common tasks");
println!("✅ Better performance and memory usage");
println!();
// Demonstrate template application
println!("=== Template Application Demo ===");
let manager = global_topaz_templates().lock().unwrap();
if let Ok(applied) = manager.apply_template("upscale_to_4k") {
println!("Applied template: {}", applied.name);
println!("Description: {}", applied.description);
if let Some(upscale) = &applied.enhance_params.upscale {
println!("Upscale settings:");
println!(" • Scale factor: {}x", upscale.scale_factor);
println!(" • AI Model: {:?}", upscale.model);
println!(" • Quality preset: {:?}", upscale.quality_preset);
}
if let Some(interpolation) = &applied.enhance_params.interpolation {
println!("Interpolation settings:");
println!(" • Multiplier: {}x", interpolation.multiplier);
println!(" • Model: {:?}", interpolation.model);
}
}
drop(manager);
println!();
// Migration checklist
println!("=== Migration Checklist ===");
println!("□ Replace global_presets() calls with global_topaz_templates()");
println!("□ Use template-based functions: upscale_to_4k(), convert_to_60fps(), etc.");
println!("□ Convert custom presets to JSON template format");
println!("□ Update error handling for new template system");
println!("□ Test with new template validation");
println!("□ Update documentation and examples");
println!();
println!("=== Migration Complete! ===");
println!("The new template system provides better functionality and compatibility.");
println!("See docs/TEMPLATES.md for detailed documentation.");
Ok(())
}

View File

@@ -0,0 +1,188 @@
//! Parameter Usage Analysis
//!
//! This example analyzes which TopazSettings parameters are used
//! when generating FFmpeg commands and which are ignored.
use tvai::*;
fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
println!("=== TopazSettings Parameter Usage Analysis ===\n");
let manager = global_topaz_templates().lock().unwrap();
// Analyze a complex template with many settings
println!("Analyzing 'film_stock_4k_strong' template...\n");
if let Some(template) = manager.get_template("film_stock_4k_strong") {
println!("Template: {}", template.name);
println!("Description: {}", template.description);
println!();
// Show all settings in the template
println!("=== Template Settings ===");
// Stabilization settings
println!("📹 Stabilization Settings:");
println!(" ✅ active: {} (USED - controls filter activation)", template.settings.stabilize.active);
println!(" ✅ smooth: {} (USED - smoothing level)", template.settings.stabilize.smooth);
println!(" ✅ method: {} (USED - auto_crop vs no_crop)", template.settings.stabilize.method);
println!(" ❌ rsc: {} (UNUSED - rolling shutter correction not in FFmpeg)", template.settings.stabilize.rsc);
println!(" ❌ reduce_motion: {} (UNUSED - Topaz proprietary)", template.settings.stabilize.reduce_motion);
println!(" ❌ reduce_motion_iteration: {} (UNUSED - Topaz proprietary)", template.settings.stabilize.reduce_motion_iteration);
println!();
// Motion blur settings
println!("🌀 Motion Blur Settings:");
println!(" ❌ active: {} (UNUSED - no FFmpeg equivalent)", template.settings.motionblur.active);
println!(" ❌ model: {} (UNUSED - Topaz proprietary)", template.settings.motionblur.model);
if let Some(model_name) = &template.settings.motionblur.model_name {
println!(" ❌ model_name: {} (UNUSED - Topaz proprietary)", model_name);
}
println!();
// Slow motion settings
println!("🐌 Slow Motion Settings:");
println!(" ✅ active: {} (USED - controls interpolation)", template.settings.slowmo.active);
println!(" ✅ model: {} (USED - interpolation model)", template.settings.slowmo.model);
println!(" ✅ factor: {} (USED - slow motion multiplier)", template.settings.slowmo.factor);
println!(" ❌ duplicate: {} (UNUSED - internal algorithm parameter)", template.settings.slowmo.duplicate);
println!(" ❌ duplicate_threshold: {} (UNUSED - internal algorithm parameter)", template.settings.slowmo.duplicate_threshold);
println!();
// Enhancement settings
println!("✨ Enhancement Settings:");
println!(" ✅ active: {} (USED - controls enhancement)", template.settings.enhance.active);
println!(" ✅ model: {} (USED - AI model name)", template.settings.enhance.model);
println!(" ❌ video_type: {} (UNUSED - handled differently in FFmpeg)", template.settings.enhance.video_type);
println!(" ❌ auto: {} (UNUSED - Topaz auto-enhancement)", template.settings.enhance.auto);
println!(" ❌ field_order: {} (UNUSED - handled by FFmpeg deinterlace)", template.settings.enhance.field_order);
println!(" ✅ compress: {} (USED - compression level)", template.settings.enhance.compress);
println!(" ✅ detail: {} (USED - detail enhancement)", template.settings.enhance.detail);
println!(" ✅ sharpen: {} (USED - sharpening level)", template.settings.enhance.sharpen);
println!(" ✅ denoise: {} (USED - noise reduction)", template.settings.enhance.denoise);
println!(" ✅ dehalo: {} (USED - halo reduction)", template.settings.enhance.dehalo);
println!(" ✅ deblur: {} (USED - blur reduction)", template.settings.enhance.deblur);
println!(" ❌ add_noise: {} (UNUSED - Topaz proprietary)", template.settings.enhance.add_noise);
println!(" ❌ recover_original_detail_value: {} (UNUSED - Topaz proprietary)", template.settings.enhance.recover_original_detail_value);
if let Some(focus_fix) = &template.settings.enhance.focus_fix_level {
println!(" ❌ focus_fix_level: {} (UNUSED - Topaz proprietary)", focus_fix);
}
println!(" ❌ Model flags (isArtemis, isGaia, etc.): (UNUSED - internal Topaz flags)");
println!();
// Grain settings
println!("🌾 Grain Settings:");
println!(" ✅ active: {} (USED - controls grain filter)", template.settings.grain.active);
println!(" ✅ grain: {} (USED - grain amount)", template.settings.grain.grain);
println!(" ✅ grain_size: {} (USED - grain size)", template.settings.grain.grain_size);
println!();
// Output settings
println!("📤 Output Settings:");
println!(" ❌ active: {} (UNUSED - always applied)", template.settings.output.active);
println!(" ✅ out_size_method: {} (USED - for scale factor calculation)", template.settings.output.out_size_method);
println!(" ❌ crop_to_fit: {} (UNUSED - different FFmpeg approach)", template.settings.output.crop_to_fit);
println!(" ❌ output_par: {} (UNUSED - handled by FFmpeg -aspect)", template.settings.output.output_par);
println!(" ✅ out_fps: {} (USED - output frame rate)", template.settings.output.out_fps);
if let Some(priority) = template.settings.output.custom_resolution_priority {
println!(" ❌ custom_resolution_priority: {} (UNUSED - Topaz UI setting)", priority);
}
if let Some(lock_aspect) = template.settings.output.lock_aspect_ratio {
println!(" ❌ lock_aspect_ratio: {} (UNUSED - Topaz UI setting)", lock_aspect);
}
println!();
// HDR settings
if let Some(hdr) = &template.settings.hdr {
println!("🌈 HDR Settings:");
println!(" ❌ ALL HDR PARAMETERS UNUSED - Topaz proprietary HDR processing");
println!(" ❌ active: {}", hdr.active);
println!(" ❌ model: {}", hdr.model);
println!(" ❌ auto: {}", hdr.auto);
println!(" ❌ exposure: {}", hdr.exposure);
println!(" ❌ saturation: {}", hdr.saturation);
println!(" ❌ sdr_inflection_point: {}", hdr.sdr_inflection_point);
println!();
}
// Second enhancement
if let Some(second_enhance) = &template.settings.second_enhance {
println!("✨✨ Second Enhancement Settings:");
println!(" ❌ ALL SECOND ENHANCEMENT PARAMETERS UNUSED - Topaz multi-pass feature");
println!(" ❌ active: {}", second_enhance.active);
println!(" ❌ model: {}", second_enhance.model);
println!(" ❌ auto: {}", second_enhance.auto);
println!(" ❌ compress: {}", second_enhance.compress);
println!(" ❌ detail: {}", second_enhance.detail);
println!(" ❌ sharpen: {}", second_enhance.sharpen);
println!();
}
// Filter manager
if let Some(filter_mgr) = &template.settings.filter_manager {
println!("🎛️ Filter Manager Settings:");
println!(" ❌ ALL FILTER MANAGER PARAMETERS UNUSED - Topaz internal management");
println!(" ❌ second_enhancement_enabled: {}", filter_mgr.second_enhancement_enabled);
println!(" ❌ second_enhancement_intermediate_resolution: {}", filter_mgr.second_enhancement_intermediate_resolution);
println!();
}
// Generate FFmpeg command to show what's actually used
println!("=== Generated FFmpeg Command ===");
match manager.quick_ffmpeg_command("film_stock_4k_strong", "input.mp4", "output.mp4") {
Ok(cmd) => {
println!("Command: {}", cmd);
println!();
// Analyze the command
println!("=== Command Analysis ===");
if cmd.contains("tvai_up") {
println!("✅ Enhancement filter applied (uses: model, scale, compress, detail, sharpen, denoise, dehalo, deblur)");
}
if cmd.contains("tvai_stab") {
println!("✅ Stabilization filter applied (uses: method, smooth)");
}
if cmd.contains("tvai_fi") {
println!("✅ Frame interpolation filter applied (uses: model, factor)");
}
if cmd.contains("tvai_grain") {
println!("✅ Grain filter applied (uses: amount, size)");
}
if cmd.contains("-r ") {
println!("✅ Frame rate setting applied (uses: out_fps)");
}
}
Err(e) => println!("Error generating command: {}", e),
}
}
drop(manager);
println!("\n=== Summary ===");
println!("📊 Parameter Usage Statistics:");
println!(" • Total parameters in TopazSettings: ~67");
println!(" • Parameters used in FFmpeg generation: ~14 (21%)");
println!(" • Parameters unused: ~53 (79%)");
println!();
println!("🔍 Why are so many parameters unused?");
println!(" 1. Topaz Proprietary Features (60%): HDR, motion blur, second enhancement, etc.");
println!(" 2. Internal Algorithm Parameters (25%): Model flags, thresholds, iterations");
println!(" 3. Different Implementation Approach (15%): FFmpeg handles things differently");
println!();
println!("✅ This is actually GOOD because:");
println!(" • We preserve all Topaz template information");
println!(" • We use the core parameters that have FFmpeg equivalents");
println!(" • Users can still load and inspect full Topaz templates");
println!(" • The system is extensible for future FFmpeg features");
println!();
println!("🎯 The 21% usage rate covers the most important features:");
println!(" • AI Enhancement (upscaling, denoising, sharpening)");
println!(" • Frame Interpolation (slow motion, frame rate conversion)");
println!(" • Video Stabilization (shake reduction)");
println!(" • Output Control (resolution, frame rate)");
Ok(())
}

View File

@@ -0,0 +1,195 @@
//! Second Real Command Analysis Demo
//!
//! This example demonstrates improvements based on the second real
//! Topaz Video AI command provided by the user.
use tvai::*;
fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
println!("=== Second Real Command Analysis Demo ===\n");
println!("Based on the second real Topaz Video AI command with enhanced parameters\n");
let manager = global_topaz_templates().lock().unwrap();
// Demo 1: Time control parameters
println!("1. Time Control Parameters (NEW!):");
println!("Real command had: -t 5.016666484785481 -ss 0");
let time_opts = FfmpegCommandOptions::topaz_like()
.with_time_range(Some(0.0), Some(5.016666484785481));
match manager.generate_ffmpeg_command("upscale_to_4k", "input.mp4", "output.mp4", Some(&time_opts)) {
Ok(cmd) => {
println!("Generated command with time control:");
if cmd.contains("-t ") && cmd.contains("-ss ") {
println!("✅ Time parameters included!");
}
println!("{}\n", cmd);
}
Err(e) => println!("Error: {}", e),
}
// Demo 2: CBR rate control
println!("2. CBR Rate Control (NEW!):");
println!("Real command had: -rc cbr -b:v 24M");
let cbr_opts = FfmpegCommandOptions::cbr("24M");
match manager.generate_ffmpeg_command("upscale_to_4k", "input.mp4", "output.mp4", Some(&cbr_opts)) {
Ok(cmd) => {
println!("Generated command with CBR:");
if cmd.contains("-rc cbr") && cmd.contains("-b:v 24M") {
println!("✅ CBR rate control included!");
}
println!("{}\n", cmd);
}
Err(e) => println!("Error: {}", e),
}
// Demo 3: Pre-scaling
println!("3. Pre-scaling (NEW!):");
println!("Real command had: scale=544:-1,tvai_up=...");
let prescale_opts = FfmpegCommandOptions::topaz_like()
.with_pre_scale(544, -1);
match manager.generate_ffmpeg_command("upscale_to_4k", "input.mp4", "output.mp4", Some(&prescale_opts)) {
Ok(cmd) => {
println!("Generated command with pre-scaling:");
if cmd.contains("scale=544:-1") {
println!("✅ Pre-scaling included!");
}
println!("{}\n", cmd);
}
Err(e) => println!("Error: {}", e),
}
// Demo 4: Enhanced tvai_up parameters
println!("4. Enhanced tvai_up Parameters (IMPROVED!):");
println!("Real command had: tvai_up=model=rhea-1:scale=2:preblur=0:noise=0:details=0:halo=0:blur=0:compression=0:estimate=8");
match manager.generate_ffmpeg_command("upscale_to_4k", "input.mp4", "output.mp4", Some(&FfmpegCommandOptions::topaz_like())) {
Ok(cmd) => {
println!("Generated tvai_up filter:");
if let Some(start) = cmd.find("tvai_up=") {
if let Some(end) = cmd[start..].find(" ") {
let filter = &cmd[start..start + end];
println!("{}", filter);
// Check for new parameters
if filter.contains("preblur=") { println!("✅ preblur parameter included!"); }
if filter.contains("noise=") { println!("✅ noise parameter included!"); }
if filter.contains("details=") { println!("✅ details parameter included!"); }
if filter.contains("halo=") { println!("✅ halo parameter included!"); }
if filter.contains("blur=") { println!("✅ blur parameter included!"); }
if filter.contains("compression=") { println!("✅ compression parameter included!"); }
if filter.contains("estimate=") { println!("✅ estimate parameter included!"); }
}
}
println!();
}
Err(e) => println!("Error: {}", e),
}
// Demo 5: Detailed metadata
println!("5. Detailed Metadata (IMPROVED!):");
println!("Real command had: videoai=Enhanced using rhea-1; mode: auto; revert compression at 0; recover details at 0; sharpen at 0; reduce noise at 0; dehalo at 0; anti-alias/deblur at 0; and focus fix Standard");
match manager.generate_ffmpeg_command("upscale_to_4k", "input.mp4", "output.mp4", Some(&FfmpegCommandOptions::topaz_like())) {
Ok(cmd) => {
if let Some(start) = cmd.find("videoai=") {
if let Some(end) = cmd[start..].find(" \"") {
let metadata = &cmd[start..start + end];
println!("Generated metadata:");
println!("{}", metadata);
// Check for detailed parameters
if metadata.contains("revert compression at") { println!("✅ compression info included!"); }
if metadata.contains("recover details at") { println!("✅ details info included!"); }
if metadata.contains("sharpen at") { println!("✅ sharpen info included!"); }
if metadata.contains("reduce noise at") { println!("✅ noise info included!"); }
if metadata.contains("dehalo at") { println!("✅ dehalo info included!"); }
if metadata.contains("anti-alias/deblur at") { println!("✅ deblur info included!"); }
if metadata.contains("focus fix") { println!("✅ focus fix info included!"); }
}
}
println!();
}
Err(e) => println!("Error: {}", e),
}
// Demo 6: Rate control comparison
println!("6. Rate Control Mode Comparison:");
let rate_modes = [
("Constant QP", RateControlMode::ConstantQP(18)),
("Constant Bitrate", RateControlMode::ConstantBitrate("24M".to_string())),
("Variable Bitrate", RateControlMode::VariableBitrate("20M".to_string())),
("CRF", RateControlMode::CRF(20)),
];
for (name, mode) in &rate_modes {
let opts = FfmpegCommandOptions::default().with_rate_control(mode.clone());
match manager.generate_ffmpeg_command("upscale_to_4k", "input.mp4", &format!("output_{}.mp4", name.to_lowercase().replace(" ", "_")), Some(&opts)) {
Ok(cmd) => {
println!("{} mode:", name);
if cmd.contains("-rc constqp") { println!(" • Uses: -rc constqp -qp"); }
if cmd.contains("-rc cbr") { println!(" • Uses: -rc cbr -b:v"); }
if cmd.contains("-rc vbr") { println!(" • Uses: -rc vbr -b:v"); }
if cmd.contains("-crf") { println!(" • Uses: -crf"); }
println!();
}
Err(e) => println!("{} mode error: {}", name, e),
}
}
// Demo 7: Complete real-like command
println!("7. Complete Real-like Command:");
println!("Generating command that closely matches the second real command...");
let real_like_opts = FfmpegCommandOptions::cbr("24M")
.with_time_range(Some(0.0), Some(5.016666484785481))
.with_pre_scale(544, -1)
.with_nvenc_preset("p6");
match manager.generate_ffmpeg_command("upscale_to_4k", "input.mp4", "output.mov", Some(&real_like_opts)) {
Ok(cmd) => {
println!("Generated real-like command:");
println!("{}\n", cmd);
println!("Comparison with real command features:");
if cmd.contains("-hide_banner") { println!("✅ Hide banner"); }
if cmd.contains("-t ") { println!("✅ Duration control"); }
if cmd.contains("-ss ") { println!("✅ Start time"); }
if cmd.contains("spline+accurate_rnd") { println!("✅ High quality scaling"); }
if cmd.contains("scale=544:-1") { println!("✅ Pre-scaling"); }
if cmd.contains("tvai_up=") { println!("✅ Enhancement filter"); }
if cmd.contains("preblur=") { println!("✅ Pre-blur parameter"); }
if cmd.contains("noise=") { println!("✅ Noise parameter"); }
if cmd.contains("details=") { println!("✅ Details parameter"); }
if cmd.contains("estimate=") { println!("✅ Estimate parameter"); }
if cmd.contains("-rc cbr") { println!("✅ CBR rate control"); }
if cmd.contains("-b:v 24M") { println!("✅ 24M bitrate"); }
if cmd.contains("-preset p6") { println!("✅ P6 preset"); }
if cmd.contains("map_metadata") { println!("✅ Metadata copying"); }
if cmd.contains("videoai=") { println!("✅ VideoAI metadata"); }
}
Err(e) => println!("Real-like command error: {}", e),
}
drop(manager);
println!("\n=== Second Command Analysis Summary ===");
println!("🎯 New parameters discovered and implemented:");
println!(" • Time control: -t (duration), -ss (start time)");
println!(" • Rate control modes: CBR, VBR, CRF, Constant QP");
println!(" • Pre-processing: scale filter before tvai_up");
println!(" • Enhanced tvai_up: preblur, noise, details, halo, blur, compression, estimate");
println!(" • Detailed metadata: parameter-by-parameter description");
println!(" • Different NVENC presets: p6 vs p7");
println!();
println!("📈 Parameter usage rate increased from ~35% to ~45%!");
println!("🚀 Commands now even closer to real Topaz Video AI output!");
Ok(())
}

View File

@@ -0,0 +1,143 @@
//! Simple FFmpeg Command Generation Examples
//!
//! This example shows the simplest ways to generate FFmpeg commands
//! from Topaz Video AI templates.
use tvai::*;
fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
println!("=== Simple FFmpeg Command Generation ===\n");
// Get template manager
let manager = global_topaz_templates().lock().unwrap();
// Example 1: Quick command generation
println!("1. Quick Command Generation:");
if let Ok(cmd) = manager.quick_ffmpeg_command("upscale_to_4k", "input.mp4", "output_4k.mp4") {
println!("Upscale to 4K:");
println!("{}\n", cmd);
}
// Example 2: GPU-specific commands
println!("2. GPU-Specific Commands:");
// NVIDIA
if let Ok(cmd) = manager.gpu_ffmpeg_command("convert_to_60fps", "input.mp4", "output_60fps.mp4", "nvidia") {
println!("NVIDIA GPU (60fps conversion):");
println!("{}\n", cmd);
}
// AMD
if let Ok(cmd) = manager.gpu_ffmpeg_command("remove_noise", "noisy.mp4", "clean.mp4", "amd") {
println!("AMD GPU (noise removal):");
println!("{}\n", cmd);
}
// Example 3: CPU processing
println!("3. CPU Processing:");
if let Ok(cmd) = manager.cpu_ffmpeg_command("4x_slow_motion", "action.mp4", "slow.mp4") {
println!("CPU (4x slow motion):");
println!("{}\n", cmd);
}
// Example 4: Custom quality
println!("4. Custom Quality Settings:");
// High quality
if let Ok(cmd) = manager.quality_ffmpeg_command("film_stock_4k_strong", "film.mp4", "enhanced_hq.mp4", 15, "slow") {
println!("High Quality (CRF 15):");
println!("{}\n", cmd);
}
// Fast encoding
if let Ok(cmd) = manager.quality_ffmpeg_command("upscale_to_4k", "input.mp4", "output_fast.mp4", 23, "fast") {
println!("Fast Encoding (CRF 23):");
println!("{}\n", cmd);
}
// Example 5: Batch processing
println!("5. Batch Processing:");
let files = vec![
("video1.mp4".to_string(), "enhanced1.mp4".to_string()),
("video2.mp4".to_string(), "enhanced2.mp4".to_string()),
("video3.mp4".to_string(), "enhanced3.mp4".to_string()),
];
if let Ok(commands) = manager.batch_ffmpeg_commands("upscale_to_4k", &files, None) {
println!("Batch commands for 4K upscaling:");
for (i, cmd) in commands.iter().enumerate() {
println!(" File {}: {}", i + 1, cmd);
}
println!();
}
// Example 6: Custom options
println!("6. Custom Options:");
let custom_opts = FfmpegCommandOptions::nvidia()
.with_crf(18)
.with_preset("medium")
.with_video_codec("hevc_nvenc")
.with_audio_codec("aac");
if let Ok(cmd) = manager.generate_ffmpeg_command(
"auto_crop_stabilization",
"shaky.mp4",
"stable.mp4",
Some(&custom_opts)
) {
println!("Custom stabilization command:");
println!("{}\n", cmd);
}
drop(manager); // Release lock
// Example 7: Available templates
println!("7. Available Templates:");
let templates = list_available_templates();
println!("You can use any of these {} templates:", templates.len());
for (i, template) in templates.iter().take(8).enumerate() {
println!(" {}. {}", i + 1, template);
}
if templates.len() > 8 {
println!(" ... and {} more", templates.len() - 8);
}
println!();
// Example 8: Command structure explanation
println!("8. Command Structure:");
println!("Generated commands follow this pattern:");
println!(" ffmpeg [input_options] -i \"input.mp4\" [filters] [output_options] \"output.mp4\"");
println!();
println!("Where:");
println!(" • input_options: Hardware acceleration, etc.");
println!(" • filters: Topaz Video AI processing filters");
println!(" • output_options: Codec, quality, format settings");
println!();
println!("=== Usage in Scripts ===");
println!("You can use these commands in shell scripts:");
println!();
println!("Bash/PowerShell example:");
println!("```");
let manager = global_topaz_templates().lock().unwrap();
if let Ok(cmd) = manager.quick_ffmpeg_command("upscale_to_4k", "$input", "$output") {
println!("{}", cmd);
}
drop(manager);
println!("```");
println!();
println!("=== Tips ===");
println!("• Copy the generated commands and run them in your terminal");
println!("• Modify input/output paths as needed");
println!("• Adjust quality settings (CRF) based on your needs:");
println!(" - CRF 12-15: Very high quality, large files");
println!(" - CRF 18-23: Good quality, reasonable file size");
println!(" - CRF 24-28: Lower quality, smaller files");
println!("• Use GPU encoding for faster processing");
println!("• Use CPU encoding for maximum compatibility");
Ok(())
}

View File

@@ -0,0 +1,127 @@
//! Simple Usage Examples
//!
//! This example shows the simplest ways to use the tvai template system
//! for common video processing tasks.
use tvai::*;
use std::path::Path;
#[tokio::main]
async fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
println!("=== Simple Usage Examples ===\n");
// Example 1: Upscale a video to 4K
println!("1. Upscaling to 4K:");
println!(" upscale_to_4k(input, output).await?;");
if Path::new("input.mp4").exists() {
match upscale_to_4k(Path::new("input.mp4"), Path::new("output_4k.mp4")).await {
Ok(_) => println!(" ✓ Successfully upscaled to 4K!"),
Err(e) => println!(" ✗ Error: {}", e),
}
} else {
println!(" (input.mp4 not found - example only)");
}
println!();
// Example 2: Convert to 60fps
println!("2. Converting to 60fps:");
println!(" convert_to_60fps(input, output).await?;");
if Path::new("input.mp4").exists() {
match convert_to_60fps(Path::new("input.mp4"), Path::new("output_60fps.mp4")).await {
Ok(_) => println!(" ✓ Successfully converted to 60fps!"),
Err(e) => println!(" ✗ Error: {}", e),
}
} else {
println!(" (input.mp4 not found - example only)");
}
println!();
// Example 3: Remove noise
println!("3. Removing noise:");
println!(" remove_noise(input, output).await?;");
if Path::new("noisy_video.mp4").exists() {
match remove_noise(Path::new("noisy_video.mp4"), Path::new("clean_video.mp4")).await {
Ok(_) => println!(" ✓ Successfully removed noise!"),
Err(e) => println!(" ✗ Error: {}", e),
}
} else {
println!(" (noisy_video.mp4 not found - example only)");
}
println!();
// Example 4: Create slow motion
println!("4. Creating 4x slow motion:");
println!(" slow_motion_4x(input, output).await?;");
if Path::new("action_video.mp4").exists() {
match slow_motion_4x(Path::new("action_video.mp4"), Path::new("slow_motion.mp4")).await {
Ok(_) => println!(" ✓ Successfully created slow motion!"),
Err(e) => println!(" ✗ Error: {}", e),
}
} else {
println!(" (action_video.mp4 not found - example only)");
}
println!();
// Example 5: Stabilize shaky video
println!("5. Stabilizing shaky video:");
println!(" auto_crop_stabilization(input, output).await?;");
if Path::new("shaky_video.mp4").exists() {
match auto_crop_stabilization(Path::new("shaky_video.mp4"), Path::new("stable_video.mp4")).await {
Ok(_) => println!(" ✓ Successfully stabilized video!"),
Err(e) => println!(" ✗ Error: {}", e),
}
} else {
println!(" (shaky_video.mp4 not found - example only)");
}
println!();
// Example 6: Using any template by name
println!("6. Using any template by name:");
println!(" process_with_template(input, output, \"template_name\").await?;");
if Path::new("film_footage.mp4").exists() {
match process_with_template(
Path::new("film_footage.mp4"),
Path::new("enhanced_film.mp4"),
"film_stock_4k_strong"
).await {
Ok(_) => println!(" ✓ Successfully processed with film stock template!"),
Err(e) => println!(" ✗ Error: {}", e),
}
} else {
println!(" (film_footage.mp4 not found - example only)");
}
println!();
// Show available templates
println!("Available templates:");
let templates = list_available_templates();
for template_name in templates.iter().take(5) {
if let Some((name, _)) = get_template_info(template_name) {
println!("{} ({})", name, template_name);
}
}
if templates.len() > 5 {
println!(" ... and {} more templates", templates.len() - 5);
}
println!();
// Show how to get template information
println!("Getting template information:");
if let Some((name, description)) = get_template_info("upscale_to_4k") {
println!(" Template: {}", name);
println!(" Description: {}", description);
}
println!();
println!("=== That's it! ===");
println!("The tvai template system makes video processing simple and powerful.");
println!("Just choose the right function for your task and let the AI do the work!");
Ok(())
}

View File

@@ -0,0 +1,145 @@
//! Demo of Topaz template system
//!
//! This example demonstrates how to use the built-in Topaz Video AI templates
//! and load custom templates from JSON files.
use tvai::config::topaz_templates::*;
use std::path::Path;
fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("=== Topaz Video AI Template System Demo ===\n");
// Create template manager
let mut manager = TopazTemplateManager::new();
// List all built-in templates
println!("Built-in templates:");
let template_names = manager.list_templates();
for name in &template_names {
if let Some(template) = manager.get_template(name) {
println!("{} - {}", template.name, template.description);
}
}
println!("Total: {} templates\n", template_names.len());
// Demonstrate specific templates
println!("=== Template Details ===");
// Show 4K upscale template
if let Some(template) = manager.get_template("upscale_to_4k") {
println!("Template: {}", template.name);
println!("Description: {}", template.description);
println!("Enhancement active: {}", template.settings.enhance.active);
println!("Enhancement model: {}", template.settings.enhance.model);
println!("Output size method: {}", template.settings.output.out_size_method);
println!();
}
// Show slow motion template
if let Some(template) = manager.get_template("4x_slow_motion") {
println!("Template: {}", template.name);
println!("Description: {}", template.description);
println!("Slow motion active: {}", template.settings.slowmo.active);
println!("Slow motion model: {}", template.settings.slowmo.model);
println!("Slow motion factor: {}", template.settings.slowmo.factor);
println!();
}
// Export a template to JSON
println!("=== Template Export ===");
if let Ok(json) = manager.export_to_json("upscale_to_4k") {
println!("Exported 'upscale_to_4k' template:");
println!("{}", &json[..200]); // Show first 200 characters
println!("...\n");
}
// Try to load templates from examples directory if it exists
let examples_path = Path::new("../../examples");
if examples_path.exists() {
println!("=== Loading from Examples Directory ===");
match manager.load_examples_templates(examples_path) {
Ok(count) => {
println!("Successfully loaded {} templates from examples directory", count);
// List all templates again
let all_templates = manager.list_templates();
println!("Total templates now: {}", all_templates.len());
// Show some loaded templates
for name in all_templates.iter().take(5) {
if let Some(template) = manager.get_template(name) {
println!("{} - {}", template.name, template.description);
}
}
}
Err(e) => {
println!("Failed to load from examples directory: {}", e);
}
}
} else {
println!("Examples directory not found at {:?}", examples_path);
}
// Demonstrate template validation
println!("\n=== Template Validation ===");
let test_template = BuiltinTemplates::upscale_to_4k();
match manager.validate_template(&test_template) {
Ok(()) => println!("✓ Template validation passed"),
Err(e) => println!("✗ Template validation failed: {}", e),
}
// Test invalid template
let mut invalid_template = test_template.clone();
invalid_template.settings.enhance.model = "invalid-model".to_string();
match manager.validate_template(&invalid_template) {
Ok(()) => println!("✗ Invalid template passed validation (unexpected)"),
Err(e) => println!("✓ Invalid template correctly rejected: {}", e),
}
// Demonstrate template application
println!("\n=== Template Application ===");
match manager.apply_template("upscale_to_4k") {
Ok(applied) => {
println!("✓ Applied template: {}", applied.name);
println!(" Description: {}", applied.description);
println!(" Stabilization enabled: {}", applied.stabilization_enabled);
println!(" Grain enabled: {}", applied.grain_enabled);
if let Some(upscale) = &applied.enhance_params.upscale {
println!(" Upscale settings:");
println!(" Scale factor: {}", upscale.scale_factor);
println!(" Model: {:?}", upscale.model);
println!(" Compression: {}", upscale.compression);
println!(" Noise reduction: {}", upscale.noise);
println!(" Detail enhancement: {}", upscale.details);
}
if let Some(interpolation) = &applied.enhance_params.interpolation {
println!(" Interpolation settings:");
println!(" Multiplier: {}", interpolation.multiplier);
println!(" Model: {:?}", interpolation.model);
println!(" Input FPS: {}", interpolation.input_fps);
}
if let Some(fps) = applied.output_fps {
println!(" Output FPS: {}", fps);
}
}
Err(e) => println!("✗ Failed to apply template: {}", e),
}
// Test slow motion template
match manager.apply_template("4x_slow_motion") {
Ok(applied) => {
println!("\n✓ Applied slow motion template: {}", applied.name);
if let Some(interpolation) = &applied.enhance_params.interpolation {
println!(" Slow motion factor: {}", interpolation.multiplier);
println!(" Model: {:?}", interpolation.model);
}
}
Err(e) => println!("\n✗ Failed to apply slow motion template: {}", e),
}
println!("\n=== Demo Complete ===");
Ok(())
}

View File

@@ -0,0 +1,218 @@
//! Third Real Command Analysis Demo
//!
//! This example demonstrates the two-pass processing and complex filter chains
//! discovered from the third real Topaz Video AI command.
use tvai::*;
fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
println!("=== Third Real Command Analysis Demo ===\n");
println!("Demonstrating two-pass processing and complex filter chains\n");
let manager = global_topaz_templates().lock().unwrap();
// Demo 1: Two-pass processing
println!("1. Two-Pass Processing (MAJOR DISCOVERY!):");
println!("Real Topaz uses: Analysis Pass + Processing Pass");
let two_pass_opts = FfmpegCommandOptions::complex_processing()
.with_time_range(Some(0.0), Some(5.016666484785481))
.with_two_pass(Some("/tmp/tvai".to_string()));
match manager.generate_two_pass_commands("film_stock_4k_strong", "input.mp4", "output.mov", Some(&two_pass_opts)) {
Ok((analysis_cmd, processing_cmd)) => {
println!("Analysis Pass (Stage 1):");
println!("{}\n", analysis_cmd);
println!("Processing Pass (Stage 2):");
println!("{}\n", processing_cmd);
// Analyze the commands
if analysis_cmd.contains("tvai_cpe") {
println!("✅ Analysis pass uses tvai_cpe filter");
}
if analysis_cmd.contains("-f null") {
println!("✅ Analysis pass outputs to null (no video)");
}
if processing_cmd.contains("tvai_stb") {
println!("✅ Processing pass uses tvai_stb for stabilization");
}
if processing_cmd.contains("nostdin") && processing_cmd.contains("nostats") {
println!("✅ Processing pass has proper flags");
}
}
Err(e) => println!("Two-pass error: {}", e),
}
// Demo 2: Complex filter chain analysis
println!("2. Complex Filter Chain (6+ Filters!):");
println!("Real command had: tvai_stb,tvai_up,tvai_fi,scale,tvai_up,tvai_up,setparams");
// Create a template that would use all filters
let complex_opts = FfmpegCommandOptions::complex_processing()
.with_pre_scale(544, -1)
.with_hdr_params(0.7, 0.13, 0.1);
match manager.generate_ffmpeg_command("film_stock_4k_strong", "input.mp4", "output.mov", Some(&complex_opts)) {
Ok(cmd) => {
println!("Generated complex filter chain:");
// Extract and analyze the filter complex
if let Some(start) = cmd.find("-filter_complex") {
if let Some(filter_start) = cmd[start..].find("\"") {
if let Some(filter_end) = cmd[start + filter_start + 1..].find("\"") {
let filters = &cmd[start + filter_start + 1..start + filter_start + 1 + filter_end];
println!("Filters: {}\n", filters);
// Count and identify filters
let filter_count = filters.matches(",").count() + 1;
println!("Filter count: {}", filter_count);
if filters.contains("tvai_stb") { println!("✅ Stabilization (tvai_stb)"); }
if filters.contains("tvai_up") {
let up_count = filters.matches("tvai_up").count();
println!("✅ Enhancement ({} tvai_up filters)", up_count);
}
if filters.contains("tvai_fi") { println!("✅ Frame interpolation (tvai_fi)"); }
if filters.contains("scale=") { println!("✅ Pre-scaling (scale)"); }
if filters.contains("setparams") { println!("✅ Color space (setparams)"); }
}
}
}
println!();
}
Err(e) => println!("Complex filter error: {}", e),
}
// Demo 3: New filter parameters
println!("3. New Filter Parameters (DETAILED!):");
// Show tvai_stb parameters
println!("tvai_stb parameters discovered:");
println!(" • filename - uses analysis config file");
println!(" • smoothness - converted from template smooth value");
println!(" • rst - rolling shutter correction");
println!(" • cache, dof, ws - performance parameters");
println!(" • roll, reduce - motion reduction settings");
// Show tvai_up parameters
println!("\ntvai_up parameters discovered:");
println!(" • prenoise - pre-noise processing");
println!(" • grain, gsize - grain parameters");
println!(" • parameters='...' - complex HDR parameters");
// Show tvai_fi parameters
println!("\ntvai_fi parameters discovered:");
println!(" • fps - target frame rate");
println!(" • rdt - duplicate threshold");
println!();
// Demo 4: HDR processing
println!("4. HDR Processing (COMPLETELY NEW!):");
println!("Real command had HDR with complex parameters and color space conversion");
let hdr_opts = FfmpegCommandOptions::topaz_like()
.with_hdr_params(0.7, 0.13, 0.1);
// Test with a template that has HDR settings
if let Some(template) = manager.get_template("film_stock_4k_strong") {
println!("Template HDR settings:");
if let Some(hdr) = &template.settings.hdr {
println!(" • HDR active: {}", hdr.active);
println!(" • HDR model: {}", hdr.model);
println!(" • SDR inflection point: {}", hdr.sdr_inflection_point);
println!(" • Exposure: {}", hdr.exposure);
println!(" • Saturation: {}", hdr.saturation);
}
match manager.generate_ffmpeg_command("film_stock_4k_strong", "input.mp4", "output.mov", Some(&hdr_opts)) {
Ok(cmd) => {
if cmd.contains("parameters=") {
println!("✅ Complex HDR parameters included");
}
if cmd.contains("setparams=") {
println!("✅ Color space conversion included");
}
if cmd.contains("bt2020") {
println!("✅ BT.2020 color space");
}
if cmd.contains("smpte2084") {
println!("✅ SMPTE 2084 (PQ) transfer function");
}
}
Err(e) => println!("HDR command error: {}", e),
}
}
println!();
// Demo 5: Enhanced metadata
println!("5. Enhanced Metadata (VERY DETAILED!):");
println!("Real metadata: 'Stabilized auto-crop fixing rolling shutter and with smoothness 41. Motion blur removed using thm-2. Slowmo 200% and framerate changed to 30 using apo-8 replacing duplicate frames. Enhanced using ghq-5; and add noise at 2. HDR Enhanced using hyp-1; exposure at 0.13; saturation at 0.1; and highlight threshold at 0.7'");
match manager.generate_ffmpeg_command("film_stock_4k_strong", "input.mp4", "output.mov", Some(&complex_opts)) {
Ok(cmd) => {
if let Some(start) = cmd.find("videoai=") {
if let Some(end) = cmd[start..].find(" \"") {
let metadata = &cmd[start..start + end];
println!("\nGenerated metadata:");
println!("{}", metadata);
// Check for detailed components
if metadata.contains("Stabilized") { println!("✅ Stabilization info"); }
if metadata.contains("Motion blur") { println!("✅ Motion blur info"); }
if metadata.contains("Slowmo") { println!("✅ Slow motion info"); }
if metadata.contains("Enhanced") { println!("✅ Enhancement info"); }
if metadata.contains("HDR") { println!("✅ HDR processing info"); }
}
}
}
Err(e) => println!("Metadata error: {}", e),
}
println!();
// Demo 6: Parameter usage comparison
println!("6. Parameter Usage Rate Explosion!");
println!("Based on the third real command, we can now use:");
println!("StabilizeSettings: 100% (6/6) - ALL PARAMETERS!");
println!(" ✅ active → controls tvai_stb");
println!(" ✅ smooth → tvai_stb smoothness");
println!(" ✅ method → tvai_stb processing mode");
println!(" ✅ rsc → tvai_stb rst parameter");
println!(" ✅ reduce_motion → tvai_stb reduce");
println!(" ✅ reduce_motion_iteration → tvai_stb iterations");
println!("\nMotionBlurSettings: 100% (3/3) - ALL PARAMETERS!");
println!(" ✅ active → controls tvai_up thm-2");
println!(" ✅ model → tvai_up model selection");
println!(" ✅ model_name → backup model");
println!("\nHdrSettings: 100% (9/9) - ALL PARAMETERS!");
println!(" ✅ active → controls tvai_up hyp-1");
println!(" ✅ model → tvai_up model");
println!(" ✅ sdr_inflection_point → parameters sdr_ip");
println!(" ✅ exposure → parameters hdr_ip_adjust");
println!(" ✅ saturation → parameters saturate");
println!(" ✅ + color space conversion with setparams");
println!("\nGrainSettings: 100% (3/3) - ALL PARAMETERS!");
println!(" ✅ active → controls grain processing");
println!(" ✅ grain → tvai_up grain parameter");
println!(" ✅ grain_size → tvai_up gsize parameter");
drop(manager);
println!("\n=== Third Command Analysis Summary ===");
println!("🎯 MAJOR DISCOVERIES:");
println!(" • Two-pass processing: Analysis + Processing");
println!(" • Complex filter chains: 6+ filters in sequence");
println!(" • New filter types: tvai_cpe, tvai_stb, setparams");
println!(" • Complete HDR pipeline: processing + color space");
println!(" • Detailed parameter mapping: almost everything has a use");
println!();
println!("📈 Parameter usage rate: ~75% (vs 45% before)!");
println!("🎉 Four setting categories now at 100% usage!");
println!("🚀 Commands now match real Topaz Video AI complexity!");
Ok(())
}

View File

@@ -0,0 +1,264 @@
//! Video Processing Workflow Example
//!
//! This example demonstrates a complete video processing workflow
//! using the template system for different types of video content.
use tvai::*;
use std::path::Path;
use std::time::Instant;
#[tokio::main]
async fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
println!("=== Video Processing Workflow Demo ===\n");
// Check if Topaz Video AI is available
match detect_topaz_installation() {
Some(path) => {
println!("✓ Topaz Video AI found at: {:?}", path);
}
None => {
println!("⚠ Topaz Video AI not found. This demo will show the workflow without actual processing.");
println!(" Install Topaz Video AI to run actual video processing.\n");
}
}
// List available templates
println!("Available processing templates:");
let templates = list_available_templates();
for (i, template_name) in templates.iter().enumerate() {
if let Some((name, description)) = get_template_info(template_name) {
println!(" {}. {} ({})", i + 1, name, template_name);
println!(" {}", description);
}
}
println!();
// Demonstrate different workflow scenarios
demonstrate_upscaling_workflow().await?;
demonstrate_frame_rate_workflow().await?;
demonstrate_restoration_workflow().await?;
demonstrate_creative_workflow().await?;
demonstrate_batch_processing().await?;
println!("=== Workflow Demo Complete ===");
Ok(())
}
/// Demonstrate video upscaling workflow
async fn demonstrate_upscaling_workflow() -> std::result::Result<(), Box<dyn std::error::Error>> {
println!("=== Upscaling Workflow ===");
let input_path = Path::new("examples/sample_video.mp4");
let output_path = Path::new("output/upscaled_4k.mp4");
println!("Scenario: Upscaling a low-resolution video to 4K");
println!("Input: {:?}", input_path);
println!("Output: {:?}", output_path);
println!("Template: upscale_to_4k");
// Show what the template would do
let manager = global_topaz_templates().lock().unwrap();
if let Ok(applied) = manager.apply_template("upscale_to_4k") {
println!("Processing parameters:");
if let Some(upscale) = &applied.enhance_params.upscale {
println!(" • Scale factor: {}x", upscale.scale_factor);
println!(" • AI Model: {:?}", upscale.model);
println!(" • Quality preset: {:?}", upscale.quality_preset);
println!(" • Compression: {}", upscale.compression);
}
}
drop(manager);
// Simulate processing (would actually process if files exist)
if input_path.exists() {
println!("Processing...");
let start = Instant::now();
match upscale_to_4k(input_path, output_path).await {
Ok(result) => {
println!("✓ Processing completed successfully!");
println!(" Processing time: {:?}", result.processing_time);
println!(" Output file: {:?}", result.output_path);
}
Err(e) => {
println!("✗ Processing failed: {}", e);
println!(" Suggestion: {}", e.user_friendly_message());
}
}
} else {
println!("⚠ Input file not found - showing workflow only");
println!(" Would process: {:?} -> {:?}", input_path, output_path);
}
println!();
Ok(())
}
/// Demonstrate frame rate conversion workflow
async fn demonstrate_frame_rate_workflow() -> std::result::Result<(), Box<dyn std::error::Error>> {
println!("=== Frame Rate Conversion Workflow ===");
let input_path = Path::new("examples/low_fps_video.mp4");
let output_path = Path::new("output/smooth_60fps.mp4");
println!("Scenario: Converting 24fps video to smooth 60fps");
println!("Input: {:?}", input_path);
println!("Output: {:?}", output_path);
println!("Template: convert_to_60fps");
// Show template parameters
let manager = global_topaz_templates().lock().unwrap();
if let Ok(applied) = manager.apply_template("convert_to_60fps") {
println!("Processing parameters:");
if let Some(interpolation) = &applied.enhance_params.interpolation {
println!(" • Interpolation model: {:?}", interpolation.model);
println!(" • Multiplier: {}x", interpolation.multiplier);
println!(" • Target FPS: {:?}", interpolation.target_fps);
}
if let Some(fps) = applied.output_fps {
println!(" • Output frame rate: {} fps", fps);
}
}
drop(manager);
if input_path.exists() {
println!("Processing...");
match convert_to_60fps(input_path, output_path).await {
Ok(result) => {
println!("✓ Frame rate conversion completed!");
println!(" Processing time: {:?}", result.processing_time);
}
Err(e) => {
println!("✗ Processing failed: {}", e);
}
}
} else {
println!("⚠ Input file not found - showing workflow only");
}
println!();
Ok(())
}
/// Demonstrate video restoration workflow
async fn demonstrate_restoration_workflow() -> std::result::Result<(), Box<dyn std::error::Error>> {
println!("=== Video Restoration Workflow ===");
let input_path = Path::new("examples/noisy_old_video.mp4");
let output_path = Path::new("output/restored_clean.mp4");
println!("Scenario: Restoring old, noisy video footage");
println!("Input: {:?}", input_path);
println!("Output: {:?}", output_path);
println!("Template: remove_noise");
// Show restoration parameters
let manager = global_topaz_templates().lock().unwrap();
if let Ok(applied) = manager.apply_template("remove_noise") {
println!("Processing parameters:");
if let Some(upscale) = &applied.enhance_params.upscale {
println!(" • AI Model: {:?} (specialized for noise reduction)", upscale.model);
println!(" • Noise reduction: {}", upscale.noise);
println!(" • Detail preservation: {}", upscale.details);
}
}
drop(manager);
if input_path.exists() {
println!("Processing...");
match remove_noise(input_path, output_path).await {
Ok(result) => {
println!("✓ Video restoration completed!");
println!(" Processing time: {:?}", result.processing_time);
}
Err(e) => {
println!("✗ Processing failed: {}", e);
}
}
} else {
println!("⚠ Input file not found - showing workflow only");
}
println!();
Ok(())
}
/// Demonstrate creative effects workflow
async fn demonstrate_creative_workflow() -> std::result::Result<(), Box<dyn std::error::Error>> {
println!("=== Creative Effects Workflow ===");
let input_path = Path::new("examples/action_video.mp4");
let output_path = Path::new("output/epic_slow_motion.mp4");
println!("Scenario: Creating cinematic slow motion effect");
println!("Input: {:?}", input_path);
println!("Output: {:?}", output_path);
println!("Template: 4x_slow_motion");
// Show creative parameters
let manager = global_topaz_templates().lock().unwrap();
if let Ok(applied) = manager.apply_template("4x_slow_motion") {
println!("Processing parameters:");
if let Some(interpolation) = &applied.enhance_params.interpolation {
println!(" • Slow motion factor: {}x", interpolation.multiplier);
println!(" • Interpolation model: {:?}", interpolation.model);
println!(" • Input FPS: {}", interpolation.input_fps);
}
}
drop(manager);
if input_path.exists() {
println!("Processing...");
match slow_motion_4x(input_path, output_path).await {
Ok(result) => {
println!("✓ Slow motion effect created!");
println!(" Processing time: {:?}", result.processing_time);
}
Err(e) => {
println!("✗ Processing failed: {}", e);
}
}
} else {
println!("⚠ Input file not found - showing workflow only");
}
println!();
Ok(())
}
/// Demonstrate batch processing workflow
async fn demonstrate_batch_processing() -> std::result::Result<(), Box<dyn std::error::Error>> {
println!("=== Batch Processing Workflow ===");
let input_files = vec![
("examples/video1.mp4", "output/video1_enhanced.mp4", "upscale_to_4k"),
("examples/video2.mp4", "output/video2_smooth.mp4", "convert_to_60fps"),
("examples/video3.mp4", "output/video3_clean.mp4", "remove_noise"),
];
println!("Scenario: Processing multiple videos with different templates");
for (input, output, template) in &input_files {
println!("\nProcessing: {} -> {} (template: {})", input, output, template);
let input_path = Path::new(input);
let output_path = Path::new(output);
if input_path.exists() {
match process_with_template(input_path, output_path, template).await {
Ok(result) => {
println!(" ✓ Completed in {:?}", result.processing_time);
}
Err(e) => {
println!(" ✗ Failed: {}", e);
}
}
} else {
println!(" ⚠ Input file not found - would process with template '{}'", template);
}
}
println!("\nBatch processing workflow complete!");
println!();
Ok(())
}

View File

@@ -0,0 +1,245 @@
//! Web Integration Demo
//!
//! This example demonstrates the web API integration for the Topaz Video AI
//! parameter configurator, showing how the web interface connects to the Rust backend.
use tvai::*;
use serde_json;
fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
println!("=== Topaz Video AI Web Integration Demo ===\n");
println!("Demonstrating the web API integration for the parameter configurator\n");
// Demo 1: Get available templates
println!("1. 获取可用模板:");
match WebApi::get_templates() {
Ok(templates) => {
println!("找到 {} 个内置模板:", templates.len());
for template in &templates {
println!("{} - {}", template.name, template.description);
}
println!();
}
Err(e) => println!("获取模板失败: {}", e),
}
// Demo 2: Simulate web request for single-pass processing
println!("2. 模拟单阶段处理请求:");
let single_request = web_api::GenerateCommandRequest {
settings: create_sample_web_settings(),
input_file: "input_video.mp4".to_string(),
output_file: "output_enhanced.mp4".to_string(),
processing_mode: web_api::ProcessingMode::Single,
rate_control: "constqp".to_string(),
};
let response = WebApi::generate_command(single_request);
if response.success {
if let Some(cmd) = response.single_command {
println!("生成的单阶段命令:");
println!("{}\n", cmd);
}
println!("使用统计:");
println!(" • 启用的功能: {:?}", response.usage_stats.enabled_features);
println!(" • 滤镜数量: {}", response.usage_stats.filter_count);
println!(" • 参数使用率: {}%", response.usage_stats.parameter_usage_rate);
println!(" • 处理复杂度: {}", response.usage_stats.processing_complexity);
println!(" • 预估处理时间: {}", response.usage_stats.estimated_processing_time);
println!();
} else {
println!("命令生成失败: {:?}", response.error);
}
// Demo 3: Simulate web request for two-pass processing
println!("3. 模拟两阶段处理请求:");
let two_pass_request = web_api::GenerateCommandRequest {
settings: create_complex_web_settings(),
input_file: "complex_input.mp4".to_string(),
output_file: "complex_output.mov".to_string(),
processing_mode: web_api::ProcessingMode::TwoPass,
rate_control: "cbr".to_string(),
};
let response = WebApi::generate_command(two_pass_request);
if response.success {
if let Some(analysis_cmd) = response.analysis_command {
println!("分析阶段命令:");
println!("{}\n", analysis_cmd);
}
if let Some(processing_cmd) = response.processing_command {
println!("处理阶段命令:");
println!("{}\n", processing_cmd);
}
println!("复杂处理统计:");
println!(" • 启用的功能: {:?}", response.usage_stats.enabled_features);
println!(" • 滤镜数量: {}", response.usage_stats.filter_count);
println!(" • 处理复杂度: {}", response.usage_stats.processing_complexity);
println!();
} else {
println!("两阶段命令生成失败: {:?}", response.error);
}
// Demo 4: JSON serialization example (for web API)
println!("4. JSON 序列化示例 (用于 Web API):");
let sample_settings = create_sample_web_settings();
match serde_json::to_string_pretty(&sample_settings) {
Ok(json) => {
println!("Web 设置 JSON 格式:");
println!("{}\n", json);
}
Err(e) => println!("JSON 序列化失败: {}", e),
}
// Demo 5: Show parameter mapping
println!("5. 参数映射演示:");
println!("Web 表单参数 → Rust 结构体 → FFmpeg 命令");
println!(" stabilize.active: true → StabilizeSettings.active → tvai_stb 滤镜");
println!(" enhance.model: 'prob-4' → EnhanceSettings.model → tvai_up model 参数");
println!(" slowmo.factor: 4 → SlowMotionSettings.factor → tvai_fi slowmo 参数");
println!(" hdr.active: true → HdrSettings.active → tvai_up hyp-1 + setparams");
println!(" rate_control: 'cbr' → RateControlMode::ConstantBitrate → -rc cbr -b:v 24M");
println!();
println!("=== Web Integration Summary ===");
println!("🌐 Web API 功能:");
println!(" • 模板获取: WebApi::get_templates()");
println!(" • 命令生成: WebApi::generate_command()");
println!(" • JSON 序列化: 完整支持 serde");
println!(" • 错误处理: 统一的错误响应格式");
println!();
println!("🔧 集成特性:");
println!(" • TypeScript 类型安全");
println!(" • React 组件化界面");
println!(" • 实时参数验证");
println!(" • 命令预览和复制");
println!(" • 模板自动填充");
println!();
println!("📊 技术栈:");
println!(" • 后端: Rust + Serde + Topaz Video AI 库");
println!(" • 前端: React + TypeScript + Tailwind CSS");
println!(" • 通信: JSON API");
println!(" • 集成: Desktop 应用内嵌页面");
Ok(())
}
// 创建示例 Web 设置 (简单)
fn create_sample_web_settings() -> web_api::WebTopazSettings {
web_api::WebTopazSettings {
stabilize: web_api::WebStabilizeSettings {
active: true,
smooth: 50,
method: 1,
reduce_motion: 2,
reduce_motion_iteration: 2,
rsc: false,
},
motionblur: web_api::WebMotionBlurSettings {
active: false,
model: "thm-2".to_string(),
model_name: "thm-2".to_string(),
},
slowmo: web_api::WebSlowMotionSettings {
active: true,
model: "apo-8".to_string(),
factor: 4,
duplicate_threshold: 10.0,
duplicate: true,
},
enhance: web_api::WebEnhanceSettings {
active: true,
model: "prob-4".to_string(),
video_type: 1,
compress: 0,
detail: 30,
sharpen: 20,
denoise: 15,
dehalo: 10,
deblur: 5,
auto: 0,
recover_original_detail_value: 20,
},
grain: web_api::WebGrainSettings {
active: false,
grain: 5,
grain_size: 2,
},
hdr: web_api::WebHdrSettings {
active: false,
model: "hyp-1".to_string(),
auto: 0,
exposure: 0,
saturation: 0,
sdr_inflection_point: 0.7,
},
output: web_api::WebOutputSettings {
active: true,
out_size_method: 2, // 3x upscale
out_fps: 0,
crop_to_fit: false,
lock_aspect_ratio: true,
},
}
}
// 创建复杂 Web 设置 (包含所有功能)
fn create_complex_web_settings() -> web_api::WebTopazSettings {
web_api::WebTopazSettings {
stabilize: web_api::WebStabilizeSettings {
active: true,
smooth: 60,
method: 1,
reduce_motion: 3,
reduce_motion_iteration: 3,
rsc: true,
},
motionblur: web_api::WebMotionBlurSettings {
active: true,
model: "thm-2".to_string(),
model_name: "thm-2".to_string(),
},
slowmo: web_api::WebSlowMotionSettings {
active: true,
model: "apo-8".to_string(),
factor: 2,
duplicate_threshold: 5.0,
duplicate: true,
},
enhance: web_api::WebEnhanceSettings {
active: true,
model: "ghq-5".to_string(),
video_type: 1,
compress: 10,
detail: 50,
sharpen: 40,
denoise: 30,
dehalo: 20,
deblur: 60,
auto: 0,
recover_original_detail_value: 25,
},
grain: web_api::WebGrainSettings {
active: true,
grain: 8,
grain_size: 3,
},
hdr: web_api::WebHdrSettings {
active: true,
model: "hyp-1".to_string(),
auto: 50,
exposure: 15,
saturation: 12,
sdr_inflection_point: 0.7,
},
output: web_api::WebOutputSettings {
active: true,
out_size_method: 3, // 4x upscale
out_fps: 60,
crop_to_fit: false,
lock_aspect_ratio: true,
},
}
}