モーション フォト形式 1.0

モーション フォトは静止画像と短い動画(音声録音を含む)を含む単一のファイルです。このタイプのメディアでは、ユーザーは高解像度の静止画像、動画や音声を表示して、画像が撮影された感情や雰囲気を捉えることができます。

依存関係

この仕様の規範的なリファレンスは次のとおりです。

はじめに

「しなければならない」、「してはならない」、「必要」、「必要」、「するべき」、「推奨」、「しても構わない」、「任意」の使用は、RFC2119 で定義されている IETF 標準に準拠しています。

モーション フォト形式

モーション フォト ファイルは、メインの静止画像ファイル(JPEGHEICAVIF)と、それに付加されたセカンダリ動画ファイルで構成されます。プライマリ画像には、静止画像ファイルと動画ファイルのコンテンツの表示方法を記述するカメラの XMP メタデータと、動画ファイルのコンテンツの場所を記述するコンテナの XMP メタデータが含まれます。

ウルトラ HDR JPEG の場合と同様に、画像ファイルにゲインマップが含まれていることがあります。

ファイル名パターン

ライターは、次の正規表現に一致するファイル名を使用する必要があります。

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

このパターンに従わない場合、リーダーは XMP メタデータ、追加された動画ファイル、動画コンテンツを無視できます。

メディアデータのエンコード

プライマリ画像には、ファイル コンテナ内の後続のメディア ファイルの順序とプロパティを定義するコンテナ要素の XMP メタデータ ディレクトリが含まれます。コンテナ内の各ファイルでは、ディレクトリ内に対応するメディア アイテムが格納されます。メディア アイテムには、ファイル コンテナ内の場所と、連結された各ファイルの基本プロパティが記述されます。

XMP 属性

2 組の XMP メタデータを使用して、モーション フォト形式の追加のセマンティック情報を定義します。メタデータは順不同で表示されます。

カメラのメタデータ

カメラのメタデータは、モーション フォトのメイン画像と動画部分の表示方法に関する情報をエンコードします。

  • 名前空間 URI は http://ns.google.com/photos/1.0/camera/ です。
  • デフォルトの名前空間の接頭辞は Camera です。

静止画像ファイルの XMP メタデータには次の属性が含まれます。

名前

種類

説明

Camera:MicroVideo

Camera:MicroVideoVersion

Camera:MicroVideoOffset

Camera:MicroVideoPresentation
TimestampUs

これらのプロパティはマイクロ動画 V1 の仕様に含まれていました。この仕様では削除されており、存在する場合は無視する必要があります。

具体的には、MicroVideoOffset 属性は GContainer:ItemLength 値に置き換えられ、ファイル内の動画データの場所を特定するために使用されます。

Camera:MotionPhoto

Integer

0: ファイルをモーション フォトとして扱わないことを示します。

1: ファイルをモーション フォトとして扱う必要があることを示します。

その他の値はすべて定義されず、0 と同様に扱われます。

値がゼロまたは負の場合、動画が実際にファイルに追加されていても、ファイルは常にモーション フォト以外のものとして扱われます。

一般的なエディタでは XMP が引き継がれるため、追加された動画が削除されている場合でも、静止画像ファイルのフィールド値が 1 のままになることがあります。したがって、このフィールドは絶対的なものではなく、読者は常に動画が存在することを確認する必要があります。

Camera:MotionPhotoVersion

Integer

モーション フォトのファイル形式のバージョンを示します。この仕様ではバージョン「1」を定義します。

Camera:MotionPhotoPresentationTimestampUs

Long

画像の静止画に対応する動画フレームの表示タイムスタンプ(マイクロ秒単位)を表す long 値。値を -1 にすることで、設定されていないか、指定されていないことを表します。

表示の動作

XMP パケットに Camera:MotionPhotoPresentationTimestampUs が存在しない場合、リーダーは動画トラックの中央に最も近いタイムスタンプの直前の表示タイムスタンプ(動画トラックの時間を 2 で割った値)を使用する必要があります。

XMP パケットに Camera:MotionPhotoPresentationTimestampUs が含まれ、動画に "application/motionphoto-image-meta" が存在する場合は、そのトラックの primaryImageFrameScoreDescr presentationTimestampUs フィールドに同じ値を指定する必要があります。Camera:MotionPhotoPresentationTimestampUs が XMP パケットに存在せず、メタデータ トラックが存在する場合、メタデータ トラックの値は -1 である必要があります。

コンテナ要素

コンテナ要素はプライマリ画像の XMP メタデータにエンコードされ、コンテナ内のメディア アイテムのディレクトリを定義します。メディア アイテムは、ディレクトリ内のメディア アイテム要素と同じ順序でコンテナ ファイル内に配置され、密にパッキングする必要があります。

  • 名前空間 URI は http://ns.google.com/photos/1.0/container/ です。
  • デフォルトの名前空間の接頭辞は Container です。

ディレクトリに含めることができるメイン画像アイテムは 1 つだけです。これはディレクトリ内の最初のアイテムにする必要があります。

要素名

種類

説明

Directory

構造体の順序付き配列

コンテナのレイアウトとコンテンツを定義する Container:Item 構造体の順序付き配列。

アイテム要素

メディア アイテム要素では、アプリケーションでの各アイテムの使用方法を記述します。

  • 名前空間 URI は http://ns.google.com/photos/1.0/container/item/ です。
  • デフォルトの名前空間の接頭辞は Item です。

最初のメディア アイテムはメイン画像である必要があります。アイテムの MIME タイプ値に記載されている画像 MIME タイプのいずれかを指定する Mime 属性を含める必要があります。メインアイテムの長さは、ファイル コンテナの先頭から始まる MIME タイプに基づいてメイン画像を解析することで決定できます。

最初のメディア アイテムには、エンコードされたメイン画像の末尾と次のメディア アイテムの先頭との間の追加のパディングを指定する Padding 属性を含めることができます。Padding 属性を指定できるのは最初のメディア アイテムのみです。

各メディア アイテムには Mime 属性を含める必要があります。セカンダリ メディア アイテムには Length 属性も含める必要があります。

シーケンシャル メディア アイテムは、ファイル コンテナ内でリソースデータを共有できます。最初のメディア アイテムによってファイル コンテナ内のリソースの場所が決まり、リソースデータ自体がコンテナの場合、後続の共有メディア アイテムでは Length が 0 に設定されます。

コンテナ内のメディア アイテム リソースの場所は、直前の付随アイテム リソースの Length 値に、メイン画像のエンコード長に Padding(指定されている場合)を加えた値で決まります。

属性名

種類

説明

Mime

String

必須。コンテナ内のメディア アイテムの MIME タイプを示すシンプルな文字列です。

Semantic

String

必須。メディア アイテムのアプリ固有の意味を示すシンプルな文字列。定義については、「アイテムのセマンティック値」セクションをご覧ください。

Length

Integer

動画コンテナなど、付随するメディア アイテムでは必須。正の整数の長さ(バイト単位)。メディア アイテムは、エンコードが適用されていない元の形式である必要があります。長さの値はファイルのバイトの実際の長さです。

付随メディア アイテムの長さ 0 は、メディア アイテムのリソースが前のメディア アイテムと共有されていることを示します。プライマリ メディア アイテムの長さは 0 である必要があります。

Padding

Integer

[JPEG ベースのモーション フォト]

メイン メディア アイテムの場合は省略可能。 エンコードされたメイン画像の末尾から次のメディア アイテムの先頭までの追加パディングをバイト単位で正の整数で含むシンプルな文字列。

[HEIC/AVIF ベースのモーション フォト]

メイン メディア アイテムでは必須。8 に等しい値、つまりモーション フォト動画データ(「mpvd」)ボックスのヘッダー長を指定する必要があります。

Item:MIME 型の値

Item:Mime 属性は、各メディア アイテムの MIME タイプを定義します。

説明

image/jpeg

JPEG 画像

image/heic

HEIC 画像

image/avif

AVIF イメージ

video/mp4

MP4 コンテナ

video/quicktime

MOV コンテナ

アイテム:セマンティック値

Item:Semantic 属性は、コンテナ ディレクトリ内の各メディア アイテムのアプリケーション固有の意味を定義します。

Value

説明

Primary

メディア アイテムがコンテナ内の表示可能なプライマリ画像であることを示します。モーション フォトには、このセマンティックを持つアイテムを 1 つだけ含める必要があります。

MotionPhoto

メディア アイテムが動画コンテナであることを示します。モーション フォトには、このセマンティックを持つアイテムを 1 つだけ含める必要があります。このメディア アイテムの場所は、ファイルの末尾にする必要があります。このメディア アイテムのバイトが終了したら、他のバイトを配置できません。

メインのウルトラ HDR 画像を使用したモーション フォト

この仕様とウルトラ HDR 画像の仕様で定義されているアイテム セマンティック値のルールに従い、プライマリ ウルトラ HDR 画像を含むモーション フォトには、アイテム セマンティックが "GainMap" のメディア アイテムも含める必要があります。また、モーション フォトをエンコードするライターは、動画アイテム要素の前にゲインマップ アイテム要素を配置する必要があります。

ISOBMFF イメージ固有の動作

ISOBMFF ベースの画像を使用したモーション フォト(例:HEIC 画像や AVIF 画像など)は、ファイルの画像部分が最上位の「モーション フォト動画データ」ボックスで終わるような構造が必要です。これは、ISO/IEC 14496-1:2010(E) の第 8 項で定義されている構文記述言語のセマンティクスを使用して記述されています。

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

「data」フィールドには動画のすべてのバイトが含まれます。モーション フォト動画データ ボックスのサイズには、特別な値「0」は使用できません。(Box を拡張するクラスのサイズの定義については、ISO/IEC 14496-12:2015: 4.2 を参照)。

また、ISOBMFF 画像の XMP では、メイン メディア アイテムのパディング属性値が、モーション フォト動画データ ボックス ヘッダーのサイズ(バイト単位)と同じになるように定義する必要があります。これはサイズと名前のヘッダーです。

HEIC ベースのモーション フォトのサンプルについて、このボックス構造を示した図 1 を参照してください。

HEIC モーション ファイル内の要素の配置を示す線図

図 1. 1 つの HEIC モーション フォト ファイル内のサンプル HEIC 画像を示すトップレベルのボックスのイラスト。ボックスの順序はほぼ説明のみを目的としています(HEIF または動画ファイルの作成方法については、関連する標準をご覧ください)。ただし、「mpvd」ボックスはすべての HEIC 画像ファイルのボックスの後に配置する必要があります。

動画コンテナのコンテンツ

メイン画像に追加される動画コンテナ ファイルには、メイン動画トラックが 1 つ以上含まれている必要があります。このトラックは必須で、AVCHEVC、または AV1 でエンコードされた動画が含まれます。メイン動画のフレーム解像度は定義されていません。動画の色空間、伝達関数、ビット深度は異なる場合があります。たとえば、SDR 動画はビット深度が 8 ビット、BT.709 色空間、sRGB 伝達関数などがあります。また、HDR 動画には、HDR メタデータとメタデータ トラックとともに、10 ビットのビット深度、BT.2100 色空間、HLG または PQ の伝達関数があります。

動画コンテナ ファイルには、必要に応じて高解像度の付随動画トラックを 1 つ含めることができます。リーダーはそのコンテンツを使用して、JPEG または HEIC 画像でエンコードされたプライマリ静止画像の置換を表示する必要があります。このトラックには、AVC、HEVC、AV1 でエンコードされた低フレームレートの動画が含まれている場合があります。付随動画のフレーム解像度は定義されていません。

セカンダリ動画トラック内のすべてのフレームが、プライマリ動画トラックに対応するフレームを持つことが想定されます。メイン動画トラックと付随動画トラックの対応するフレームの各ペアには、同一のプレゼンテーション タイムスタンプを設定する必要があります。第 2 トラックのフレームに対応するメイン トラック フレームがない場合、視聴者は、表示タイムスタンプに最も近い表示タイムスタンプを持つメイン トラック フレームを、そのサブ動画トラックの代表サムネイルとして選択できます。

動画コンテナ ファイルには、AAC でエンコードされた 44 kHz、48 kHz、96 kHz の 16 ビットモノラルまたはステレオの音声トラックを 1 つ含めることができます(省略可)。読者は、メイン動画トラックが表示されるときに、この音声トラックを表示する必要があります。

付随動画のトラックが存在する場合は、必ずメイン動画トラックの後に配置します。他のトラックに関する順序の制約は他にありません。メイン動画トラックのトラック インデックスは、付随動画トラックのトラック インデックスよりも小さくする必要があります。つまり、メイン動画のトラックのトラック番号が 2 の場合、サブ動画のトラックには 3 以上のトラック番号が必要です。

マシン・インテリジェンス・スコアリングによる動画メタデータ・トラック

ライターは、必要に応じてタイプ「meta」のメタデータ トラックを動画コンテナ ファイルに追加できます。メタデータ トラックには、「構文」で説明されている形式のバイト ストリームを含むサンプルを 1 つだけ含める必要があります。

メタデータ トラックが存在する場合、トラックのサンプル説明テーブル エントリ(「trak」ボックスに対して「mdia.minf.stbl.stsd」にある「stsd」ボックス)には、テキスト メタデータのサンプル エントリを示す Atom(「mett」ボックス)を 1 つ含める必要があります。「mett」ボックスには、「application/motionphoto-image-meta」に等しい MIME タイプの文字列を指定する必要があります。

構文

このメタデータ トラックが定義されている場合、その内容は、この MotionPhotoMetadataDescriptor 仕様に準拠するバイト ストリームで構成されている必要があります。この仕様は、ISO/IEC 14496-1:2010(E) 第 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