précédent   suivant   sommaire  

10. Le module de temporisation et de synchronisation de SMIL 2.0

Rédacteurs :
Patrick Schmitz (cogit@ludicrum.org), (Microsoft)
Jeff Ayars (jeffa@real.com), (RealNetworks)
Bridie Saccocio (bridie@real.com), (RealNetworks)
Muriel Jourdan (Muriel.Jourdan@inrialpes.fr), (INRIA)


Table des matières

10.1 Introduction

Cette section est informative

Cette section définit le module de temporisation et de synchronisation. SMIL 1.0 a résolu des problèmes fondamentaux de synchronisation des médias et défini une facon puissante de chorégraphier des contenus multimédias. SMIL 2.0 étend la gestion de la temporisation et de la synchronisation en ajoutant des possibilités au modèle de temporisation et la syntaxe associée. Certains éléments de la syntaxe de SMIL 1.0 ont été modifiés ou dépréciés. Cette section du document spécifie le module de temporisation et de synchronisation.

Deux audiences sont visées par ce module : les développeurs de visualisateurs ou d'éditeur SMIL 2.0 et les auteurs d'autres langages XML désirant intégrer des éléments de temporisation et de synchronisation. Un langage auquel ce module est intégré est appelé langage hôte. Un document contenant des éléments et attributs de temporisation et de synchronisation SMIL est appelé document hôte.

Comme ce module est utilisé dans différents profiles (i.e., langages hôtes), les exigences de la syntaxe associée peuvent varier. Ces différences de syntaxe devraient rester minimes aussi bien que pratiques.

La gestion de la temporisation et de la synchronisation de SMIL 2.0 est découpée en 15 modules, permettant ainsi une grande flexibilité pour les créateurs d'autres langages intégrant ces fonctionnalités. Ces modules sont décrits dans « Annexe E : Les modules de temporisation et de synchronisation de SMIL ».

10.2 Aperçu de la temporisation de SMIL

Cette section est informative.

La temporisation de SMIL définit les éléments et attributs servant à coordonner et synchroniser la présentation d'un média au cours du temps. Le terme de média couvre un large champs, incluant les types de médias discrets tels que les images fixes, le texte et les graphiques vectoriels, ainsi que les types de médias continus étant intrinsèquement basés sur le temps tels que la vidéo, l'audio et les animations.

Trois éléments de synchronisation gèrent des utilisations de temporisation communes :

Ces éléments sont appelés conteneurs de temps. Ils regroupent les enfants qu'ils contiennent selon des plans de montage chronologiques coordonnées.

La temporisation de SMIL fournit également des attributs permettant de spécifier le comportement d'un élément au cours du temps. Les éléments ont un début et une durée simple. Le début peut être spécifié de différentes façons : par exemple, un élément peut démarrer à un temps donné, ou se baser sur le démarrage d'un autre élément, ou encore démarrer en réponse à un événement (un clic de souris par exemple). La durée simple définit la durée de présentation de base d'un élément. Les éléments peuvent être définis pour répéter une durée simple, un certain nombre de fois ou encore pendant un certain temps. La durée simple et les effets de répétition sont combinés pour donner la durée active. Lorsque la durée active d'un élément est écoulée, celui-ci peut être soit retiré de la présentation, soit gelé (conservé dans son dernier état), par exemple pour combler un espace dans la présentation.

Un élément devient actif lorsque démarre sa durée active et devient inactif lorsque se termine sa durée active. Durant sa durée active, l'élément est actif, et en dehors de sa durée active, l'élément est inactif.

La Figure 1 illustre la gestion d'un élément se répétant dans un simple conteneur de temps <par>. La syntaxe correspondante est incluse dans le diagramme.

Basic strip illustration of timing

<par begin="0s" dur="33s">
   <video begin="1s" dur="10s" repeatCount="2.5" fill="freeze" .../>
</par>

Figure 1 - Le diagramme partiel montre une gestion de base de la temporisation. Le terme « Durée simple* » indique que cette durée simple est coupée avant sa fin.

Les attributs qui contrôle cet aspect de la temporisation ne servent pas que pour les éléments médias, mais aussi pour les conteneurs de temps. Cela permet par exemple de répéter une séquence entière et de la coordonner comme une seule entité avec d'autres médias ou d'autres conteneurs de temps. Même si les auteurs peuvent spécifier une durée simple pour le conteneur de temps, il est souvent plus simple de la laisser non spécifiée, auquel cas ce sont les éléments enfants contenus qui définiront cette durée. Lorsqu'un élément n'a pas de durée simple spécifiée, le modèle temporel définit une durée simple implicite pour l'élément. Par exemple, la durée simple implicite d'une séquence est calculée par la somme des durées actives de tous ses enfants.

Chaque conteneur de temps impose un certain nombre de valeurs par défaut et de contraintes sur les enfants contenus. Par exemple dans un élément <seq>, les éléments commencent par défaut juste après la fin de l'élément précédent et dans tous les conteneurs de temps, la durée active de tout élément enfant est contrainte de ne pas dépasser la durée simple du conteneur. La figure 2 illustre les effets de la répétition d'un conteneur <par> et de ses contraintes sur un élément enfant <video>.

More complex strip illustration of timing

<par begin="0s" dur="12s" repeatDur="33s" fill="freeze" >
   <video begin="1s" dur="5s" repeatCount="1.8" fill="freeze" .../>
</par>

Figure 2 - Le diagramme partiel montre les contraintes d'un conteneur de temps sur les éléments enfants. Le terme « Durée simple* » indique que cette durée simple est coupée avant sa fin.

Le modèle de temporisation de SMIL définit comment les éléments du conteneur de temps et les attributs de temporisation sont interprétés pour construire un graphe temporel. Le graphe temporel modélise la planification et les relations de synchronisation de la présentation. Le graphe temporel est une structure dynamique, changeant en fonction des événements induits par l'utilisateur, des réceptions de média et du contrôle DOM de la présentation. À tout instant donné, le graphe temporel modélise le document à cet instant et la sémantique décrite dans ce module. Cependant, comme les événements induits par l'utilisateur ou d'autres facteurs créent des changements dans les éléments, les règles sémantiques sont réévaluées pour conserver un graphe temporel à jour.

Lorsqu'une valeur begin ou end se rapporte à un événement, ou au début ou à la fin active d'un autre élément, il peut être impossible de calculer la valeur de temps. Par exemple, si un élément est prévu pour démarrer lors d'un certain événement, la valeur de temps de begin ne sera pas connue avant que l'événement ne se produise. Ces valeurs begin et end sont alors dites non résolues. Quand une telle valeur de temps est connue (i.e., quand on peut la calculer comme temps dans la présentation), elle est dite résolue. Un temps résolu est dit défini s'il n'a pas la valeur indefinite. Voir aussi la discussion dans « La consolidation de la temporisation basée sur les événements et de la temporisation planifiée ».

Dans un environnement idéal, la présentation devrait se dérouler exactement comme spécifiée. Cependant, les diverses limitations du monde réel (tel que les retards dus à l'encombrement du réseau) peuvent influer sur la lecture effective d'un média. La façon dont l'application s'adapte et gère la présentation par rapport aux problèmes d'interprétation d'un média est appelée comportement de synchronisation à l'exécution. SMIL possède des attributs permettant à l'auteur de contrôler ce comportement de synchronisation à l'exécution pour la présentation.

10.3 La définition du Langage

Cette section est informative

Le modèle de temporisation est construit en allant des concepts les plus simples aux plus complexes : tout d'abord les contrôles de temporisation de base et de durée simple, ensuite les attributs de contrôle des répétitions et de contrainte des durées actives. Finalement les éléments de définition des conteneurs de temps seront présentés.

Le modèle temporel dépend d'un certain nombre de définitions à propos du document hôte : un document hôte est présenté sur un intervalle de temps.

10.3.1 Les attributs

Cette section définit l'ensemble des attributs de temporisation communs à tous les éléments de synchronisation SMIL.

Sauf indication contraire, dans ce qui suit, en cas d'erreur dans la syntaxe de la valeur d'argument d'un attribut, l'attribut sera ignoré ( comme s'il n'était pas spécifié).

Les attributs begin et dur : La gestion de base de la temporisation

Cette section est informative.

La temporisation de base pour un élément se fait grâce aux attributs begin et dur. Les auteurs peuvent exprimer le début d'un élément de plusieurs façons différentes, allant des temps d'horloge simples au temps où se produit un événement (par exemple, un clic de souris). La durée simple d'un élément est définie comme une simple valeur de temps. La syntaxe de l'attribut begin est décrite ci-dessous. Les règles de syntaxe formelle pour chaque valeur d'attribut sont décrites dans « Les grammaires des valeurs des attributs de temporisation » ; un résumé de la syntaxe de la valeur d'un attribut est fourni ici afin d'aider le lecteur.

Cette section est normative.

begin : smil-1.0-syncbase-value | begin-value-list
Définit quand un élément devient actif.
La valeur de l'attribut est soit une déclaration de base de synchronisation SMIL 1.0, soit une liste de valeurs séparées par des points-virgules.
smil-1.0-syncbase-value : "id(" Id-value ")" ( "(" ( "begin" | "end" | Clock-value ) ")" )?
Déprécié. Décrit une base de synchronisation et un décalage par rapport à cette base de synchronisation. Le début de l'élément est défini par rapport au début ou à la fin active d'un autre élément.
begin-value-list : begin-value (";" begin-value-list )?
Une liste de valeurs séparées par des points-virgules. L'interprétation d'une liste de temps de début est détaillée dans la section « L'évaluation des listes des temps de début et de fin ».
begin-value : ( offset-value | syncbase-value | event-value | repeat-value | accesskey-value | media-marker-value | wallclock-sync-value | "indefinite" )
Décrit le début d'un élément.
offset-value : ( "+" | "-" )? Clock-value
Décrit le début d'un élément comme un décalage par rapport à une base de synchronisation implicite. La définition de la base de synchronisation implicite dépend du conteneur de temps parent de l'élément. Le décalage est mesuré dans le temps simple du parent.
syncbase-value : ( Id-value "." ( "begin" | "end" ) ) ( ( "+" | "-" ) Clock-value )?
Décrit une une base de synchronisation et un décalage par rapport à celle-ci. Le début de l'élément est défini par rapport au début ou à la fin active d'un autre élément.
event-value : ( Id-value "." )? ( event-ref  ) ( ( "+" | "-" ) Clock-value )?
Décrit un événement et un décalage optionnel qui déterminent le début de l'élément. Le début de l'élément est défini par rapport au moment où cet événement s'est déclenché. Les événements peuvent être n'importe quel événement défini pour le langage hôte en accord avec [DOM2Events]. Cela peut être des événements de l'interface utilisateur, des déclencheurs d'événement transmis par le réseau, etc. Les détails de la temporisation liée aux événements sont décrits dans la section ci-dessous « La consolidation de la temporisation basée sur les événements et de la temporisation planifiée ».
repeat-value : ( Id-value "." )? "repeat(" integer ")" ( ( "+" | "-" ) Clock-value )?
Décrit un événement de répétition qualifié. Le début de l'élément est défini par rapport au moment du déclenchement de l'événement repeat avec une valeur d'itération spécifiée.
accesskey-value : "accesskey(" character ")"( ( "+" | "-" ) Clock-value )?
Décrit une clé d'accès qui détermine le début de l'élément. Le début de l'élément est déterminé par rapport au moment où le caractère correspondant à la clé d'accès est entré par l'utilisateur.
media-marker-value : Id-value ".marker(" marker-name ")"
Décrit le début de l'élément comme point de montage nommé défini par un élément média.
wallclock-sync-value : "wallclock(" wallclock-value ")"
Décrit le début de l'élément comme un temps d'une horloge réelle. La syntaxe du temps d'une horloge réelle est basée sur la syntaxe définie dans la norme [ISO8601].
"indefinite"
Le début de l'élément sera déterminé par un appel à la méthode "beginElement()" ou un hyperlien pointant sur l'élément.
Les méthodes du DOM pour la temporisation et la synchronisation SMIL sont décrites dans la section « Les méthodes réservées du DOM ».
La temporisation basée sur les hyperliens est décrite dans la section « Les hyperliens et la temporisation ».
Sémantique de la valeur de begin

Cette section est normative

Cette section est informative.

Les enfants d'un conteneur par commencent par défaut lorsque le conteneur commence (ce qui équivaut à begin="0s"). Les enfants d'un conteneur seq commencent par défaut lorsque l'enfant précédent termine sa durée active (ce qui équivaut à begin="0s") et le premier commence par défaut lorsque le conteneur commence. Les enfants d'un conteneur excl ont par défaut une valeur de début de "indefinite".

La valeur de begin peut spécifier une liste de temps. Cela peut servir à spécifier plusieurs « moyens » ou « règles » pour commencer un élément, par exemple si l'un d'entre plusieurs événements est déclenché. Une liste de temps peut aussi définir plusieurs temps de début, permettant de jouer un élément plus d'une fois (ce comportement peut être contrôlé, par exemple, pour ne permettre que l'utilisation effective du début le plus antérieur - voir aussi « L'attribut restart »).

En général, le temps le plus précoce dans la liste détermine le temps de début de l'élément. Il y a d'autres contraintes sur l'évaluation d'une liste de temps de début qui sont détaillées dans la section « L'évaluation des listes des temps de début et de fin ».

Notez que même s'il est possible de mettre la valeur "indefinite" dans une liste de valeurs de begin, la valeur "indefinite" n'est réellement utile que comme valeur simple. La combiner avec d'autres valeurs n'influe pas sur la temporisation du début, car les méthodes de début du DOM peuvent être invoquées avec ou sans la spécification de "indefinite" pour begin.

Lorsqu'un temps de début est spécifié comme variante de base de synchronisation, une valeur de marqueur ou une valeur d'horloge réelle, le temps défini doit être converti par l'implémentation en un temps relatif au conteneur de temps parent ( c'est-à-dire, en un temps qui équivaut à une valeur de décalage). Ceci est appelé conversion de l'espace temporel et est détaillé dans la section « La conversion entre temps local et temps global ».

La gestion des décalages négatifs pour begin

Cette section est informative.

L'utilisation de décalages négatifs pour définir des temps de début définit simplement les relations de synchronisation de l'élément. Cela ne surclasse en aucun cas les contraintes du conteneur de temps et cela ne peut surclasser les contraintes de temps de la présentation.

Cette section est normative.

Le temps de début calculé définit la relation de synchronisation planifiée de l'élément, même s'il n'est pas possible de démarrer l'élément au moment calculé. Le modèle temporel utilise le temps de début calculé et non pas le temps observé du début de l'élément.

Cette section est informative.

Si un élément a un début qui est résolu comme devant commencer avant le début du conteneur de temps parent, les contraintes du conteneur s'appliquent toujours. Par exemple :

<par>
   <video id="vid" begin="-5s" dur="10s" src="movie.mpg" />
   <audio begin="vid.begin+2s" dur="8s" src="sound.au" />
</par>

L'élément video ne peut démarrer avant que l'élément par ne commence. Le début est simplement défini comme ayant débuté « dans le passé » lors du début de par. Le lecteur observera que la vidéo commence à 5 secondes de son début, et se termine au bout de 5 secondes. Notez que l'élément audio commence par rapport au début de la vidéo et que le temps de début calculé est utilisé et non le temps de début observé contraint par le parent. De ce fait, l'audio commence à 3 secondes de son début et dure également 5 secondes.

Le comportement peut être rapproché de l'utilisation d'une valeur de l'attribut clipBegin appliquée sur l'élément, mais qui ne s'applique qu'à la première itération d'éléments se répétant. Dans l'exemple précédent, si l'un des éléments était défini pour se répéter, la seconde itération puis les suivantes du média seraient jouées à partir du début du média (voir aussi «Les attributs repeatCount, repeatDur et repeat : les éléments de répétition  »).

Cette section est normative.

Le comportement peut être rapproché de l'utilisation d'une valeur de l'attribut clipBegin appliquée sur l'élément, mais qui ne s'applique qu'à la première itération des éléments se répétant.

En fait, l'élément commence au temps de début calculé en suivant l'algorithme ci-dessous :

Let o be the offset value of a given begin value,
d be the associated simple duration,
AD be the associated active duration.
Let rAt be the time when the begin time becomes resolved.
Let rTo be the resolved sync-base or event-base time without the offset
Let rD be rTo - rAt.	If rD < 0 then rD is set to 0.
 
If AD is indefinite, it compares greater than any value of o or ABS(o).
REM( x, y ) is defined as x - (y * floor( x/y )). 
If y is indefinite or unresolved, REM( x, y ) is just x.

Let mb = REM( ABS(o), d ) - rD
If ABS(o) >= AD then the element does not begin.
Else if mb >= 0 then the media begins at mb.
Else the media begins at mb + d.
Soit o la valeur de décalage d'une valeur de début donnée,
d la durée simple associée,
AD la durée active associée.
Soit rAt le temps où le temps de début se résoud.
Soit rTo le temps de la base de synchronisation, ou celui basé sur un événement, sans le décalage
Soit rD égal à rTo - rAt. Si rD < 0, alors rD égale 0

Si AD est indéfini, il est évalué supérieur à toute valeur de o ou ABS(o).
REM( x, y ) est défini comme x - (y * floor( x/y )).
Si y est indéfini ou non-résolu, REM( x, y ) correspond juste à x.

Soit mb = REM( ABS(o), d ) - rD
Si ABS(o) >= AD, alors l'élément ne commence pas.
Autrement si mb >= 0, alors le média commence à mb.
Sinon le média commence à mb + d.

Si l'élément se répète, la valeur d'itération de l'événement de repeat se calcule à partir du temps de début calculé ci-dessus et non pas sur le nombre observé de répétitions.

Cette section est informative.

Exemple :

<smil ...> 
...
<ref begin="foo.activateEvent-8s" dur="3s" repeatCount="10" .../>
...
</smil>

L'élément commence lorsque l'utilisateur active (en cliquant par exemple) l'élément "foo". Le temps de début est calculé comme étant 8 secondes plus tôt et commence donc à se jouer à 2 secondes dans la durée simple de 3 secondes, dans la troisième itération de la répétition. Une seconde plus tard, la quatrième itération de l'élément va commencer et l'événement repeat associé aura son compteur d'itération à 3 ( celui-ci commençant à 0). L'élément se terminera 22 secondes après son activation. L'événement beginEvent est déclenché lorsque l'élément commence, mais a une valeur d'estampille qui correspond au temps de début défini, i.e., 8 secondes plus tôt. Les dépendants temporels sont activés par rapport au temps de début calculé et non par rapport au temps de début observé.

Note : Si les auteurs de scripts désirent distinguer le nombre d'itérations calculé du nombre d'itérations observé, ils peuvent compter le nombre effectif des événements repeat dans le gestionnaire d'événement associé.

Les délais négatifs de début

Un temps de début spécifie une relation de synchronisation entre l'élément et son conteneur de temps parent. La temporisation des variantes de base de synchronisation, d'une base d'événement, d'un marqueur ou d'une horloge réelle est implicitement convertie en un décalage sur le conteneur de temps parent, tout comme le spécifierait directement une valeur de décalage. Pour les enfants d'un élément seq, il s'agit toujours d'un décalage positif à partir du début du conteneur de temps seq. Cependant, pour les enfants de conteneurs de temps par et excl, le décalage calculé, par rapport au temps de début du parent, peut être négatif.

Notez qu'un élément ne peut pas effectivement commencer avant que le conteneur de temps parent ne commence. Un élément avec un délai de temps négatif se comporte comme s'il avait commencé plus tôt. L'effet sur la présentation pour l'élément (par exemple, l'affichage d'un média visuel) est équivalent à celui d'une valeur de l'attribut clipBegin (avec la même magnitude) pour la première, et seulement la première, itération d'un élément répété. Si aucune répétition n'est spécifiée, l'effet sur la présentation pour l'élément d'un décalage de début négatif est équivalent à celui d'une spécification de clipBegin, avec la même magnitude que la valeur de décalage. Néanmoins, les effets secondaires de la « temporisation » ne sont pas équivalents à ce qui est décrit pour une valeur de clipBegin. Tout ce qui dépend de la valeur de début se comportera comme si l'élément avait démarré plus tôt.

La sémantique de la valeur de dur

La longueur de la durée simple est spécifiée par l'attribut dur. La syntaxe de cet attribut est décrite ci-dessous.

Cette section est normative.

dur
Spécifie une durée simple.
L'attribut prend sa valeur dans ce qui suit :
Clock-value
Spécifie la longueur de la durée simple, mesurée dans le temps actif de l'élément.
La valeur doit être supérieure à 0.
"media"
Spécifie la durée simple en tant que durée intrinsèque du média. Ceci n'est valide que pour les éléments définissant un média.
"indefinite"
Spécifie une durée simple indéfinie.

S'il y a la moindre erreur de syntaxe dans l'argument de valeur de dur, l'attribut sera ignoré (comme s'il n'était pas défini).

Si la valeur "media" est utilisée pour l'attribut d'un élément qui ne définit pas un média (par exemple, les conteneur de temps SMIL 2.0 par, seq et excl), l'attribut sera ignoré (comme s'il n'était pas défini). Les médias contenus, tels que les enfants d'un élément par, ne sont pas considérés comme des médias directement associés à l'élément.

Si l'élément n'a pas d'attribut dur (valide), la durée simple de cet élément est définie comme étant sa durée implicite. La durée implicite dépend du type de l'élément. La première distinction se fait entre les différents types des éléments médias et des conteneurs de temps. Si l'élément média n'a pas d'enfant temporisé, il est appelé élément média simple.

Si l'auteur spécifie une valeur pour l'attribut dur qui est plus courte que la durée implicite pour un élément, la durée implicite sera écourtée par la durée simple spécifiée.

Si l'auteur spécifie une durée simple qui est plus longue que la durée implicite pour un élément, la durée implicite de l'élément sera étendue à la durée simple spécifée :

Notez que, quand une durée simple est "indefinite", certains cas d'utilisation simple peuvent conduire à des résultats surprenants. Voir l'exemple #4 de l'Annexe B.

Exemples

L'exemple suivant montre une temporisation de début avec un décalage simple. L'élément <audio> démarre 5 secondes après que le conteneur de temps <par> a commencé et se termine 4 secondes plus tard.

<par>
   <audio src="song1.au" begin="5s" dur="4s" />
</par>

L'exemple suivant montre une temporisation de début avec une base de synchronisation. L'élément <img> démarre 2 secondes après le début de l'élément <audio>

<par>
   <audio id="song1" src="song1.au" />
   <img src="img1.jpg" begin="song1.begin+2s" />
</par>

Les éléments peuvent aussi être spécifiés pour commencer en réponse à un événement. Dans cet exemple, l'élément image commence (apparaît) quand l'utilisateur clique sur l'élément "show". L'image se termine (disparaît) 3 secondes et demi plus tard.

<smil ...>
...
<text id="show" ... />
<img begin="show.activateEvent" dur="3.5s" ... />
...
</smil ...>

L'attribut end : le contrôle de la durée active

Cette section est informative.

SMIL 2.0 fournit un contrôle supplémentaire sur la durée active. L'attribut end permet à l'auteur de contraindre la durée active en spécifiant une valeur de fin via un décalage simple, une base de temps, une base d'événement, une base de synchronisation ou des appels aux méthodes DOM. Les règles pour combiner les attributs afin de calculer la durée active sont présentées dans la section « Le calcul de la durée active ».

Les règles de syntaxe de chaque valeur d'attribut sont décrites dans la section « Les grammaires des valeurs des attributs de temporisation ». Un résumé de la syntaxe est fourni ici afin d'aider le lecteur.

Cette section est normative.

end : smil-1.0-syncbase-value | end-value-list
Définit une valeur de fin pour l'élément pouvant contraindre la durée active.
La valeur de l'attribut est soit une déclaration de base de synchronisation SMIL 1.0, soit une liste de valeurs séparées par des points-virgules.
smil-1.0-syncbase-value : "id(" Id-value ")" ( "(" ( "begin" | "end" | Clock-value ) ")" )?
Déprécié. Décrit une base de synchronisation et un décalage à partir de cette base de synchronisation. La fin de l'élément est définie par rapport au début ou à la fin active d'un autre élément.
end-value-list : end-value (";" end-value-list )?
Une liste de valeurs de fin séparées par des points-virgules. L'interprétation d'une liste de temps de fins est détaillée dans la section « L'évaluation des listes des temps de début et de fin ».
end-value : ( offset-value | syncbase-value | event-value | repeat-value | accesskey-value | media-marker-value | wallclock-sync-value | "indefinite" )
Décrit la valeur de fin d'un élément.
offset-value : ( "+" | "-" )? Clock-value
Décrit la valeur de fin comme un décalage par rapport à une base de synchronisation implicite. La définition de la base de synchronisation implicite dépend du conteneur de temps parent. Le décalage est mesuré dans le temps simple du conteneur parent.
syncbase-value : ( Id-value "." ( "begin" | "end" ) ) ( ( "+" | "-" ) Clock-value )?
Décrit une base de synchronisation et un décalage à partir de cette base de synchronisation. La fin de l'élément est définie par rapport au début ou à la fin active d'un autre élément.
event-value : ( Id-value "." )? ( event-ref  ) ( ( "+" | "-" ) Clock-value )?
Décrit un événement et un décalage optionnel qui détermine la valeur de fin. La valeur de fin est définie par rapport au moment où cet événement s'est déclenché. Les événements peuvent être n'importe quel événement défini pour le langage hôte en accord avec [DOM2Events]. Cela peut être des événements de l'interface utilisateur, des déclencheurs d'événement transmis par le réseau, etc. Les détails de la temporisation liée aux événements sont décrits dans la section ci-dessous « La consolidation de la temporisation basée sur les événements et de la temporisation planifiée ».
repeat-value : ( Id-value "." )? "repeat(" integer ")" ( ( "+" | "-" ) Clock-value )?
Décrit un événement de répétion qualifié. La fin de l'élément est définie par rapport au moment du déclenchement de l'événement répétition avec une valeur d'itération spécifiée.
accesskey-value : "accesskey(" character ")"( ( "+" | "-" ) Clock-value )?
Décrit une clé d'accès qui détermine la fin de l'élément. La fin de l'élément est déterminée par rapport au moment où le caractère correspondant à la touche d'accès est entré par l'utilisateur.
media-marker-value : Id-value ".marker(" marker-name ")"
Décrit la la valeur de fin comme un temps de marqueur nommé défini par un élément de média.
wallclock-sync-value : "wallclock(" wallclock-value ")"
Décrit la valeur de fin en tant que temps d'une horloge réelle. La syntaxe du temps d'une horloge réelle est basée sur la syntaxe définie dans la norme [ISO8601].
"indefinite"
La valeur de fin de l'élément sera déterminée par un appel à la méthodeendElement().
Les méthodes du DOM pour la temporisation et la synchronisation SMIL sont décrites dans la section « Les méthodes réservées du DOM ».

Si un attribut end est spécifié mais aucun des attributs dur, repeatCount ou repeatDur, la durée simple est définie comme étant "indefinite" et la valeur de end contraint la définition de la durée . Le comportement de la durée simple dans ce cas est défini dans « La sémantique de la valeur de dur », comme si l'attribut dur avait la valeur "indefinite".

Si la valeur de end est résolue pendant que l'élément est actif, et que le temps résolu est dans le passé, l'élément devrait immédiatement terminer sa durée active. Les dépendants temporels définis par rapport à la fin de cet élément devraient être résolus en utilisant la fin active calculée (qui peut se trouver dans le passé) et non pas la fin active observée.

Les valeur dépréciées smil-1.0-syncbase-values sont sémantiquement équivalentes aux types end-values SMIL 2.0 suivants :

Cette section est informative.

La valeur de end peut spécifier une liste de temps. Cela peut servir à spécifier plusieurs « façons » ou « règles » pour terminer un élément, par exemple, si l'un de plusieurs événements est déclenché. Une liste de temps peut aussi définir plusieurs temps de fin correspondant à plusieurs temps de début, permettant à un élément de jouer plus d'une fois (ce comportement peut être contrôlé - voir aussi « L'attribut restart »).

Dans l'exemple suivant, l'attribut dur n'est pas spécifié et ainsi la durée simple est définie comme étant la durée implicite du média. Dans ce cas (et dans ce cas seulement), la valeur de end va augmenter la durée active si l'attribut dur spécifie une durée plus grande que la durée implicite. La vidéo va être affichée pendant 8 secondes et ensuite la dernière image restera affichée encore 2 secondes.

<video end="10s" src="8-SecondVideo.mpg" .../>

Si un auteur désire spécifier une durée implicite en même temps qu'une contrainte de fin, l'attribut dur peut être spécifié comme "media". Dans l'exemple suivant, l'élément se terminera au plus tôt entre la durée intrinsèque et un clic de souris :

<html ...>
...
<video dur="media" end="click" src="movie.mpg" .../>
...
</html>

Ces cas peuvent naître de l'utilisation de valeurs négatives dans les formes avec base de synchronisation et base d'événementielle, et les auteurs devraient rester vigilants vis à vis des complexités qui peuvent en résulter. Voir aussi « La gestion des valeurs négatives pour end ».

Dans l'exemple suivant, la durée active se terminera au plus tôt entre les 10 secondes et la fin de l'élément "foo". Ceci est particulièrement pratique si "foo" est défini pour commencer ou finir en fonction d'un événement.

<audio src="foo.au" dur="2s" repeatDur="10s" 
	 end="foo.end" .../>

Dans l'exemple suivant, la durée active se terminera au bout de 10 secondes et raccourcira la durée simple définie pour 20 secondes. L'effet est que seule la première moitié de l'élément est effectivement jouée. Pour un élément média simple, l'auteur peut simplement spécifier cela en utilisant l'attribut dur. Quoiqu'il en soit dans d'autres cas, il est parfois important de pouvoir spécifier la durée simple indépendamment de la durée active.

<par>
   <audio src="music.au" dur="20s" end="10s" ... />
</par>

Dans l'exemple suivant, l'élément commence quand l'utilisateur active (i.e., clique sur) l'élément "gobtn". La durée active se terminera 30 secondes après que le temps du conteneur de temps parent a commencé.

<smil ...>
...
<par>
<audio src="music.au" begin="gobtn.activateEvent" repeatDur="indefinite"
          end="30s" ... />
     <img src="foo.jpg" dur="40s" ... />
</par>
...
</smil>

Notez que si l'utilisateur ne clique pas sur l'élément cible avant que les 30 secondes ne soient écoulées, l'élément ne sera jamais lancé. Dans ce cas, l'élément n'a ni durée active ni fin active.

Les valeurs par défaut pour la syntaxe des événements facilitent la définition d'un comportement interactif simple. Dans l'exemple suivant, l'image s'arrète quand l'utilisateur clique sur l'élément.

<html ...>
...
<img src="image.jpg" end="click" />
...
</html>

L'utilisation de l'attribut end avec une valeur d'événement permet aux auteurs de terminer un élément soit avec un événement interactif, soit avec une durée active maximum. Ceci est parfois appelé interaction paresseuse.

Dans cet exemple, une présentation décrit les processus d'une usine. Chaque étape est une vidéo prévue pour se répéter 3 fois afin que les choses soient claires. Chaque élément peut également être arrêté en cliquant sur la vidéo ou sur un certain élément "next" indiquant à l'utilisateur que l'étape suivante peut être visualisée.

<smil ...>
...
<seq>
  <video dur="5s" repeatCount="3" end="activateEvent; next.activateEvent" .../>
  <video dur="5s" repeatCount="3" end="activateEvent; next.activateEvent" .../>
  <video dur="5s" repeatCount="3" end="activateEvent; next.activateEvent" .../>
  <video dur="5s" repeatCount="3" end="activateEvent; next.activateEvent" .../>
  <video dur="5s" repeatCount="3" end="activateEvent; next.activateEvent" .../>
</seq>
...
</smil>

Dans ce cas, la fin active de chaque élément est définie pour intervenir au plus tôt entre 15 secondes (durée de 5s * 3 répétitions) après que l'élément a commencé et un clic sur "next". Cela donne à l'utilisateur le choix entre s'asseoir et regarder, et faire défiler la présentation à un rythme plus élevé.

La gestion des valeurs négatives pour end

Cette section est normative.

Les attributs min et max : un contrôle accru de la durée active

Cette section est informative.

Les attributs min/max permettent à l'auteur de contrôler les limites inférieure et supérieure de la durée active de l'élément.

Cette section est normative.

min
Spécifie la valeur minimum de la durée active.
La valeur de l'attribut peut être l'une des suivantes :
Clock-value
Spécifie la longueur de la valeur minimum de la durée active, mesurée en temps actif de l'élément.
La valeur doit être supérieure ou égale à 0.
"media"
Spécifie la valeur minimum de la durée active comme étant la durée intrinsèque du média. Cela n'est valide que pour les éléments définissant un média.

S'il y a la moindre erreur dans la syntaxe de la valeur de min, l'attribut sera ignoré (comme s'il n'avait pas été spécifié).

La valeur par défaut de min est "0". Cela ne contraint pas du tout la durée active.

max
Spécifie la valeur maximum de la durée active.
La valeur de l'attribut peut être l'une des suivantes :
Clock-value
Spécifie la longueur de la valeur maximum de la durée active.
La valeur doit être supérieure à 0.
"media"
Spécifie la durée maximum de la durée active comme étant la durée intrinsèque du média. Cela n'est valide que pour les éléments définissant un média.
"indefinite"
La valeur maximum de la durée active est indéfinie et n'est pas contrainte de ce fait.

S'il y a la moindre erreur dans la syntaxe de la valeur de max, l'attribut sera ignoré (comme s'il n'avait pas été spécifié).

La valeur par défaut de max est "indefinite". Cela ne contraint pas du tout la durée active.

Si la valeur "media" est spécifiée pour les attributs min ou max sur un élément qui ne définit pas de média (par exemple, sur les éléments conteneurs de temps SMIL 2.0 par, seq ou excl), l'attribut en question sera ignoré (comme s'il n'avait pas été spécifié). Les médias contenus, tels que les enfants d'un élément par, ne sont pas considérés comme des médias directement associés à l'élément.

Si à la fois les attributs min et max sont définis, alors la valeur de max doit être supérieure ou égale à celle de min. Si cette condition n'est pas remplie, les deux attributs seront ignorés.

La règle à appliquer, pour calculer la durée active d'un élément dont les attributs min ou max sont spécifiés, est la suivante : chaque fois que la durée active d'un élément est calculée (i.e., pour chaque intervalle de l'élément si celui-ci commence plus d'une fois), ce calcul est fait sans tenir compte des valeurs de min et max (en appliquant l'algorithme décrit dans « Le calcul de la durée active »). Le résultat de cette étape est comparé aux limites min et max. Si le résultat est à l'intérieur des limites, alors cette première valeur calculée est retenue. Sinon, deux cas de figures peuvent se présenter :

Cette section est informative.

Les exemples suivants illustrent quelques cas d'utilisation des attributs min et max :

Exemple 1. Dans l'exemple suivant, la vidéo va simplement être jouée pendant 10 secondes.

<smil ...>
...
<par >
   <video id="video_of_15s" max="10s".../>
</par>
...
</smil>

Exemple 2. Dans l'exemple suivant, si un événement d'activation se produit avant 10 secondes, cette activation (par exemple, un clic de souris) ne va pas interrompre la vidéo immédiatement, mais celle-ci va continuer pendant 10 secondes puis s'arrêter. Si un événement de clic se produit après les 10 secondes, la vidéo est jouée (en se répétant) jusqu'à ce que le clic survienne. Notez que l'événement endEvent ne se produit que si un clic a lieu après les 10 secondes et pas à la fin simple de chaque répétition.

<smil ...>
...
<par >
   <video id="video_of_15s" repeatDur="indefinite" end="activateEvent" min="10s".../>
</par>
...
</smil>

Exemple 3. Dans l'exemple suivant, si un événement d'activation se produit sur l'élément "foo" à 5 secondes, cet événement ne termine pas le conteneur de temps tout de suite, mais à 12 secondes. La durée simple est définie comme étant "indefinite" (car un attribut end est spécifié sans attribut dur) et, de ce fait, le conteneur de temps joue normalement jusqu'à la fin de ses 12 secondes.

<smil ...>
...
<par end="foo.activateEvent" min="12s" >
   <video id="video_of_15s" .../>
   <video id="video_of_10s" .../>
</par>
...
</smil>

Exemple 4. Dans l'exemple suivant, si l'on clique sur la première vidéo à 5 secondes, alors la durée simple du conteneur de temps est calculée comme étant de 5 secondes. D'après l'attribut fill pendant le temps qui sépare la fin de la durée simple et la fin de la durée active, les deux vidéos sont gelées entre 5 et 12 secondes.

<html ...>
...
<par endsync="first" min="12s" fill="freeze" >
   <video id="video_of_15s" end="click" ...>
   <video id="video_of_10s" .../>
</par>
...
</html>

Exemple 5. Dans l'exemple suivant, le conteneur de temps a une durée simple de 5 secondes et la contrainte de min définit la durée active comme étant de 12 secondes. Comme la valeur par défaut pour l'attribut fill est, dans ce cas, "remove", rien n'est affiché dans le conteneur de temps entre les secondes 5 et 12.

<par dur="5s" min="12s" >
   <video id="video_of_15s"/>
   <video id="video_of_10s" />
</par>
L'attribut min et les temps de début négatifs

Si un élément est défini pour commencer avant son parent (par exemple, avec une valeur de décalage négative simple), la durée de min est mesurée en fonction du temps de début calculé et pas le début observé (voir exemple 1 ci-dessous). Cela signifie que la valeur de min peut ne pas avoir d'effet observable (comme dans l'exemple 2 ci-dessous).

Exemple 1. Dans l'exemple suivant, l'image sera affichée à partir du début du conteneur de temps pendant 2 secondes.

<par> 
   <img id="img" begin="-5s" min="7s" dur="5s" .../>
</par>

Exemple 2. Dans l'exemple suivant, l'image ne sera pas affichée du tout.

<par>
   <img id="img" begin="-5s" min="4s" dur="2s" .../>
</par>

Voir aussi les sections « L'attribut min et la répétition » et « Les contraintes du conteneur de temps sur les durées des enfants ».

Les grammaires des valeurs des attributs de temporisation

Cette section est normative.

Les spécifications de la syntaxe sont définies en utilisant la notation EBNF comme défini dans [XML10].

Dans les spécifications de syntaxe qui suivent, les espaces blancs autorisés sont indiqués par un « S », défini comme suit (définition de « S » issue de [XML10]) :

S ::= (#x20 | #x9 | #xD | #xA)+
Les valeurs de begin

Cette section est normative.

Une valeur begin-value-list est une liste de spécifiants de temporisation séparés par des points-virgules :

begin-value-list ::= begin-value (S? ";" S? begin-value-list )?
begin-value	 ::= (offset-value | syncbase-value 
		      | event-value | repeat-value | accesskey-value
		      | media-marker-value | wallclock-sync-value
		      | "indefinite" )
Les valeurs de end

Cette section est normative.

Une valeur end-value-list est une liste de spécifiants de temporisation séparés par des points-virgules :

end-value-list ::= end-value (S? ";" S? end-value-list )?
end-value      ::= (offset-value | syncbase-value 
		      | event-value | repeat-value | accesskey-value
		      | media-marker-value | wallclock-sync-value
		      | "indefinite" )
L'analyse des spécifiants de temporisation

Plusieurs des valeurs de spécification de temporisation ont une syntaxe similaire. Pour l'analyse d'un élément individuel dans une liste de valeurs, une interprétation correcte est définie par l'approche suivante. De plus, les types Id-value et Event-symbol sont des valeurs NMTOKEN XML et, en tant que telles, peuvent contenir les caractères point « . » et tiret « - ». Le caractère barre oblique inverse « \ » doit être utilisé pour masquer ces deux caractères dans les valeurs Id-value et Event-symbol, sinon ceux-ci seront interprétés, respectivement, comme un séparateur et le signe de soustraction. Une fois ces règles interprétées, mais avant que les valeurs Id-value dans les valeurs de base de synchronisation, les valeurs d'événement ou les valeurs de marqueur de média ne soient prises en charge plus avant, tous les caractères d'échappement, ceux de têtre ou ceux incorporés, devraient être supprimés

  1. Supprimer tous les caractères blancs de tête, de queue ou intermédiaires ;
  2. Si la valeur commence par un nombre ou un indicateur de signe numérique (i.e., un « + » ou un « - », la valeur doit être interprétée comme la valeur d'un décalage ;
  3. Sinon, si la valeur commence par l'atome non masqué "wallclock", elle devrait être interprétée comme une valeur wallclock-sync-value ;
  4. Sinon, si la valeur commence par l'atome non masqué "indefinite", elle devrait être interprétée comme étant la valeur "indefinite" ;
  5. Sinon : construire une sous-chaîne d'atome jusqu'à l'indicateur de signe, sans l'inclure (i.e., retirer tout décalage, l'analyser séparément puis l'inclure au résultat de cette étape). Dans la suite, aucun caractère point « . », précédé du caractère d'échappement barre oblique inverse « \ », ne doit être traité comme un séparateur, mais comme un caractère d'atome normal.
    1. Si l'atome ne contient aucun séparateur « . », alors la valeur doit être interprétée comme une valeur event-value avec un élément de base d'événement non spécifié (i.e., par défaut) ;
    2. Sinon, si l'atome se termine par les chaînes non masquées ".begin" ou ".end", alors la valeur devrait être interprétée comme une valeur syncbase-value ;
    3. Sinon, si l'atome contient la chaîne non masquée ".marker(", alors la valeur devrait être interprétée comme une valeur media-marker-value ;
    4. Sinon, la valeur devrait être interprétée comme une valeur event-value (avec un événement de base d'événement spécifié).

Cette façon de faire permet aux implémentations de traiter les atomes wallclock et indefinite comme des ID d'élément réservés, et begin, end et marker comme des noms d'événement réservés, tout en conservant un mécanisme d'échappement pour que les éléments et événements avec ces noms puissent être appelés.

Les valeurs d'horloge

Les valeur d'horloge ont la syntaxe suivante :

Clock-value	 ::= ( Full-clock-value | Partial-clock-value | Timecount-value )
Full-clock-value    ::= Hours ":" Minutes ":" Seconds ("." Fraction)?
Partial-clock-value ::= Minutes ":" Seconds ("." Fraction)?
Timecount-value     ::= Timecount ("." Fraction)? (Metric)?
Metric		    ::= "h" | "min" | "s" | "ms"
Hours		    ::= DIGIT+; any positive number
Minutes 	    ::= 2DIGIT; range from 00 to 59
Seconds 	    ::= 2DIGIT; range from 00 to 59
Fraction		::= DIGIT+
Timecount	    ::= DIGIT+
2DIGIT			  ::= DIGIT DIGIT
DIGIT			     ::= [0-9]

Pour les valeurs de Timecount, le suffixe métrique par défaut est "s" (pour secondes) Aucun caractère blanc de séparation n'est autorisé dans les valeurs d'horloge même si les caractères blancs de tête et de queue seront ignorés.

Voici quelques exemples de valeurs d'horloge valides :

Les valeurs fractionnaires sont simplement des valeurs décimales en secondes (base 10) . Le nombre de chiffres après la virgule est illimité (bien qu'en réalité la précision varie d'une implémentation à l'autre).
Par exemple :

00.5s = 500 millisecondes
00:00.005 = 5 millisecondes
Les valeurs de décalage

Les valeurs de décalage servent à spécifier quand un élément devrait commencer ou finir par rapport à sa base de synchronisation.

Cette section est normative.

Une valeur de décalage a la syntaxe suivante :

offset-value   ::= (( S? "+" | "-" S? )? ( Clock-value )

La base de synchronisation implicite pour une valeur de décalage dépend du conteneur de temps :

Les valeurs de begin et de end de SMIL 1.0 

Déprécié.

smil-1-syncbase-value  ::= "id(" Id-value ")" 
			   ( "(" ( "begin" | "end" | Clock-value) ")" )?
Les valeurs de référence d'ID

Cette section est normative.

Les valeurs ID-reference sont des références à la valeur d'un attribut "id" d'un autre élément dans le document.

Id-value			::= Id-ref-value
Id-ref-value		 ::= IDREF | Escaped-Id-ref-value
Escaped-Id-ref-value	 ::= Escape-Char NMTOKEN
Escape-Char		::= "\"

Si l'élément référencé par IDREF est ignoré, comme décrit dans les modules de contrôle de contenu (par exemple, s'il spécifie un attribut de test évalué à "false" ), la valeur de temps associée (i.e., la valeur de base de synchronisation, ou de base d'événement, qui spécifie l'Id-value) sera considérée non valide.

Cette section est informative.

Les sémantiques des éléments ignorés pourraient changer dans les futures versions de SMIL. Une sémantique possible serait que les arguments des arcs de synchronisation associés ne seront pas non valides, mais plutôt toujours « non résolus ». Quand ce comportement a besoin d'être simulé dans cette version de la temporisation et de la synchronisation de SMIL, un auteur peut ajouter la valeur "indefinite" dans la liste des valeurs pour les attributs begin et end.

Les valeurs de base de synchronisation

Une valeur de base de synchronisation commence par un terme Syncbase-element définissant la valeur d'un attribut "id" d'un autre élément, appelé élément de base de synchronisation.

Cette section est normative.

Une valeur de base de synchronisation a la syntaxe suivante :

 Syncbase-value   ::= ( Syncbase-element "." Time-symbol )
                      ( S? ("+"|"-") S? Clock-value )? 
 Syncbase-element ::= Id-value
 Time-symbol      ::= "begin" | "end"