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

Android 10 في ميزات اختيارية المخزن المؤقت للكاميرا HAL3 إدارة واجهات برمجة التطبيقات (API) التي تسمح لك تنفيذ منطق إدارة المخزن المؤقت للحصول على ذاكرة مختلفة المفاضلات ضمن وقت الاستجابة في عمليات تنفيذ طبقة تجريد الأجهزة (HAL) للكاميرا

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

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

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

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

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

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

الشكل 2. واجهة 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) للكاميرا للاحتفاظ بوحدات تخزين احتياطية أكثر مما تم طلبه إطار عمل الكاميرا. هذا هو الوقت المناسب لإجراء returnStreamBuffers استخدام البيانات المختلفة. فإذا لم تتضمن عملية تنفيذ HAL موارد احتياطية أكثر مما هو مطلوب، لا يتطلّب تنفيذ طبقة تجريد الأجهزة (HAL) للكاميرا طلب returnStreamBuffers. .

SignStreamFlush

تشير رسالة الأشكال البيانية 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) الكاميرا وتتعامل معها

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

عند استخدام واجهات برمجة تطبيقات إدارة المخزن المؤقت لتطبيق منطق إدارة المخزن المؤقت، مراعاة التغييرات المحتملة التالية في السلوك على الكاميرا تنفيذ طبقة تجريد الأجهزة (HAL) للكاميرا:

  • وصول طلبات الالتقاط إلى طبقة تجريد الأجهزة (HAL) للكاميرا بشكل أسرع وأكثر بشكل متكرّر: بدون واجهات برمجة تطبيقات إدارة المخزن المؤقت، يطلب إطار عمل الكاميرا الموارد الاحتياطية للمخرجات لكل طلب التقاط قبل إرسال طلب الالتقاط إلى طبقة تجريد الأجهزة (HAL) للكاميرا. عند استخدام واجهات برمجة تطبيقات إدارة المخزن المؤقت، فإن إطار عمل الكاميرا لم تعد بحاجة إلى انتظار الموارد الاحتياطية وبالتالي يمكنها إرسال طلبات الالتقاط إلى طبقة تجريد الأجهزة (HAL) للكاميرا سابقًا.

    وأيضًا، بدون وجود واجهات برمجة تطبيقات لإدارة المخزن المؤقت، يتوقف إطار عمل الكاميرا يرسلون طلبات الالتقاط إذا كان أحد ساحات إخراج الالتقاط طلبك إلى الحد الأقصى لعدد الموارد الاحتياطية التي يمكن أن تحتفظ بها HAL مرة واحدة (يتم تحديد هذه القيمة بواسطة طبقة تجريد الأجهزة (HAL) للكاميرا في الحقل HalStream::maxBuffers في القيمة المعروضة لـ configureStreams الاتصال). باستخدام واجهات برمجة التطبيقات الخاصة بإدارة المخزن المؤقت، لم يعُد سلوك التقييد هذا الحالية ويجب ألا يتم قبول تنفيذ HAL للكاميرا مكالمتان (processCaptureRequest) عند وجود عدد كبير جدًا من طلبات الالتقاط في HAL في قائمة الانتظار.

  • يتفاوت وقت استجابة المكالمات requestStreamBuffers بشكل كبير: هناك هناك العديد من الأسباب التي قد تؤدي إلى استغراق مكالمة requestStreamBuffers وقتًا أطول من المتوسط. مثلاً:

    • بالنسبة إلى الموارد الاحتياطية القليلة الأولى للبث الذي تم إنشاؤه حديثًا، يمكن إجراء يمكن أن يستغرق وقتًا أطول لأن الجهاز يحتاج إلى تخصيص ذاكرة.
    • يزيد وقت الاستجابة المتوقع بالتناسب مع عدد الموارد الاحتياطية المطلوبة في كل استدعاء.
    • يتوفّر على التطبيق مخازن مؤقتة وهو مشغول بالمعالجة. هذا النمط إلى إبطاء طلبات المخزن المؤقت أو انتهاء المهلة بسبب نقص الموارد الاحتياطية أو انشغال وحدة المعالجة المركزية (CPU).

استراتيجيات إدارة الموارد الاحتياطية

تسمح واجهات برمجة التطبيقات لإدارة المخزن المؤقت بأنواع مختلفة من إدارة المخزن المؤقت والاستراتيجيات المراد تنفيذها. تشمل بعض الأمثلة:

  • التوافق مع الأنظمة القديمة: تطلب طبقة تجريد الأجهزة (HAL) مستودعات احتياطية لطلب تسجيل المحتوى. أثناء مكالمة processCaptureRequest. لا توفر هذه الإستراتيجية أي مقدار التوفير في الذاكرة، ولكن يمكن أن يكون بمثابة أول تنفيذ للمخزن المؤقت إلا أن ذلك يتطلب تغييرات قليلة جدًا في رمز طبقة تجريد الأجهزة (HAL) للكاميرا الحالية.
  • زيادة التوفير في الذاكرة إلى أقصى حد: لا تطلب طبقة تجريد الأجهزة (HAL) للكاميرا سوى مخازن مؤقتة للمخرجات يجب ملء أحدهما مباشرة. تسمح هذه الإستراتيجية توفير أكبر في الذاكرة. يتمثل الجانب السلبي المحتمل في زيادة مسار الكاميرا إيقاف مؤقت عندما تستغرق طلبات المخزن المؤقت وقتًا طويلاً غير معتاد إلى أن تكتمل.
  • نسخة مخبأة: تُخزِّن طبقة تجريد الأجهزة (HAL) بعض المخازن المؤقتة في الكاميرا بحيث يقلّ احتمال طلب مخزن مؤقت بطيء من حين لآخر.

ويمكن أن يتبنى طبقة تجريد الأجهزة (HAL) للكاميرا استراتيجيات مختلفة لحالات استخدام معينة، مثلًا، استخدام الإستراتيجية القصوى لتوفير الذاكرة لحالات الاستخدام التي تستهلك قدرًا كبيرًا من من الذاكرة واستخدام الإستراتيجية المتوافقة مع الأنظمة القديمة لحالات الاستخدام الأخرى.

نموذج للتنفيذ في طبقة تجريد الأجهزة (HAL) للكاميرا الخارجية

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