يقدّم نظام التشغيل Android 10 واجهات برمجة تطبيقات اختيارية لإدارة ملف التخزين المؤقت في HAL3 للكاميرا تتيح لك تنفيذ منطق إدارة ملف التخزين المؤقت لتحقيق مفاضلات مختلفة في وقت الاستجابة للذاكرة ووقت الاستجابة لالتقاط الصور في عمليات تنفيذ HAL للكاميرا.
تتطلّب طبقة تجريد الأجهزة (HAL) للكاميرا طلبات N (حيث تساوي N تساوي عمق مسار الأنابيب) في قائمة الانتظار، ولكنها لا تتطلّب غالبًا جميع مجموعات N من الموارد الاحتياطية للإخراج في الوقت نفسه.
على سبيل المثال، قد يكون لدى HAL ثمانية طلبات في قائمة الانتظار في مسار التنفيذ، ولكنه يتطلب فقط موارد احتياطية للمخرجات للطلبين في المراحل الأخيرة من مسار العملية. على الأجهزة التي تعمل بنظام التشغيل Android 9 والإصدارات الأقدم، يخصِّص إطار عمل الكاميرا مستودعات عندما يكون الطلب في قائمة انتظار في HAL، وبالتالي قد تكون هناك ست مجموعات من المخازن المؤقتة في HAL غير مستخدَمة. في نظام التشغيل Android 10، تسمح واجهات برمجة التطبيقات لإدارة ذاكرة التخزين المؤقت لـ HAL3 للكاميرا بفصل ذاكرة التخزين المؤقت لوحدة الإخراج من أجل تحرير المجموعات الست من ذاكرات التخزين المؤقت. وقد يؤدي ذلك إلى توفير مئات الميغابايت في الذاكرة على الأجهزة المتطورة، وقد يكون مفيدًا أيضًا للأجهزة منخفضة الذاكرة.
يعرض الشكل 1 مخطّطًا بيانيًا لواجهة HAL للكاميرا على الأجهزة التي تعمل بالإصدار 9 من Android والإصدارات الأقدم. يعرض الشكل 2 واجهة HAL للكاميرا في الإصدار 10 من نظام التشغيل Android مع تنفيذ واجهات برمجة التطبيقات لإدارة المخزن المؤقت لـ HAL3 للكاميرا.
الشكل 1: واجهة HAL للكاميرا في Android 9 والإصدارات الأقدم
الشكل 2: واجهة Camera 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) للكاميرا لإظهار الموارد الاحتياطية.
طلب StreamBuffers
استخدِم الأسلوب
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 لكاميرا Android بمزيد من وحدات التخزين المؤقت أكثر مما طلبه إطار عمل الكاميرا. وهذا هو الوقت المناسب لاستخدام الطريقة 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، ما يعني أنّ إطار عمل
الكاميرا قد يستدعي واجهات برمجة تطبيقات أخرى لحظر الطلبات قبل أن يتلقّى signalStreamFlush
طلبًا من HAL. وهذا يعني أنّ طريقة 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++.