ترجمت واجهة Cloud Translation API‏ هذه الصفحة.
Switch to English

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

يقدم 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.

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

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

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

الشكل 2. واجهة Camera HAL في Android 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.

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

returnStreamBuffers

استخدم طريقة returnStreamBuffers لإعادة المخازن المؤقتة الإضافية إلى إطار عمل الكاميرا. عادةً ما تقوم HAL بالكاميرا بإرجاع المخازن المؤقتة إلى إطار عمل الكاميرا من خلال طريقة processCaptureResult ، ولكن يمكنها فقط حساب طلبات الالتقاط التي تم إرسالها إلى الكاميرا HAL. باستخدام طريقة requestStreamBuffers ، يمكن لتطبيق HAL للكاميرا الاحتفاظ بالمخازن المؤقتة أكثر مما هو مطلوب بواسطة إطار عمل الكاميرا. هذا هو الوقت الذي يجب فيه استخدام طريقة returnStreamBuffers . إذا لم يحتفظ تطبيق HAL أبدًا returnStreamBuffers المؤقتة أكثر من المطلوب ، فلن يحتاج تطبيق 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 أحادية الاتجاه ، مما يعني أن إطار عمل الكاميرا قد يستدعي واجهات برمجة تطبيقات حظر أخرى قبل أن يتلقى 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 وقتًا أطول من المتوسط. على سبيل المثال:

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

استراتيجيات إدارة العازلة

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

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

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

تنفيذ العينة في HAL الكاميرا الخارجية

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