Articles :: Programmation

Ecrire un plug-in pour iMovie

samedi 26 février 2005 par STudio26

Sommaire

Niveau : confirmé

En regardant du côté des pages développeurs d’Apple, on trouve des choses très intéressantes comme les SDK (Software Development Kit, ou kits de développement). Si vous ne trouvez pas le plug-in d’iMovie qui vous convient, vous pouvez toujours développer vos propres plug-ins. Cet article vous donne quelques explications pour leur réalisation.

Introduction

Cet article vous donne quelques explications sur la réalisation d’un plug-in pour iMovie. Il décrit comment a été conçu un plug-in qui applique un effet d’image de télévision à une séquence, plug-in que vous pourrez retrouver sur ma page personnelle. Vous pouvez également le télécharger et le mettre dans votre dossier Bibliothèque/iMovie/Plug-ins pour le tester.

Pour commencer il vous faut un environnement de programmation. Cela tombe bien, Xcode est livré avec Panther. Je vous laisse le soin d’installer cet environnement. Cet article suppose que vous maîtrisiez les compilations sous Xcode. Ensuite, il vous faut certains outils pour développer les plug-ins iMovie. Le SDK pour les plug-ins iMovie est disponible sur le site d’Apple à la page suivante : http://developer.apple.com/sdk/. Ce SDK contient un projet permettant de créer des plug-ins pour iMovie 3 et suivants, car la compatibilité ascendante est assurée [1]. Il contient également la documentation au format PDF (iMovie_Plugin_Guide.pdf) qui explique les principes de base du fonctionnement de ces plug-ins et les détails techniques : l’API (Application Programming Interface, l’interface de programmation avec l’application). Cet article se base en grande partie sur cette documentation et sur les exemples de codes du kit.

Les exemple d’Apple, qui sont des plug-ins disponibles dans iMovie, sont inclus dans le seul et unique projet iMovieSDK.pbproj.

Ce qu’il faut savoir

Un plug-in c’est avant tout une structure. Cette structure contient toutes les informations à son sujet. A nous de bien la renseigner. Des constantes sont définies dans le SDK pour nous simplifier la vie. Voici la structure HYPluginGetInfo telle qu’elle est définie dans HYPluginInterface.h :

Il existe trois sortes de plug-ins. Les plug-ins de titres, de transitions et d’effets. C’est la réalisation d’un plug-in d’effet que nous allons détailler. Le type de plug-in est stocké dans pluginType de la structure HYPluginGetInfo.

Un plug-in passe par trois phases.
-  Une phase d’initialisation,
-  une phase de traitement et
-  une phase finale. On utilise dans notre exemple les définitions suivantes pour coder ces différentes phases :

La fonction "main"

Le plug-in doit contenir la fonction main qui appelle l’une des fonctions ci-dessus selon la phase. La phase est stockée dans le sélecteur switch. Les phases sont définies par les constantes kPlugInitialize, kPlugDoFrame, et kPlugTerminate [2]. Il ne faut pas oublier d’initialiser la structure HYPluginGetInfo lors de l’appel avec le sélecteur kPlugGetInfo.

iMovie gère lui-même des instances de plug-ins. Il peut à tout moment appeler la fonction de rendu (par exemple pour l’aperçu en mode vignette ou la prévisualisation). Pour communiquer avec un plug-in, iMovie utilise une structure de type HYPluginParams qui contient le compteur d’image de départ et de fin, le nombre d’images à créer, le sélecteur dont je vous ai parlé avant, un pointeur sur la liste des méthodes disponibles pour récupérer et traiter l’image, etc... Cette structure est décrite dans le fichier HYPluginInterface.h.

Ce qui nous donne pour la fonction principale :

L’initialisation

Lors de l’initialisation on donne un nom au plug-in et on vérifie s’il est compatible avec la version actuelle d’iMovie. On doit aussi définir les éléments de l’interface utilisateur que l’on souhaite utiliser. Ils s’agit des différents réglages pour un plug-in. Pour simplifier l’exemple nous n’en utiliserons pas.

Which sert ici à déterminer quel plug-in on utilise, et non plus dans quelle phase du plug-in nous sommes, car nous sommes dans l’initialisation. En effet on peut facilement définir plusieurs effets différents dans un même plug-in. Which sert alors de sélecteur pour utiliser le "bon" bout de code. Ici nous n’avons qu’un plug-in identifié par la constante : kVideoEffect. On pourrait très bien avoir un k8mmEffect pour produire un effet de film 8mm qui partagerait une partie du code avec kVideoEffect.

Le code :

La phase finale

Là on doit libérer les ressources, enfin si on en a alloué et on retourne kPluginOK si tout s’est bien passé.

Le code :

L’effet proprement dit

Pour cet effet, nous allons éclaircir ou assombrir une ligne sur deux. Il nous suffit de savoir si on est sur une ligne paire ou impaire et de modifier les pixels en conséquence. ToAdd vaut +10 ou -10 si on souhaite éclaircir ou assombrir les pixels. Il ne faut pas oublier de "borner" chaque composante RVB (rouge vert bleu) aux valeurs 0 à 255. Le corps de cette boucle peut se résumer à cela :

On utilise une petite astuce pour accentuer l’effet. On assombrit et éclaircit les lignes deux par deux grâce au bou de code suivant (row % 4) < 2 ? -1 : 1 [3].

Le code complet de l’effet vidéo :

La partie après "// We need to call CopyBits so it can handle the scaling" est supposée gérer l’effet "fade-in" et "fade-out" qui permet d’appliquer l’effet progressivement. Le paramètre opacity est calculée par une simple règle de trois pour savoir quel pourcentage de l’image initiale doit être mélangée avec l’image calculée [4].

Conclusion

Voilà, ce n’est pas si difficile. Le plug-in réalisé est extrèmement basique mais avait pour but de vous expliquer la mise en oeuvre d’un plug-in et les différentes tructures existantes. J’espère que cette courte introduction au plug-in iMovie vous permettra de faire vos propres plug-ins. Il m’a été impossible de maîtrises les effets "fade-in" et "fade-out" de début et de fin de plug-in avec le SDK fourni par Apple et XCode 1.5. Peut-être qu’avec d’autres versions cela fonctionne correctement, ou que le SDK d’Apple est bogué [5]. Toute information sur ce sujet est vraiment la bienvenue !

[1] Je ne peux malheureusement pas vérifier cela.

[2] la constante kPlugFilePlaceHolder utilisée dans les plug-ins Apple n’est expliquée nulle part...

[3] On effectue un modulo 4, si le reste est 0 ou 1 on assombrira la ligne, sinon on l’éclaircira.

[4] En théorie, car je n’ai jamais réussi à la faire fonctionner, y compris dans les sources livrées avec le SDK.

[5] Une mise à jour de ce vieux SDK serait la bienvenue.

Recherche

A propos — Site collaboratif édité sous licence GNU FDL [pourquoi ?] — © 2004-08 — Mentions légalesContact
Syndication RSS — Powered by SPIPstockbanddonné


Contenu édité sous licence GNU FDL sans sections invariantes
© MacTouch 2004-08 — Powered by SPIP
http://www.mactouch.com/.