dimanche 25 janvier 2009

Retour sur les fichiers scn

En avril 2007 j'ai donné dans ce blog les informations dont je disposais sur les fichiers scn produits par Studio de Pinnacle. Vous pouvez les retrouver ici. Depuis cette date, mes connaissances sur ce type de fichier ont progressé sur trois éléments:

1) On peut dans chaque scène choisir l'image miniature qui sera affichée pour visualiser la scène. Par défaut c'est la première image, celle dont l'offset par rapport au début de la scène est 0. Dans Studio vous avez un menu contextuel qui permet de choisir une autre miniature. Cela s'intègre alors dans le fichier scn en ajoutant l'offset de cette image par rapport au début de scène. Pour signaler que cette donnée supplémentaire est présente, un indicateur est mis à $40.

2) On peut ajouter un titre aux scènes. Ce titre est affiché sur deux lignes dans Studio, mais peut éventuellement déborder sur davantage de lignes. Pour indiquer qu'un tel titre est présent, un indicateur est mis à $80. Le titre peut être en caractères UTF-8 ou UTF-16 (widechar).

3) On peut ajouter un commentaire aux scènes, qui sera ignoré dans Studio. C'est éventuellement utile pour mettre des mots-clés etc... En réalité ce commentaire, qui peut aussi être UTF-8 ou UTF-16 est toujours présent, mais en général il est rempli par une chaîne vide.

Voilà donc la nouvelle structure des fichiers avi, où j'ai au passage unifié ce que Lucien appelait le type 1 et le type 2!

Un fichier *.scn commence par un en-tête qui en hexadécimal est le suivant:
63 26 01 00 04 00 00 00 FF FF 03 00 0A 00 'SourceTape'
[nom complet du fichier]
00 00 00 00 00 00 00 00 {{nombre de scenes}} FF FF
01 00 04 00 'Clip' 50 xx yy 00 FF FF

Puis pour la première scène:

01 00 05 00 'Scene'
[commentaire_1]
(scene_1)
(longueur_1)
00 00 00 00 01 80
[fichier]
00 00 00 00
00 00 00 00
(longueur_1)
<(image_1)> si (yy and $40)<>0
<[titre_1]> si (xx and $80)<>0


Puis pour chacune des scènes suivantes, notées scene_i (avec i>=2):

03 80 F0 xx yy 00 05 80
[commentaire_i]
(scene_i)
(longueur_i)
00 00 00 00 07 00
(scene_i)
(longueur_i)
(scene_i)
<(image_i)> si (yy and $40)<>0
<[titre_i]> si (xx and $80)<>0


Ici ma notation est la suivante:
  • {{nombre}} est un nombre codé sur 2 octets
  • (scene_i) est le numéro de la frame dans le fichier avi où commence la scène i. Par exemple scene_1 est 0. Ce numéro est un entier codé sur 4 octets.
  • (longueur_i) est la longueur - en nombre de frames -sur 4 octets de la scène i. Donc (longueur_i)=(scene_i+1)-(scene_i)
  • <> si condition : signifie que l'élément est optionnel, et il n'est présent que si la condition est remplie
  • [texte] est une chaine de caractères précédée de sa longueur et éventuellement de caractères de code selon une des syntaxes suivantes:
00 => texte vide
{len} avec len<$FF => texte UTF-8 de longueur len
FF {{len}} avec len<$FFFE => texte UTF-8 de longueur len

FF FE FF 00 => texte vide
FF FE FF {len} avec len<$FF => texte UTF-16 de longueur len
FF FE FF FF {{len}} avec len<$FFFE => texte UTF-16 de longueur len

{len} est la longueur du texte sur 1 octet
{{len}} est la longueur du texte sur 2 octets - donc toujours précédée du code $FF
Le code FF FE FF signifie donc que le texte est en widechar, chaque caractère étant codé sur 2 octets.