פורמט של תמונה עם תנועה 1.0

תמונות עם תנועה הן קבצים בודדים שמכילים תמונות סטילס וכן סרטון קצר, כולל הקלטת אודיו. סוג המדיה הזה מאפשר למשתמש להציג תמונת סטילס ברזולוציה גבוהה וגם את הסרטון והסאונד כדי לתעד הסנטימנט והאווירה שבהם התמונה צולמה.

יחסי תלות

הנה כמה הפניות נורמליות למפרט הזה:

מבוא

השימוש במילים "חובה", "אסור", "נדרש", "צריך", 'אסור', 'מומלץ', 'מאי' ו'אופציונלי' בהתאם לתקן IETF מוגדר ב-RFC2119.

פורמט של תמונות עם תנועה

קובצי תמונות עם תנועה מכילים קובץ של תמונת סטילס ראשית, JPEG, HEIC או AVIF, עם קובץ וידאו משני שצורף אליו. התמונה הראשית מכילה את המצלמה XMP מטא-נתונים שמתארים איך להציג את התוכן של קובץ תמונת הסטילס ושל קובץ הסרטון, ומטא-נתונים של Container XMP שמתארים איך לאתר את תוכן קובץ הווידאו.

קובץ התמונה עשוי לכלול מפת רווח, כמו במקרה של Ultra HDR JPEGs.

תבנית שם הקובץ

הכותבים צריכים להשתמש בשם קובץ שתואם לביטוי הרגולרי הבא:

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

הקוראים יכולים להתעלם מהמטא-נתונים של ה-XMP, מקובץ הסרטון שצורף או מהסרטון תוכן, אם לא עוקבים אחר הדפוס.

קידוד נתוני מדיה

התמונה הראשית מכילה רכיב קונטיינר XMP ספריית מטא-נתונים שמגדירה את הסדר והמאפיינים של פריטי המדיה הבאים במאגר התגים של הקבצים. לכל קובץ במאגר יש מדיה תואמת של הפריט בספרייה. פריט המדיה מתאר את המיקום של הקובץ מאגר תגים והתכונות הבסיסיות של כל קובץ משורשר.

מאפייני XMP

שתי קבוצות של מטא-נתונים של XMP משמשות להגדרת המידע הסמנטי הנוסף בפורמט של תמונה עם תנועה. המטא-נתונים יכולים להופיע בסדר רנדומלי.

מטא-נתונים של מצלמה

המטא-נתונים של המצלמה מקודדים מידע על אופן ההצגה של התמונה הראשית חלקי וידאו של תמונה עם תנועה.

  • ה-URI של מרחב השמות הוא http://ns.google.com/photos/1.0/camera/
  • קידומת ברירת המחדל של מרחב השמות היא Camera

המאפיינים הבאים עשויים להופיע במטא-נתונים של ה-XMP של קובץ תמונת הסטילס:

שם

סוג

תיאור

Camera:MicroVideo

Camera:MicroVideoVersion

Camera:MicroVideoOffset

Camera:MicroVideoPresentation
TimestampUs

המאפיינים האלה היו חלק ממפרט Microvideo V1. הן נמחקות במפרט הזה ויש להתעלם מהן אם הן קיימות.

באופן ספציפי, המאפיין MicroVideoOffset מוחלף בערך GContainer:ItemLength לאיתור נתוני הסרטון בקובץ.

Camera:MotionPhoto

Integer

0: מציין שאין להתייחס לקובץ כתמונה עם תנועה.

1: מציין שיש להתייחס לקובץ כתמונה עם תנועה.

כל שאר הערכים לא מוגדרים והמערכת מתייחסת אליהם באופן שוות ערך ל-0.

אם הערך הוא אפס או שלילי, הקובץ תמיד נחשב כ תמונה שאינה עם תנועה, גם אם סרטון אכן מצורף לקובץ.

XMP מועבר על ידי רוב העורכים שמתנהגים באופן תקין, ולכן קובצי תמונה של סטילס עדיין יהיה ערך שיורי של 1 עבור השדה הזה, למרות הסרנו את הסרטון. לכן שדה זה אינו מוחלט, וקוראים חייבת תמיד לאשר שקיים סרטון.

Camera:MotionPhotoVersion

Integer

מציין את גרסת פורמט הקובץ של התמונה עם התנועה. במפרט הזה מוגדרת גרסה 1.

Camera:MotionPhotoPresentationTimestampUs

Long

ערך ארוך שמייצג את חותמת הזמן של המצגת (במיליוניות השנייה) של פריים בסרטון שתואם לתמונה הסטטית. הערך יכול להיות 1- כדי לציין לא מוגדר/לא צוין.

התנהגות המצגת

אם Camera:MotionPhotoPresentationTimestampUs לא נמצא בחבילת ה-XMP, על הקוראים להשתמש בחותמת הזמן של ההצגה ממש לפני חותמת הזמן הקרוב ביותר לאמצע הטראק של הסרטון, כלומר, משך הטראק של הסרטון. חלקי 2.

אם הפרמטר Camera:MotionPhotoPresentationTimestampUs נמצא בחבילת ה-XMP וגם גם פרמטר "application/motionphoto-image-meta" קיים בסרטון, חייב להופיע בprimaryImageFrameScoreDescr presentationTimestampUs של הטראק הזה. אם הוא לא Camera:MotionPhotoPresentationTimestampUs קיים בחבילת ה-XMP ובטראק של המטא-נתונים, אז הערך טראק המטא-נתונים חייב להיות -1.

רכיב קונטיינר

רכיב הקונטיינר מקודד למטא-נתונים של ה-XMP של התמונה הראשית. מגדיר את הספרייה של פריטי המדיה בקונטיינר. פריטי מדיה חייבים להיות נמצאים בקובץ המאגר באותו סדר שבו נמצאים רכיבי פריט המדיה הספרייה וצריך להיות ארוז היטב.

  • ה-URI של מרחב השמות הוא http://ns.google.com/photos/1.0/container/
  • קידומת ברירת המחדל של מרחב השמות היא Container

הספרייה יכולה להכיל רק פריט תמונה ראשי אחד והוא חייב להיות הראשון של הפריט בספרייה.

שם הרכיב

סוג

תיאור

Directory

מערך מבנים מסודר

מערך מסודר של מבנים Container:Item המגדירים את הפריסה של מאגר התגים.

רכיב פריט

רכיבי מדיה מתארים את האופן שבו האפליקציה צריכה להשתמש בכל פריט.

  • ה-URI של מרחב השמות הוא http://ns.google.com/photos/1.0/container/item/
  • קידומת ברירת המחדל של מרחב השמות היא Item

פריט המדיה הראשון חייב להיות התמונה הראשית. היא חייבת להכיל Mime. מאפיין שמציין את אחד מסוגי ה-MIME של התמונה הרשומים בסוג ה-MIME של הפריט ערכים. אפשר לקבוע את אורך הפריט הראשי על ידי ניתוח הפרמטר הראשי על סמך סוג ה-MIME שלו, החל מתחילת מאגר הקובץ.

פריט המדיה הראשון יכול להכיל מאפיין Padding שמציין עוד מרווח פנימי בין סוף התמונה הראשית המקודדת לבין תחילת פריט המדיה הבא. רק פריט המדיה הראשון יכול להכיל מאפיין Padding.

כל פריט מדיה צריך להכיל מאפיין Mime. פריטי המדיה המשניים חייבים לכלול גם את מאפייני האורך.

פריטי מדיה עוקבים יכולים לשתף נתוני משאבים בתוך מאגר הקובץ. פריט המדיה הראשון קובע את מיקום המשאב במאגר הקבצים, ובפריטי מדיה משותפים נוספים, הערך של Length מוגדר ל-0 במקרה נתוני משאבים הם בעצמם קונטיינר.

המיקום של משאבי פריטי מדיה בקונטיינר נקבע באמצעות סיכום ערכי Length של משאבי הפריטים המשניים הקודמים באורך של אם צוין, קידוד התמונה הראשית וגם Padding.

שם מאפיין

סוג

תיאור

Mime

String

נדרש. מחרוזת פשוטה שמציינת את סוג ה-MIME של פריט המדיה בקונטיינר.

Semantic

String

נדרש. מחרוזת פשוטה שמציינת את המשמעות הספציפית לאפליקציה של פריט המדיה. אפשר למצוא מידע על ההגדרה הזו בקטע 'ערכים סמנטיים של פריטים'.

Length

Integer

נדרש לפריטי מדיה משניים, כולל מאגר הווידאו. אורך המספר השלם החיובי בבייטים של הפריט. פריטי מדיה צפויים להופיע בצורה המקורית שלהם, ללא קידוד. הערך של length הוא האורך בפועל של הבייטים בקובץ.

האורך 0 בפריטי מדיה משניים מציין שמשאב פריט המדיה משותף עם פריט המדיה הקודם. האורך של פריט מדיה ראשי צריך להיות 0.

Padding

Integer

[תמונות עם תנועה המבוססות על JPEG]

אופציונלי לפריט המדיה הראשי. מחרוזת פשוטה שמכילה אורך של מספר שלם חיובי בבייטים של תוספת מרווח פנימי בין סוף התמונה הראשית המקודדת לבין תחילתה פריט המדיה הבא.

[תמונות עם תנועה שמבוססות על HEIC/AVIF]

חובה לפריט המדיה הראשי. חייב להיות ערך שווה ל-8, את אורך הכותרת של התמונה עם התנועה התיבה של נתוני הסרטון ('mpvd').

פריט:ערכים של סוג MIME

המאפיין Item:Mime מגדיר את סוג ה-MIME של כל פריט מדיה.

ערך

תיאור

image/jpeg

תמונה בפורמט JPEG

image/heic

תמונת HEIC

image/avif

תמונה בפורמט AVIF

video/mp4

מאגר MP4

video/quicktime

מאגר MOV

פריט:ערכים סמנטיים

המאפיין Item:Semantic מגדיר את המשמעות הספציפית של כל אפליקציה קובץ מדיה בספריית הקונטיינר.

Value

תיאור

Primary

מציין שפריט המדיה הוא התמונה הראשית שמוכן לתצוגה בקונטיינר. תמונה עם תנועה חייבת לכלול פריט אחד בלבד עם הסמנט הזה.

MotionPhoto

מציין שפריט המדיה הוא מאגר הווידאו. תמונה עם תנועה חייבת לכלול פריט אחד בלבד עם הסמנט הזה. המיקום של פריט המדיה הזה חייב להיות בסוף הקובץ. אי אפשר להוסיף בייטים אחרים אחרי שהבייטים של פריט המדיה הזה הסתיימו.

תמונות עם תנועה עם תמונה ראשית מסוג Ultra HDR

בהתאם לכללים לקביעת ערך סמנטי של הפריטים במפרט הזה, המפרט של תמונות Ultra HDR, תמונות עם תנועה עם תמונה ראשית מסוג Ultra HDR חייבות לכלול גם פריט מדיה עם סמנטי של פריט מתוך "GainMap". כמו כן, כותבים שמקודדים תמונות עם תנועה חייבים להציב רכיב פריט המפה לפני הרכיב של פריט הסרטון.

התנהגות ספציפית לתמונה ל-ISOBMFF

תמונות עם תנועה עם מבוססת ISOBMFF על תמונות (למשל תמונות HEIC ו-AVIF) חייבות להיות בנויות כך שהתמונה חלק מהקובץ מסתיים ברמה העליונה של 'נתוני וידאו של תמונות עם תנועה' תיבה, שמתוארת באמצעות הסמנטיקה של 'שפת התיאור הסינטקטי', שהוגדרה סעיף 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[];
}

שבו 'data' מכיל את כל הבייטים של הסרטון. הערך המיוחד של '0' אסור עבור גודל תיבת הנתונים של תמונות וידאו עם תנועה. (יש לעיין במאמר ISO/IEC 14496-12:2015: 4.2 להגדרת גודל מחלקה מרחיבה את Box.)

ה-XMP של תמונת ISOBMFF חייב להגדיר גם את המרווח הפנימי של פריט המדיה הראשי. כערך המאפיין כשווה לגודל בבייטים של סרטון התמונה עם התנועה כותרת תיבת הנתונים – כותרות הגודל והשם.

ראו איור 1 שממחיש את מבנה התיבה הזה לקבלת דוגמה לתנועה שמבוססת על HEIC תמונה:

תרשים קו שמדגים את סידור הרכיבים בקובץ תנועה HEIC

איור 1. איור של התיבות ברמה העליונה של תמונת HEIC לדוגמה בתוך קובץ HEIC יחיד של תמונה עם תנועה. שימו לב שסדר התיבות מיועד בעיקר איור בלבד (עיינו בסטנדרטים הרלוונטיים שמסבירים איך להרכיב קובצי HEIF או וידאו); עם זאת, הקובץ 'mpvd' חייבת להופיע אחרי כל פונקציית HEIC תיבות של קובץ תמונה.

תוכן מאגר התגים של הסרטון

קובץ מאגר הווידאו שצורף לתמונה הראשית חייב להכיל את התג לפחות טראק אחד של וידאו ראשי. הטראק הזה נדרש והוא מכיל וידאו מקודד ב-AVC, HEVC או AV1. רזולוציית הפריים הראשי בסרטון לא מוגדרת. מרחב הצבעים של הסרטון, העברה הפונקציה, ועומק הסיביות עשוי להשתנות. לדוגמה, קטעי וידאו באיכות SDR יכולים להיות בפורמט של 8 ביט מרחב צבעים BT.709, עם פונקציית העברה ב-sRGB. לחלופין, סרטוני HDR עשויים כוללים עומק ביט של 10 ביט, מרחב צבעים BT.2100 והעברה ל-HLG או ל-PQ וכן מטא-נתונים של HDR וטראקים של מטא-נתונים.

קובץ המאגר של הסרטון יכול להכיל אפשרות משנית אחת של רזולוציה גבוהה יותר טראק של סרטון. הקוראים צריכים להשתמש בתוכן שלו כדי להציג חלופות תמונת סטילס ראשית שמקודדת בתמונה JPEG או HEIC. הטראק הזה עשוי לכלול וידאו בקצב פריימים נמוך יותר שמקודד ב-AVC , HEVC או AV1. הפריים המשני בסרטון לא מוגדר.

הציפייה היא שכל הפריימים בטראק המשני של הסרטון יכללו הפריימים התואמים בטראק הראשי של הסרטון. כל צמד בטראקים של וידאו ראשיים ומשניים, ההצגה של פריימים צריכה להיות זהה חותמות זמן. אם יש מסגרת טראק משנית ללא רכיב ראשי תואם מסגרת הטראק, הצופים יכולים לנסות לבחור פריים של טראק ראשי עם תואם לחותמת הזמן של המצגת בתור התמונה הממוזערת המייצגת טראק משני של סרטון.

קובץ מאגר הווידאו יכול להכיל אודיו מונו או אודיו סטריאופוני אחד אופציונלי של 16 סיביות להיות בקידוד 44kHz, 48kHz או 96kHz בקידוד AAC. על הקוראים להציג את המידע הזה טראק של אודיו כאשר מוצגת הטראק הראשי של הווידאו.

הטראק המשני של הווידאו, אם קיים, תמיד צריך להופיע אחרי הטראק הראשי טראק של סרטון. אין מגבלות סדר אחרות לגבי טראקים אחרים. הטראק הראשי של הסרטון חייב להיות בעל אינדקס טראק נמוך יותר מזה של כל טראק משני טראק של סרטון. כלומר, אם הטראק הראשי של הסרטון כולל טראק מספר 2, אז כל טראק שהוא הטראק המשני של הסרטון חייב לכלול מספר טראק גדול מ-3 או שווה לו.

מעקב אחר מטא-נתונים של וידאו עם ציון ציונים ב-Machine Intelligence

כותבים יכולים להוסיף טראק של מטא-נתונים לקובץ המאגר של הסרטון עם מקלידים 'meta'. טראק המטא-נתונים צריך לכלול דוגמה אחת בלבד שמכילה בייטים בסטרימינג בפורמט שמתואר בקטע 'תחביר'.

אם קיים טראק של מטא-נתונים, הרשומה לדוגמה של טבלת התיאורים track (כלומר, תיבת ה-"stsd" שנמצאת ב-"mdia.minf.stbl.stsd" ביחס 'trak' תיבה) חייב להכיל אטום יחיד שמציין דוגמת טקסט למטא נתונים רשומה - (כלומר, תיבת "Metat"). מטבע ה-"Mett" חייבת להיות מחרוזת של סוג MIME שווה ל- ל-"application/motionphoto-image-meta".

תחביר

אם טראק של מטא-נתונים זה מוגדר, התוכן שלו חייב להיות מורכב מזרם של בייטים תואם למפרט MotionPhotoMetadataDescriptor הזה, המתואר באמצעות הסמנטיקה של 'שפת התיאור הסינטקטי', סעיף 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