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:
- Kata kunci untuk digunakan dalam RFC untuk Menunjukkan Tingkat Persyaratan
- T.81 (09/92) Kompresi digital dan coding gambar diam dengan nada berkelanjutan (JPEG)
- ISO/IEC 23008-12:2022 Coding dengan efisiensi tinggi dan penayangan media di lingkungan heterogen Bagian 12: Format File Gambar (HEIC)
- Format File Gambar (AVIF) AV1 (AVIF)
- Format Gambar Ultra HDR v1.0 | Android Developers (Ultra HDR)
- ISO 16684-1:2011(E) Spesifikasi XMP Bagian 1 (XMP)
- Spesifikasi Adobe XMP Bagian 3 Penyimpanan dalam File (XMP)
- ISO/IEC 14496-10:2022 Coding objek audio-visual Bagian 10: Coding video lanjutan (AVC)
- ISO/IEC 23008-2:2023 Coding dengan efisiensi tinggi dan penayangan media di lingkungan heterogen Bagian 2: Coding video dengan efisiensi tinggi (HEVC)
- Spesifikasi Proses Decoding & Bitstream AV1 (AV1)
- Coding Objek Audio-Visual ISO/IEC 14496-1:2010 - Sistem
- Format file media ISO/IEC 14496-12:2015 ISO Box (ISOBMFF)
- ISO/IEC 14496-14:2020 Coding objek audio-visual Bagian 14: Format file MP4 (MP4)
- Apple QuickTime File Format (MOV)
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 |
|
Properti ini merupakan bagian dari spesifikasi Microvideo V1. Parameter tersebut akan dihapus dalam spesifikasi ini dan harus diabaikan jika ada. Secara khusus, atribut |
|
|
|
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. |
|
|
Menunjukkan versi format file Foto Bergerak. Spesifikasi ini mendefinisikan versi "1". |
|
|
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 |
|
Array Struktur yang Diurutkan |
Array yang diurutkan dari struktur |
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 |
|
|
Wajib. String sederhana yang menunjukkan jenis MIME item media dalam penampung. |
|
|
Wajib. String sederhana yang menunjukkan arti spesifik aplikasi dari item media. Lihat bagian Nilai Semantik Item untuk definisi. |
|
|
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. |
|
|
[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 |
|
Gambar JPEG |
|
Gambar HEIC |
|
Gambar AVIF |
|
Penampung MP4 |
|
Penampung MOV |
Item:Nilai semantik
Atribut Item:Semantic
menentukan arti spesifik aplikasi dari setiap
item media dalam direktori container.
|
Deskripsi |
|
Menunjukkan bahwa item media adalah gambar utama yang siap ditampilkan dalam penampung. Foto motion harus menyertakan satu, dan hanya satu, item dengan semantik ini. |
|
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:
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