מצלמות 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, ממשק הלקוח של 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>
    
  • (אופציונלי) אם המכשיר פועל במצב העברה ב-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. הלקוחות יכולים להתאים אישית את הפרמטרים הבאים:

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

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

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

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

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

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

פורמט פלט HAL

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

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

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

אימות

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