Formato de foto com movimento 1.0

As fotos com movimento são arquivos únicos que contêm uma imagem estática e um vídeo curto, que inclui gravação de áudio. Esse tipo de mídia permite que um usuário visualize uma imagem estática de alta resolução, bem como o vídeo e o som, para capturar o sentimento e a atmosfera em que a imagem foi tirada.

Dependências

Confira a seguir referências normativas para esta especificação:

Introdução

O uso de "DEVE", "NÃO PODE", "OBRIGATÓRIO", "DEVERIA", "NÃO DEVE", "RECOMENDADO", "MAIO" e "OPCIONAL" é de acordo com o padrão IETF definido em RFC2119.

Formato de foto com movimento

Os arquivos de fotos com movimento consistem em um arquivo de imagem estática principal, JPEG, HEIC ou AVIF, com um arquivo de vídeo secundário anexado a ele. A imagem principal contém metadados XMP da câmera que descrevem como exibir o conteúdo do arquivo de imagem estática e do arquivo de vídeo, e metadados XMP do contêiner que descrevem como localizar o conteúdo do arquivo de vídeo.

O arquivo de imagem pode ter um mapa de ganho, como é o caso de JPEGs Ultra HDR.

Padrão de nome de arquivo

Os gravadores precisam usar um nome de arquivo correspondente à seguinte expressão regular:

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

Se o padrão não for seguido, os leitores poderão ignorar os metadados XMP, o arquivo de vídeo anexado ou o conteúdo do vídeo.

Codificação de dados de mídia

A imagem principal contém um diretório de metadados XMP do elemento de contêiner que define a ordem e as propriedades do arquivo de mídia subsequente no contêiner de arquivos. Cada arquivo no contêiner tem um item de mídia correspondente no diretório. O item de mídia descreve o local no contêiner de arquivos e as propriedades básicas de cada arquivo concatenado.

Atributos XMP

Dois conjuntos de metadados XMP são usados para definir as informações semânticas extras para o formato foto com movimento. Eles podem aparecer em qualquer ordem.

Metadados da câmera

Os metadados da câmera codificam as informações sobre como apresentar a imagem principal e as partes do vídeo da foto com movimento.

  • O URI do namespace é http://ns.google.com/photos/1.0/camera/
  • O prefixo padrão do namespace é Camera

Os seguintes atributos podem aparecer nos metadados XMP do arquivo de imagem estática:

Nome

Tipo

Descrição

Camera:MicroVideo

Camera:MicroVideoVersion

Camera:MicroVideoOffset

Camera:MicroVideoPresentation
TimestampUs

Essas propriedades faziam parte da especificação Microvideo V1. Eles são excluídos nesta especificação e precisam ser ignorados, se estiverem presentes.

Mais especificamente, o atributo MicroVideoOffset é substituído pelo valor GContainer:ItemLength para localizar os dados de vídeo no arquivo.

Camera:MotionPhoto

Integer

0: indica que o arquivo não deve ser tratado como uma foto com movimento.

1: indica que o arquivo deve ser tratado como uma foto com movimento.

Todos os outros valores são indefinidos e são tratados de maneira equivalente a 0.

Se o valor for zero ou negativo, o arquivo será sempre tratado como uma foto sem movimento, mesmo que um vídeo esteja realmente anexado ao arquivo.

Como o XMP é transferido pelos editores mais comportados, os arquivos de imagem estática ainda podem ter um valor residual de 1 para esse campo, mesmo que o vídeo anexado tenha sido removido. Esse campo não é definitivo, e os leitores precisam sempre confirmar a presença de um vídeo.

Camera:MotionPhotoVersion

Integer

Indica a versão do formato do arquivo da foto com movimento. Esta especificação define a versão "1".

Camera:MotionPhotoPresentationTimestampUs

Long

Valor longo que representa o carimbo de data/hora da apresentação (em microssegundos) do frame do vídeo correspondente à imagem estática. O valor pode ser -1 para indicar não definido/não especificado.

Comportamento da apresentação

Se Camera:MotionPhotoPresentationTimestampUs não estiver presente no pacote XMP, os leitores precisarão usar um carimbo de data/hora da apresentação imediatamente anterior ao carimbo de data/hora mais próximo do meio da faixa de vídeo, ou seja, a duração da faixa de vídeo dividida por dois.

Se Camera:MotionPhotoPresentationTimestampUs estiver presente no pacote XMP e o "application/motionphoto-image-meta" estiver presente no vídeo, o mesmo valor precisará aparecer no campo primaryImageFrameScoreDescr presentationTimestampUs dessa faixa. Se Camera:MotionPhotoPresentationTimestampUs não estiver presente no pacote XMP e a faixa de metadados estiver presente, o valor na faixa de metadados precisará ser -1.

Elemento Container

O elemento de contêiner é codificado nos metadados XMP da imagem principal e define o diretório dos itens de mídia no contêiner. Os itens de mídia precisam ser localizados no arquivo do contêiner na mesma ordem que os elementos dos itens de mídia no diretório e ser bem compactados.

  • O URI do namespace é http://ns.google.com/photos/1.0/container/
  • O prefixo padrão do namespace é Container

O diretório pode conter apenas um item de imagem principal e precisa ser o primeiro item no diretório.

Nome do elemento

Tipo

Descrição

Directory

Matriz ordenada de estruturas

Matriz ordenada de estruturas Container:Item que definem o layout e o conteúdo do contêiner.

Elemento do item

Os elementos de itens de mídia descrevem como cada item deve ser usado pelo aplicativo.

  • O URI do namespace é http://ns.google.com/photos/1.0/container/item/
  • O prefixo padrão do namespace é Item

O primeiro item de mídia precisa ser a imagem principal. Ele precisa conter um atributo Mime especificando um dos tipos MIME de imagem listados nos valores de tipo MIME do item. O comprimento do item principal pode ser determinado analisando a imagem principal com base no tipo MIME, começando no início do contêiner do arquivo.

O primeiro item de mídia pode conter um atributo Padding especificando um padding adicional entre o final da imagem principal codificada e o início do próximo item de mídia. Somente o primeiro item de mídia pode conter um atributo Padding.

Cada item de mídia precisa conter um atributo Mime. Os itens de mídia secundários também precisam conter atributos Length.

Os itens de mídia sequenciais podem compartilhar dados de recursos no contêiner de arquivos. O primeiro item de mídia determina a localização do recurso no contêiner de arquivos e os itens de mídia compartilhados subsequentes têm Length definido como 0 caso os dados do recurso sejam um contêiner.

A localização dos recursos de item de mídia no contêiner é determinada pela soma dos valores Length dos recursos do item secundário anteriores com o comprimento da codificação de imagem principal mais Padding, se especificado.

Nome do atributo

Tipo

Descrição

Mime

String

Obrigatório. String simples que indica o tipo MIME do item de mídia no contêiner.

Semantic

String

Obrigatório. String simples que indica o significado específico do aplicativo para o item de mídia. Consulte a seção "Valores semânticos do item" para definição.

Length

Integer

Obrigatório para itens de mídia secundários, incluindo o contêiner de vídeo. O tamanho inteiro positivo em bytes do item. Os itens de mídia devem estar no formato original, sem codificação aplicada. O valor de comprimento é o tamanho real dos bytes no arquivo.

O tamanho 0 nos itens de mídia secundários indica que o recurso do item de mídia é compartilhado com o item de mídia anterior. O tamanho esperado é 0 em um item de mídia principal.

Padding

Integer

[Fotos com movimento baseadas em JPEG]

Opcional para o item de mídia principal. String simples que contém um tamanho inteiro positivo em bytes de padding extra entre o final da imagem principal codificada e o início do próximo item de mídia.

[Fotos com movimento baseadas em HEIC/AVIF]

Obrigatório para o item de mídia principal. Precisa ter um valor igual a 8, o tamanho do cabeçalho da caixa "Dados de vídeo de fotos com movimento ("mpvd").

Item:valores do tipo MIME

O atributo Item:Mime define o tipo MIME de cada item de mídia.

Valor

Descrição

image/jpeg

Imagem JPEG

image/heic

Imagem HEIC

image/avif

Imagem AVIF

video/mp4

Contêiner MP4

video/quicktime

Contêiner MOV

Item:valores semânticos

O atributo Item:Semantic define o significado específico do aplicativo de cada item de mídia no diretório do contêiner.

Value

Descrição

Primary

Indica que o item de mídia é a principal imagem pronta para exibição no contêiner. Uma foto com movimento precisa incluir apenas um item com essa semântica.

MotionPhoto

Indica que o item de mídia é o contêiner de vídeo. Uma foto com movimento precisa incluir apenas um item com essa semântica. O local desse item de mídia precisa estar no final do arquivo. Nenhum outro byte pode ser colocado depois que os bytes deste item de mídia forem encerrados.

Fotos com movimento com uma imagem Ultra HDR principal

De acordo com as regras de valor semântico do item definidas nesta especificação e na especificação de imagem Ultra HDR, as fotos com movimento com uma imagem Ultra HDR também precisam incluir um item de mídia com uma semântica de item de "GainMap". Além disso, os gravadores que codificam as fotos com movimento precisam colocar o elemento do item de ganho do mapa antes do elemento do item de vídeo.

Comportamento específico da imagem ISOBMFF

Fotos com movimento com imagens baseadas em ISOBMFF (por exemplo, imagens HEIC e AVIF) precisam ter uma estrutura que faça com que a parte da imagem do arquivo termine com uma caixa de dados de vídeo de fotos com movimento de nível superior, descrita usando a semântica da linguagem de descrição sintática definida na cláusula 8 da 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[];
}

em que o campo "data" contém todos os bytes do vídeo. O valor especial de "0" não é permitido para o tamanho da caixa de dados de vídeos de fotos com movimento. Consulte ISO/IEC 14496-12:2015: 4.2 para ver a definição de um tamanho de classe que estende a caixa.

O XMP da imagem ISOBMFF também precisa definir o valor do atributo "Padding" do item de mídia principal como sendo igual ao tamanho em bytes do cabeçalho da caixa de dados do vídeo com movimento, que são os cabeçalhos de tamanho e nome.

Consulte a Figura 1 ilustrando essa estrutura de caixa para um exemplo de foto de movimento baseada em HEIC:

Diagrama de linhas demonstrando a organização dos elementos em um arquivo de movimento HEIC

Figura 1. Ilustração das caixas de nível superior de uma amostra de imagem HEIC em um único arquivo de foto com movimento HEIC. A ordem das caixas serve principalmente para ilustração (consulte os padrões relevantes sobre como construir arquivos HEIF ou de vídeo). No entanto, a caixa "mpvd" precisa vir depois de todas as caixas do arquivo de imagem HEIC.

Conteúdo do contêiner de vídeo

O arquivo do contêiner de vídeo anexado à imagem principal precisa incluir pelo menos uma faixa de vídeo principal. Essa faixa é obrigatória e contém vídeo codificado em AVC, HEVC ou AV1. A resolução de frame do vídeo principal é indefinida. O espaço de cores do vídeo, a função de transferência e a profundidade de bits podem variar. Por exemplo, os vídeos SDR podem ter uma profundidade de 8 bits, espaço de cor BT.709, com uma função de transferência sRGB. Os vídeos em HDR também podem ter uma profundidade de 10 bits, espaço de cor BT.2100 e uma função de transferência HLG ou PQ, além de faixas de metadados e metadados HDR.

O arquivo de contêiner de vídeo pode conter uma faixa de vídeo secundária com resolução mais alta opcional. Os leitores precisam usar o conteúdo para exibir substituições para a imagem estática principal codificada na imagem JPEG ou HEIC. Essa faixa pode conter vídeo com frame rate mais baixo codificado em AVC, HEVC ou AV1. A resolução do frame do vídeo secundário é indefinida.

Espera-se que todos os frames na faixa de vídeo secundária tenham frames correspondentes na faixa de vídeo principal. Cada par de frames correspondentes nas faixas de vídeo principal e secundária precisa ter carimbos de data/hora de apresentação idênticos. Se houver um frame de faixa secundário sem um frame principal correspondente, os espectadores poderão tentar selecionar um frame principal com o carimbo de data/hora da apresentação correspondente mais próximo como a miniatura representativa dessa faixa de vídeo secundária.

O arquivo do contêiner de vídeo pode conter uma faixa de áudio mono ou estéreo de 16 bits opcional a 44 kHz, 48 kHz ou 96 kHz codificada em AAC. Os leitores precisam apresentar essa faixa de áudio quando a faixa de vídeo principal for exibida.

A faixa de vídeo secundária, se houver, precisa sempre vir depois da faixa de vídeo principal. Não há outras restrições de ordem em relação a outras faixas. A faixa de vídeo principal precisa ter um índice de faixa menor que o de qualquer faixa de vídeo secundária. Ou seja, se a faixa de vídeo principal tiver a faixa número 2, qualquer faixa de vídeo secundária vai precisar ter um número de faixa maior ou igual a 3.

Faixa de metadados de vídeo com pontuação de inteligência de máquina

Opcionalmente, os gravadores podem adicionar uma faixa de metadados ao arquivo do contêiner de vídeo com um tipo "meta". A faixa de metadados precisa ter exatamente uma amostra que contenha um fluxo de bytes no formato descrito em "Sintaxe".

Se houver uma faixa de metadados, o exemplo de entrada da tabela de descrição da faixa (ou seja, a caixa "stsd" localizada em "mdia.minf.stbl.stsd" em relação à caixa "trak") precisará conter um único atom que indique uma entrada de amostra de metadados de texto (ou seja, uma caixa "mett"). A caixa "mett" precisa ter uma string de tipo MIME igual a "application/motionphoto-image-meta".

Sintaxe

Se essa faixa de metadados for definida, o conteúdo dela precisará consistir em um fluxo de bytes em conformidade com a especificação MotionPhotoMetadataDescriptor, descrita aqui usando a semântica da linguagem de descrição sintática definida na cláusula 8 da 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