النظام الفرعي لحالة HAL

الطلبات

يُرسِل إطار عمل التطبيق طلبات النتائج التي تم التقاطها إلى النظام الفرعي للكاميرا. يتطابق طلب واحد مع مجموعة واحدة من النتائج. يتضمن الطلب كل معلومات الإعداد حول تسجيل هذه النتائج ومعالجتها. ويشمل ذلك عناصر مثل درجة الدقة وتنسيق البكسل، والتحكّم اليدوي في أداة الاستشعار والعدسة وفلاش الكاميرا، وأوضاع التشغيل 3A، والتحكّم في معالجة تنسيق RAW إلى YUV، وإنشاء الإحصاءات. يتيح ذلك التحكّم بشكل أكبر في معالجة النتائج وإخراجها. يمكن أن تكون هناك طلبات متعدّدة في انتظار المعالجة في الوقت نفسه، ولا يؤدي إرسال الطلبات إلى حظر الطلبات الأخرى. وتتم معالجة الطلبات دائمًا بالترتيب الذي يتم استلامها به.

طراز طلب الكاميرا

الشكل 1: طراز الكاميرا

HAL والنظام الفرعي للكاميرا

يتضمّن النظام الفرعي للكاميرا عمليات تنفيذ المكوّنات في مسار معالجة كاميرا ، مثل خوارزمية 3A وعناصر التحكّم في المعالجة. يقدّم HAL واجهة لك لتنفيذ إصداراتك من هذه المكوّنات. للحفاظ على التوافق مع جميع الأنظمة الأساسية بين العديد من الشركات المصنّعة للأجهزة وموفّري معالجات إشارة الصور (ISP أو أداة استشعار الكاميرا)، يكون نموذج مسار الكاميرا الافتراضية غير مطابق مباشرةً لأي معالج إشارة صور حقيقي. ومع ذلك، فإنه يشبه إلى حدٍ كبير قنوات المعالجة الفعلية حتى تتمكّن من ربطه بالأجهزة بكفاءة. بالإضافة إلى ذلك، فهو مجردّ بما يكفي للسماح بالعديد من الخوارزميات وأوامر التشغيل المختلفة بدون التأثير في الجودة أو الكفاءة أو التوافق مع جميع الأجهزة.

تتيح مسار الكاميرا أيضًا عوامل تشغيل يمكن لإطار عمل التطبيق بدءها لتفعيل ميزات مثل التركيز التلقائي. ويرسل أيضًا إشعارات إلى إطار عمل التطبيق لإعلام التطبيقات بالأحداث، مثل قفل التركيز التلقائي أو الأخطاء.

طبقة تجريد أجهزة الكاميرا

الشكل 2: مسار الكاميرا

يُرجى العِلم أنّ بعض وحدات معالجة الصور المعروضة في المخطّط البياني أعلاه ليست محدّدة جيدًا في الإصدار الأولي. تفترض عملية معالجة الكاميرا ما يلي:

  • لا تخضع مخرجات تنسيق RAW Bayer لأي معالجة داخل وحدة معالجة الصور (ISP).
  • يتم إنشاء الإحصاءات استنادًا إلى بيانات المستشعرات الأوّلية.
  • يتم ترتيب وحدات المعالجة المختلفة التي تحوّل بيانات الاستشعار الأوّلية إلى YUV بترتيب عشوائي.
  • أثناء عرض وحدات متعددة للتصغير والاقتصاص، تتشارك جميع وحدات التصغير عناصر التحكّم في منطقة الإخراج (التكبير الرقمي). ومع ذلك، قد تختلف درجة دقة الإخراج وتنسيق البكسل في كل وحدة.

ملخّص لاستخدام واجهة برمجة التطبيقات
في ما يلي ملخّص موجز لخطوات استخدام واجهة برمجة التطبيقات Android camera API. اطّلِع على القسم "بدء التشغيل وتسلسل العمليات المتوقّعة" للحصول على تفاصيل مفصّلة عن هذه الخطوات، بما في ذلك طلبات واجهة برمجة التطبيقات.

  1. الاستماع إلى أجهزة الكاميرا وحصرها
  2. افتح الجهاز واربط المستمعين.
  3. ضبط النتائج لحالة الاستخدام المستهدَفة (مثل التقاط الصور الثابتة والتسجيل وغيرها)
  4. أنشئ طلبات لحالة الاستخدام المستهدَفة.
  5. تسجيل/تكرار الطلبات والأحداث المتسلسلة
  6. تلقّي البيانات الوصفية للنتائج وبيانات الصور
  7. عند التبديل بين حالات الاستخدام، ارجع إلى الخطوة 3.

ملخّص تشغيل HAL

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

الشكل 3: نظرة عامة على Camera HAL

بدء التشغيل وتسلسل العمليات المتوقّعة

يحتوي هذا القسم على شرح مفصّل للخطوات المتوقّعة عند استخدام واجهة برمجة التطبيقات للكاميرا. يُرجى الاطّلاع على platform/hardware/interfaces/camera/ للاطّلاع على تعريفات واجهة HIDL.

إحصاء أجهزة الكاميرا وفتحها وإنشاء جلسة نشطة

  1. بعد الإعداد، يبدأ إطار العمل في الاستماع إلى أي موفّري كاميرا حاليين ينفذون واجهة ICameraProvider. إذا كان هذا الموفِّر أو الموفِّرون متوفّرين، سيحاول إطار العمل إنشاء اتصال.
  2. يسرد إطار العمل أجهزة الكاميرا من خلال ICameraProvider::getCameraIdList().
  3. ينشئ إطار العمل مثيلًا جديدًا من ICameraDevice من خلال استدعاء ICameraProvider::getCameraDeviceInterface_VX_X() المعنيّ.
  4. يُطلِق إطار العمل ICameraDevice::open() لإنشاء جلسة اتّخاذ لقطات نشطة جديدة ICameraDeviceSession.

استخدام جلسة كاميرا نشطة

  1. يستدعي إطار العمل ICameraDeviceSession::configureStreams() مع قائمة بعمليات نقل البيانات من/إلى جهاز HAL.
  2. يطلب إطار العمل الإعدادات التلقائية لبعض حالات الاستخدام التي تتضمّن مكالمات إلى ICameraDeviceSession::constructDefaultRequestSettings(). ويمكن أن يحدث ذلك في أي وقت بعد أن يُنشئ ICameraDevice::openICameraDeviceSession.
  3. يُنشئ إطار العمل طلب الالتقاط الأول ويرسله إلى HAL مع الإعدادات استنادًا إلى إحدى مجموعات الإعدادات التلقائية، وأحد مجرى الإخراج على الأقل الذي سجّله إطار العمل في وقت سابق. يتم إرسال هذا الإجراء إلى HAL باستخدام ICameraDeviceSession::processCaptureRequest(). يجب أن تحظر HAL إعادة هذه المكالمة إلى أن تصبح جاهزة لإرسال ال request التالي.
  4. يواصل إطار العمل إرسال الطلبات والطلبات المرسَلة إلى العميل ICameraDeviceSession::constructDefaultRequestSettings() للحصول على مخازن الإعدادات التلقائية لحالات الاستخدام الأخرى حسب الحاجة.
  5. عند بدء التقاط طلب (يبدأ المستشعر بتعريض كاميرا DSLR للالتقاط)، يُطلِق HAL طلبًا إلى ICameraDeviceCallback::notify() مع رسالة SHUTTER، بما في ذلك رقم اللقطة والطابع الزمني لبدء التعريض. ولا يلزم أن يتمّ إجراء طلب الإشعار هذا قبل إجراء أول مكالمة processCaptureResult() لطلب، ولكن لا يتم إرسال أي نتائج إلى أحد التطبيقات لتسجيلها إلا بعد استدعاء notify() لتسجيلها.
  6. بعد بعض التأخير في مسار الإرسال، يبدأ HAL في عرض عمليات الالتقاط المكتملة في إطار العمل باستخدام ICameraDeviceCallback::processCaptureResult(). ويتم عرضها بالترتيب نفسه الذي تم إرسال الطلبات به. يمكن أن يتم إرسال عدة طلبات في وقت واحد، وذلك استنادًا إلى عمق مسار الإرسال لجهاز HAL الكاميرا.

بعد مرور بعض الوقت، سيحدث أحد الإجراءَين التاليَين:

  • قد يتوقف إطار العمل عن إرسال طلبات جديدة، وينتظر اكتمال عمليات التسجيل الحالية (ملء جميع وحدات التخزين المؤقت، وعرض جميع النتائج)، ثم يستدعي ICameraDeviceSession::configureStreams() مرة أخرى. يؤدي ذلك إلى إعادة ضبط أجهزة الكاميرا ومسار الإرسال لإعداد مجموعة جديدة من مجرى عمليات الإدخال/الإخراج. قد تتم إعادة استخدام بعض أحداث البث من الإعدادات السابقة. يستمر إطار العمل بعد ذلك من طلب الالتقاط الأول إلى HAL، إذا بقي مصدر إخراج مسجَّل واحد على الأقل. (بخلاف ذلك، ICameraDeviceSession::configureStreams() مطلوب أولاً).
  • قد يُطلِق إطار العمل ICameraDeviceSession::close() لإنهاء جلسة الكاميرا. يمكن استدعاء هذا الإجراء في أي وقت عندما لا تكون أي مكالمات أخرى من إطار العمل نشطة، على الرغم من أنّه قد يتم حظر المكالمة إلى أن تكتمل كل عمليات تسجيل البيانات الجارية (يتم عرض كل النتائج، وملء كل ذاكرات التخزين المؤقت في الذاكرة). بعد انتهاء مكالمة close()، لا يُسمح بعد ذلك بأي مكالمات إلى ICameraDeviceCallback من HAL. بعد بدء معالجة طلب close()، قد لا يستدعي إطار العمل أي وظائف أخرى لجهاز HAL.
  • في حال حدوث خطأ أو حدث غير متزامن آخر، يجب أن يتصل HAL بـ ICameraDeviceCallback::notify() مع رسالة الخطأ أو الحدث المناسبة. بعد العودة من إشعار خطأ فادح على مستوى الجهاز، يجب أن يعمل HAL كما لو تم استدعاء close(). ومع ذلك، يجب أن يُلغي واجهة HAL أو تُكمل كل عمليات الالتقاط غير المكتملة قبل استدعاء notify()، وذلك لكي لا يتلقّى الإطار العملي المزيد من عمليات الاستدعاء من الجهاز بعد استدعاء notify() مع ظهور خطأ فادح. يجب أن تعرض الطرق غير close() القيمة -ENODEV أو NULL بعد أن تعرض طريقة notify() رسالة خطأ فادحًا.
مسار عمليات الكاميرا

الشكل 4: مسار تشغيل الكاميرا

مستويات الأجهزة

يمكن لأجهزة الكاميرا تنفيذ عدة مستويات من الأجهزة حسب ميزاتها. لمزيد من المعلومات، يُرجى الاطّلاع على مستوى الأجهزة المتوافقة.

التفاعل بين طلب التقاط البيانات من التطبيق وعنصر التحكّم في 3A ومسار المعالجة

استنادًا إلى الإعدادات في وحدة التحكّم في 3A، تتجاهل مسار الكاميرا بعض المَعلمات في طلب الالتقاط الذي يقدّمه التطبيق، وتستخدِم القيم المقدَّمة من إجراءات التحكّم في 3A بدلاً من ذلك. على سبيل المثال، عندما يكون التعريض التلقائي فعالًا، يتم التحكّم في وقت التعريض ومدة اللقطة ومَعلمات الحساسية لجهاز الاستشعار من خلال خوارزمية 3A للنظام الأساسي، ويتم تجاهل أي قيم محدّدة من التطبيق. يجب الإبلاغ عن القيم التي تم اختيارها للإطار من خلال إجراءات 3A في البيانات الوصفية للإخراج. يوضّح الجدول التالي الأوضاع المختلفة لوحدة التحكّم 3A والسمات التي يتم التحكّم فيها من خلال هذه الأوضاع. اطّلِع على ملف platform/system/media/camera/docs/docs.html للاطّلاع على تعريفات هذه السمات.

المَعلمة الولاية المواقع التي يتم التحكّم فيها
android.control.aeMode إيقاف بدون تحديد نمط
تفعيل android.sensor.exposureTime android.sensor.frameDuration android.sensor.sensitivity android.lens.aperture (إذا كان متاحًا) android.lens.filterDensity (إذا كان متاحًا)
ON_AUTO_FLASH كل الإعدادات مفعَّلة، بالإضافة إلى android.flash.firingPower وandroid.flash.firingTime وandroid.flash.mode
ON_ALWAYS_FLASH القيمة نفسها مثل ON_AUTO_FLASH
ON_AUTO_FLASH_RED_EYE القيمة نفسها مثل ON_AUTO_FLASH
android.control.awbMode إيقاف بدون تحديد نمط
WHITE_BALANCE_* android.colorCorrection.transform. التعديلات الخاصة بالنظام الأساسي إذا كانت قيمة android.colorCorrection.mode هي FAST أو HIGH_QUALITY
android.control.afMode إيقاف بدون تحديد نمط
FOCUS_MODE_* android.lens.focusDistance
android.control.videoStabilization إيقاف بدون تحديد نمط
تفعيل يمكن ضبط android.scaler.cropRegion لتنفيذ ميزة تثبيت الفيديو
android.control.mode إيقاف إيقاف ميزة "ضبط الإضاءة تلقائيًا" و"ضبط درجة حرارة اللون تلقائيًا" و"ضبط التركيز تلقائيًا"
تلقائي يتم استخدام إعدادات AE وAWB وAF الفردية
SCENE_MODE_* يمكنها إلغاء جميع المَعلمات المُدرَجة أعلاه. عناصر التحكّم الفردية في 3A غير مفعّلة.

تعمل عناصر التحكّم في وحدة "معالجة الصور" في الشكل 2 وفقًا لقاعدة مشابهة، وبشكل عام، تتضمّن كل وحدة ثلاثة أوضاع:

  • غير مفعّل: تم إيقاف مجموعة المعالجة هذه. لا يمكن إيقاف وحدات إزالة الفسيفساء وتصحيح الألوان وتعديل منحنى التدرج اللوني.
  • سريع: في هذا الوضع، قد لا تبطئ وحدة المعالجة معدّل عرض اللقطات في الإخراج مقارنةً بالوضع "إيقاف"، ولكن من المفترض أن تنتج الإخراج بأعلى جودة ممكنة في ظل هذا القيد. يتم استخدام هذا الخيار عادةً في وضعَي المعاينة أو تسجيل الفيديو، أو وضع التقاط الصور المتسلسلة للصور الثابتة. على بعض الأجهزة، قد يكون هذا الوضع معادلاً للوضع OFF (لا يمكن إجراء أي معالجة بدون إبطاء عدد اللقطات في الثانية)، وعلى بعض الأجهزة، قد يكون هذا الوضع معادلاً للوضع HIGH_QUALITY (لا يؤدي استخدام أفضل جودة إلى إبطاء عدد اللقطات في الثانية).
  • HIGH_QUALITY: في هذا الوضع، من المفترض أن تُنتج وحدة المعالجة أفضل نتيجة ممكنة من حيث الجودة، مع إبطاء عدد اللقطات في الثانية للإخراج حسب الحاجة. ويُستخدَم هذا الوضع عادةً لالتقاط صور ثابتة عالية الجودة. تتضمّن بعض الكتل عنصر تحكّم يدويًا يمكن اختياره اختياريًا بدلاً من FAST أو HIGH_QUALITY. على سبيل المثال، تتيح مجموعة تصحيح الألوان استخدام مصفوفة تحويل ألوان، في حين يتيح تعديل منحنى درجة اللون استخدام منحنى ربط عالمي произвольн اختياري لدرجة اللون.

إنّ الحد الأقصى لمعدل عرض اللقطات الذي يمكن أن يتوافق معه النظام الفرعي للكاميرا هو تابع لعدة عوامل:

  • درجات الدقة المطلوبة لملفات بث الصور الناتجة
  • توفُّر أوضاع التجميع/التخطّي في أداة التصوير
  • معدل نقل البيانات لواجهة أداة التصوير
  • معدل نقل البيانات لكتل معالجة مزوّدي خدمة الإنترنت المختلفة

وبما أنّ هذه العوامل يمكن أن تختلف اختلافًا كبيرًا بين مزوّدي خدمات الإنترنت وأجهزة الاستشعار المختلفة، تحاول واجهة HAL للكاميرا تبسيط القيود المفروضة على معدل نقل البيانات إلى نموذج بسيط قدر الإمكان. يتسم النموذج المقدَّم بالسمات التالية:

  • يتم ضبط وحدة استشعار الصور دائمًا لإخراج أصغر درجة دقة ممكنة استنادًا إلى أحجام بث الإخراج المطلوبة من التطبيق. يتم تحديد أصغر درجة للدقة على أنّها لا تقل عن حجم أكبر ملف ناتج تم طلبه.
  • بما أنّ أي طلب قد يستخدم أيًا من مصادر الإخراج التي تم ضبطها حاليًا أو جميعها، يجب ضبط أداة الاستشعار ومزوّد خدمة الإنترنت للسماح بتوسيع نطاق عملية تسجيل واحدة لتغطي جميع مصادر الإخراج في الوقت نفسه.
  • تعمل أحداث بث JPEG مثل أحداث بث YUV التي تمت معالجتها للطلبات التي لا يتم تضمينها فيها، وفي الطلبات التي تتم الإشارة إليها مباشرةً، تعمل كأحداث بث JPEG.
  • يمكن تشغيل وحدة معالجة ملفات JPEG بشكل متزامن مع بقية مسار معالجة الكاميرا، ولكن لا يمكنها معالجة أكثر من عملية التقاط واحدة في المرة الواحدة.