Formato de fotos en movimiento 1.0

Las fotos en movimiento son archivos individuales que contienen una imagen fotográfica fija y un video corto, con grabación de audio. Este tipo de contenido multimedia le permite al usuario ver una imagen estática de alta resolución, así como el video y el sonido, para capturar la opinión y la atmósfera donde se tomó la imagen.

Dependencias

Las siguientes son referencias normativas para esta especificación:

Introducción

El uso de "DEBE", "NO DEBE", "OBLIGATORIO", "DEBERÍA", "NO DEBERÍA", "SE RECOMIENDA", "PUEDE" y "OPCIONAL" según el estándar IETF definido en RFC2119.

Formato de fotos en movimiento

Los archivos de fotos en movimiento consisten en un archivo de imagen estática principal, JPEG, HEIC o AVIF, con un archivo de video secundario adjunto. La imagen principal contiene metadatos de XMP de la cámara que describen cómo mostrar el archivo de imagen fija y el contenido del archivo de video, y metadatos de XMP del contenedor que describen cómo ubicar el contenido del archivo de video.

El archivo de imagen puede tener un mapa de ganancia, como es el caso de los JPEG Ultra HDR.

Patrón de nombre de archivo

Los escritores deben usar un nombre de archivo que coincida con la siguiente expresión regular:

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

Los lectores pueden ignorar los metadatos XMP, el archivo de video agregado o el contenido del video si no se sigue el patrón.

Codificación de datos multimedia

La imagen principal contiene un directorio de metadatos XMP de elemento de contenedor que define el orden y las propiedades del archivo multimedia posterior en el contenedor de archivos. Cada archivo del contenedor tiene un elemento multimedia correspondiente en el directorio. El elemento multimedia describe la ubicación en el contenedor del archivo y las propiedades básicas de cada archivo concatenado.

Atributos XMP

Se usan dos conjuntos de metadatos XMP para definir la información semántica adicional para el formato de la foto en movimiento. Los metadatos pueden aparecer en cualquier orden.

Metadatos de la cámara

Los metadatos de la cámara codifican información sobre cómo presentar las partes de la imagen y el video principales de la foto en movimiento.

  • El URI del espacio de nombres es http://ns.google.com/photos/1.0/camera/
  • El prefijo del espacio de nombres predeterminado es Camera

Los siguientes atributos pueden aparecer en los metadatos XMP del archivo de imagen fija:

Nombre

Tipo

Descripción

Camera:MicroVideo

Camera:MicroVideoVersion

Camera:MicroVideoOffset

Camera:MicroVideoPresentation
TimestampUs

Estas propiedades formaban parte de la especificación de Microvideo V1. Se borran en esta especificación y se deben ignorar si están presentes.

En particular, el atributo MicroVideoOffset se reemplaza por el valor GContainer:ItemLength para ubicar los datos de video en el archivo.

Camera:MotionPhoto

Integer

0: Indica que el archivo no debe tratarse como una Foto en movimiento.

1: Indica que el archivo debe tratarse como una Foto en movimiento.

Todos los demás valores son indefinidos y se tratan de forma equivalente a 0.

Si el valor es cero o negativo, el archivo siempre se considerará como una foto que no es en movimiento, incluso si se agregó un video al archivo.

Dado que la mayoría de los editores con buen comportamiento transfieren XMP, los archivos de imagen fija pueden tener un valor residual de 1 en este campo, aunque se haya quitado el video agregado. Por lo tanto, este campo no es definitivo y los lectores siempre deben confirmar que un video está presente.

Camera:MotionPhotoVersion

Integer

Indica la versión en formato de archivo de la Foto en movimiento. Esta especificación define la versión “1”.

Camera:MotionPhotoPresentationTimestampUs

Long

Valor largo que representa la marca de tiempo de presentación (en microsegundos) del fotograma correspondiente a la imagen estática El valor puede ser -1 para indicar no establecido o no especificado.

Comportamiento de la presentación

Si Camera:MotionPhotoPresentationTimestampUs no está presente en el paquete XMP, los lectores deben usar una marca de tiempo de presentación que anteceda inmediatamente a la marca de tiempo más cercana a la mitad de la pista de video, es decir, la duración de la pista de video dividida por 2.

Si Camera:MotionPhotoPresentationTimestampUs está presente en el paquete XMP y "application/motionphoto-image-meta" está presente en el video, debe aparecer el mismo valor en el campo primaryImageFrameScoreDescr presentationTimestampUs de esa pista. Si Camera:MotionPhotoPresentationTimestampUs no está presente en el paquete XMP y la pista de metadatos está presente, el valor en la pista de metadatos debe ser -1.

Elemento de contenedor

El elemento contenedor está codificado en los metadatos XMP de la imagen principal y define el directorio de elementos multimedia del contenedor. Los elementos multimedia deben ubicarse en el archivo contenedor en el mismo orden que los elementos multimedia del directorio y deben estar bien empaquetados.

  • El URI del espacio de nombres es http://ns.google.com/photos/1.0/container/
  • El prefijo del espacio de nombres predeterminado es Container

El directorio puede contener solo un elemento de imagen principal y debe ser el primer elemento en el directorio.

Nombre del elemento

Tipo

Descripción

Directory

Arreglo de estructuras ordenado

Array ordenado de estructuras Container:Item que definen el diseño y el contenido del contenedor.

Elemento:

Los elementos de elementos multimedia describen cómo debe usar la aplicación cada elemento.

  • El URI del espacio de nombres es http://ns.google.com/photos/1.0/container/item/
  • El prefijo del espacio de nombres predeterminado es Item

El primer elemento multimedia debe ser la imagen principal. Debe contener un atributo Mime que especifique uno de los tipos de MIME de imagen que se enumeran en los valores de tipo de MIME del elemento. La longitud del elemento principal se puede determinar analizando la imagen principal según su tipo de MIME, comenzando por el principio del contenedor de archivo.

El primer elemento multimedia puede contener un atributo Padding que especifique el relleno adicional entre el final de la imagen principal codificada y el comienzo del siguiente elemento multimedia. Solo el primer elemento multimedia puede contener un atributo Padding.

Cada elemento multimedia debe contener un atributo Mime. Los elementos multimedia secundarios también deben contener atributos de Longitud.

Los elementos multimedia secuenciales pueden compartir datos de recursos dentro del contenedor de archivos. El primer elemento multimedia determina la ubicación del recurso en el contenedor de archivos y los siguientes elementos multimedia compartidos tienen Length establecido en 0 en el caso de que los datos del recurso sean en sí mismos un contenedor.

La ubicación de los recursos de elementos multimedia en el contenedor se determina mediante la suma de los valores Length de los recursos del elemento secundario anteriores a la longitud de la codificación de la imagen principal más Padding si se especifica.

Nombre del atributo

Tipo

Descripción

Mime

String

Obligatorio. Es una cadena simple que indica el tipo de MIME del elemento multimedia del contenedor.

Semantic

String

Obligatorio. Es una cadena simple que indica el significado específico de la aplicación del elemento multimedia. Consulta la sección Valores semánticos de los elementos para obtener una definición.

Length

Integer

Obligatorio para los elementos multimedia secundarios, incluido el contenedor de video. La longitud del número entero positivo en bytes del elemento. Se espera que los elementos multimedia tengan su forma original, sin codificación. El valor de longitud es la longitud real de los bytes en el archivo.

La longitud 0 en los elementos multimedia secundarios indica que el recurso del elemento multimedia se comparte con el elemento multimedia anterior. Se espera que la longitud sea de 0 en un elemento multimedia principal.

Padding

Integer

[Fotos en movimiento basadas en JPEG]

Opcional para el elemento multimedia principal. String simple que contiene un número entero positivo en bytes de padding adicional entre el final de la imagen principal codificada y el comienzo del siguiente elemento multimedia.

[Fotos en movimiento basadas en HEIC/AVIF]

Obligatorio para el elemento multimedia principal. Debe tener un valor igual a 8, la longitud del encabezado del cuadro de datos de fotos en movimiento de video ("mpvd").

Elemento:Valores de tipo MIME

El atributo Item:Mime define el tipo de MIME de cada elemento multimedia.

Valor

Descripción

image/jpeg

Imagen JPEG

image/heic

Imagen HEIC

image/avif

Imagen AVIF

video/mp4

Contenedor MP4

video/quicktime

Contenedor MOV

Elemento:Valores semánticos

El atributo Item:Semantic define el significado específico de la app de cada elemento multimedia en el directorio del contenedor.

Value

Descripción

Primary

Indica que el elemento multimedia es la imagen lista para mostrar principal del contenedor. Una foto en movimiento debe incluir un solo elemento con esta semántica.

MotionPhoto

Indica que el elemento multimedia es el contenedor de video. Una foto en movimiento debe incluir un solo elemento con esta semántica. La ubicación de este elemento multimedia debe estar al final del archivo. No se pueden colocar otros bytes después de que terminan los bytes de este elemento multimedia.

Fotos en movimiento con una imagen principal Ultra HDR

Según las reglas de valor semántica del elemento definidas en esta especificación y en la especificación de imágenes Ultra HDR, las fotos en movimiento con una imagen Ultra HDR principal también deben incluir un elemento multimedia con una semántica de elemento de "GainMap". Además, los escritores que codifican fotos en movimiento deben colocar el elemento del elemento de mapa de ganancia antes del elemento del elemento de video.

Comportamiento específico de la imagen ISOBMFF

Fotos en movimiento con imágenes basadas en ISOBMFF (p.ej., imágenes HEIC y AVIF) deben tener una estructura que permita que la parte de la imagen del archivo termine con un cuadro de nivel superior, "Datos de video y fotos en movimiento", que se describe con la semántica del lenguaje de descripción sintáctico definido en la cláusula 8 de la norma 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[];
}

donde el campo "data" contiene todos los bytes del video. No se permite el valor especial de "0" para el tamaño del cuadro de datos de videos y fotos en movimiento. (Consulta ISO/IEC 14496-12:2015: 4.2 para obtener la definición de un tamaño de clase que extiende Box).

El XMP de la imagen ISOBMFF también debe definir el valor del atributo de padding del elemento multimedia principal como que sea igual al tamaño en bytes del encabezado del cuadro de datos de video y foto en movimiento, es decir, los encabezados de tamaño y nombre.

Consulta la Figura 1, en la que se ilustra esta estructura de caja para obtener un ejemplo de una foto en movimiento basada en HEIC:

Diagrama de líneas que muestra la disposición de los elementos en un archivo de movimiento HEIC

Figura 1: Ilustración de los cuadros de nivel superior de una imagen HEIC de muestra dentro de un único archivo de fotos en movimiento HEIC. Ten en cuenta que el orden de los cuadros es principalmente para fines ilustrativos (consulta los estándares pertinentes sobre cómo crear archivos HEIF o de video); sin embargo, el cuadro "mpvd" debe aparecer después de todos los cuadros de archivos de imagen HEIC.

Contenidos del contenedor de video

El archivo de contenedor de video que se agrega a la imagen principal debe incluir al menos una pista de video principal. Esta pista es obligatoria y contiene video codificado en AVC, HEVC o AV1. La resolución de fotogramas principal de video no está definida. El espacio de color, la función de transferencia y la profundidad de bits del video pueden variar. Por ejemplo, los videos SDR pueden tener una profundidad de bits de 8 bits, un espacio de color BT.709 y una función de transferencia sRGB. Alternativamente, los videos HDR pueden tener una profundidad de bits de 10 bits, un espacio de color BT.2100 y una función de transferencia HLG o PQ, junto con metadatos de HDR y pistas de metadatos.

El archivo de contenedor de video puede contener una pista de video secundaria opcional de mayor resolución. Los lectores deben usar su contenido para mostrar sustituciones de la imagen estática principal codificada en la imagen JPEG o HEIC. Esta pista puede contener un video de velocidad de fotogramas más baja codificado en AVC, HEVC o AV1. La resolución del fotograma secundario no está definida.

Se espera que todos los fotogramas de la pista de video secundario tengan fotogramas correspondientes en la pista de video principal. Cada par de fotogramas correspondientes en las pistas de video principales y secundarias debe tener marcas de tiempo de presentación idénticas. Si hay un fotograma de pista secundario sin el fotograma de pista principal correspondiente, los usuarios pueden intentar seleccionar un fotograma de pista principal con la marca de tiempo de presentación con la coincidencia más cercana como la miniatura representativa de esa pista de video secundaria.

El archivo de contenedor de video puede contener una pista de audio mono o estéreo opcional de 16 bits a 44 kHz, 48 kHz o 96 kHz, codificada en AAC. Los lectores deben presentar esta pista de audio cuando se muestra la pista de video principal.

La pista de video secundaria, si está presente, siempre debe ir después de la pista de video principal. No existen otras restricciones de orden con respecto a otras pistas. La pista de video principal debe tener un índice de pista inferior al de cualquier pista de video secundaria. Es decir, si la pista de video principal tiene el número de pista 2, cualquier pista de video secundaria debe tener un número de pista mayor o igual que 3.

Seguimiento de metadatos de video con puntuación de inteligencia artificial

De manera opcional, los escritores pueden agregar una pista de metadatos al archivo contenedor de video con el tipo "meta". La pista de metadatos debe tener exactamente una muestra que contenga un flujo de bytes en el formato descrito en "Sintaxis".

Si la pista de metadatos está presente, la entrada de la tabla de descripción de ejemplo de la pista (es decir, el cuadro "stsd" ubicado en "mdia.minf.stbl.stsd" en relación con el cuadro "trak") debe contener un solo átomo que indique una entrada de muestra de metadatos de texto (es decir, un cuadro "mett"). El cuadro "mett" debe tener una cadena de tipo MIME igual a "application/motionphoto-image-meta".

Sintaxis

Si se define esta pista de metadatos, su contenido debe consistir en un flujo de bytes conforme a la especificación MotionPhotoMetadataDescriptor, que se describe aquí con la semántica del lenguaje de descripción sintáctico definido en la cláusula 8 de la norma 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