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

يقدّم نظام التشغيل 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 للكاميرا.

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

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

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

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

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

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

يستخدم 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++.