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