বাহ্যিক ইউএসবি ক্যামেরা

অ্যান্ড্রয়েড প্ল্যাটফর্ম স্ট্যান্ডার্ড অ্যান্ড্রয়েড ক্যামেরা 2 এপিআই এবং ক্যামেরা HAL ইন্টারফেস ব্যবহার করে প্লাগ-এন্ড-প্লে ইউএসবি ক্যামেরা (অর্থাৎ ওয়েবক্যাম) ব্যবহার সমর্থন করে। ওয়েবক্যামগুলি সাধারণত ইউএসবি ভিডিও ক্লাস (ইউভিসি) ড্রাইভার সমর্থন করে এবং লিনাক্সে, স্ট্যান্ডার্ড ভিডিও 4 লিনাক্স (ভি 4 এল) ড্রাইভারটি ইউভিসি ক্যামেরা নিয়ন্ত্রণ করতে ব্যবহৃত হয়।

ওয়েবক্যামের জন্য সমর্থন সহ, ডিভাইসগুলি ভিডিও চ্যাটিং এবং ফটো কিয়স্কের মতো হালকা ব্যবহারের ক্ষেত্রে ব্যবহার করা যেতে পারে। এই বৈশিষ্ট্যটি অ্যান্ড্রয়েড ফোনে সাধারণ অভ্যন্তরীণ ক্যামেরা HALগুলিকে প্রতিস্থাপন করে না এবং উচ্চ-রেজোলিউশন এবং উচ্চ-গতির স্ট্রিমিং, AR এবং ম্যানুয়াল ISP/সেন্সর/লেন্স নিয়ন্ত্রণ জড়িত কর্মক্ষমতা-নিবিড়, জটিল কাজগুলিকে সমর্থন করার জন্য ডিজাইন করা হয়নি৷

USB ক্যামেরা HAL প্রক্রিয়া হল বাহ্যিক ক্যামেরা প্রদানকারীর অংশ যা USB ডিভাইসের প্রাপ্যতা শোনে এবং সেই অনুযায়ী বহিরাগত ক্যামেরা ডিভাইসগুলিকে গণনা করে৷ প্রক্রিয়াটির অনুমতি রয়েছে এবং একটি SE নীতি অন্তর্নির্মিত ক্যামেরা HAL প্রক্রিয়ার অনুরূপ। থার্ড-পার্টি ওয়েবক্যাম অ্যাপগুলি যেগুলি সরাসরি USB ডিভাইসগুলির সাথে যোগাযোগ করে তাদের UVC ডিভাইসগুলি অ্যাক্সেস করার জন্য যে কোনও নিয়মিত ক্যামেরা অ্যাপের মতো একই ক্যামেরা অনুমতি প্রয়োজন৷

উদাহরণ এবং উত্স

কিভাবে USB ক্যামেরা প্রয়োগ করতে হয় সে সম্পর্কে আরও তথ্যের জন্য, ExternalCameraProvider এ বাহ্যিক ক্যামেরা প্রদানকারীর রেফারেন্স বাস্তবায়ন দেখুন। এক্সটার্নাল ক্যামেরা ডিভাইস এবং সেশন ইমপ্লিমেন্টেশন ExternalCameraDevice এবং ExternalCameraDeviceSession অন্তর্ভুক্ত করা হয়েছে। API স্তর 28 থেকে শুরু করে, Java ক্লায়েন্ট API-এ EXTERNAL হার্ডওয়্যার স্তর অন্তর্ভুক্ত রয়েছে।

বাস্তবায়ন

বাস্তবায়নকে অবশ্যই android.hardware.usb.host সিস্টেম বৈশিষ্ট্য সমর্থন করতে হবে।

UVC ডিভাইসের জন্য কার্নেল সমর্থন সক্রিয় করা আবশ্যক। আপনি সংশ্লিষ্ট কার্নেল defconfig ফাইলে নিম্নলিখিত যোগ করে এটি সক্রিয় করতে পারেন।

+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y

সংশ্লিষ্ট ডিভাইস বিল্ডে বাহ্যিক ক্যামেরা প্রদানকারীকে সক্ষম করতে, যা প্রয়োজনীয় 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>
    
  • (ঐচ্ছিক) যদি ডিভাইস ট্রেবল পাসথ্রু মোডে চলে, 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 এর একটি উদাহরণ (কপিরাইট লাইন বাদ দেওয়া হয়েছে)।

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

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

কাস্টমাইজেশন

আপনি সাধারণ কাস্টমাইজেশন বিকল্প বা ডিভাইস-নির্দিষ্ট অপ্টিমাইজেশনের মাধ্যমে অ্যান্ড্রয়েড ক্যামেরা উন্নত করতে পারেন।

সাধারণ কাস্টমাইজেশন

আপনি external_camera_config.xml ফাইলটি পরিবর্তন করে বাহ্যিক ক্যামেরা প্রদানকারীকে কাস্টমাইজ করতে পারেন। বিশেষত, ক্লায়েন্টরা নিম্নলিখিত পরামিতিগুলি কাস্টমাইজ করতে পারে:

  • অভ্যন্তরীণ ক্যামেরার ভিডিও নোড বাদে
  • সমর্থিত ছবির আকার এবং ফ্রেম রেট উপরের বাউন্ড
  • ইনফ্লাইট বাফারের সংখ্যা (জ্যাঙ্ক বনাম মেমরি ট্রেডঅফ)

এই পরামিতিগুলি ছাড়াও, আপনি আপনার নিজস্ব প্যারামিটার যোগ করতে পারেন বা আপনার নিজস্ব কনফিগারেশন বিকাশ করতে পারেন।

ডিভাইস-নির্দিষ্ট অপ্টিমাইজেশান

আপনি ডিভাইস-নির্দিষ্ট অপ্টিমাইজেশান যোগ করে কর্মক্ষমতা উন্নত করতে পারেন।

বাফার কপি/স্কেলিং এবং JPEG ডিকোড/এনকোড

জেনেরিক বাস্তবায়ন CPU (libyuv/libjpeg) ব্যবহার করে কিন্তু আপনি এটিকে ডিভাইস-নির্দিষ্ট অপ্টিমাইজেশান দিয়ে প্রতিস্থাপন করতে পারেন।

HAL আউটপুট বিন্যাস

জেনেরিক বাস্তবায়ন নিম্নলিখিত আউটপুট বিন্যাস ব্যবহার করে:

  • ভিডিও IMPLEMENTATION_DEFINED বাফারের জন্য YUV_420_888
  • YUV12 অন্য সব IMPLEMENTATION_DEFINED বাফারের জন্য

কর্মক্ষমতা উন্নত করতে, আপনি ডিভাইস-নির্দিষ্ট দক্ষ বিন্যাসগুলির সাথে আউটপুট ফর্ম্যাটগুলি প্রতিস্থাপন করতে পারেন। আপনি একটি কাস্টমাইজড বাস্তবায়নে অতিরিক্ত বিন্যাস সমর্থন করতে পারেন

বৈধতা

বাহ্যিক ক্যামেরা সমর্থন সহ ডিভাইসগুলিকে অবশ্যই ক্যামেরা CTS পাস করতে হবে। বাহ্যিক USB ওয়েবক্যামটি অবশ্যই সম্পূর্ণ পরীক্ষা চলাকালীন নির্দিষ্ট ডিভাইসে প্লাগ করা থাকতে হবে, অন্যথায় কিছু পরীক্ষার ক্ষেত্রে ব্যর্থ হবে।