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

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

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

איך זה עובד

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

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

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

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

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

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

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

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

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

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

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

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

    • גישה של אפליקציות דרך ממשקי MediaStore API
    • גישה לאפליקציה דרך ממשקי API ישירים של נתיב קובץ, כולל Java וקוד מקורי
    • גישה של אפליקציות באמצעות Storage Access Framework‏ (SAF)
    • גישה לאפליקציות דרך כוונות (Intents) בגיליון השיתוף של מערכת ההפעלה. (MediaStore URI בלבד)
    • העברת קבצים ב-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

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

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

media-transcoding-architecture

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

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

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

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

גישה לקבצים

המרת מדיה תואמת מבוססת על מערכת הקבצים של Filesystem in Userspace‏ (FUSE), שמשמשת לאחסון מוגדר-היקף. FUSE מאפשר למודול MediaProvider לבדוק פעולות הקובץ במרחב המשתמש ולסנן את הגישה לקבצים על סמך המדיניות, כדי לאפשר, לדחות או לצנזר את הגישה.

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

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

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

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

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

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

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

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

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

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

  • 10 סשנים רצופים
  • משך זמן כולל של שלוש דקות

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

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

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

  • קידוד 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, יצרני המכשירים יכולים להשתמש בפלאגין לדוגמה של מסנן Codec 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 יש מנגנון עטיפה ל-plug-ins של מסננים, שמארז את המקודדים יחד עם ה-plug-ins של המסננים. MediaCodec מזהה את הרכיבים הארוזים האלה כמקודדים עם תכונות סינון.

סקירה כללית

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

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

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

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

הממשק 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.

יצירה

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

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

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

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

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

התחלה

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

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

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

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

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

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

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

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

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

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

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

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

כדי לבדוק את הפלאגין לדוגמה:

  1. יוצרים מחדש את המכשיר ומעבירים אותו באמצעות Flash.
  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