Format Foto Gerak 1.0

Foto Motion adalah file tunggal yang berisi gambar fotografi diam dan video singkat, yang menyertakan rekaman audio. Jenis media ini memungkinkan pengguna melihat gambar diam beresolusi tinggi serta video dan suara untuk menangkap sentimen dan suasana tempat gambar diambil.

Dependensi

Berikut ini adalah referensi normatif untuk spesifikasi ini:

Pengantar

Penggunaan "HARUS", "HARUS NOT", "REQUIRED", "SHOULD", "HARUS NOT", "RECOMMENDED", "MAY", dan "OPTIONAL" sesuai dengan standar IETF yang ditentukan dalam RFC2119.

Format Foto Bergerak

File Motion Photo terdiri dari file gambar diam utama, JPEG, HEIC, atau AVIF, dengan file video sekunder yang ditambahkan ke dalamnya. Gambar utama berisi metadata Kamera XMP yang menjelaskan cara menampilkan file gambar diam dan konten file video, serta 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 konten video jika polanya tidak diikuti.

Encoding Data Media

Gambar utama berisi direktori metadata XMP Elemen Container yang menentukan urutan dan properti file media berikutnya di penampung file. Setiap file dalam penampung memiliki item media yang sesuai di direktori. Item media menjelaskan lokasi dalam penampung file dan properti dasar setiap file gabungan.

Atribut XMP

Dua kumpulan metadata XMP digunakan untuk menentukan informasi semantik tambahan untuk format Motion Photo. Metadata dapat muncul dalam urutan apa pun.

Metadata Kamera

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

  • 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, file ini selalu diperlakukan sebagai Foto non-Motion, meskipun video sebenarnya ditambahkan ke file.

Karena XMP digunakan oleh sebagian besar editor yang berperilaku baik, file gambar diam mungkin masih memiliki nilai residu 1 untuk kolom ini meskipun video yang ditambahkan telah dihapus. Oleh karena itu, kolom ini tidak pasti 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 dengan bagian tengah trek video, yaitu durasi trek video yang dibagi 2.

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

Elemen container

Elemen container dienkode ke dalam metadata XMP gambar utama dan menentukan direktori item media dalam container. Item media harus berada di file penampung dalam urutan yang sama dengan elemen item media dalam direktori dan harus dikemas dengan rapat.

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

Direktori tersebut hanya dapat berisi satu item gambar utama dan harus menjadi item pertama dalam direktori.

Nama Elemen

Jenis

Deskripsi

Directory

Array Struktur yang Diurutkan

Array yang diurutkan dari struktur Container:Item yang menentukan tata letak dan konten penampung.

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. Atribut ini harus berisi atribut Mime yang menentukan salah satu jenis MIME gambar yang tercantum dalam Nilai Jenis MIME Item. Panjang item utama dapat ditentukan dengan menguraikan gambar utama berdasarkan jenis MIME-nya yang dimulai dari awal penampung file.

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

Setiap item media harus berisi atribut Mime. Item media sekunder juga harus berisi atribut Panjang.

Item media berurutan dapat berbagi data resource dalam penampung file. Item media pertama menentukan lokasi resource dalam penampung file, dan item media bersama berikutnya menetapkan Length ke 0 jika data resource itu sendiri adalah penampung.

Lokasi resource item media dalam penampung ditentukan dengan menjumlahkan nilai Length dari resource item sekunder sebelumnya dengan panjang 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 padding tambahan antara akhir gambar utama yang dienkode dan awal item media berikutnya.

[Foto motion berbasis HEIC/AVIF]

Diperlukan untuk item media utama. Harus memiliki nilai yang sama dengan 8, panjang header kotak Data Video Foto Gerak ("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 aplikasi dari setiap item media dalam 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 dalam spesifikasi gambar Ultra HDR, foto gerakan dengan gambar Ultra HDR utama juga harus menyertakan item media dengan semantik item "GainMap". Selain itu, penulis yang mengenkode foto motion harus menempatkan elemen item getmap sebelum elemen item video.

Perilaku khusus gambar ISOBMFF

Foto Motion dengan gambar berbasis ISOBMFF (mis., Gambar HEIC dan AVIF) harus memiliki struktur sedemikian rupa sehingga bagian gambar file dihentikan dengan kotak "Data Video Foto Gerak" tingkat atas, yang dijelaskan menggunakan semantik Sintaksis Deskripsi yang ditetapkan dalam ISO/IEC 14496-1:2010(E) klausa 8:

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

dengan isian "data" yang 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 nilai atribut Padding item media utama sebagai ukuran yang sama dengan ukuran dalam byte header Kotak Data Video Motion, yaitu header ukuran dan nama.

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

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. Perlu diketahui bahwa urutan kotak sebagian besar hanya untuk ilustrasi (lihat standar yang relevan tentang cara membuat file HEIF atau video); namun, kotak "mpvd" harus disertakan setelah semua kotak file gambar HEIC.

Konten penampung video

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

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

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

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

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

Trek Metadata Video dengan Penskoran Machine Intelligence

Penulis dapat secara opsional menambahkan trek metadata ke file penampung video dengan jenis "meta". Trek metadata harus memiliki tepat satu sampel yang berisi aliran byte dalam format yang dijelaskan dalam "Sintaksis".

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

Sintaksis

Jika trek metadata ini ditentukan, kontennya harus terdiri dari aliran byte yang sesuai dengan spesifikasi MotionPhotoMetadataDescriptor ini, yang dijelaskan di sini menggunakan semantik Bahasa Deskripsi Sintaksis yang ditentukan dalam ISO/IEC 14496-1:2010(E) klausa 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