מצלמות USB חיצוניות

<!-- Copyright 2018 The Android Open Source Project

ברישיון Apache, גרסה 2.0 ("הרישיון"); מותר להשתמש בקובץ הזה אך ורק בהתאם לתנאי הרישיון. אפשר לקבל עותק של הרישיון בכתובת

  http://www.apache.org/licenses/LICENSE-2.0

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

פלטפורמת Android תומכת בשימוש במצלמות USB מסוג Plug and Play (כלומר מצלמות אינטרנט) באמצעות Android Camera2 API הרגיל וממשק HAL של המצלמה. מצלמות אינטרנט בדרך כלל תומכות במנהלי התקנים של USB video class (UVC), וב-Linux, מנהל ההתקן הרגיל של Video4Linux (V4L) משמש לשליטה במצלמות UVC.

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

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

דוגמאות ומקורות

למידע נוסף על הטמעת מצלמות USB, עיינו בהטמעת העזר של ספק המצלמה החיצונית בכתובת ExternalCameraProvider. ההטמעות של המכשיר והסשן של המצלמה החיצונית כלולות ב-ExternalCameraDevice וב-ExternalCameraDeviceSession. החל מרמת API‏ 28, ממשק ה-API של לקוח Java כולל את רמת החומרה EXTERNAL.

הטמעה

ההטמעה חייבת לתמוך בתכונת המערכת android.hardware.usb.host.

צריך גם להפעיל את תמיכת הליבה (kernel) במכשירי UVC. כדי להפעיל את זה, צריך להוסיף את הקוד הבא לקובצי ה-defconfig המתאימים של הליבה.

+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y

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

  • מוסיפים את קובץ התצורה של המצלמה החיצונית ואת ספריית המצלמה החיצונית אל device.mk.

    +PRODUCT_PACKAGES += android.hardware.camera.provider-V1-external-service
    
    +PRODUCT_COPY_FILES += \
    +device/manufacturerX/productY/external_camera_config.xml:$(TARGET_COPY_OUT_VENDOR)/etc/external_camera_config.xml
    
  • מוסיפים את שם הספק של המצלמה החיצונית למניפסט Treble HAL של המכשיר.

    <hal format="aidl">
        <name>android.hardware.camera.provider</name>
        <version>1</version>
        <interface>
            <name>ICameraProvider</name>
            <instance>internal/0</instance>
    +       <instance>external/0</instance>
        </interface>
    </hal>
    
  • מקשרים את המופע של ספק המצלמה external/0 AIDL אל hal_camera_service בקובץ sepolicy/service_contexts של המכשיר. מידע נוסף זמין במאמר SEPolicy ל-AIDL HAL.

    android.hardware.camera.provider.ICameraProvider/external/0 u:object_r:hal_camera_service:s0
    
  • (אופציונלי) אם המכשיר פועל במצב Treble passthrough, מעדכנים את sepolicy כדי ש-cameraserver יוכל לגשת למצלמת ה-UVC.

    +# for external camera
    +allow cameraserver device:dir r_dir_perms;
    +allow cameraserver video_device:dir r_dir_perms;
    +allow cameraserver video_device:chr_file rw_file_perms;
    

דוגמה ל-external_camera_config.xml (ללא שורות זכויות היוצרים).

<ExternalCamera>
    <Provider>
        <ignore> <!-- Internal video devices to be ignored by external camera HAL -->
            <id>0</id> <!-- No leading/trailing spaces -->
            <id>1</id>
        </ignore>
    </Provider>
    <!-- See ExternalCameraUtils.cpp for default values of Device configurations below -->
    <Device>
        <!-- Max JPEG buffer size in bytes-->
        <MaxJpegBufferSize bytes="3145728"/> <!-- 3MB (~= 1080p YUV420) -->
        <!-- Size of v4l2 buffer queue when streaming >= 30fps -->
        <!-- Larger value: more request can be cached pipeline (less janky)  -->
        <!-- Smaller value: use less memory -->
        <NumVideoBuffers count="4"/>
        <!-- Size of v4l2 buffer queue when streaming < 30fps -->
        <NumStillBuffers count="2"/>

        <!-- List of maximum fps for various output sizes -->
        <!-- Any image size smaller than the size listed in Limit row will report
            fps (as minimum frame duration) up to the fpsBound value. -->
        <FpsList>
            <!-- width/height must be increasing, fpsBound must be decreasing-->
            <Limit width="640" height="480" fpsBound="30.0"/>
            <Limit width="1280" height="720" fpsBound="15.0"/>
            <Limit width="1920" height="1080" fpsBound="10.0"/>
            <!-- image size larger than the last entry will not be supported-->
        </FpsList>
    </Device>
</ExternalCamera>

התאמה אישית

אתם יכולים לשפר את המצלמה ב-Android באמצעות אפשרויות התאמה אישית כלליות או אופטימיזציות ספציפיות למכשיר.

התאמות אישיות כלליות

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

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

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

אופטימיזציות ספציפיות למכשיר

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

העתקה/שינוי קנה מידה של מאגר נתונים זמני ופענוח/קידוד של JPEG

הטמעות גנריות משתמשות במעבד (libyuv/libjpeg), אבל אפשר להחליף אותו באופטימיזציות ספציפיות למכשיר.

פורמט פלט HAL

הטמעות גנריות משתמשות בפורמטים הבאים של פלט:

  • YUV_420_888 למאגרי נתונים זמניים של סרטונים ב-IMPLEMENTATION_DEFINED
  • YUV12 לכל שאר המאגרים של IMPLEMENTATION_DEFINED

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

אימות

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