Extract Text (OCR):
src/FrameShift/ProgramOcr.cs— Explorer queue, picker and model preparation.src/FrameShift/Windows/AI/ExtractTextPickerForm.cs— native WinForms options.src/FrameShift/Core/AI/Ocr/— verified model downloads, ONNX inference, geometry, PDFium, output and cancellation.tests/FrameShift.Tests/Ocr*Tests.cs— OCR, native/scanned/mixed PDF, rotation, UI and cleanup qualification.- Feature and CLI guide.
Index court des fichiers actifs du projet.
Pour construire une future fenêtre, commencer par le guide de développement UI, puis retrouver ici les composants et exemples actifs. Le contrat du socle et le standard visuel restent les références communes.
Règles de lecture :
- code actif uniquement ;
references/exclus ;bin/etobj/exclus ;- focus sur les fichiers maintenus à la main.
src/FrameShift/Program.cssrc/FrameShift/ProgramCli.cssrc/FrameShift/ProgramBatch.cssrc/FrameShift/ProgramAiPreflight.cssrc/FrameShift/ProgramImageToPdf.cssrc/FrameShift/ProgramJoinVideos.cssrc/FrameShift/ProgramRemoveObject.cssrc/FrameShift/ProgramPickersConversion.cssrc/FrameShift/ProgramPickersCut.cssrc/FrameShift/ProgramPickersImage.cssrc/FrameShift/ProgramPickersSubtitles.cssrc/FrameShift/ProgramPickersResizeCompress.cssrc/FrameShift/ProgramPickersTiming.cssrc/FrameShift/FrameShift.csprojsrc/FrameShift.SubtitlesWorker/FrameShift.SubtitlesWorker.csprojsrc/FrameShift.SubtitlesWorker/Program.cssrc/FrameShift.SubtitlesWorker/native-dml/THIRD_PARTY_NOTICES.txttests/FrameShift.Tests/FrameShift.Tests.csprojinstaller/FrameShift.issbuild_installer.ps1build_all.ps1
Infrastructure :
src/FrameShift/Core/Actions/ActionDescriptor.cssrc/FrameShift/Core/Actions/ActionExecutionResult.cssrc/FrameShift/Core/Actions/ActionOptionKeys.cssrc/FrameShift/Core/Actions/ActionQueueRunner.cssrc/FrameShift/Core/Actions/ActionRegistry.cssrc/FrameShift/Core/Actions/ActionRequest.cssrc/FrameShift/Core/Actions/AddSubtitlesToVideoAction.cssrc/FrameShift/Core/Actions/AddSubtitlesToVideoMode.cssrc/FrameShift/Core/Actions/AddSubtitlesToVideoPlanner.cssrc/FrameShift/Core/Actions/AddSubtitlesToVideoBurnAppearance.cssrc/FrameShift/Core/Actions/AddSubtitlesToVideoSettings.cssrc/FrameShift/Core/Actions/AddSubtitlesToVideoSubtitleSourceLoader.cssrc/FrameShift/Core/Actions/CancellationScope.cssrc/FrameShift/Core/Actions/ConversionActionHelper.cssrc/FrameShift/Core/Actions/IConversionChoice.cssrc/FrameShift/Core/Actions/IFrameShiftAction.cssrc/FrameShift/Core/Actions/MediaActionMessages.cs
Conversion et catalogues :
src/FrameShift/Core/Actions/AudioConversionCatalog.cssrc/FrameShift/Core/Actions/ImageConversionCatalog.cssrc/FrameShift/Core/Actions/VideoConversionCatalog.cssrc/FrameShift/Core/Actions/VideoConversionPlan.cssrc/FrameShift/Core/Actions/VideoConversionPlanner.cssrc/FrameShift/Core/Actions/ConversionSelection.cssrc/FrameShift/Core/Actions/ConvertAudioAction.cssrc/FrameShift/Core/Actions/ConvertImageAction.cssrc/FrameShift/Core/Actions/ConvertVideoAction.cs
Compression :
src/FrameShift/Core/Actions/CompressAudioAction.cssrc/FrameShift/Core/Actions/CompressAudioSettings.cssrc/FrameShift/Core/Actions/CompressImageAction.cssrc/FrameShift/Core/Actions/CompressImageSettings.cssrc/FrameShift/Core/Actions/CompressVideoAction.cssrc/FrameShift/Core/Actions/VideoCompressionCatalog.cssrc/FrameShift/Core/Actions/VideoCompressionPlan.cssrc/FrameShift/Core/Actions/VideoCompressionPlanner.cssrc/FrameShift/Core/Actions/VideoCompressionProfile.cssrc/FrameShift/Core/Actions/VideoCompressionTarget.cs
Audio :
src/FrameShift/Core/Actions/ChangeAudioSpeedAction.cssrc/FrameShift/Core/Actions/ChangePitchAction.cssrc/FrameShift/Core/Actions/ChangePitchSettings.cssrc/FrameShift/Core/Actions/ChangeSpeedSettings.cssrc/FrameShift/Core/Actions/CutAudioAction.cssrc/FrameShift/Core/Actions/CutAudioEditingService.cssrc/FrameShift/Core/Actions/CutAudioSettings.cssrc/FrameShift/Core/Actions/ReverseAudioAction.cs
Vidéo :
src/FrameShift/Core/Actions/ChangeVideoSpeedAction.cssrc/FrameShift/Core/Actions/CreateGifAction.cssrc/FrameShift/Core/Actions/CreateGifSettings.cssrc/FrameShift/Core/Actions/CropVideoAction.cssrc/FrameShift/Core/Actions/CutVideoAction.cssrc/FrameShift/Core/Actions/CutVideoMath.cssrc/FrameShift/Core/Actions/CutVideoSettings.cssrc/FrameShift/Core/Actions/ExtractAudioAction.cssrc/FrameShift/Core/Actions/ExtractAudioCatalog.cssrc/FrameShift/Core/Actions/ExtractFramesAction.cssrc/FrameShift/Core/Actions/ExtractFramesSettings.cssrc/FrameShift/Core/Actions/JoinVideosAction.cssrc/FrameShift/Core/Actions/JoinVideosSettings.cssrc/FrameShift/Core/Actions/JoinVideosPlanner.cssrc/FrameShift/Core/Actions/InterpolateVideoAction.cssrc/FrameShift/Core/Actions/RifeInterpolateVideoAction.cssrc/FrameShift/Core/Actions/InterpolateVideoSettings.cssrc/FrameShift/Core/Actions/RifeInterpolateVideoSettings.cssrc/FrameShift/Core/Actions/RemoveAudioAction.cssrc/FrameShift/Core/Actions/ResizeVideoAction.cssrc/FrameShift/Core/Actions/ResizeSettings.cssrc/FrameShift/Core/Actions/RotateFlipVideoAction.cssrc/FrameShift/Core/Actions/RotateFlipSettings.cssrc/FrameShift/Core/Actions/VideoCropSettings.cs
Image :
src/FrameShift/Core/Actions/CompressImageAction.cssrc/FrameShift/Core/Actions/ConvertToIconAction.cssrc/FrameShift/Core/Actions/ConvertToIconSettings.cssrc/FrameShift/Core/Actions/CropImageAction.cssrc/FrameShift/Core/Actions/ImageToPdfAction.cssrc/FrameShift/Core/Actions/ImageToPdfCropSettings.cssrc/FrameShift/Core/Actions/ImageToPdfItemSettings.cssrc/FrameShift/Core/Actions/ImageToPdfSettings.cssrc/FrameShift/Core/Actions/ResizeImageAction.cssrc/FrameShift/Core/Actions/RotateFlipImageAction.cs
Media Info :
src/FrameShift/Core/Actions/MediaInfoAction.cssrc/FrameShift/Core/Actions/MediaInfoFormatter.cs
src/FrameShift/Core/FFmpeg/FfmpegRunner.cssrc/FrameShift/Core/FFprobe/FfprobeRunner.cssrc/FrameShift/Core/FFprobe/MediaProbeResult.cssrc/FrameShift/Core/FFprobe/MediaStreamInfo.cssrc/FrameShift/Core/FFprobe/MediaInfoData.cssrc/FrameShift/Core/FFprobe/JoinVideoProbeResult.cs
src/FrameShift/Core/Helpers/ImageCropSupport.cssrc/FrameShift/Core/Helpers/ImageToPdfGeometry.cssrc/FrameShift/Core/Helpers/ImageToPdfPdfExporter.cssrc/FrameShift/Core/Helpers/OutputPathHelper.cssrc/FrameShift/Core/Helpers/ToolLocator.cssrc/FrameShift/Core/Logging/AppLogger.cssrc/FrameShift/Core/Progress/IProgressReporter.cs
src/FrameShift/Core/AI/AiModelDownloadProgress.cssrc/FrameShift/Core/AI/AiModelFileDownloader.cssrc/FrameShift/Core/AI/AiModelDirectorySafety.cssrc/FrameShift/Core/AI/AiModelSettings.cssrc/FrameShift/Core/AI/OnnxProviderHelper.cssrc/FrameShift/Core/AI/CreateSubtitles/CreateSubtitlesAction.cssrc/FrameShift/Core/AI/CreateSubtitles/CreateSubtitlesModelCatalog.cssrc/FrameShift/Core/AI/CreateSubtitles/CreateSubtitlesModelLocator.cssrc/FrameShift/Core/AI/CreateSubtitles/CreateSubtitlesModelDownloader.cssrc/FrameShift/Core/AI/CreateSubtitles/CreateSubtitlesAssPreset.cssrc/FrameShift/Core/AI/CreateSubtitles/CreateSubtitlesAssDiagnostic.cssrc/FrameShift/Core/AI/CreateSubtitles/CreateSubtitlesOutputFormat.cssrc/FrameShift/Core/AI/CreateSubtitles/CreateSubtitlesProtocol.cssrc/FrameShift/Core/AI/CreateSubtitles/CreateSubtitlesAss.cssrc/FrameShift/Core/AI/CreateSubtitles/CreateSubtitlesProjectSerialization.cssrc/FrameShift/Core/AI/CreateSubtitles/CreateSubtitlesSrt.cssrc/FrameShift/Core/AI/CreateSubtitles/SubtitleProject.cssrc/FrameShift/Core/AI/CreateSubtitles/CreateSubtitlesWorkerRunner.cssrc/FrameShift/Core/AI/RemoveBackground/BackgroundRemovalModelCatalog.cssrc/FrameShift/Core/AI/RemoveBackground/BackgroundRemovalModelDefinition.cssrc/FrameShift/Core/AI/RemoveBackground/BackgroundRemovalEngine.cssrc/FrameShift/Core/AI/RemoveBackground/IBackgroundRemovalEngine.cssrc/FrameShift/Core/AI/RemoveBackground/ModelDownloader.cssrc/FrameShift/Core/AI/RemoveBackground/ModelLocator.cssrc/FrameShift/Core/AI/RemoveBackground/RemoveBackgroundAction.cssrc/FrameShift/Core/AI/SeparateAudio/AudioChunkReader.cssrc/FrameShift/Core/AI/SeparateAudio/AudioSeparationEngine.cssrc/FrameShift/Core/AI/SeparateAudio/AudioStemWriter.cssrc/FrameShift/Core/AI/SeparateAudio/HostSpectro.cssrc/FrameShift/Core/AI/SeparateAudio/ModelDownloader.cssrc/FrameShift/Core/AI/SeparateAudio/ModelLocator.cssrc/FrameShift/Core/AI/SeparateAudio/OverlapAddRing.cssrc/FrameShift/Core/AI/SeparateAudio/SeparateAudioAction.cssrc/FrameShift/Core/AI/RemoveNoise/DeepFilterNetModelLocator.cssrc/FrameShift/Core/AI/RemoveNoise/RemoveNoiseAction.cssrc/FrameShift/Core/AI/RemoveNoise/RemoveNoiseEngine.cssrc/FrameShift/Core/AI/RemoveNoise/RemoveNoiseVideoAction.cssrc/FrameShift/Core/AI/VideoInterpolation/RifePerfTimer.cssrc/FrameShift/Core/AI/VideoInterpolation/RifePerformanceMetrics.cssrc/FrameShift/Core/AI/RemoveNoise/RemoveNoiseVideoSettings.cssrc/FrameShift/Core/AI/VideoInterpolation/RifeFrameInterpolationEngine.cssrc/FrameShift/Core/AI/VideoInterpolation/RifeModelCatalog.cssrc/FrameShift/Core/AI/VideoInterpolation/RifeModelDefinition.cssrc/FrameShift/Core/AI/VideoInterpolation/RifeModelDownloader.cssrc/FrameShift/Core/AI/VideoInterpolation/RifeModelLocator.cssrc/FrameShift/Core/AI/RemoveObject/IObjectRemovalEngine.cssrc/FrameShift/Core/AI/RemoveObject/ModelDownloader.cssrc/FrameShift/Core/AI/RemoveObject/ModelLocator.cssrc/FrameShift/Core/AI/RemoveObject/ObjectRemovalEngine.cssrc/FrameShift/Core/AI/RemoveObject/ObjectRemovalModelCatalog.cssrc/FrameShift/Core/AI/RemoveObject/ObjectRemovalModelDefinition.cssrc/FrameShift/Core/AI/RemoveObject/RemoveObjectAction.cssrc/FrameShift/Core/AI/Upscale/UpscaleModelDefinition.cssrc/FrameShift/Core/AI/Upscale/UpscaleModelCatalog.cssrc/FrameShift/Core/AI/Upscale/ModelLocator.cssrc/FrameShift/Core/AI/Upscale/ModelDownloader.cssrc/FrameShift/Core/AI/Upscale/IUpscaleEngine.cssrc/FrameShift/Core/AI/Upscale/UpscaleTiler.cssrc/FrameShift/Core/AI/Upscale/UpscaleFrameProcessor.cssrc/FrameShift/Core/AI/Upscale/UpscaleEngine.cssrc/FrameShift/Core/AI/Upscale/UpscaleImageAction.cssrc/FrameShift/Core/AI/VideoUpscale/VideoUpscaleEngine.cssrc/FrameShift/Core/AI/VideoUpscale/UpscaleRawVideoPipeline.cssrc/FrameShift/Core/Actions/UpscaleVideoAction.cssrc/FrameShift/Core/Actions/UpscaleVideoSettings.cs
Helpers core utiles :
src/FrameShift/Core/Helpers/ImageAutoCropDetector.cs
Batch et progression :
src/FrameShift/Windows/Batch/ConversionBatchSession.cssrc/FrameShift/Windows/ProgressUI/ProgressForm.cs
IA :
src/FrameShift/Windows/AI/DownloadModelForm.cssrc/FrameShift/Windows/AI/RemoveNoiseAudioPickerForm.cssrc/FrameShift/Windows/AI/RifeInterpolateVideoPickerForm.cssrc/FrameShift/Windows/AI/SeparateAudioPickerForm.cssrc/FrameShift/Windows/AI/RemoveNoiseVideoPickerForm.cssrc/FrameShift/Windows/AI/RemoveObjectEditorForm.cssrc/FrameShift/Windows/AI/BriaModelNoticeForm.cssrc/FrameShift/Windows/AI/UpscaleImagePickerForm.cssrc/FrameShift/Windows/AI/UpscaleVideoPickerForm.cssrc/FrameShift/Windows/AI/CreateSubtitlesPickerForm.cs
Contrôles :
src/FrameShift/Windows/Controls/SeekTrackBar.cssrc/FrameShift/Windows/Controls/JoinVideoTimelineItem.cssrc/FrameShift/Windows/Controls/JoinVideosTimelineControl.cs
Formulaires :
src/FrameShift/Windows/Forms/MainForm.cssrc/FrameShift/Windows/Forms/SettingsForm.cssrc/FrameShift/Windows/Forms/MediaInfoForm.cssrc/FrameShift/Windows/Forms/ConversionPickerForm.cssrc/FrameShift/Windows/Forms/ChangePitchForm.cssrc/FrameShift/Windows/Forms/ChangeSpeedForm.cssrc/FrameShift/Windows/Forms/CompressAudioForm.cssrc/FrameShift/Windows/Forms/CompressImageForm.cssrc/FrameShift/Windows/Forms/CompressVideoForm.cssrc/FrameShift/Windows/Forms/ConvertToIconForm.cssrc/FrameShift/Windows/Forms/CreateGifForm.cssrc/FrameShift/Windows/Forms/CropImageForm.cssrc/FrameShift/Windows/Forms/CropVideoForm.cssrc/FrameShift/Windows/Forms/CutAudioForm.cssrc/FrameShift/Windows/Forms/CutVideoForm.cssrc/FrameShift/Windows/Forms/CutVideoForm.Preview.cs— aperçu asynchrone annulable/sérialisé du pilote C, fermeture et libération des bitmaps.src/FrameShift/Windows/Forms/ImageToPdfForm.cssrc/FrameShift/Windows/Forms/JoinVideosForm.cssrc/FrameShift/Windows/Forms/InterpolateVideoForm.cssrc/FrameShift/Windows/Forms/ResizeImageForm.cssrc/FrameShift/Windows/Forms/ResizeMediaFormBase.cssrc/FrameShift/Windows/Forms/ResizeVideoForm.cssrc/FrameShift/Windows/Forms/RotateFlipImageForm.cssrc/FrameShift/Windows/Forms/RotateFlipVideoForm.cs
Helpers UI :
src/FrameShift/Windows/Helpers/FrameShiftWindowPolicy.cs— politique DPI, police possédée et contraintes bornées au moniteur.src/FrameShift/Windows/Helpers/FrameShiftDialogLayout.cs— shell compact, corps défilant, statut/actions persistants et hauteur initiale mesurée.src/FrameShift/Windows/Helpers/EditorPreviewLifetime.cs— sérialisation/annulation des aperçus et libération des bitmaps tardifs.src/FrameShift/Windows/Controls/FrameShiftHeader.cs— bandeau mesuré, métadonnées complètes et renouvellement DPI de l'icône.src/FrameShift/Windows/Controls/FrameShiftActionButton.cs— bouton natif à rendu arrondi et dimensions mesurées.src/FrameShift/Windows/Controls/FrameShiftActionBar.cs— commandes de même taille, texte long et retour à la ligne.src/FrameShift/Windows/Controls/FrameShiftFieldRow.cs— mesure des champs et labels dans l'espace disponible.src/FrameShift/Windows/Controls/FrameShiftStatusMessage.cs— statut natif multiligne copiable, hauteur mesurée/plafonnée.src/FrameShift/Windows/Controls/FrameShiftEditorWorkspace.cs— rail d'options replié sous l'aperçu en largeur réduite.src/FrameShift/Windows/Controls/FrameShiftToolTile.cs— outils PDF mesurés et bitmap d'icône possédé.src/FrameShift/Windows/Helpers/ControlHelper.cssrc/FrameShift/Windows/Helpers/FrameShiftCropEditorUi.cssrc/FrameShift/Windows/Helpers/FrameShiftEditorShellUi.cssrc/FrameShift/Windows/Helpers/FrameShiftTheme.cssrc/FrameShift/Windows/Helpers/FrameShiftThemePreference.cssrc/FrameShift/Windows/Helpers/FrameShiftUiSettings.cssrc/FrameShift/Windows/Helpers/WindowsThemeDetector.cssrc/FrameShift/Windows/Helpers/FrameShiftMenuRenderer.cssrc/FrameShift/Windows/Helpers/FrameShiftUiFactory.cssrc/FrameShift/Windows/Helpers/FrameShiftGridUi.cs— métriques DPI/texte communes aux files Main et Progress.src/FrameShift/Windows/ProgressUI/ProgressForm.Details.cs— lecture/copier des détails complets, sélection par occurrence et réorganisation file/détails de Progress.src/FrameShift/Windows/Controls/FrameShiftChoiceCard.cs— radio natif présenté en carte descriptive, rendu sélectionné et clavier natif.src/FrameShift/Windows/Controls/FrameShiftFlowRow.cs— choix espacés, hauteur mesurée selon la largeur, retour à la ligne.src/FrameShift/Windows/Controls/FrameShiftTimelineWorkspace.cs— aperçu au-dessus des contrôles temporels, défilement de secours indépendant du footer.src/FrameShift/Windows/Helpers/FrameShiftUiLayout.cssrc/FrameShift/Windows/Helpers/FrameShiftUiMetrics.cssrc/FrameShift/Windows/Helpers/FrameShiftUiPainter.cssrc/FrameShift/Windows/Helpers/FrameShiftWindowChrome.cssrc/FrameShift/Windows/Helpers/IconPaths.cssrc/FrameShift/Windows/Helpers/ImageBitmapHelper.cssrc/FrameShift/Windows/Helpers/PreviewFrameHelper.cssrc/FrameShift/Windows/Forms/AddSubtitlesToVideoPickerForm.cssrc/FrameShift/Windows/Forms/AddSubtitlesToVideoBurnEditorForm.cssrc/FrameShift/Windows/Helpers/PreviewLayoutHelper.cssrc/FrameShift/Windows/Helpers/NaturalFileNameComparer.cs
Responsabilités UI partagées :
FrameShiftUiMetrics.cscentralise les métriques de géométrie UI actives : marges, hauteurs standard, footer, gaps, rayons, largeurs de rail.FrameShiftUiLayout.csconserve la mesure commune des boutons. Les anciens placements fixes sans consommateurs ont été retirés en F1.FrameShiftDialogLayout.cscompose bandeau/corps/statut/actions ;FrameShiftEditorShellUi.csetFrameShiftCropEditorUi.cscomposent les variantes aperçu/options et temporelles, avec repli et défilement de secours. Les marges viennent du shell, sans ancien spacer concurrent.FrameShiftWindowChrome.csreste le point d’entrée commun pour la barre de titre,ShowIconet la sélection d’icône FrameShift / FrameShift AI.- Il possède les icônes qu'il charge : réutilisation, remplacement et libération à
Disposed, sans libérer les icônes empruntées à l'appelant ; abonnement unique au cycle des handles. FrameShiftTheme.csrésout la paletteSystem/Light/Darkà l'initialisation ou au changement de préférence et rafraîchit les fenêtres ouvertes du même processus ;FrameShiftUiSettings.cspersiste ce choix séparément des réglages IA.FrameShiftMenuRenderer.csapplique les couleurs de la palette aux menus WinForms appartenant à FrameShift.FrameShiftWindowPolicy.csfixe la référence 96 DPI,AutoScaleMode.Dpi, la police et les minima clients reconstruits/bornés au moniteur.FrameShiftUiMetrics.csconvertit seulement les dimensions manuelles ; les composants mesurent le texte et le footer reste indépendant du corps défilant.PerMonitorV2applicatif reste limité à Debug jusqu'à la qualification G.
Tests et exemples UI actifs :
tests/FrameShift.Tests/UiFoundationTests.cs— primitives, textes agrandis, bornage de fenêtre, dessin et corps défilant cachés.tests/FrameShift.Tests/UiPilotTests.cs— géométrie et états des cinq pilotes C sans affichage.tests/FrameShift.Tests/UiD3Tests.cs— pickers IA, fermeture/téléchargement simulé et réglages sans affichage.tests/FrameShift.Tests/UiEditorTests.cs— sept éditeurs E, coordonnées média, fermeture modale et durée de vie des aperçus.tests/FrameShift.UiSamples/Program.cs— exemples compacte/éditeur et mode --check caché.tests/FrameShift.UiSamples/D3LauncherForm.cs— recette manuelle D3 viaTEST_PHASE_D3.cmd.tests/FrameShift.UiSamples/ELauncherForm.cs— recette manuelle des sept éditeurs viaTEST_PHASE_E.cmd.tests/FrameShift.Tests/UiD1Tests.cs— fenêtres D1 cachées, redimensionnement, progression, annulation et périmètre des actions.tests/FrameShift.Tests/UiD2Tests.cs— variantes D2 cachées, réglages, dimensions, champs liés et retours tardifs des aperçus après fermeture.tests/FrameShift.UiSamples/D2LauncherForm.cs— recette manuelle des 12 fenêtres D2 viaTEST_PHASE_D2.cmd, réglages interceptés et aperçus réels.tests/FrameShift.UiSamples/D1LauncherForm.cs— recette manuelle D1 viaTEST_PHASE_D1.cmd; états simulés et actions Main interceptées.tests/FrameShift.Tests/ChangePitchSettingsTests.cstests/FrameShift.Tests/AddSubtitlesToVideoPlannerTests.cstests/FrameShift.Tests/AddSubtitlesToVideoBurnTests.cstests/FrameShift.Tests/AddSubtitlesToVideoBurnEditorFormTests.cstests/FrameShift.Tests/AddSubtitlesToVideoSettingsTests.cstests/FrameShift.Tests/ConvertToIconSettingsTests.cstests/FrameShift.Tests/CreateGifSettingsTests.cstests/FrameShift.Tests/CutAudioSettingsTests.cstests/FrameShift.Tests/ExtractAudioCatalogTests.cstests/FrameShift.Tests/ExtractFramesSettingsTests.cstests/FrameShift.Tests/ImageAutoCropDetectorTests.cstests/FrameShift.Tests/OutputPathHelperTests.cstests/FrameShift.Tests/ProgramBatchTests.cstests/FrameShift.Tests/ProgramCliTests.cstests/FrameShift.Tests/ConversionBatchQueueMessageTests.cstests/FrameShift.Tests/RifeInterpolateVideoSettingsTests.cstests/FrameShift.Tests/UpscaleVideoSettingsTests.cstests/FrameShift.Tests/CreateSubtitlesTests.cstests/FrameShift.Tests/VideoCompressionPlannerTests.cstests/FrameShift.Tests/VideoConversionPlannerTests.cstests/FrameShift.Tests/FrameShiftThemeTests.cstests/FrameShift.Tests/UiColorStateTests.cs— contrastes calculés, peinture en mémoire des états, remappage des overrides de grille et des états Progress.tests/FrameShift.Tests/UiKeyboardTests.cs— commandes sur contrôles cachés, métadonnées complètes, ordre Tab, reconstruction des cibles de focus, sélection/tri/déplacement/suppression Join et glyphes accessibles des files.tests/FrameShift.Tests/UiResourceLifetimeTests.cs— propriété/libération natives des icônes, cache bitmap du bandeau, outils et polices communes sur contrôles cachés.tests/FrameShift.Tests/WinFormsTestCollection.cs— isolation des classes UI et de leur dossier de préférences, sans désactiver le parallélisme des collections indépendantes.tests/FrameShift.UiSamples/UiResourceProbe.cs— mode--resources <json>, profils GDI/USER après échauffement dans un processus STA caché ; aucune capture ou injection d'entrée.src/FrameShift/Windows/Controls/FrameShiftGridButtonCell.cs— cellule native × dont le nom accessible expose l'action et le fichier ; aucun changement de dessin.tests/FrameShift.UiSamples/F2LauncherForm.cs— recette ciblée viaTEST_PHASE_F2.cmd, thèmes temporaires sans sauvegarde et fenêtres non modales.TEST_PHASE_F3.cmd— réutilise ce lanceur en mode clavier avec trois copies de la vidéo test pour Join ; procéduredocs/UI_PHASE_F3_MANUAL_TESTS.md.docs/UI_PHASE_F4_MANUAL_TESTS.md— parcours combiné F2/F3/F4 et contrôles visibles de réouvertures/icônes avec les lanceurs existants.tests/FrameShift.Tests/JoinVideosSettingsTests.cstests/FrameShift.Tests/JoinVideosPlannerTests.cstests/FrameShift.Tests/JoinVideosFormTests.cstests/FrameShift.Tests/JoinVideosTimelineControlTests.cs
Assets de test utiles :
tests/input/
- Le launcher
Programest maintenant découpé en plusieurs fichierspartial: Program.cs= entrypoint + routage principal ;ProgramCli.cs= parsing CLI ;ProgramBatch.cs= batch, progression, annulation ;ProgramAiPreflight.cs= préflight IA ;ProgramImageToPdf.cs= flux single-instanceImage to PDF;ProgramJoinVideos.cs= flux mono-action multi-instanceJoin Videos;ProgramPickers*.cs= fallback UI et collecte d'options par familles d'actions, y compris le picker mode + fichier deadd-subtitles-video.Image to PDFreste un module interactif lancé par ce launcherProgram, pas un exécutable séparé.Join Videosreste un module interactif mono-piste lancé parProgram: sa timeline conserve les occurrences du même fichier, son pipe local agrège les invocations Explorer, et le core ne reçoit qu'une opération finalisée viaJoinVideosSettings.CropImageFormetCropVideoFormpartagent maintenant une base UI proche viaFrameShiftCropEditorUi.cs, avec auto-crop visuel et navigation de preview.Add Subtitles to Video(add-subtitles-video) reste une seule action produit :SelectableTrackconserve le planner conteneur léger du lot 1, tandis queBurnIntoVideocharge.srt/.ass/.frameshift-subtitles.json, génère au besoin un ASS temporaire dimensionné sur la vidéo, réencode la vidéo via FFmpeg et copie l’audio quand le conteneur de sortie le permet.- Le lot 3 ajoute
AddSubtitlesToVideoBurnAppearance, des overrides de style burn sérialisables, et un éditeur WinFormsAddSubtitlesToVideoBurnEditorFormavec aperçu frame par frame. Le même générateur ASS temporaire sert à la prévisualisation comme à l’incrustation finale ; les.assexternes restent en passthrough avec les contrôles visuels désactivés. - Le lot 4 étend ce flux avec un aperçu animé court basé sur un clip burn temporaire, des copies de travail
.asspour fiabiliser les chemins Windows complexes, un probe enrichi (MediaProbeResult) pour rotation/HDR, et des nettoyages complets des previews temporaires à chaque annulation ou refresh obsolète. - Le lot 5 ferme l’intégration produit :
ActionRegistryl’enregistre définitivement,Program/ProgramCli/ProgramPickersSubtitlesgardent le routage UI-first/CLI,installer/FrameShift.issajoute le composant vidéo dédié, dépendancesffmpeg/ffprobeet l’entrée Explorer vidéoAdd subtitles to video, et la doc produit/architecture est alignée sur cette surface réelle. Media Infopasse parFfprobeRunner.TryProbeMediaInfoAsync(...)puisMediaInfoFormatter.DownloadModelFormest maintenant un downloader IA partagé entreremove-backgroundetseparate-audio.DownloadModelFormest maintenant le downloader IA partagé des modulesremove-background,remove-noise,separate-audioetinterpolate-video-rife.RemoveBackgroundsuit désormais un mini-catalogue de modèles (fast,high-resolution,high-resolution-general) inspiré des patterns déjà utilisés pourRemove Objectet RIFE ; les deux variantes HR sont figées en CPU only dans1.0.11.- Le catalogue
RemoveBackgroundinclut aussi deux modèles fournis par l'utilisateur BRIA RMBG-2.0 (bria-balanced,bria-high-quality) marquésManualOnly: aucun téléchargement/redistribution par FrameShift. Le préflight (ProgramAiPreflight.EnsureBriaManualModelReady) vérifie la présence + le SHA256 officiel et afficheBriaModelNoticeForm(Open BRIA page / Open folder / Re-check / Cancel, + Use anyway sur mismatch ; dialog adaptatif piloté par un déléguéFunc<BriaModelStatus>, Re-check revalide en place et enchaîne sur l'action) au lieu d'ouvrirDownloadModelForm. ConversionBatchSession.csetProgressForm.csgèrent désormais une identité de queue distincte par invocation batch, ce qui permet d’empiler plusieurs relances du même fichier dans la fenêtre ouverte sans perte silencieuse.IconPaths.cscentralise aussi les icônes IA actives du dossierAssets\Icons\ai.- Les assets upscale dédiés sont
Assets\Icons\ai\upscale_image.(ico|png)etupscale_video.(ico|png); les démonstrations vidéo sont dansscreenshots\Gif_demos\demo_upscale_video.gifetscreenshots\Video_demos\demo_upscale_video.mp4. ProgramRemoveObject.csgère le flux UI-first deremove-object(validation extension, ouvertureRemoveObjectEditorForm), intercepté avant la file dansProgram.cs.- Create Subtitle File (
create-subtitles-audio/create-subtitles-video) isole sherpa-onnx dansFrameShift.SubtitlesWorkerpour éviter les collisions deonnxruntime.dllavec le runtime ONNX principal. Worker publié en dossier (pas PublishSingleFile) pour queDirectML.dllsoit trouvé parLoadLibrary. Exécution GPU via DirectML avec fallback CPU automatique (init et inférence) ; 4 DLL natives DML dansnative-dml/(sherpa-onnx 1.13.3 DML, ORT 1.24.4 DirectML, DirectML 1.15.4). FeatureDim par modèle : Base/Small=80, Turbo=128. Trois modèles :whisper-base,whisper-small(défaut),whisper-turbo(~3,1 GB, encodeur ONNX external data).CreateSubtitlesPickerFormaffiche désormais un sélecteur radio 3 modèles et 3 formats de sortie exclusifs :Standard SRT(défaut),Advanced ASS Subtitle,FrameShift Customization Project. QuandAdvanced ASS Subtitleest choisi, le formulaire révèle aussi 3 presets exclusifs :Classic(défaut),Word Highlight,Progressive Reveal. Voirdocs/CREATE_SUBTITLES.mdpour les détails complets. - Le pipeline SRT
CreateSubtitlespasse désormais par un modèle interneSubtitleProject/SubtitleSegment/SubtitleWordpour conserver les timestamps mot par mot déjà fournis par le worker avant formatage.srt. - Lot 2 ajoute un sérialiseur projet versionné
CreateSubtitlesProjectSerializer(frameshift-subtitle-project, v1, extension suggérée.frameshift-subtitles.json) et un exporteurCreateSubtitlesAssFormatterpour un ASS classique valide. - Lot 3 branche réellement ces sorties via
CreateSubtitlesOutputFormats,ProgramAiPreflight,ProgramClietCreateSubtitlesPickerForm, tout en gardantStandard SRTsélectionné par défaut et sans activer d'effets dynamiques ASS. - Lot 4 ajoute
CreateSubtitlesAssPreset,CreateSubtitlesAssDiagnostic, le câblage UI/CLI du preset ASS et deux rendus dynamiques limités (Word Highlight,Progressive Reveal) avec fallback automatique versClassicpour les segments dont l'alignement mot à mot n'est pas fiable. - L’état 1.16.0 garde un
RefinedDisplayStartpartagé entreASS,SRT, projet sérialisé et burn vidéo ; enWord Highlight, la phrase complète apparaît dès ce début raffiné, tandis queProgressive Revealreste progressif. build_installer.ps1est le script de release canonique ;build_all.ps1,build_publish.ps1etbuild_publish.batdélèguent tous vers lui sans logique de build parallèle.AiModelDirectorySafety.cscanonicalise les choix de dossier de modèles et refuse les racines / emplacements protégés ; l’ISS applique les mêmes règles avant installation et désinstallation.AiModelSettings.csgère les préférences utilisateur IA persistées dans%LOCALAPPDATA%\FrameShift\config\settings.json; cléModelsDirectoryoptionnelle et repli sur le dossier par défaut si la valeur est dangereuse ou inutilisable.AiModelStorage.RootDirectoryest désormais résolu dynamiquement depuisAiModelSettings; les nouveaux dossiers de modèles créés par FrameShift reçoivent un marqueur d’appartenance, utilisé par l’uninstallateur pour ne jamais supprimer la racine configurable, ne retirer que les fichiers de modèles explicitement autorisés et ne supprimer un dossier que s’il devient vide.OnnxProviderHelper.cscentralise la création de session ONNX (DML → CPU), la détection d'échec DML à l'inférence et les messages utilisateur propres (sans chemins internes ONNX Runtime).Upscale/ModelLocator.cssépare le stockageupscale-image-onnx/upscale-video-onnxet copie à la demande les anciens modèles valides depuisupscale-onnx.UpscaleRawVideoPipeline.csporte le chemin rapide par défaut deupscale-video: FFmpeg décode/encode enrawvideomémoire,UpscaleVideoActiongarde un fallback automatique vers le pipeline BMP historique, etUpscaleFrameProcessor.csréutilise maintenant ses buffers/tensors pour réduire les allocations par frame. Le profilage (juin 2026) a montré ce pipeline borné par l'inférence ONNX DirectML (copies/conversions/I/O négligeables) ;UpscaleFrameProcessorretourne désormais l'image upscalée sans.Clone()plein-frame redondant (resize in-place sur le chemin target≠natif), réduisant le pic mémoire sans changer la sortie.BackgroundRemovalEngine.csutilise désormaisProcessPixelRows+ accès direct aux buffersDenseTensor(au lieu des indexeurs pixelimage[x,y]/tensor[0,c,y,x]) pour la construction du tenseur d'entrée, la construction du masque et le composite final ; gain mesuré ×5–×22 sur ces phases CPU pour les grandes images via le cheminfast/Bria ; les cheminshigh-resolutionrestent bornés par l'inférence CPU ; sortie bit-à-bit identique.MainForm.csouvreSettingsForm.cs, qui porte la section "AI models folder" avec Browse, Reset to default et Open folder.- Références UI actives : contrat et exemples, standard visuel, feuille de route et preuves.
UI_DPI_AUDIT.mdconserve le bilan ancien à titre historique.