يقدم Android 10 واجهات برمجة تطبيقات إدارة المخزن المؤقت HAL3 للكاميرا الاختيارية والتي تسمح لك بتنفيذ منطق إدارة المخزن المؤقت لتحقيق ذاكرة مختلفة والتقاط مقايضات زمن الوصول في تطبيقات HAL للكاميرا.
تتطلب كاميرا HAL طلبات N (حيث تساوي N عمق خط الأنابيب ) في قائمة الانتظار في خط الأنابيب الخاص بها ، ولكنها غالبًا لا تتطلب جميع مجموعات N من المخازن المؤقتة للإخراج في نفس الوقت.
على سبيل المثال ، قد يحتوي HAL على ثمانية طلبات في قائمة الانتظار في خط الأنابيب ، ولكنه لا يتطلب سوى مخازن إخراج للطلبين في المراحل الأخيرة من خط الأنابيب. على الأجهزة التي تعمل بنظام Android 9 والإصدارات الأقدم ، يخصص إطار عمل الكاميرا المخازن المؤقتة عند وضع الطلب في قائمة انتظار في HAL ، لذلك يمكن أن تكون هناك ست مجموعات من المخازن المؤقتة في HAL ليست قيد الاستخدام. في Android 10 ، تسمح واجهات برمجة تطبيقات إدارة المخزن المؤقت للكاميرا HAL3 بفصل المخازن المؤقتة للإخراج لتحرير المجموعات الست من المخازن المؤقتة. يمكن أن يؤدي ذلك إلى توفير مئات الميغابايتات من الذاكرة على الأجهزة المتطورة ويمكن أن يكون مفيدًا أيضًا للأجهزة ذات الذاكرة المنخفضة.
يوضح الشكل 1 مخططًا لواجهة الكاميرا HAL للأجهزة التي تعمل بنظام Android 9 والإصدارات الأقدم. يوضح الشكل 2 واجهة HAL للكاميرا في Android 10 مع تنفيذ واجهات برمجة تطبيقات إدارة المخزن المؤقت للكاميرا 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 للكاميرا لإرجاع المخازن المؤقتة.
طلب
استخدم طريقة requestStreamBuffers
لطلب المخازن المؤقتة من إطار عمل الكاميرا. عند استخدام واجهات برمجة تطبيقات إدارة المخزن المؤقت للكاميرا HAL3 ، لا تحتوي طلبات الالتقاط من إطار عمل الكاميرا على مخازن إخراج ، أي أن حقل bufferId
في StreamBuffer
هو 0
. لذلك ، يجب أن تستخدم HAL للكاميرا requestStreamBuffers
لطلب المخازن المؤقتة من إطار عمل الكاميرا.
تسمح طريقة requestStreamBuffers
للمتصل بطلب عدة مخازن مؤقتة من تدفقات إخراج متعددة في مكالمة واحدة ، مما يسمح بعدد أقل من مكالمات HIDL IPC. ومع ذلك ، تستغرق المكالمات وقتًا أطول عند طلب المزيد من المخازن المؤقتة في نفس الوقت وقد يؤثر ذلك سلبًا على زمن انتقال الطلب إلى النتيجة الإجمالي. أيضًا ، نظرًا لأن المكالمات الواردة إلى requestStreamBuffers
يتم إجراء تسلسل لها في خدمة الكاميرا ، يوصى باستخدام 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
.
تدفق إشارة
يتم استدعاء طريقة 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
. يجب أن يستخدم تطبيق Camera HAL الوسيطة streamConfigCounter
لتحديد ما إذا كانت مكالمة signalStreamFlush
تصل بعد استدعاء configureStreams
المقابل لها. انظر الشكل 3 للحصول على مثال.
الشكل 3. كيف يجب أن تكتشف HAL الكاميرا وتعالج مكالمات signalStreamFlush التي تصل متأخرة
يتغير السلوك عند تنفيذ واجهات برمجة تطبيقات إدارة المخزن المؤقت
عند استخدام واجهات برمجة تطبيقات إدارة المخزن المؤقت لتنفيذ منطق إدارة المخزن المؤقت ، ضع في اعتبارك التغييرات المحتملة التالية في السلوك على تطبيق 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 ++.