Format Foto Gerak 1.0

Foto Motion adalah file tunggal yang berisi gambar foto diam dan video pendek, yang mencakup rekaman audio. Jenis media ini memungkinkan pengguna untuk melihat gambar diam beresolusi tinggi serta video dan suara untuk menangkap sentimen dan suasana di mana gambar itu diambil.

Dependensi

Berikut ini adalah referensi normatif untuk spesifikasi ini:

Pengantar

Penggunaan "HARUS", "TIDAK BOLEH", "WAJIB", "HARUS", "TIDAK BOLEH", "DIREKOMENDASIKAN", "MEI", dan "OPSIONAL" sesuai dengan standar IETF didefinisikan dalam RFC2119.

Format Foto Bergerak

File Motion Photo terdiri dari file gambar diam utama, JPEG, HEIC, atau AVIF, dengan file video sekunder yang akan ditambahkan. Gambar utama berisi Camera XMP metadata yang menjelaskan cara menampilkan file gambar diam dan konten file video, dan metadata Container XMP yang menjelaskan cara menemukan konten file video.

File gambar mungkin memiliki getmap, seperti halnya dengan Ultra HDR JPEG.

Pola Nama File

Penulis harus menggunakan nama file yang cocok dengan ekspresi reguler berikut:

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

Pembaca dapat mengabaikan metadata XMP, file video yang ditambahkan, atau video jika pola tidak diikuti.

Encoding Data Media

Image utama berisi Elemen Container XMP direktori metadata yang menentukan urutan dan properti media berikutnya di penampung file. Setiap file dalam penampung memiliki media yang sesuai item pada direktori. Item media menjelaskan lokasi dalam file {i>container <i}dan properti dasar setiap file yang digabungkan.

Atribut XMP

Dua set {i>metadata<i} XMP digunakan untuk mendefinisikan informasi semantik tambahan untuk format Foto Bergerak. Metadata dapat muncul dalam urutan apa pun.

Metadata Kamera

Metadata kamera mengenkode informasi tentang cara menampilkan gambar utama dan bagian video dari Foto Motion.

  • URI namespace adalah http://ns.google.com/photos/1.0/camera/
  • Awalan namespace default adalah Camera

Atribut berikut dapat muncul dalam metadata XMP file gambar diam:

Nama

Jenis

Deskripsi

Camera:MicroVideo

Camera:MicroVideoVersion

Camera:MicroVideoOffset

Camera:MicroVideoPresentation
TimestampUs

Properti ini merupakan bagian dari spesifikasi Microvideo V1. Parameter tersebut akan dihapus dalam spesifikasi ini dan harus diabaikan jika ada.

Secara khusus, atribut MicroVideoOffset diganti dengan nilai GContainer:ItemLength untuk menemukan data video dalam file.

Camera:MotionPhoto

Integer

0: Menunjukkan bahwa file tidak seharusnya diperlakukan sebagai Foto Bergerak.

1: Menunjukkan bahwa file harus diperlakukan sebagai Foto Bergerak.

Semua nilai lain tidak ditentukan dan diperlakukan setara dengan 0.

Jika nilainya nol atau negatif, maka file akan selalu diperlakukan sebagai non-Foto Bergerak, bahkan jika video telah ditambahkan ke dalam file.

Karena XMP digunakan oleh sebagian besar editor yang berperilaku baik, file gambar diam mungkin masih memiliki nilai residu 1 untuk bidang ini meskipun video telah dihapus. Oleh karena itu, kolom ini tidak definitif dan pembaca harus selalu mengonfirmasi keberadaan video.

Camera:MotionPhotoVersion

Integer

Menunjukkan versi format file Foto Bergerak. Spesifikasi ini mendefinisikan versi "1".

Camera:MotionPhotoPresentationTimestampUs

Long

Nilai panjang yang mewakili stempel waktu presentasi (dalam mikrodetik) frame video yang sesuai dengan gambar diam. Nilai dapat berupa -1 untuk menunjukkan tidak ditetapkan/tidak ditentukan.

Perilaku presentasi

Jika Camera:MotionPhotoPresentationTimestampUs tidak ada dalam paket XMP, pembaca harus menggunakan stempel waktu presentasi tepat sebelum stempel waktu yang paling dekat ke bagian tengah trek video, yaitu durasi trek video dibagi 2.

Jika Camera:MotionPhotoPresentationTimestampUs ada dalam paket XMP dan "application/motionphoto-image-meta" ditampilkan dalam video, hal yang sama nilai harus muncul di primaryImageFrameScoreDescr presentationTimestampUs bidang dari jalur tersebut. Jika Camera:MotionPhotoPresentationTimestampUs bukan ada dalam paket XMP dan jalur metadata ada, maka nilai yang trek metadata harus -1.

Elemen container

Elemen kontainer dienkode ke dalam metadata XMP dari gambar utama dan menentukan direktori item media dalam container. Item media harus yang terletak di file container dengan urutan yang sama dengan elemen item media di direktori dan harus dikemas dengan sangat padat.

  • URI namespace adalah http://ns.google.com/photos/1.0/container/
  • Awalan namespace default adalah Container

Direktori ini hanya boleh berisi satu item gambar utama dan harus menjadi item pertama item pada direktori.

Nama Elemen

Jenis

Deskripsi

Directory

Array Struktur yang Diurutkan

Array yang diurutkan dari struktur Container:Item yang menentukan tata letak dan isi container.

Elemen item

Elemen item media menjelaskan cara penggunaan setiap item oleh aplikasi.

  • URI namespace adalah http://ns.google.com/photos/1.0/container/item/
  • Awalan namespace default adalah Item

Item media pertama harus berupa gambar utama. Harus berisi Mime yang menetapkan salah satu jenis MIME gambar yang tercantum dalam Tipe MIME Item Nilai-nilai. Panjang item utama dapat ditentukan dengan menguraikan item utama berdasarkan jenis MIME-nya, yang dimulai dari awal container file.

Item media pertama mungkin berisi atribut Padding yang menentukan padding di antara akhir gambar utama yang dienkode dan awal gambar item media berikutnya. Hanya item media pertama yang boleh berisi atribut Padding.

Setiap item media harus berisi atribut Mime. Item media sekunder harus juga berisi atribut {i>Length<i}.

Item media berurutan dapat berbagi data resource dalam penampung file. Tujuan pertama menentukan lokasi sumber daya di kontainer file, dan item media bersama berikutnya memiliki Length yang disetel ke 0 jika data resource itu sendiri adalah container.

Lokasi resource item media dalam container ditentukan dengan menjumlahkan nilai Length resource item sekunder sebelumnya sepanjang encoding gambar utama ditambah Padding jika ditentukan.

Nama Atribut

Jenis

Deskripsi

Mime

String

Wajib. String sederhana yang menunjukkan jenis MIME item media dalam penampung.

Semantic

String

Wajib. String sederhana yang menunjukkan arti spesifik aplikasi dari item media. Lihat bagian Nilai Semantik Item untuk definisi.

Length

Integer

Wajib untuk item media sekunder, termasuk penampung video. Panjang bilangan bulat positif dalam byte item. Item media diharapkan dalam bentuk aslinya, tanpa encoding yang diterapkan. Nilai {i>length<i} adalah panjang byte sebenarnya dalam file.

Panjang 0 dalam item media sekunder menunjukkan bahwa resource item media dibagikan dengan item media sebelumnya. Panjangnya diharapkan 0 di item media utama.

Padding

Integer

[Foto motion berbasis JPEG]

Opsional untuk item media utama. String sederhana yang berisi panjang bilangan bulat positif dalam byte tambahan padding di antara akhir gambar utama yang dienkode dan awal item media berikutnya.

[Foto motion berbasis HEIC/AVIF]

Diperlukan untuk item media utama. Harus memiliki nilai sama dengan 8, nilai panjang header Foto Gerak Kotak Data Video ("mpvd").

Item:Nilai jenis MIME

Atribut Item:Mime menentukan jenis MIME setiap item media.

Nilai

Deskripsi

image/jpeg

Gambar JPEG

image/heic

Gambar HEIC

image/avif

Gambar AVIF

video/mp4

Penampung MP4

video/quicktime

Penampung MOV

Item:Nilai semantik

Atribut Item:Semantic menentukan arti spesifik setiap aplikasi pada direktori container.

Value

Deskripsi

Primary

Menunjukkan bahwa item media adalah gambar utama yang siap ditampilkan dalam penampung. Foto motion harus menyertakan satu, dan hanya satu, item dengan semantik ini.

MotionPhoto

Menunjukkan bahwa item media adalah penampung video. Foto motion harus menyertakan satu, dan hanya satu, item dengan semantik ini. Lokasi item media ini harus berada di akhir file. Tidak ada byte lain yang dapat ditempatkan setelah byte item media ini dihentikan.

Foto motion dengan gambar Ultra HDR utama

Sesuai dengan aturan nilai semantik item yang ditentukan dalam spesifikasi ini dan spesifikasi gambar Ultra HDR, foto motion dengan gambar Ultra HDR utama juga harus menyertakan item media dengan semantik item "GainMap". Selain itu, penulis yang mengenkode foto bergerak harus menempatkan elemen item getmap sebelum elemen item video.

Perilaku khusus gambar ISOBMFF

Foto Motion dengan Berbasis ISOBMFF gambar (mis., gambar HEIC dan AVIF) harus memiliki struktur sehingga gambar bagian dari file dihentikan dengan "Data Video Foto Bergerak" tingkat atas kotak, dijelaskan dengan menggunakan semantik {i>syntax<i} Bahasa Deskripsi yang didefinisikan dalam Klausul 8 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[];
}

di mana “data” berisi semua byte video. Nilai khusus "0" tidak diizinkan untuk ukuran Kotak Data Video Foto Gerak. (Lihat ISO/IEC 14496-12:2015: 4.2 untuk definisi ukuran class yang memperluas Box.)

XMP gambar ISOBMFF juga harus menentukan Padding item media utama nilai atribut ini sama dengan ukuran dalam byte Video Foto Gerak {i>Header <i}Data Box, yaitu {i>header <i}ukuran dan nama.

Lihat Gambar 1 yang mengilustrasikan struktur kotak ini untuk contoh gerakan berbasis HEIC foto:

Diagram garis yang menunjukkan susunan elemen dalam {i>motion file<i} HEIC

Gambar 1. Ilustrasi kotak tingkat atas dari contoh gambar HEIC dalam satu file foto gerakan HEIC. Perhatikan bahwa urutan kotak sebagian besar adalah untuk hanya ilustrasi (lihat standar yang relevan tentang cara membangun file HEIF atau video); Meskipun demikian, "mpvd" kotak harus muncul setelah semua HEIC kotak file gambar.

Konten penampung video

File kontainer video yang ditambahkan ke gambar utama harus mencakup setidaknya satu trek video utama. Trek ini wajib diisi dan berisi video yang dienkode di AVC, HEVC, atau AV1. Tujuan resolusi frame video utama tidak ditentukan. Ruang warna video, transfer fungsi ini, dan kedalaman bit dapat bervariasi. Misalnya, video SDR mungkin memiliki bit 8-bit kedalaman warna, ruang warna BT.709, dengan fungsi transfer sRGB. Atau, video HDR mungkin memiliki kedalaman 10-bit bit, ruang warna BT.2100, dan transfer HLG atau PQ tambahan, beserta metadata dan trek metadata HDR.

File penampung video dapat berisi satu opsional resolusi sekunder yang lebih tinggi trek video. Pembaca harus menggunakan kontennya untuk menampilkan pengganti untuk gambar diam utama yang dikodekan dalam gambar JPEG atau HEIC. Trek ini mungkin berisi video dengan kecepatan frame yang lebih rendah yang dienkode dalam AVC, HEVC, atau AV1. Frame video sekunder resolusi tidak ditentukan.

Semua frame dalam trek video sekunder diharapkan memiliki frame yang sesuai di trek video utama. Setiap pasangan pasangan frame di trek video primer dan sekunder harus memiliki presentasi yang identik stempel waktu. Jika ada frame trek sekunder tanpa frame trek utama yang sesuai frame trek, pelihat dapat mencoba memilih frame trek utama dengan frame stempel waktu presentasi yang cocok sebagai thumbnail representatif untuk trek video sekunder.

File kontainer video dapat berisi satu audio mono atau stereo 16-bit opsional trek pada 44kHz, 48 kHz, atau 96 kHz yang dikodekan dalam AAC. Pembaca harus menyajikan ini trek audio saat trek video utama ditampilkan.

Trek video sekunder, jika ada, harus selalu muncul setelah trek utama trek video. Tidak ada batasan pengurutan lainnya terkait jalur lain. Tujuan trek video utama harus memiliki indeks trek yang lebih rendah dari trek sekunder mana pun trek video. Artinya, jika trek video utama memiliki trek nomor 2, maka setiap trek video sekunder harus memiliki nomor trek lebih besar dari atau sama dengan 3.

Trek Metadata Video dengan Penskoran Machine Intelligence

Penulis dapat menambahkan trek metadata ke file kontainer video dengan ketik "meta". Trek metadata hanya boleh memiliki satu sampel yang berisi aliran byte dalam format yang dijelaskan dalam "Sintaksis".

Jika trek metadata ada, contoh entri tabel deskripsi untuk (yaitu, kotak "stsd" yang terletak di "mdia.minf.stbl.stsd" relatif terhadap "trak" ) harus berisi satu atom yang menunjukkan contoh metadata teks entri - (yaitu, kotak "mett"). "mett" box harus memiliki string jenis MIME sama ke "application/motionphoto-image-meta".

Sintaksis

Jika trek metadata ini ditentukan, kontennya harus terdiri dari aliran byte sesuai dengan spesifikasi MotionPhotoMetadataDescriptor ini, yang dijelaskan menggunakan semantik {i>syntax<i} Bahasa Deskripsi yang didefinisikan di Klausa 8 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