يتضمّن نظام التشغيل Android 10 واجهات برمجة تطبيقات اختيارية لإدارة المخزن المؤقت HAL3 للكاميرا تتيح لك تنفيذ منطق إدارة المخزن المؤقت لتحقيق مقايضات مختلفة بين الذاكرة ووقت الاستجابة في عمليات تنفيذ HAL للكاميرا.
يتطلّب HAL للكاميرا N طلبًا (حيث N يساوي عمق خط الأنابيب) يتم وضعه في قائمة الانتظار في خط الأنابيب، ولكنّه غالبًا لا يتطلّب كل مجموعات N من مخازن الإخراج المؤقتة في الوقت نفسه.
على سبيل المثال، قد يحتوي HAL على ثمانية طلبات في قائمة الانتظار، ولكنّه لا يتطلّب سوى مخازن مؤقتة للإخراج لطلبَين في المراحل الأخيرة من مسار التعلّم. على الأجهزة التي تعمل بالإصدار 9 من نظام التشغيل Android والإصدارات الأقدم، يخصّص إطار عمل الكاميرا المخازن المؤقتة عند وضع الطلب في قائمة الانتظار في طبقة تجريد الأجهزة (HAL)، لذا قد تكون هناك ست مجموعات من المخازن المؤقتة في طبقة تجريد الأجهزة غير مستخدَمة. في نظام التشغيل Android 10، تتيح واجهات برمجة التطبيقات الخاصة بإدارة المخزن المؤقت HAL3 للكاميرا فصل المخازن المؤقتة للإخراج من أجل إتاحة المجموعات الست من المخازن المؤقتة. ويمكن أن يؤدي ذلك إلى توفير مئات الميجابايت من الذاكرة على الأجهزة المتطورة، كما يمكن أن يكون مفيدًا أيضًا للأجهزة ذات الذاكرة المنخفضة.
يعرض الشكل 1 مخططًا لواجهة HAL الخاصة بالكاميرا للأجهزة التي تعمل بالإصدار Android 9 والإصدارات الأقدم. يوضّح الشكل 2 واجهة HAL للكاميرا في نظام التشغيل Android 10 مع تنفيذ واجهات برمجة التطبيقات الخاصة بإدارة المخزن المؤقت في HAL3 للكاميرا.
الشكل 1: واجهة Camera HAL في الإصدار 9 من نظام التشغيل Android والإصدارات الأقدم
الشكل 2: واجهة HAL للكاميرا في نظام التشغيل Android 10 باستخدام واجهات برمجة التطبيقات لإدارة المخزن المؤقت
تنفيذ واجهات برمجة التطبيقات لإدارة المخزن المؤقت
لتنفيذ واجهات برمجة التطبيقات لإدارة المخزن المؤقت، يجب أن يتضمّن HAL للكاميرا ما يلي:
- تنفيذ HIDL
ICameraDevice@3.5 - اضبط مفتاح خصائص الكاميرا
android.info.supportedBufferManagementVersionعلىHIDL_DEVICE_3_5.
يستخدم HAL الخاص بالكاميرا الطريقتَين
requestStreamBuffers
و
returnStreamBuffers
في
ICameraDeviceCallback.hal
لطلب المخازن المؤقتة وعرضها. يجب أن تنفّذ طبقة HAL أيضًا طريقة
signalStreamFlush
في
ICameraDeviceSession.hal
للإشارة إلى طبقة HAL الخاصة بالكاميرا من أجل عرض المخازن المؤقتة.
requestStreamBuffers
استخدِم طريقة
requestStreamBuffers
لطلب مخازن مؤقتة من إطار عمل الكاميرا. عند استخدام واجهات برمجة التطبيقات لإدارة المخزن المؤقت في HAL3 للكاميرا، لا تحتوي طلبات الالتقاط من إطار عمل الكاميرا على مخازن مؤقتة للإخراج، أي أنّ الحقل bufferId في StreamBuffer هو 0. لذلك، يجب أن تستخدم طبقة تجريد الأجهزة (HAL) للكاميرا requestStreamBuffers لطلب المخازن المؤقتة من إطار عمل الكاميرا.
تسمح طريقة requestStreamBuffers للمتصل بطلب مخازن مؤقتة متعددة
من عدة مصادر لبيانات الإخراج في مكالمة واحدة، ما يتيح إجراء عدد أقل من مكالمات HIDL IPC. ومع ذلك، تستغرق المكالمات وقتًا أطول عندما يتم طلب المزيد من المخازن المؤقتة في الوقت نفسه، وقد يؤثر ذلك سلبًا في إجمالي وقت الاستجابة من الطلب إلى النتيجة.
بالإضافة إلى ذلك، بما أنّ عمليات طلب البيانات في requestStreamBuffers يتم تسلسلها في خدمة الكاميرا، يُنصح بأن يستخدم برنامج HAL للكاميرا سلسلة محادثات مخصّصة ذات أولوية عالية لطلب المخازن المؤقتة.
في حال تعذُّر تنفيذ طلب تخزين مؤقت، يجب أن يكون بإمكان طبقة تجريد الأجهزة (HAL) للكاميرا التعامل مع الأخطاء غير الفادحة بشكل سليم. توضّح القائمة التالية الأسباب الشائعة لتعذّر تنفيذ طلبات التخزين المؤقت وكيفية تعامل طبقة تجريد الأجهزة (HAL) الخاصة بالكاميرا معها.
- انقطاع اتصال التطبيق ببث الإخراج:
هذا خطأ غير خطير. يجب أن يرسل HAL الخاص بالكاميرا
ERROR_REQUESTلأي طلب التقاط يستهدف بثًا غير متصل، وأن يكون جاهزًا لمعالجة الطلبات اللاحقة بشكل طبيعي. - انتهاء المهلة: يمكن أن يحدث ذلك عندما يكون التطبيق مشغولاً بتنفيذ عمليات مكثفة أثناء الاحتفاظ ببعض المخازن المؤقتة. يجب أن يرسل HAL للكاميرا
ERROR_REQUESTلطلبات الالتقاط التي لا يمكن تنفيذها بسبب خطأ في المهلة، وأن يكون جاهزًا لمعالجة الطلبات اللاحقة بشكل طبيعي. - إطار عمل الكاميرا بصدد إعداد ضبط جديد للبث:
يجب أن تنتظر طبقة تجريد الأجهزة (HAL) الخاصة بالكاميرا إلى أن يكتمل تنفيذ استدعاء
configureStreamsالتالي قبل استدعاءrequestStreamBuffersمرة أخرى. - وصلت طبقة تجريد الأجهزة (HAL) للكاميرا إلى
الحد الأقصى للمخزن المؤقت
(الحقل
maxBuffers): يجب أن تنتظر طبقة تجريد الأجهزة (HAL) للكاميرا إلى أن تعرض مخزنًا مؤقتًا واحدًا على الأقل من البث قبل استدعاءrequestStreamBuffersمرة أخرى.
returnStreamBuffers
استخدِم طريقة
returnStreamBuffers
لإرجاع المخازن المؤقتة الإضافية إلى إطار عمل الكاميرا. تعرض طبقة تجريد الأجهزة (HAL) للكاميرا عادةً المخازن المؤقتة لإطار عمل الكاميرا من خلال الطريقة processCaptureResult، ولكن يمكنها فقط احتساب طلبات الالتقاط التي تم إرسالها إلى طبقة تجريد الأجهزة (HAL) للكاميرا. باستخدام طريقة requestStreamBuffers، يمكن أن يحتفظ تنفيذ HAL للكاميرا بمخازن مؤقتة أكثر مما طلبه إطار عمل الكاميرا. في هذه الحالة، يجب استخدام الطريقة returnStreamBuffers. إذا لم يسبق أن احتوى تنفيذ طبقة تجريد الأجهزة (HAL) على مخازن مؤقتة أكثر من المطلوب، لن يحتاج تنفيذ طبقة تجريد الأجهزة (HAL) الخاصة بالكاميرا إلى استدعاء الطريقة returnStreamBuffers.
signalStreamFlush
يتم استدعاء طريقة
signalStreamFlush
من خلال إطار عمل الكاميرا لإرسال إشعار إلى طبقة تجريد الأجهزة (HAL) للكاميرا من أجل عرض جميع المخازن المؤقتة المتاحة. يتم استدعاء هذه الطريقة عادةً عندما يكون إطار عمل الكاميرا على وشك استدعاء configureStreams ويجب إفراغ مسار التقاط الكاميرا. على غرار طريقة returnStreamBuffers، إذا لم يكن تنفيذ طبقة تجريد الأجهزة (HAL) للكاميرا يتضمّن مخازن مؤقتة أكثر من المطلوب، يمكن أن يكون التنفيذ فارغًا لهذه الطريقة.
بعد أن تستدعي بنية الكاميرا signalStreamFlush، تتوقف البنية عن إرسال طلبات التقاط جديدة إلى طبقة تجريد الأجهزة (HAL) للكاميرا إلى أن يتم إرجاع جميع المخازن المؤقتة إلى بنية الكاميرا. عندما يتم عرض جميع المخازن المؤقتة، يتعذّر استدعاء طريقة requestStreamBuffers، ويمكن لإطار عمل الكاميرا مواصلة عمله في حالة نظيفة. بعد ذلك، يستدعي إطار عمل الكاميرا إما الطريقة configureStreams أو الطريقة processCaptureRequest. إذا استدعى إطار عمل الكاميرا الطريقة configureStreams، يمكن أن يبدأ HAL الخاص بالكاميرا في طلب المخازن المؤقتة مرة أخرى بعد أن تعرض المكالمة configureStreams نتيجة ناجحة. إذا استدعى إطار عمل الكاميرا الطريقة processCaptureRequest، يمكن لطبقة تجريد الأجهزة (HAL) للكاميرا بدء طلب المخازن المؤقتة أثناء استدعاء processCaptureRequest.
تختلف دلالات الطريقتين signalStreamFlush وflush. عند استدعاء طريقة flush، يمكن لطبقة تجريد الأجهزة (HAL) إيقاف طلبات الالتقاط المعلّقة باستخدام ERROR_REQUEST لإفراغ خط الأنابيب في أقرب وقت ممكن. عند استدعاء طريقة signalStreamFlush، يجب أن ينهي HAL جميع طلبات الالتقاط المعلقة بشكل طبيعي وأن يعيد جميع المخازن المؤقتة إلى إطار عمل الكاميرا.
يتمثل الاختلاف الآخر بين طريقة signalStreamFlush والطرق الأخرى في أنّ signalStreamFlush هي طريقة HIDL أحادية الاتجاه، ما يعني أنّ إطار عمل الكاميرا قد يستدعي واجهات برمجة تطبيقات أخرى تحظر التنفيذ قبل أن يتلقّى HAL طلب signalStreamFlush. وهذا يعني أنّ طريقة signalStreamFlush والطرق الأخرى (خاصةً طريقة configureStreams) قد تصل إلى طبقة HAL الخاصة بالكاميرا بترتيب مختلف عن الترتيب الذي تم استدعاؤها به في إطار عمل الكاميرا. لحلّ مشكلة عدم التزامن هذه، تمت إضافة الحقل streamConfigCounter إلى StreamConfiguration وإضافته كوسيطة إلى الطريقة signalStreamFlush. يجب أن يستخدم تنفيذ HAL للكاميرا الوسيطة streamConfigCounter
الوسيطة لتحديد ما إذا كانت مكالمة signalStreamFlush تصل بعد مكالمة configureStreams المقابلة. راجِع الشكل 3 للاطّلاع على مثال.
الشكل 3: كيف يجب أن يرصد HAL للكاميرا طلبات signalStreamFlush التي تصل متأخرة ويتعامل معها؟
تغييرات في السلوك عند تنفيذ واجهات برمجة التطبيقات لإدارة المخزن المؤقت
عند استخدام واجهات برمجة التطبيقات لإدارة المخزن المؤقت من أجل تنفيذ منطق إدارة المخزن المؤقت، يجب مراعاة التغييرات المحتملة التالية في سلوك الكاميرا وتنفيذ طبقة تجريد الأجهزة (HAL) للكاميرا:
وصول طلبات الالتقاط إلى طبقة تجريد الأجهزة (HAL) للكاميرا بشكل أسرع وبمعدّل أكبر: بدون واجهات برمجة تطبيقات إدارة المخزن المؤقت، يطلب إطار عمل الكاميرا مخازن مؤقتة للإخراج لكل طلب التقاط قبل إرسال طلب التقاط إلى طبقة تجريد الأجهزة (HAL) للكاميرا. عند استخدام واجهات برمجة تطبيقات إدارة المخزن المؤقت، لم يعُد إطار عمل الكاميرا بحاجة إلى انتظار المخازن المؤقتة، وبالتالي يمكنه إرسال طلبات الالتقاط إلى طبقة تجريد الأجهزة (HAL) للكاميرا في وقت أبكر.
بالإضافة إلى ذلك، بدون واجهات برمجة تطبيقات لإدارة المخزن المؤقت، يتوقف إطار عمل الكاميرا عن إرسال طلبات الالتقاط إذا بلغ أحد مصادر بيانات الإخراج لطلب الالتقاط الحد الأقصى لعدد المخازن المؤقتة التي يمكن لطبقة HAL الاحتفاظ بها في وقت واحد (تحدّد طبقة HAL للكاميرا هذه القيمة في الحقل
HalStream::maxBuffersضمن القيمة المعروضة من طلبconfigureStreams). باستخدام واجهات برمجة التطبيقات لإدارة المخزن المؤقت، لم يعُد هذا السلوك الخاص بتحديد عدد مرات التنفيذ متاحًا، ويجب ألا يقبل تنفيذ HAL للكاميرا طلباتprocessCaptureRequestعندما يكون لدى HAL عدد كبير جدًا من طلبات الالتقاط في قائمة الانتظار.تفاوت كبير في وقت استجابة مكالمة
requestStreamBuffers: هناك العديد من الأسباب التي قد تؤدي إلى استغراق مكالمةrequestStreamBuffersوقتًا أطول من المتوسط. على سبيل المثال:- بالنسبة إلى المخازن المؤقتة القليلة الأولى لعملية بث تم إنشاؤها حديثًا، قد تستغرق المكالمات وقتًا أطول لأنّ الجهاز يحتاج إلى تخصيص الذاكرة.
- يزداد وقت الاستجابة المتوقّع بما يتناسب مع عدد المخازن المؤقتة المطلوبة في كل مكالمة.
- يحتفظ التطبيق بمخازن مؤقتة وهو مشغول بالمعالجة. ويمكن أن يؤدي ذلك إلى بطء طلبات التخزين المؤقت أو حدوث مهلة بسبب عدم توفّر مساحة تخزين مؤقت أو انشغال وحدة المعالجة المركزية.
استراتيجيات إدارة المخزن المؤقت
تسمح واجهات برمجة التطبيقات لإدارة المخزن المؤقت بتنفيذ أنواع مختلفة من استراتيجيات إدارة المخزن المؤقت. تشمل بعض الأمثلة:
- متوافق مع الإصدارات السابقة: يطلب HAL المخازن المؤقتة لطلب الالتقاط
أثناء عملية استدعاء
processCaptureRequest. لا توفّر هذه الاستراتيجية أي توفير في الذاكرة، ولكن يمكن استخدامها كأول عملية تنفيذ لواجهات برمجة تطبيقات إدارة المخزن المؤقت، ما يتطلّب إجراء تغييرات قليلة جدًا على الرمز البرمجي في طبقة HAL الحالية للكاميرا. - توفير أكبر قدر ممكن من الذاكرة: لا يطلب HAL للكاميرا مخازن مؤقتة للإخراج إلا قبل الحاجة إلى ملء أحدها مباشرةً. تسمح هذه الاستراتيجية بتوفير الذاكرة إلى أقصى حدّ. والعيوب المحتملة هي حدوث تشوّش في مسار الكاميرا عندما تستغرق طلبات المخزن المؤقت وقتًا طويلاً بشكل غير معتاد.
- التخزين المؤقت: يخزّن HAL للكاميرا بعض المخازن المؤقتة مؤقتًا حتى يقل احتمال تأثره بطلبات المخزن المؤقت البطيئة العرضية.
يمكن أن يعتمد HAL للكاميرا استراتيجيات مختلفة لحالات استخدام معيّنة، مثل استخدام استراتيجية توفير الذاكرة إلى أقصى حد لحالات الاستخدام التي تستهلك الكثير من الذاكرة، واستخدام استراتيجية متوافقة مع الإصدارات القديمة لحالات الاستخدام الأخرى.
مثال على التنفيذ في طبقة HAL الخاصة بالكاميرا الخارجية
تم طرح طبقة تجريد الأجهزة (HAL) الخاصة بالكاميرا الخارجية في Android 9، ويمكن العثور عليها في شجرة المصدر على الرابط
hardware/interfaces/camera/device/3.5/.
في نظام التشغيل Android 10، تم تعديلها لتشمل
ExternalCameraDeviceSession.cpp،
وهي عملية تنفيذ لواجهة برمجة تطبيقات إدارة المخزن المؤقت. تنفّذ طبقة HAL الخاصة بالكاميرا الخارجية
استراتيجية توفير الذاكرة إلى أقصى حد المذكورة في استراتيجيات إدارة المخزن المؤقت في بضع مئات من أسطر رمز C++.