מצלמות 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.

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

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

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

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

הטמעה

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

צריך להפעיל גם את התמיכה במכשירים מסוג UVC בליבה (kernel). כדי להפעיל את האפשרות הזו, צריך להוסיף את השורות הבאות לקובצי הליבה המתאימים 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>
    
  • (אופציונלי) אם המכשיר פועל במצב העברה של Treble, מעדכנים את 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

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

אימות

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