Formato foto in movimento 1.0

Le foto in movimento sono singoli file che contengono un'immagine fotografica statica e un breve video che include la registrazione audio. Questo tipo di contenuti multimediali consente a un utente di visualizzare un fermo immagine ad alta risoluzione, nonché il video e l'audio per catturare l'atmosfera e l'atmosfera in cui è stata scattata l'immagine.

Dipendenze

Di seguito sono riportati i riferimenti normativi per questa specifica:

Introduzione

L'utilizzo degli attributi "MUST", "MUST NOT", "REQUIRED", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY" e "OPTIONAL" è conforme allo standard IETF definito in RFC2119.

Formato foto in movimento

I file di foto in movimento sono costituiti da un file immagine principale, JPEG, HEIC o AVIF, a cui è aggiunto un file video secondario. L'immagine principale contiene i metadati XMP della fotocamera che descrivono come visualizzare il file dell'immagine statica e i contenuti del file video, mentre i metadati del container XMP che descrivono come individuare i contenuti del file video.

Il file immagine potrebbe avere una mappa di guadagno, come nel caso dei file JPEG Ultra HDR.

Pattern nome file

Gli autori devono utilizzare un nome file corrispondente alla seguente espressione regolare:

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

I lettori possono ignorare i metadati XMP, il file video aggiunto o i contenuti del video se lo schema non viene seguito.

codifica dei dati multimediali

L'immagine principale contiene una directory di metadati XMP di elemento container che definisce l'ordine e le proprietà del file multimediale successivo nel contenitore di file. A ogni file del container corrisponde un elemento multimediale corrispondente nella directory. L'elemento multimediale descrive la posizione nel contenitore di file e le proprietà di base di ogni file concatenato.

Attributi XMP

Per definire le informazioni semantiche aggiuntive per il formato foto in movimento vengono utilizzate due serie di metadati XMP. I metadati possono essere visualizzati in qualsiasi ordine.

Metadati della videocamera

I metadati della fotocamera codificano le informazioni su come presentare l'immagine principale e le parti video della foto in movimento.

  • L'URI dello spazio dei nomi è http://ns.google.com/photos/1.0/camera/
  • Il prefisso dello spazio dei nomi predefinito è Camera

Nei metadati XMP del file immagine possono essere presenti i seguenti attributi:

Nome

Tipo

Descrizione

Camera:MicroVideo

Camera:MicroVideoVersion

Camera:MicroVideoOffset

Camera:MicroVideoPresentation
TimestampUs

Queste proprietà facevano parte della specifica Microvideo V1. Vengono eliminati in questa specifica e devono essere ignorati, se presenti.

In particolare, l'attributo MicroVideoOffset viene sostituito dal valore GContainer:ItemLength per l'individuazione dei dati relativi ai video all'interno del file.

Camera:MotionPhoto

Integer

0: indica che il file non deve essere considerato come foto in movimento.

1: indica che il file deve essere trattato come una foto in movimento.

Tutti gli altri valori non sono definiti e vengono trattati in modo equivalente a 0.

Se il valore è zero o negativo, il file viene sempre considerato come una foto non in movimento, anche se in realtà viene aggiunto un video.

Poiché l'XMP viene trasferito dalla maggior parte degli editor che si sono comportati bene, i file immagine statici potrebbero avere ancora un valore residuo pari a 1 per questo campo anche se il video aggiunto è stato rimosso. Questo campo, pertanto, non è definitivo e i lettori devono sempre confermare la presenza di un video.

Camera:MotionPhotoVersion

Integer

Indica la versione del formato file della foto in movimento. Questa specifica definisce la versione "1".

Camera:MotionPhotoPresentationTimestampUs

Long

Valore lungo che rappresenta il timestamp della presentazione (in microsecondi) del frame video corrispondente al fermo dell'immagine. Il valore può essere -1 per indicare un valore non impostato/non specificato.

Comportamento della presentazione

Se Camera:MotionPhotoPresentationTimestampUs non è presente nel pacchetto XMP, i lettori devono utilizzare un timestamp di presentazione immediatamente precedente il timestamp più vicino alla metà della traccia video, ovvero la durata della traccia video divisa per 2.

Se Camera:MotionPhotoPresentationTimestampUs è presente nel pacchetto XMP e "application/motionphoto-image-meta" è presente nel video, lo stesso valore deve apparire nel campo presentationTimestampUs primaryImageFrameScoreDescr della traccia. Se Camera:MotionPhotoPresentationTimestampUs non è presente nel pacchetto XMP ed è presente la traccia di metadati, il valore nella traccia di metadati deve essere -1.

Elemento contenitore

L'elemento container è codificato nei metadati XMP dell'immagine principale e definisce la directory degli elementi multimediali nel container. Gli elementi multimediali devono trovarsi nel file del contenitore nello stesso ordine degli elementi multimediali nella directory e devono essere compressi.

  • L'URI dello spazio dei nomi è http://ns.google.com/photos/1.0/container/
  • Il prefisso dello spazio dei nomi predefinito è Container

La directory può contenere un solo elemento dell'immagine principale e deve essere il primo elemento della directory.

Nome elemento

Tipo

Descrizione

Directory

Array ordinato di strutture

Array ordinato di strutture Container:Item che definisce il layout e i contenuti del container.

Elemento elemento

Gli elementi degli elementi multimediali descrivono come ogni elemento dovrebbe essere utilizzato dall'applicazione.

  • L'URI dello spazio dei nomi è http://ns.google.com/photos/1.0/container/item/
  • Il prefisso dello spazio dei nomi predefinito è Item

Il primo elemento multimediale deve essere l'immagine principale. Deve contenere un attributo Mime che specifichi uno dei tipi MIME immagine elencati in Valori tipo MIME elemento. La lunghezza dell'elemento principale può essere determinata analizzando l'immagine principale in base al suo tipo MIME a partire dall'inizio del contenitore di file.

Il primo elemento multimediale può contenere un attributo Padding che specifica una spaziatura interna aggiuntiva tra la fine dell'immagine principale codificata e l'inizio dell'elemento multimediale successivo. Solo il primo elemento multimediale può contenere un attributo Padding.

Ogni elemento multimediale deve contenere un attributo Mime. Anche gli elementi multimediali secondari devono contenere attributi Length.

Gli elementi multimediali sequenziali possono condividere dati delle risorse all'interno del contenitore dei file. Il primo elemento multimediale determina la posizione della risorsa nel contenitore dei file, mentre gli elementi multimediali condivisi successivi hanno il valore Length impostato su 0 nel caso in cui i dati della risorsa siano essi stessi un contenitore.

La posizione delle risorse dell'elemento multimediale nel container viene determinata sommando i valori Length delle risorse dell'elemento secondario precedenti con la lunghezza della codifica dell'immagine principale più Padding, se specificato.

Nome attributo

Tipo

Descrizione

Mime

String

Obbligatorio. Stringa semplice che indica il tipo MIME dell'elemento multimediale nel contenitore.

Semantic

String

Obbligatorio. Stringa semplice che indica il significato specifico dell'applicazione dell'elemento multimediale. Consulta la sezione Valori semantici degli elementi per la definizione.

Length

Integer

Obbligatorio per gli elementi multimediali secondari, incluso il contenitore video. Il numero intero positivo in byte dell'articolo. Gli elementi multimediali devono essere nella loro forma originale, senza codifica. Il valore della lunghezza corrisponde alla lunghezza effettiva dei byte nel file.

La lunghezza pari a 0 negli elementi multimediali secondari indica che la risorsa dell'elemento multimediale è condivisa con l'elemento multimediale precedente. La lunghezza dovrebbe essere pari a 0 in un elemento multimediale principale.

Padding

Integer

[Foto in movimento basate su JPEG]

Facoltativo per l'elemento multimediale principale. Stringa semplice contenente un numero intero positivo in byte di spaziatura interna aggiuntiva tra la fine dell'immagine principale codificata e l'inizio dell'elemento multimediale successivo.

[Foto in movimento basate su HEIC/AVIF]

Obbligatorio per l'elemento multimediale principale. Deve avere un valore uguale a 8, la lunghezza dell'intestazione della casella dei dati video delle foto in movimento ("mpvd").

Elemento:valori tipo MIME

L'attributo Item:Mime definisce il tipo MIME di ogni elemento multimediale.

Valore

Descrizione

image/jpeg

Immagine JPEG

image/heic

Immagine HEIC

image/avif

Immagine AVIF

video/mp4

Contenitore MP4

video/quicktime

Contenitore MOV

Elemento:valori semantici

L'attributo Item:Semantic definisce il significato specifico dell'applicazione di ogni elemento multimediale nella directory del container.

Value

Descrizione

Primary

Indica che l'elemento multimediale è l'immagine display principale pronta nel contenitore. Una foto in movimento deve includere un solo elemento con questa semantica.

MotionPhoto

Indica che l'elemento multimediale è il contenitore video. Una foto in movimento deve includere un solo elemento con questa semantica. Il percorso di questo elemento multimediale deve trovarsi alla fine del file. Non è possibile inserire altri byte dopo la terminazione dei byte di questo elemento multimediale.

Foto in movimento con un'immagine Ultra HDR principale

In base alle regole per i valori semantici degli elementi definite in questa specifica e nella specifica delle immagini Ultra HDR, le foto in movimento con un'immagine Ultra HDR principale devono includere anche un elemento multimediale con la semantica dell'elemento "GainMap". Inoltre, gli scrittori che codificano le foto in movimento devono posizionare l'elemento elemento guadagnomap prima dell'elemento video.

Comportamento specifico per immagine ISOBMFF

Foto in movimento con immagini basate su ISOBMFF (ad es. le immagini HEIC e AVIF) devono avere una struttura in modo che la porzione dell'immagine del file termini con una casella di primo livello "Dati video foto in movimento", descritta utilizzando la semantica del Syntactic Description Language definito nella clausola ISO/IEC 14496-1:2010(E) 8:

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

in cui il campo "data" contiene tutti i byte video. Il valore speciale "0" non è consentito per le dimensioni della casella dati video foto in movimento. (Consulta ISO/IEC 14496-12:2015: 4.2 per la definizione di una dimensione di classe che estende Box.)

L'XMP dell'immagine ISOBMFF deve inoltre definire il valore dell'attributo Spaziatura interna dell'elemento multimediale principale in modo che corrisponda alle dimensioni in byte dell'intestazione della casella dati video foto in movimento, ovvero le intestazioni dimensioni e nome.

Fai riferimento alla Figura 1 che illustra la struttura di questa scatola per una foto di movimento basata su HEIC di esempio:

Diagramma a linee che mostra la disposizione degli elementi in un file di movimento HEIC

Figura 1. Illustrazione delle caselle di primo livello di un'immagine HEIC di esempio all'interno di un singolo file di foto in movimento HEIC. Tieni presente che l'ordine delle caselle è solo a scopo illustrativo (fai riferimento agli standard pertinenti per la creazione di file HEIF o video); tuttavia, la casella"mpvd" deve essere inserita dopo tutte le caselle del file immagine HEIC.

Contenuti del contenitore video

Il file del contenitore video aggiunto all'immagine principale deve includere almeno una traccia video principale. Questa traccia è obbligatoria e contiene video codificato in AVC, HEVC o AV1. La risoluzione del frame video principale non è definita. Lo spazio colore del video, la funzione di trasferimento e la profondità in bit possono variare. Ad esempio, i video SDR possono avere una profondità di 8 bit, spazio colore BT.709 e una funzione di trasferimento sRGB. In alternativa, i video HDR possono avere una profondità di 10 bit, uno spazio colore BT.2100 e una funzione di trasferimento HLG o PQ, oltre a metadati e tracce di metadati HDR.

Il file del contenitore video può contenere una traccia video secondaria con risoluzione più alta facoltativa. I lettori devono utilizzare i suoi contenuti per visualizzare le sostituzioni dell'immagine statica principale codificata nell'immagine JPEG o HEIC. Questa traccia può contenere video con frequenza fotogrammi inferiore codificati in AVC, HEVC o AV1. La risoluzione del fotogramma secondario non è definita.

È normale che tutti i fotogrammi nella traccia video secondaria abbiano fotogrammi corrispondenti nella traccia video principale. Ogni coppia di frame corrispondenti nelle tracce video principali e secondarie dovrebbe avere timestamp di presentazione identici. Se è presente un frame della traccia secondario senza un frame della traccia principale corrispondente, gli spettatori possono provare a selezionare un frame della traccia principale con il timestamp di presentazione più simile come miniatura rappresentativa della traccia video secondaria.

Il file del contenitore video può contenere una traccia audio facoltativa in formato mono o stereo a 16 bit a 44 kHz, 48 kHz o 96 kHz codificata in AAC. I lettori devono presentare questa traccia audio quando viene visualizzata la traccia video principale.

La traccia video secondaria, se presente, deve sempre essere dopo la traccia video principale. Non ci sono altri vincoli di ordinamento relativi ad altre tracce. La traccia video principale deve avere un indice delle tracce inferiore a quello di qualsiasi traccia video secondaria. In altre parole, se la traccia video principale ha una traccia numero 2, ogni traccia video secondaria dovrà avere un numero di traccia maggiore o uguale a 3.

Traccia dei metadati video con punteggio di Machine Intelligence

Gli autori possono aggiungere facoltativamente una traccia di metadati al file del contenitore video con un tipo "meta". La traccia di metadati deve avere esattamente un campione contenente uno stream di byte nel formato descritto in "Sintassi".

Se è presente la traccia di metadati, la voce della tabella di descrizione dell'esempio relativa alla traccia (ovvero la casella "stsd" situata in "mdia.minf.stbl.stsd" relativa alla casella "trak") deve contenere un singolo atomo che indica una voce di esempio di metadati di testo, ovvero una casella "mett". La casella "mett" deve avere una stringa di tipo MIME uguale a "application/motionphoto-image-meta".

Sintassi

Se viene definita questa traccia di metadati, i relativi contenuti devono essere costituiti da uno stream di byte conforme alla presente specifica MotionPhotoMetadataDescriptor, descritta qui utilizzando la semantica del Syntactic Description Language definita nella clausola ISO/IEC 14496-1:2010(E) 8.

// 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