המרת קידוד תואמת של מדיה

ב-Android 12, המרת קידוד של מדיה תואמת, שהושקה ב-Android 12, היא תכונה שמאפשרת למכשירים להשתמש בפורמטי מדיה מודרניים וחסכוניים יותר לצילום וידאו, כמו HEVC, תוך שמירה על תאימות לאפליקציות. בעזרת התכונה הזו, יצרני מכשירים יכולים להשתמש ב-HEVC במקום ב-AVC כברירת מחדל כדי לשפר את איכות הווידאו תוך צמצום הדרישות לאחסון ורוחב פס. במכשירים שבהם מופעלת המרת קידוד של מדיה תואמת, מערכת Android יכולה להמיר באופן אוטומטי סרטונים (באורך של עד דקה אחת) שהוקלטו בפורמטים כמו HEVC או HDR כשפותחים את הסרטונים באפליקציה שלא תומכת בפורמט הזה. כך האפליקציות יכולות לפעול גם כשהסרטונים מצולמים בפורמטים חדשים יותר במכשיר.

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

איך זה עובד

תכונת המרת הקידוד התואמת של מדיה מורכבת משני חלקים עיקריים:

  • שירותי המרת קידוד במסגרת המדיה: השירותים האלה ממירים קבצים מפורמט אחד לפורמט אחר באמצעות חומרה, כדי לשמור על זמן אחזור קצר והמרות באיכות גבוהה. הוא כולל את ה-API להמרת קידוד, שירות המרת הקידוד, פלאגין של OEM (יצרן ציוד מקורי) למסננים מותאמים אישית וחומרה. לפרטים נוספים, ראו סקירה כללית של ארכיטקטורה.
  • תכונה תואמת להמרת קידוד של מדיה בספקי מדיה: הרכיב הזה שנמצא בספקי מדיה מיירט אפליקציות שניגשים לקובצי מדיה, ומציג את הקובץ המקורי או קובץ שעבר המרת קידוד בהתאם ליכולות המוצהרות של האפליקציה. לא נדרש טיפול מיוחד אם אפליקציה תומכת בפורמט של קובץ המדיה. אם האפליקציה לא תומכת בפורמט, ה-framework ממיר את הקובץ לפורמט ישן יותר, כמו AVC, כשהאפליקציה ניגשת לקובץ.

איור 1 מציג סקירה כללית של תהליך המרת הקידוד של המדיה.

תהליך תואם של המרת קידוד של מדיה

איור 1. סקירה כללית של המרת קידוד של מדיה תואמת.

פורמטים נתמכים

התכונה התואמת להמרת קידוד של מדיה תומכת בהמרות הפורמט הבאות:

  • HEVC (8 ביט) ל-AVC: המרות בקודק מתבצעות באמצעות חיבור של מפענח Mediacodec אחד ומקודד Mediacode אחד.
  • HDR10+ (10 ביט) ל-AVC (SDR): המרות מ-HDR ל-SDR מתבצעות באמצעות מכונות mediacodec והוק (hook) פלאגין של ספק במכונות של המפענח. מידע נוסף זמין במאמר קידוד HDR ל-SDR.

מקורות תוכן נתמכים

התכונה התואמת של המרת קידוד של מדיה תומכת במדיה במכשיר שנוצרה על ידי אפליקציית המצלמה המקורית של ה-OEM, ושמורה בתיקייה DCIM/Camera/ בעוצמת הקול החיצונית הראשית. התכונה לא תומכת במדיה באחסון משני. אין תמיכה בתוכן שמועבר למכשירים באמצעות אימייל או כרטיסי SD.

אפליקציות ניגשות לקבצים לפי נתיבי קבצים שונים. ברשימה הבאה מתוארים נתיבי הקבצים שבהם מופעלת או עוקפת המרת קידוד:

  • המרת הקידוד הופעלה:

    • גישה לאפליקציות דרך ממשקי API של MediaStore
    • גישה לאפליקציות דרך ממשקי API ישירים של נתיבי קבצים, כולל Java וקוד נייטיב
    • גישה לאפליקציות דרך Storage Access Framework (SAF)
    • גישה לאפליקציה דרך רשימת ה-Intents של גיליון השיתוף של מערכת ההפעלה. (URI של MediaStore בלבד)
    • העברת קובץ MTP/PTP מטלפון למחשב
  • בוצעה עקיפה של המרת הקידוד:

    • העברת קובץ ממכשיר על ידי הוצאה של כרטיס ה-SD
    • העברת קבצים ממכשיר למכשיר באמצעות אפשרויות כמו 'שיתוף בקרבת מקום' או העברת Bluetooth.

הוספה של נתיבי קבצים מותאמים אישית להמרת קידוד

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

כדי להוסיף נתיב קובץ, צריך להשתמש בשכבת-על של משאב זמן ריצה (RRO) בנתיב המרת הקידוד, config_supported_transcoding_relative_paths. הדוגמה הבאה היא להוספת נתיב קובץ:

<string-array name="config_supported_transcoding_relative_paths" translatable="false">
    <item>DCIM/JCF/</item>
</string-array>

כדי לאמת את נתיבי הקבצים שהוגדרו, משתמשים ב:

adb shell dumpsys activity provider com.google.android.providers.media.module/com.android.providers.media.MediaProvider | head -n 20

סקירה כללית של הארכיטקטורה

בקטע הזה מתוארת הארכיטקטורה של תכונת המרת הקידוד של מדיה.

ארכיטקטורת המרת קידוד של מדיה

איור 2. הארכיטקטורה של המרת קידוד של מדיה.

הארכיטקטורה של המרת קידוד של מדיה מורכבת מהרכיבים הבאים:

  • MediaTranscodingManager API: ממשק שמאפשר ללקוח לתקשר עם שירות MediaTranscoding. המודול MediaProvider משתמש ב-API הזה.
  • MediaTranscodingService: שירות נייטיב שמנהל את החיבורים של הלקוחות, מתזמן בקשות להמרת קידוד ומנהל את הנהלת החשבונות עבור TranscodingSessions.
  • MediaTranscoder: ספרייה מותאמת שמבצעת המרת קידוד. הספרייה הזו מבוססת על ה-NDK של מסגרת המדיה לצורך תאימות למודולים.

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

גישה לקובץ

המרת קידוד של מדיה תואמת מבוססת על מערכת הקבצים במערכת הקבצים של מרחב המשתמש (FUSE), שמשמשת לאחסון בהיקף. FUSE

כשאפליקציה מנסה לגשת לקובץ, הדימון (daemon) של FUSE מיירט את הגישה לקריאת הקובץ מהאפליקציה. אם האפליקציה תומכת בפורמט חדש יותר (כמו HEVC), הקובץ המקורי מוחזר. אם האפליקציה לא תומכת בפורמט, הקובץ יומר לפורמט ישן יותר (כמו AVC) או יוחזר מהמטמון אם יש גרסה שהקידוד שלה הומר.

בקשת קבצים שהומרו

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

אפליקציות יכולות לבקש נכסים שהקידוד שלהם הומר באמצעות האפשרויות הבאות:

  • יש להצהיר על פורמטים לא נתמכים בקובץ המניפסט. למידע נוסף, ראו הצהרה על יכולות במשאב והצהרה על יכולות בקוד.
  • מוסיפים אפליקציות לרשימת המרת הקידוד של הכוח שכלולה במודול MediaProvider. כך מתאפשרת המרת קידוד לאפליקציות שלא עדכנו את קובץ המניפסט שלהן. אחרי שאפליקציה מעדכנת את קובץ המניפסט בפורמטים לא נתמכים, צריך להסיר אותה מרשימת אילוץ המרת הקידוד. יצרני מכשירים יכולים להציע את האפליקציות שלהם להוספה או להסרה מרשימת כוח הקידוד של האפליקציות על ידי שליחת תיקון או על ידי דיווח על באג. צוות Android בודק מדי פעם את הרשימה ועשוי להסיר אפליקציות מהרשימה.
  • כדאי להשבית בזמן הריצה פורמטים נתמכים עם מסגרת התאימות של האפליקציה (המשתמשים יכולים גם להשבית זאת עבור כל אפליקציה בהגדרות).
  • פותחים קובץ עם MediaStore ומציינים באופן מפורש פורמטים לא נתמכים באמצעות ה-API של openTypedAssetFileDescriptor.

בהעברות דרך USB (ממכשיר למחשב), המרת הקידוד מושבתת כברירת מחדל, אבל המשתמשים יכולים להפעיל המרת קידוד באמצעות המתג המרת סרטונים ל-AVC במסך ההגדרות העדפות USB, כפי שמוצג באיור 3.

מתג להפעלת המרת קידוד של מדיה

איור 3. מתג להפעלת המרת קידוד של מדיה במסך 'העדפות USB'.

הגבלות על שליחת בקשות לקבצים שהומרו

כדי שבקשות להמרת קידוד לא לנעול משאבי מערכת למשך תקופות ארוכות, אפליקציות שמבקשות סשנים של המרת קידוד מוגבלות ל:

  • 10 סשנים ברצף
  • משך הפעלה כולל של שלוש דקות

אם האפליקציה חורגת מכל ההגבלות האלה, ה-framework יחזיר את מתאר הקובץ המקורי.

דרישות לגבי מכשירים

כדי לתמוך בתכונה התואמת של המרת קידוד של מדיה, המכשירים צריכים לעמוד בדרישות הבאות:

  • קידוד HEVC מופעל כברירת מחדל במכשיר באפליקציית המצלמה המקורית
  • (מכשירים שתומכים בהמרת קידוד מ-HDR ל-SDR) המכשיר תומך בצילום סרטון HDR

כדי להבטיח את ביצועי המכשיר להמרת קידוד של מדיה, צריך לבצע אופטימיזציה לביצועים של גישת קריאה/כתיבה לחומרת הווידאו ולאחסון. כשקודקי המדיה מוגדרים עם עדיפות שוות ל-1, הקודקים חייבים לפעול בתפוקה הגבוהה ביותר האפשרית. מומלץ שביצועי המרת הקידוד ישיגו לפחות 200FPS. כדי לבדוק את ביצועי החומרה, כדאי להפעיל את נקודת ההשוואה של מקודד המדיה בכתובת frameworks/av/media/libmediatranscoding/transcoder/benchmark.

אימות

כדי לאמת את תכונת המרת הקידוד התואמת של המדיה, מריצים את בדיקות ה-CTS הבאות:

  • android.media.mediatranscoding.cts
  • android.mediaprovidertranscode.cts

הפעלה של המרת קידוד של מדיה בכל העולם

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

בדיקת הסטטוס של המרת הקידוד

במהלך הבדיקה, אפשר להשתמש בפקודת המעטפת הבאה של ADB כדי לבדוק את סטטוס המרת הקידוד, כולל סשנים נוכחיים וקודמים של המרת קידוד:

adb shell dumpsys media.transcoding

הארכת משך הזמן של הסרטון

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

adb shell device_config put storage_native_boot transcode_max_duration_ms <LARGE_NUMBER_IN_MS>

מקור והפניות של AOSP

בהמשך מופיעים קוד המקור של AOSP שקשור להמרת קידוד של מדיה תואמת.

קידוד HDR ל-SDR

כדי לתמוך בקידוד HDR ל-SDR, יצרני מכשירים יכולים להשתמש בפלאגין המסנן של קודק הסינון לדוגמה 2.0 של AOSP שנמצא ב-/platform/frameworks/av/media/codec2/hidl/plugin/. בקטע הזה נסביר איך פועל הפלאגין של המסנן, איך מטמיעים אותו ואיך בודקים אותו.

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

איך זה עובד

בקטע הזה מתוארת ההתנהגות הכללית של פלאגין המסנן Codec 2.0.

ברקע

מערכת Android מספקת הטמעה של שכבת התאמה בין ממשק Codec 2.0 לבין ממשק HAL של android.hardware.media.c2 ב-android::hardware::media::c2. ביישומי פלאגין של מסננים, AOSP כולל מנגנון wrapper שעוטף את המפענחים עם יישומי פלאגין של מסננים. MediaCodec מזהה את הרכיבים העטופים האלה כמפענחים עם תכונות סינון.

סקירה

המחלקה FilterWrapper מחזירה את רכיבי הקודק של הספק ומחזירה את רכיבי הקודק העטופים בחזרה לשכבת ההתאמה media.c2. המחלקה FilterWrapper טוענת את libc2filterplugin.so דרך ה-API FilterWrapper::Plugin ומתעדת את המסננים הזמינים מהפלאגין. בתהליך היצירה, FilterWrapper מפעיל את כל המסננים הזמינים. רק מסננים שמשנים את מאגר הנתונים הזמני מופעלים בהתחלה.

ארכיטקטורת יישומי הפלאגין לסינון

איור 1. ארכיטקטורת יישומי פלאגין של מסננים.

ממשק הפלאגין של המסנן

הממשק FilterPlugin.h מגדיר את ממשקי ה-API הבאים כדי לחשוף את המסננים:

  • std::shared_ptr<C2ComponentStore>getComponentStore()

    מחזירה אובייקט C2ComponentStore שמכיל מסננים. זאת בנפרד ממה שנחשפת ההטמעה של Codec 2.0 של הספק. בדרך כלל, החנות הזו מכילה רק את המסננים שמשמשים את המחלקה FilterWrapper.

  • bool describe(C2String name, Descriptor *desc)

    תיאור המסננים בנוסף למה שזמין מ-C2ComponentStore. התיאורים הבאים מוגדרים:

    • controlParam: פרמטרים ששולטים בהתנהגות המסננים. לדוגמה, בשביל מיפוי טונים מ-HDR ל-SDR, פרמטר הבקרה הוא הפונקציה של העברת היעד.
    • affectedParams: פרמטרים שמושפעים מפעולות הסינון. לדוגמה, פרמטרים של HDR למיפוי גוונים של SDR הם ההיבטים של הצבעים.
  • bool isFilteringEnabled(const std::shared_ptr<C2ComponentInterface> &intf)

    הפונקציה מחזירה את הערך true אם רכיב המסנן משנה את מאגר הנתונים הזמני. לדוגמה, המסנן למיפוי גוונים מחזיר את הערך true אם הפונקציה להעברת היעד היא SDR והפונקציה להעברת קלט היא HDR (HLG או PQ).

פרטי FilterWrapper

בקטע מתוארים הפרטים של הכיתה FilterWrapper.

יצירה

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

שאילתה והגדרה

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

שאילתה והגדרה

איור 2. שאילתה והגדרות אישיות.

התחלה

בהתחלה, הרכיב הארוז מפעיל את המפענח ואת כל המסננים שמשנים את מאגר הנתונים הזמני. אם לא מופעל מסנן, הרכיב הארוז מפעיל את המפענח ואת חוצץ המעבר (pass-through), ושולח פקודות למפענח עצמו.

טיפול במאגר הנתונים הזמני

טיפול במאגר הנתונים הזמני

איור 3. טיפול במאגר הנתונים הזמני.

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

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

עצירה, איפוס ושחרור

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

הטמעת הפלאגין של המסנן לדוגמה

כדי להפעיל את הפלאגין:

  1. מטמיעים את הממשק FilterPlugin בספרייה ומשחררים אותו בכתובת /vendor/lib[64]/libc2filterplugin.so.
  2. מוסיפים הרשאות נוספות לאפליקציה mediacodec.te לפי הצורך.
  3. מעדכנים את שכבת ההתאמה ל-Android 12 ויוצרים מחדש את השירות media.c2.

בדיקת הפלאגין

כדי לבדוק את הפלאגין לדוגמה, מבצעים את הפעולות הבאות:

  1. בונים מחדש את המכשיר ומעדכנים אותו.
  2. יוצרים את הפלאגין לדוגמה באמצעות הפקודה הבאה:

    m sample-codec2-filter-plugin
    
  3. טוענים מחדש את המכשיר ומשנים את השם של הפלאגין של הספק כדי שהוא יזוהה על ידי שירות הקודק.

    adb root
    adb remount
    adb reboot
    adb wait-for-device
    adb root
    adb remount
    adb
    push /out/target/<...>/lib64/sample-codec2-filter-plugin.so \
    
    /vendor/lib64/libc2filterplugin.so
    adb push
    /out/target/<...>/lib/sample-codec2-filter-plugin.so \
    
    /vendor/lib/libc2filterplugin.so
    adb reboot