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

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

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

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

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

إدارة العازلة في 9 أو أقل

الشكل اجهة HAL 1. كاميرا في الروبوت 9 و أقل

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

الشكل اجهة HAL 2. كاميرا في الروبوت 10 باستخدام واجهات برمجة التطبيقات إدارة عازلة

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

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

يستخدم HAL الكاميرا requestStreamBuffers و returnStreamBuffers الأساليب في ICameraDeviceCallback.hal لطلب والعودة المخازن. يجب على HAL أيضا تنفيذ signalStreamFlush الأسلوب في ICameraDeviceSession.hal للإشارة إلى HAL الكاميرا إلى مخازن العودة.

طلب

استخدام requestStreamBuffers طريقة لطلب المخازن المؤقتة من إطار الكاميرا. عند استخدام الكاميرا HAL3 واجهات برمجة التطبيقات إدارة العازلة، طلبات من القبض إطار الكاميرا لا تحتوي على مخازن الانتاج، وهذا هو، و bufferId الميدانية في StreamBuffer هو 0 . ولذلك، يجب على HAL الكاميرا استخدام requestStreamBuffers لطلب المخازن المؤقتة من إطار الكاميرا.

و requestStreamBuffers يسمح أسلوب المتصل لطلب مخازن متعددة من تيارات إخراج متعددة في مكالمة واحدة، مما يسمح لعدد أقل من المكالمات HIDL IPC. ومع ذلك ، تستغرق المكالمات وقتًا أطول عند طلب المزيد من المخازن المؤقتة في نفس الوقت وقد يؤثر ذلك سلبًا على زمن انتقال الطلب إلى النتيجة الإجمالي. أيضا، لأنه يدعو إلى requestStreamBuffers وتسلسل في خدمة الكاميرا، من المستحسن أن الكاميرا هال استخدام مخصص موضوع ذات الأولوية العالية إلى مخازن الطلب.

إذا فشل طلب المخزن المؤقت ، فيجب أن تكون طبقة تجريد الأجهزة الخاصة بالكاميرا قادرة على معالجة الأخطاء غير الفادحة بشكل صحيح. تصف القائمة التالية الأسباب الشائعة لفشل طلبات المخزن المؤقت وكيفية معالجتها بواسطة كاميرا 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 الأسلوب. يجب استخدام تطبيق الكاميرا 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 في الروبوت 9 ويمكن العثور عليها في الشجرة مصدر في hardware/interfaces/camera/device/3.5/ . في الروبوت 10، وقد تم تحديثه ليشمل ExternalCameraDeviceSession.cpp ، تنفيذا لAPI إدارة العازلة. هذه الكاميرا HAL خارجية تنفذ استراتيجية التوفير الذاكرة مكبر المذكورة في استراتيجيات إدارة العازلة في بضع مئات الأسطر من التعليمات البرمجية C ++.