واجهات برمجة التطبيقات لإدارة المخزن المؤقت HAL3 للكاميرا

يقدّم نظام التشغيل Android 10 واجهات برمجة تطبيقات اختيارية لإدارة ملف التخزين المؤقت في HAL3 للكاميرا تتيح لك تنفيذ منطق إدارة ملف التخزين المؤقت لتحقيق مفاضلات مختلفة في وقت الاستجابة للذاكرة ووقت الاستجابة لالتقاط الصور في عمليات تنفيذ HAL للكاميرا.

يتطلب HAL للكاميرا عددًا من الطلبات (يُشار إليه بالرمز N) يساوي عمق مسار الإرسال، ويُضاف إلى قائمة الانتظار في مسار الإرسال، ولكن غالبًا لا يتطلب جميع مجموعات N لمخازن الإخراج في الوقت نفسه.

على سبيل المثال، قد يكون لدى HAL ثمانية طلبات في قائمة الانتظار، ولكنه يحتاج فقط إلى وحدات تخزين مؤقت للإخراج للطلبَين في المراحل الأخيرة من مسار الإرسال. على الأجهزة التي تعمل بالإصدار 9 من نظام التشغيل Android والإصدارات الأقدم، يخصّص إطار عمل الكاميرا ملفّات ذاكرة مؤقتة عند وضع الطلب في قائمة الانتظار في HAL، لذا قد تكون هناك ستّ مجموعات من ملفات الذاكرة المؤقتة في HAL غير مستخدَمة. في نظام التشغيل Android 10، تسمح واجهات برمجة التطبيقات لإدارة ذاكرة التخزين المؤقت لـ HAL3 للكاميرا بفصل ذاكرة التخزين المؤقت لوحدة الإخراج من أجل تحرير المجموعات الست من ذاكرات التخزين المؤقت. ويمكن أن يؤدي ذلك إلى توفير مئات الميغابايت من الذاكرة على الأجهزة المتطوّرة، كما يمكن أن يكون مفيدًا أيضًا ل الأجهزة ذات الذاكرة المنخفضة.

يعرض الشكل 1 مخطّطًا بيانيًا لواجهة HAL للكاميرا على الأجهزة التي تعمل بالإصدار 9 من Android والإصدارات الأقدم. يعرض الشكل 2 واجهة HAL للكاميرا في الإصدار 10 من نظام التشغيل Android مع تنفيذ واجهات برمجة التطبيقات لإدارة المخزن المؤقت لـ HAL3 للكاميرا.

إدارة التخزين المؤقت في الإصدار 9 أو الإصدارات الأقدم

الشكل 1: واجهة Camera HAL في الإصدار 9 من نظام التشغيل Android والإصدارات الأقدم

إدارة المخزن المؤقت في Android 10

الشكل 2: واجهة Camera HAL في Android 10 باستخدام واجهات برمجة التطبيقات لإدارة المخزن المؤقت

تنفيذ واجهات برمجة التطبيقات لإدارة المخزن المؤقت

لتنفيذ واجهات برمجة التطبيقات لإدارة المخزن المؤقت، يجب أن يستوفي HAL للكاميرا الشروط التالية:

يستخدم 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 لكاميرا 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 للكاميرا الخارجية

تم تقديم واجهة برمجة التطبيقات لكاميرا خارجية في Android 9 ويمكن العثور عليها في شجرة المصدر على الرابط hardware/interfaces/camera/device/3.5/. في Android 10، تم تعديله ليشمل ExternalCameraDeviceSession.cpp، وهو تطبيق لواجهة برمجة التطبيقات لإدارة المخزن المؤقت. تنفِّذ واجهة HAL لكاميرا خارجية هذه استراتيجية توفير الذاكرة إلى أقصى حدّ المذكورة في استراتيجيات إدارة المخازن المؤقتة في بضع مئات من سطور код C++.