Format Motion Photo 1.0

Les photos animées sont des fichiers uniques qui contiennent une photo fixe et une courte vidéo, qui inclut un enregistrement audio. Ce type de contenu multimédia permet à un utilisateur d'afficher une image fixe haute résolution, ainsi que la vidéo et le son, pour capturer le sentiment et l'atmosphère où l'image a été prise.

Dépendances

Voici les références normatives pour cette spécification:

Introduction

L'utilisation des éléments "OBLIGATOIRE", "NE DOIT PAS", "OBLIGATOIRE", "DEVRAIT", "NE DEVRAIT PAS", "RECOMMANDÉ", "PEUT" et "FACULTATIF" est conforme à la norme IETF définie dans la RFC2119.

Format photo animé

Les fichiers de photos animées sont constitués d'un fichier d'image fixe principal (JPEG, HEIC ou AVIF), auquel sont ajoutés un fichier vidéo secondaire. L'image principale contient des métadonnées XMP de l'appareil photo décrivant comment afficher le contenu des fichiers d'images fixes et vidéo, et des métadonnées XMP de conteneur décrivant comment localiser le contenu du fichier vidéo.

Le fichier image peut comporter un Gainmap, comme c'est le cas avec les JPEG Ultra HDR.

Modèle de nom de fichier

Les rédacteurs doivent utiliser un nom de fichier correspondant à l'expression régulière suivante:

^([^\\s\\/\\\\][^\\/\\\\]*MP)\\.(JPG|jpg|JPEG|jpeg|HEIC|heic|AVIF|avif)

Les lecteurs peuvent ignorer les métadonnées XMP, le fichier vidéo ajouté ou le contenu de la vidéo si le format n'est pas respecté.

Encodage de données multimédias

L'image principale contient un répertoire de métadonnées XMP de l'élément de conteneur qui définit l'ordre et les propriétés du fichier multimédia suivant dans le conteneur de fichiers. Chaque fichier du conteneur possède un élément multimédia correspondant dans le répertoire. L'élément multimédia décrit l'emplacement dans le conteneur de fichiers et les propriétés de base de chaque fichier concaténé.

Attributs XMP

Deux ensembles de métadonnées XMP sont utilisés pour définir les informations sémantiques supplémentaires pour le format Motion Photo. Les métadonnées peuvent apparaître dans n'importe quel ordre.

Métadonnées de l'appareil photo

Les métadonnées de l'appareil photo encodent les informations sur la manière de présenter les parties principales et vidéo de la photo animée.

  • L'URI d'espace de noms est http://ns.google.com/photos/1.0/camera/.
  • Le préfixe d'espace de noms par défaut est Camera

Les attributs suivants peuvent apparaître dans les métadonnées XMP des fichiers d'images fixes:

Nom

Type

Description

Camera:MicroVideo

Camera:MicroVideoVersion

Camera:MicroVideoOffset

Camera:MicroVideoPresentation
TimestampUs

Ces propriétés faisaient partie de la spécification Microvideo V1. Elles sont supprimées dans cette spécification et doivent être ignorées si elles sont présentes.

En particulier, l'attribut MicroVideoOffset est remplacé par la valeur GContainer:ItemLength pour localiser les données vidéo dans le fichier.

Camera:MotionPhoto

Integer

0: indique que le fichier ne doit pas être traité comme une photo animée.

1: indique que le fichier doit être traité comme une photo animée.

Toutes les autres valeurs ne sont pas définies et sont traitées de la même manière que 0.

Si la valeur est nulle ou négative, le fichier est toujours considéré comme une photo qui n'est pas une photo animée, même si une vidéo y est ajoutée.

Étant donné que le XMP est réutilisé par les éditeurs les plus performants, les fichiers image fixes peuvent toujours avoir une valeur résiduelle de 1 pour ce champ, même si la vidéo ajoutée a été supprimée. Ce champ n'est donc pas définitif, et les lecteurs doivent toujours confirmer qu'une vidéo est présente.

Camera:MotionPhotoVersion

Integer

Indique la version du format de fichier de la photo animée. Cette spécification définit la version "1".

Camera:MotionPhotoPresentationTimestampUs

Long

Valeur longue représentant le code temporel de présentation (en microsecondes) de l'image vidéo correspondant à l'image fixe. La valeur peut être -1 pour indiquer qu'elle n'est pas définie ou n'est pas spécifiée.

Comportement de la présentation

Si Camera:MotionPhotoPresentationTimestampUs n'est pas présent dans le paquet XMP, les lecteurs doivent utiliser un code temporel de présentation situé juste avant celui le plus proche du milieu de la piste vidéo, c'est-à-dire la durée de la piste vidéo divisée par 2.

Si Camera:MotionPhotoPresentationTimestampUs est présent dans le paquet XMP et que "application/motionphoto-image-meta" est présent dans la vidéo, la même valeur doit apparaître dans le champ primaryImageFrameScoreDescr presentationTimestampUs de cette piste. Si Camera:MotionPhotoPresentationTimestampUs n'est pas présent dans le paquet XMP et que la piste de métadonnées est présente, la valeur de la piste de métadonnées doit être -1.

Élément du conteneur

L'élément de conteneur est encodé dans les métadonnées XMP de l'image principale et définit le répertoire des éléments multimédias du conteneur. Les éléments multimédias doivent se trouver dans le fichier conteneur dans le même ordre que les éléments multimédias du répertoire, et doivent être empaquetés étroitement.

  • L'URI d'espace de noms est http://ns.google.com/photos/1.0/container/.
  • Le préfixe d'espace de noms par défaut est Container

Le répertoire ne peut contenir qu'un seul élément d'image principal, qui doit être le premier élément du répertoire.

Nom de l'élément

Type

Description

Directory

Tableau ordonné de structures

Tableau ordonné de structures Container:Item définissant la mise en page et le contenu du conteneur.

Élément d'élément

Les éléments multimédias décrivent la manière dont chaque élément doit être utilisé par l'application.

  • L'URI d'espace de noms est http://ns.google.com/photos/1.0/container/item/.
  • Le préfixe d'espace de noms par défaut est Item

Le premier élément multimédia doit être l'image principale. Il doit contenir un attribut Mime spécifiant l'un des types MIME d'image répertoriés dans la section "Valeurs du type MIME des éléments". La longueur de l'élément principal peut être déterminée en analysant l'image principale en fonction de son type MIME, à partir du début du conteneur de fichiers.

Le premier élément multimédia peut contenir un attribut Padding spécifiant une marge intérieure supplémentaire entre la fin de l'image principale encodée et le début de l'élément multimédia suivant. Seul le premier élément multimédia peut contenir un attribut Padding.

Chaque élément multimédia doit contenir un attribut Mime. Les éléments multimédias secondaires doivent également contenir des attributs de longueur.

Les éléments multimédias séquentiels peuvent partager des données de ressources dans le conteneur de fichiers. Le premier élément multimédia détermine l'emplacement de la ressource dans le conteneur de fichiers. Les éléments multimédias partagés suivants ont Length défini sur 0 si les données de ressource sont elles-mêmes un conteneur.

L'emplacement des ressources d'élément multimédia dans le conteneur est déterminé en additionnant les valeurs Length des ressources d'éléments secondaires précédentes à la longueur de l'encodage d'image principal, plus Padding si spécifié.

Nom de l'attribut

Type

Description

Mime

String

Cette colonne est obligatoire. Chaîne simple indiquant le type MIME de l'élément multimédia dans le conteneur.

Semantic

String

Cette colonne est obligatoire. Chaîne simple indiquant la signification spécifique de l'élément multimédia à l'application. Pour en savoir plus, consultez la section "Valeurs sémantiques des éléments".

Length

Integer

Obligatoire pour les éléments multimédias secondaires, y compris le conteneur vidéo. Nombre entier positif en octets de l'élément. Les éléments multimédias doivent se présenter dans leur forme d'origine, sans aucun codage. La valeur de longueur correspond à la longueur réelle des octets du fichier.

Une longueur de 0 dans les éléments multimédias secondaires indique que la ressource d'élément multimédia est partagée avec l'élément multimédia précédent. La longueur devrait être égale à 0 dans un élément multimédia principal.

Padding

Integer

[Photos animées au format JPEG]

Facultatif pour l'élément multimédia principal. Chaîne simple contenant une longueur entière positive (en octets) de marge intérieure supplémentaire entre la fin de l'image principale encodée et le début de l'élément multimédia suivant.

[Photos animées HEIC/AVIF]

Obligatoire pour l'élément multimédia principal. Doit avoir une valeur égale à 8, qui correspond à la longueur de l'en-tête de la case Motion Photo Video Data ("mpvd").

Item:Valeurs de type MIME

L'attribut Item:Mime définit le type MIME de chaque élément multimédia.

Valeur

Description

image/jpeg

Image JPEG

image/heic

Image HEIC

image/avif

Image AVIF

video/mp4

Conteneur MP4

video/quicktime

Conteneur MOV

Item:Valeurs sémantiques

L'attribut Item:Semantic définit la signification spécifique à l'application de chaque élément multimédia présent dans le répertoire de conteneur.

Value

Description

Primary

Indique que l'élément multimédia est l'image display prête principale dans le conteneur. Une photo animée doit inclure un seul élément avec cette sémantique.

MotionPhoto

Indique que l'élément multimédia est le conteneur vidéo. Une photo animée doit inclure un seul élément avec cette sémantique. L'emplacement de cet élément multimédia doit se trouver à la fin du fichier. Aucun autre octet ne peut être placé après l'arrêt des octets de cet élément multimédia.

Photos animées avec une image Ultra HDR principale

Conformément aux règles de valeur sémantique des éléments définies dans cette spécification et dans la spécification d'image Ultra HDR, les photos animées avec une image Ultra HDR principale doivent également inclure un élément multimédia avec une sémantique d'élément de "GainMap". En outre, les rédacteurs qui encodent des photos animées doivent placer l'élément "gainmap item" avant l'élément "video item".

Comportement spécifique aux images ISOBMFF

Photos animées comportant des images basées sur ISOBMFF (par exemple, les images HEIC et AVIF) doivent avoir une structure de sorte que la partie de l'image du fichier se termine par une boîte "Motion Photo Video Data" de premier niveau, décrite à l'aide de la sémantique du langage de description syntaxique défini dans la clause 8 de la norme ISO/IEC 14496-1:2010(E) :

// Box as defined in ISO/IEC 14496-12:2015: 4.2
aligned(8) class MotionPhotoVideoData extends Box('mpvd') {
  bit(8) data[];
}

où le champ « data » contient tous les octets de la vidéo. La valeur spéciale "0" n'est pas autorisée pour la taille de la zone de données vidéo de la photo animée. (Reportez-vous à la norme ISO/IEC 14496-12:2015: 4.2 pour connaître la définition d'une taille de classe qui étend Box.)

Le XMP de l'image ISOBMFF doit également définir la valeur de l'attribut Padding de l'élément multimédia principal comme étant égale à la taille en octets de l'en-tête de la zone de données de la vidéo animée, c'est-à-dire les en-têtes de taille et de nom.

Reportez-vous à la figure 1 illustrant cette structure en cases pour un exemple de photo animée basée sur l'algorithme HEIC:

Graphique linéaire illustrant la disposition des éléments dans un fichier de mouvement HEIC

Figure 1 : Illustration représentant les cadres supérieurs d'un exemple d'image HEIC dans un seul fichier photo animé HEIC. Notez que l'ordre des cadres ne sert principalement qu'à l'illustration (veuillez vous référer aux normes pertinentes sur la création des fichiers HEIF ou vidéo). Néanmoins, le champ "mpvd" doit figurer après tous les cadres du fichier image HEIC.

Contenu du conteneur vidéo

Le fichier de conteneur vidéo ajouté à l'image principale doit inclure au moins une piste vidéo principale. Cette piste est obligatoire et contient une vidéo encodée au format AVC, HEVC ou AV1. La résolution de l'image vidéo principale n'est pas définie. L'espace colorimétrique, la fonction de transfert et la profondeur de bits de la vidéo peuvent varier. Par exemple, les vidéos SDR peuvent avoir un espace colorimétrique BT.709 de 8 bits de profondeur, avec une fonction de transfert sRVB. Les vidéos HDR peuvent également avoir une profondeur de 10 bits, un espace colorimétrique BT.2100 et une fonction de transfert HLG ou PQ, ainsi que des métadonnées HDR et des pistes de métadonnées.

Le fichier du conteneur vidéo peut contenir une piste vidéo secondaire de résolution supérieure facultative. Les lecteurs doivent utiliser son contenu pour afficher les substitutions de l'image fixe principale encodée dans l'image JPEG ou HEIC. Cette piste peut contenir des vidéos à une fréquence d'images inférieure et encodée en AVC, HEVC ou AV1. La résolution de l'image de la vidéo secondaire n'est pas définie.

Il est normal que toutes les images de la piste vidéo secondaire aient des images correspondantes dans la piste vidéo principale. Chaque paire d'images correspondantes dans les pistes vidéo principale et secondaire doit avoir des codes temporels de présentation identiques. S'il existe une image de piste secondaire sans image de piste principale correspondante, les spectateurs peuvent essayer de sélectionner une image de piste principale avec l'horodatage de présentation correspondant le plus proche comme vignette représentative de cette piste vidéo secondaire.

Le fichier du conteneur vidéo peut contenir une piste audio mono ou stéréo 16 bits facultative à 44 kHz, 48 kHz ou 96 kHz encodée en AAC. Les lecteurs doivent présenter cette piste audio lorsque la piste vidéo principale est affichée.

La piste vidéo secondaire, le cas échéant, doit toujours apparaître après la piste vidéo principale. Il n'existe aucune autre contrainte d'ordre concernant les autres pistes. L'index de la piste vidéo principale doit être inférieur à celui de toute piste vidéo secondaire. Autrement dit, si la piste vidéo principale possède le numéro de piste 2, le numéro de toute piste vidéo secondaire doit être supérieur ou égal à 3.

Piste de métadonnées vidéo avec scores d'intelligence artificielle

Les rédacteurs peuvent éventuellement ajouter une piste de métadonnées au fichier du conteneur vidéo avec le type "meta". La piste de métadonnées doit comporter exactement un échantillon contenant un flux d'octets au format décrit dans la section "Syntaxe".

Si la piste de métadonnées est présente, l'entrée du tableau de description de l'exemple pour la piste (c'est-à-dire la boîte "stsd" située à l'emplacement "mdia.minf.stbl.stsd" par rapport à la zone "trak") doit contenir un seul atome qui indique une entrée d'échantillon de métadonnées textuelles (c'est-à-dire une zone "mett"). La zone "mett" doit comporter une chaîne de type MIME égale à "application/motionphoto-image-meta".

Syntaxe

Si cette piste de métadonnées est définie, son contenu doit consister en un flux d'octets conforme à la spécification MotionPhotoMetadataDescriptor, décrite ici à l'aide de la sémantique du langage de description syntaxique défini dans la clause 8 de la norme ISO/IEC 14496-1:2010(E).

// BaseDescriptor as defined in ISO/IEC 14496-1:2010(E): 7.2.2.2
abstract aligned(8) expandable((1<<28) - 1) class BaseDescriptor
    : bit(8) tag=0 {
  // Empty. To be filled by classes extending this class.
}

// Score data for a frame.
class MotionPhotoFrameScoreDescriptor extends BaseDescriptor
    : bit(8) tag=MotionPhotoFrameScoreDescrTag {
  // The frame's score in the range [0, 1].
  float(32) score;

  // The frame's presentation timestamp in microseconds.
  int(64) presentationTimestampUs;
}

// Score data for a track.
class MotionPhotoTrackScoreDescriptor extends BaseDescriptor
    : bit(8) tag=MotionPhotoTrackScoreDescrTag {
  // The number of scored frames in the track.
  unsigned int(32) numScoredFrames;

  // The track's frames' score data. They must be in ascending order with
  // respect to the presentation timestamp.
  MotionPhotoFrameScoreDescriptor trackFrameScoreDescr[numScoredHighResFrames];
}

// Score data for a motion photo.
class MotionPhotoScoreDescriptor extends BaseDescriptor
    : bit(8) tag=MotionPhotoScoreDescrTag {

  // Machine-intelligence model version used to calculate the scores. Writers
  // using a scoring model should set this field to 1 or greater. Writers not
  // using any scoring model should set this field to 0.
  unsigned int(32) modelVersion;

  // The primary image's frame score data.
  MotionPhotoFrameScoreDescriptor primaryImageFrameScoreDescr;

  // The high-resolution motion photo frames' score data.
  MotionPhotoTrackScoreDescriptor highResTrackScoreDescr;
}

// Flag data for a track.
class MotionPhotoTrackFlagsDescriptor extends BaseDescriptor
    : bit(8) tag=MotionPhotoTrackFlagDescrTag {
  // Set to true to indicate the video frames have been stabilized and don't
  // require readers of the track to apply any further stabilization.
  bit(1) isStabilized;
}

// Flags for a motion photo.
class MotionPhotoFlagsDescriptor extends BaseDescriptor
        : bit(8) tag=MotionPhotoFlagDescrTag {
  // The low-resolution motion photo track's flag data.
  MotionPhotoTrackFlagDescriptor lowResTrackFlagsDescr;

  // The high-resolution motion photo track's flag data.
  MotionPhotoTrackFlagDescriptor highResTrackFlagsDescr;
}

// Container for motion photo metadata, like stabilization indicators and
// quality scoring.
class MotionPhotoMetadataDescriptor extends BaseDescriptor
    : bit(8) tag=MotionPhotoMetadataDescrTag {
  // Scoring data for the still and high-res frames.
  MotionPhotoScoreDescriptor motionPhotoScoreDescr;

  // Flags for the low-res and high-res frames.
  MotionPhotoFlagDescriptor motionPhotoFlagDescr;
}

// Class tags for MotionPhotoData using the "User Private" tag space 0xC0-0xFE
// for descriptors defined in ISO/IEC 14496-1:2010(E): 7.2.2.1, Table 1.
// 0xC0 MotionPhotoMetadataDescrTag
// 0xC1 MotionPhotoScoreDescrTag
// 0xC2 MotionPhotoTrackScoreDescrTag
// 0xC3 MotionPhotoFrameScoreDescrTag
// 0xC4 MotionPhotoFlagsDescrTag
// 0xC5 MotionPhotoTrackFlagDescrTag