Formato de foto com movimento 1.0

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

Dependências

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

Introdução

O uso de "PRECISA", "NÃO PODE", "OBRIGATÓRIO", "DEVERIA", "NÃO DEVE", "RECOMENDADO", "PODE" e "OPCIONAL" é de acordo com o padrão IETF definido na 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 um arquivo de vídeo secundário anexado a ele. A imagem principal contém XMP da câmera metadados que descrevem como exibir o arquivo de imagem estática e o conteúdo do arquivo de vídeo, e os 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)

Os leitores podem ignorar os metadados XMP, o arquivo de vídeo anexado ou o caso o padrão não seja seguido.

Codificação de dados de mídia

A imagem principal contém um elemento de contêiner XMP. Diretório de metadados que define a ordem e as propriedades da mídia subsequente no contêiner do arquivo. Cada arquivo no contêiner tem uma mídia correspondente item no diretório. O item de mídia descreve o local no arquivo. contêiner 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 no 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 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 um que não seja uma foto com movimento, mesmo que um vídeo esteja de fato anexado ao arquivo.

Como o XMP é transferido pelos editores mais bem comportados, os arquivos de imagem estática ainda pode ter um valor residual de 1 para este campo, mesmo que o vídeo foi retirado. Por isso, esse campo não é definitivo, e os leitores precisa 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 devem usar um carimbo de data/hora da apresentação imediatamente antes do carimbo de data/hora mais próximo do meio da faixa de vídeo, isto é, a duração da faixa de vídeo dividido por 2.

Se Camera:MotionPhotoPresentationTimestampUs estiver presente no pacote XMP e "application/motionphoto-image-meta" estiver presente no vídeo, o mesmo o valor precisa aparecer no presentationTimestampUs primaryImageFrameScoreDescr campo desse caminho. Se Camera:MotionPhotoPresentationTimestampUs não for presente no pacote XMP e a faixa de metadados estiver presente, o valor em a faixa de metadados precisa 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 devem ser localizados no arquivo de contêiner na mesma ordem que os elementos de item de mídia em diretório e precisa ser compactado.

  • 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 deve 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. Ela precisa conter um Mime. atributo especificando um dos tipos MIME de imagem listados no Tipo MIME do item Valores. O comprimento do item principal pode ser determinado analisando-se baseada no tipo MIME dela, começando no início do contêiner do arquivo.

O primeiro item de mídia pode conter um atributo Padding especificando outros padding entre o final da imagem principal codificada e o início da 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 devem também contêm atributos Length.

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

O local dos recursos de item de mídia no contêiner é determinado pela soma os valores Length dos recursos de item secundário anteriores para o comprimento de a 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 valores padding entre o final da imagem principal codificada e o início da próximo item de mídia.

[Fotos com movimento baseadas em HEIC/AVIF]

Obrigatório para o item de mídia principal. Deve ter um valor igual a 8, o comprimento do cabeçalho da foto com movimento Dados de vídeo ("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 no das especificações de imagem Ultra HDR, as fotos com movimento com uma imagem Ultra HDR principal também precisam incluir um item de mídia com uma semântica de item de "GainMap"; Além disso, os autores que codificam as fotos com movimento devem colocar o elemento do item winmap antes do elemento de vídeo.

Comportamento específico da imagem ISOBMFF

Fotos com movimento com Com base em ISOBMFF imagens (por exemplo, imagens HEIC e AVIF) devem ter uma estrutura que do arquivo termina com uma parte superior de "Dados de vídeo de fotos com movimento" caixa descritas com o uso da semântica da Linguagem de descrição sintática definida em 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 os "dados" 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 com fotos com movimento. (Consulte ISO/IEC 14496-12:2015: 4.2 para definir o tamanho de uma classe que estende o Box.)

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

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

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 um único arquivo de foto com movimento HEIC. A ordem das caixas é principalmente para ilustração (consulte os padrões relevantes sobre como construir arquivos HEIF ou de vídeo); No entanto, o "mpvd" precisa vir depois de todas as consultas HEIC caixas de arquivo de imagem.

Conteúdo do contêiner de vídeo

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

O arquivo de contêiner de vídeo pode conter uma instância secundária opcional de resolução mais alta faixa de vídeo. Os leitores devem usar o conteúdo para exibir substituições para o imagem estática principal codificada na imagem JPEG ou HEIC. Esta faixa pode conter vídeos com frame rate mais baixo codificados em AVC, HEVC ou AV1. O frame do vídeo secundário a resolução é 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 valores os frames nas faixas de vídeo principal e secundária devem ter apresentação idêntica carimbos de data/hora. Se houver um frame de faixa secundário sem o principal correspondente os espectadores podem tentar selecionar um frame principal com o mais próximo carimbo de data/hora da apresentação igual à miniatura representativa dessa faixa de vídeo secundária.

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

A faixa de vídeo secundária, se presente, deve sempre vir depois da faixa principal faixa de vídeo. Não há outras restrições de ordem em relação a outras faixas. A a faixa de vídeo principal deve ter um índice de faixa menor que o de qualquer faixa secundária faixa de vídeo. Ou seja, se a faixa de vídeo principal tiver a faixa número 2, todas as a faixa de vídeo secundária deve 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 escritores podem adicionar uma faixa de metadados ao arquivo do contêiner de vídeo com uma digite "meta". A faixa de metadados deve ter exatamente uma amostra que contenha um stream de bytes no formato descrito em "Sintaxe".

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

Sintaxe

Se essa faixa de metadados estiver definida, o conteúdo dela precisará ser composto por um stream de bytes está em conformidade com esta especificação MotionPhotoMetadataDescriptor, descrita aqui usando a semântica da Linguagem de descrição sintática definida em 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