مرجع بنية camera3_device_ops
#include <
camera3.h
>
حقول البيانات |
|
int(* | initialize )(const struct camera3_device *, const camera3_callback_ops_t *callback_ops) |
int(* | configure_streams )(const struct camera3_device *, camera3_stream_configuration_t *stream_list) |
int(* | register_stream_buffers )(const struct camera3_device *, const camera3_stream_buffer_set_t *buffer_set) |
const camera_metadata_t *(* | construct_default_request_settings )(const struct camera3_device *, int type) |
int(* | process_capture_request )(const struct camera3_device *, camera3_capture_request_t *request) |
void(* | get_metadata_vendor_tag_ops )(const struct camera3_device *, vendor_tag_query_ops_t *ops) |
void(* | dump )(const struct camera3_device *, int fd) |
int(* | flush )(const struct camera3_device *) |
void * | reserved [8] |
وصف مفصّل
مستندات الحقل
int(* configure_streams)(const struct camera3_device *, camera3_stream_configuration_t *stream_list) |
configure_streams:
CAMERA_DEVICE_API_VERSION_3_0 فقط:
أعِد ضبط مسار معالجة جهاز الكاميرا في HAL وإعداد مصادر بيانات إدخال وإخراج جديدة. تستبدل هذه الدعوة أيّ إعدادات حالية للبث بالبثّات المحدّدة في stream_list. سيتمّ استدعاء هذه الطريقة مرّة واحدة على الأقل بعد initialize() قبل إرسال طلب باستخدام process_capture_request() .
يجب أن تحتوي قائمة stream_list على مصدر بيانات واحد على الأقلّ يمكنه الإخراج، ولا يجوز أن تحتوي على أكثر من مصدر بيانات واحد يمكنه الإدخال.
قد تحتوي قائمة_البث على مصادر بيانات موجودة أيضًا في المجموعة النشطة حاليًا من مصادر البيانات (من الطلب السابق على configure_stream()). وستكون لهذه مصادر البيانات قيم صالحة لاستخدامها وmax_buffers والمؤشر الخاص.
إذا سبق أن تم تسجيل وحدات التخزين المؤقتة في هذا البث، لن يتم استدعاء register_stream_buffers() مرة أخرى للبث، ويمكن تضمين وحدات التخزين المؤقتة من البث على الفور في طلبات الإدخال.
إذا احتاجت HAL إلى تغيير إعدادات البث لبث حالي بسبب الإعدادات الجديدة، قد تعيد كتابة قيم الاستخدام و/أو max_buffers أثناء طلب الضبط.
سيرصد إطار العمل هذا التغيير، ثم سيعيد توزيع وحدات تخزين الجلسة للبث، وسيستدعي register_stream_buffers() مرة أخرى قبل استخدام وحدات التخزين من هذا البث في طلب.
إذا لم يتم تضمين مصدر بيانات نشط حاليًا في stream_list، يمكن أن تزيل HAL أيّ إشارات إلى مصدر البيانات هذا بأمان. ولن تتم إعادة استخدامه في أيّ طلب لاحق لإنشاء عنصر في إطار العمل، وسيتم تحرير جميع وحدات تخزين gralloc له بعد انتهاء طلب configure_streams() .
تعود ملكية بنية stream_list إلى إطار العمل، وقد لا يكون بالإمكان الوصول إليها بعد اكتمال هذا الطلب. سيظل عنوان بنية camera3_stream_t الفردية صالحًا للوصول إليه من خلال HAL حتى نهاية أول طلب configure_stream() الذي لم يعُد يتضمّن بنية camera3_stream_t في الوسيطة stream_list. لا يجوز لواجهة HAL تغيير القيم في بنية البث خارج المؤشر الخاص، باستثناء العنصرَين usage وmax_buffers أثناء configure_streams() الاستدعاء نفسه.
إذا كان البث جديدًا، سيتم ضبط حقلَي usage وmax_buffer وprivate pointer في بنية البث على 0. يجب أن يضبط جهاز HAL هذه الحقول قبل أن يعود طلب configure_streams() . ويستخدم إطار العمل ووحدة gralloc في النظام الأساسي هذه الحقول بعد ذلك لتخصيص مخازن gralloc لكل بث.
قبل أن يتم تضمين وحدات التخزين المؤقتة في طلب تسجيل لبث جديد، سيستدعي إطار العمل register_stream_buffers() مع هذا البث. ومع ذلك، ليس مطلوبًا من الإطار العمل تسجيل وحدات التخزين المؤقت لجلسات البث في كل البث قبل إرسال طلب. يتيح ذلك بدء بث معاينة سريعًا (على سبيل المثال)، مع تخصيص سعة للبثّات الأخرى في وقت لاحق أو بشكل متزامن.
CAMERA_DEVICE_API_VERSION_3_1 فقط:
أعِد ضبط مسار معالجة جهاز الكاميرا في HAL وإعداد مصادر بيانات إدخال وإخراج جديدة. تستبدل هذه الدعوة أيّ إعدادات حالية للبث بالبثّات المحدّدة في stream_list. سيتمّ استدعاء هذه الطريقة مرّة واحدة على الأقل بعد initialize() قبل إرسال طلب باستخدام process_capture_request() .
يجب أن تحتوي قائمة stream_list على مصدر بيانات واحد على الأقلّ يمكنه الإخراج، ولا يجوز أن تحتوي على أكثر من مصدر بيانات واحد يمكنه الإدخال.
قد تحتوي قائمة_البث على مصادر بيانات موجودة أيضًا في المجموعة النشطة حاليًا من مصادر البيانات (من الطلب السابق على configure_stream()). وستكون لهذه مصادر البيانات قيم صالحة لاستخدامها وmax_buffers والمؤشر الخاص.
إذا سبق أن تم تسجيل وحدات التخزين المؤقتة في هذا البث، لن يتم استدعاء register_stream_buffers() مرة أخرى للبث، ويمكن تضمين وحدات التخزين المؤقتة من البث على الفور في طلبات الإدخال.
إذا احتاجت HAL إلى تغيير إعدادات البث لبث حالي بسبب الإعدادات الجديدة، قد تعيد كتابة قيم الاستخدام و/أو max_buffers أثناء طلب الضبط.
سيرصد إطار العمل هذا التغيير، ثم سيعيد توزيع وحدات تخزين الجلسة للبث، وسيستدعي register_stream_buffers() مرة أخرى قبل استخدام وحدات التخزين من هذا البث في طلب.
إذا لم يتم تضمين مصدر بيانات نشط حاليًا في stream_list، يمكن أن تزيل HAL أيّ إشارات إلى مصدر البيانات هذا بأمان. ولن تتم إعادة استخدامه في أيّ طلب لاحق لإنشاء عنصر في إطار العمل، وسيتم تحرير جميع وحدات تخزين gralloc له بعد انتهاء طلب configure_streams() .
تعود ملكية بنية stream_list إلى إطار العمل، وقد لا يكون بالإمكان الوصول إليها بعد اكتمال هذا الطلب. سيظل عنوان بنية camera3_stream_t الفردية صالحًا للوصول إليه من خلال HAL حتى نهاية أول طلب configure_stream() الذي لم يعُد يتضمّن بنية camera3_stream_t في الوسيطة stream_list. لا يجوز لواجهة HAL تغيير القيم في بنية البث خارج المؤشر الخاص، باستثناء العنصرَين usage وmax_buffers أثناء configure_streams() الاستدعاء نفسه.
إذا كان البث جديدًا، سيتم ضبط حقلَي max_buffer وprivate pointer في بنية البث على 0. سيتم ضبط الاستخدام على علامات استخدام المستهلكين. يجب أن يضبط جهاز HAL هذه الحقول قبل أن يعود طلب configure_streams() . ويستخدم إطار العمل ووحدة gralloc للنظام الأساسي هذه الحقول بعد ذلك لتخصيص مخازن gralloc لكل بث.
قبل أن يتم تضمين وحدات التخزين المؤقتة في طلب تسجيل لبث جديد، سيستدعي إطار العمل register_stream_buffers() مع هذا البث. ومع ذلك، ليس مطلوبًا من الإطار العمل تسجيل وحدات التخزين المؤقت لجلسات البث في كل البث قبل إرسال طلب. يتيح ذلك بدء بث معاينة سريعًا (على سبيل المثال)، مع تخصيص سعة للبثّات الأخرى في وقت لاحق أو بشكل متزامن.
>= CAMERA_DEVICE_API_VERSION_3_2:
أعِد ضبط مسار معالجة جهاز الكاميرا في HAL وإعداد مصادر بيانات إدخال وإخراج جديدة. تستبدل هذه الدعوة أيّ إعدادات حالية للبث بالبثّات المحدّدة في stream_list. سيتمّ استدعاء هذه الطريقة مرّة واحدة على الأقل بعد initialize() قبل إرسال طلب باستخدام process_capture_request() .
يجب أن تحتوي قائمة stream_list على مصدر بيانات واحد على الأقلّ يمكنه الإخراج، ولا يجوز أن تحتوي على أكثر من مصدر بيانات واحد يمكنه الإدخال.
قد تحتوي قائمة_البث على مصادر بيانات موجودة أيضًا في المجموعة النشطة حاليًا من مصادر البيانات (من الطلب السابق على configure_stream()). وستكون لهذه مصادر البيانات قيم صالحة لاستخدامها وmax_buffers والمؤشر الخاص.
إذا احتاجت HAL إلى تغيير إعدادات البث لبث حالي بسبب الإعدادات الجديدة، قد تعيد كتابة قيم الاستخدام و/أو max_buffers أثناء طلب الضبط.
سيرصد إطار العمل هذا التغيير، وقد يعيد بعد ذلك تخصيص ذاكرات التخزين المؤقت للبث قبل استخدام ذاكرات التخزين المؤقت من هذا البث في طلب.
إذا لم يتم تضمين مصدر بيانات نشط حاليًا في stream_list، يمكن أن تزيل HAL أيّ إشارات إلى مصدر البيانات هذا بأمان. ولن تتم إعادة استخدامه في أيّ طلب لاحق لإنشاء عنصر تحكم() من خلال إطار العمل، وسيتم تحرير جميع وحدات تخزين gralloc له بعد انتهاء طلب configure_streams() .
تعود ملكية بنية stream_list إلى إطار العمل، وقد لا يكون بالإمكان الوصول إليها بعد اكتمال هذا الطلب. سيظل عنوان بنية camera3_stream_t الفردية صالحًا للوصول إليه من خلال HAL حتى نهاية أول طلب configure_stream() الذي لم يعُد يتضمّن بنية camera3_stream_t في الوسيطة stream_list. لا يجوز لواجهة HAL تغيير القيم في بنية البث خارج المؤشر الخاص، باستثناء العنصرَين usage وmax_buffers أثناء configure_streams() الاستدعاء نفسه.
إذا كان البث جديدًا، سيتم ضبط حقلَي max_buffer وprivate pointer في بنية البث على 0. سيتم ضبط الاستخدام على علامات استخدام المستهلكين. يجب أن يضبط جهاز HAL هذه الحقول قبل أن يعود طلب configure_streams() . ويستخدم إطار العمل ووحدة gralloc للنظام الأساسي هذه الحقول بعد ذلك لتخصيص مخازن gralloc لكل بث.
يمكن أن يتضمّن إطار العمل في أي وقت وحدات تخزين مؤقتة تم تخصيصها حديثًا في طلب التسجيل. بعد إرجاع مخزن مؤقت gralloc إلى الإطار باستخدام process_capture_result (وبعد الإشارة إلى release_fence المعنيّ)، يمكن للإطار تحريره أو إعادة استخدامه في أي وقت.
الشروط الأساسية:
لن يستدعي إطار العمل هذه الطريقة إلا عندما لا تتم معالجة أي عمليات تسجيل. وهذا يعني أنّه تم إرجاع جميع النتائج إلى الإطار، وتم إرجاع جميع وحدات التخزين المؤقت للدخل والإخراج التي لا تزال قيد المعالجة، وتم إرسال إشارات إلى HAL بشأن حدود تحرير المزامنة. لن يُرسِل إطار العمل طلبات جديدة لتسجيل المحتوى أثناء تنفيذ configure_streams() call.
الشروط اللاحقة:
يجب أن يضبط جهاز HAL نفسه لتوفير الحد الأقصى من معدل عرض اللقطات الممكن في الإخراج استنادًا إلى أحجام وتنسيقات مصادر الإخراج، كما هو موضّح في البيانات الوصفية الثابتة لجهاز الكاميرا.
متطلبات الأداء:
من المتوقّع أن تكون هذه المكالمة كثيفة الاستخدام للموارد وقد تستغرق إكمالها عدة مئات من المللي ثانية، لأنّها قد تتطلّب إعادة ضبط أداة استشعار الصور وإعادة ضبط مسار معالجة الكاميرا. ومع ذلك، يجب أن يحاول جهاز HAL تقليل وقت الاستجابة لإعادة الضبط من أجل تقليل الفواصل الزمنية التي تظهر للمستخدم أثناء تغييرات وضع التشغيل في التطبيق (مثل التبديل من التقاط الصور الثابتة إلى تسجيل الفيديو).
من المفترض أن يعود HAL من هذه المكالمة خلال 500 ملي ثانية، ويجب أن يعود من هذه المكالمة خلال 1000 ملي ثانية.
القيم المعروضة:
0: عند ضبط البث بنجاح
-EINVAL: إذا كانت إعدادات البث المطلوبة غير صالحة في ما يلي بعض الأمثلة على إعدادات البث غير الصالحة:
- أن تتضمّن أكثر من بث واحد مزوّد بإمكانية الإدخال (INPUT أو BIDIRECTIONAL)
- عدم تضمين أي مصادر بيانات قادرة على الإخراج (OUTPUT أو BIDIRECTIONAL)
- بما في ذلك أحداث البث التي تستخدم تنسيقات غير متوافقة أو حجمًا غير متوافق مع هذا التنسيق
- تضمين عدد كبير جدًا من مصادر الإخراج بتنسيق معيّن
- إعدادات عرض بالتناوب غير متوافقة (لا تنطبق إلا على الأجهزة التي تعمل بالإصدار CAMERA_DEVICE_API_VERSION_3_3 أو الإصدارات الأحدث)
- لا تستوفي أحجام/تنسيقات البث متطلبات camera3_stream_configuration_t->operation_mode للوضع غير العادي، أو لا تتوافق طبقة HAL مع وضع التشغيل المطلوب. (لا ينطبق إلا على الأجهزة التي تعمل بالإصدار 3.3 من واجهة برمجة التطبيقات CAMERA_DEVICE_API_VERSION_3_3 أو الإصدارات الأحدث)
يُرجى العِلم أنّ إرسال إطار عمل لإعداد بث غير صالح ليس عملية عادية، لأنّه يتم التحقّق من إعدادات البث قبل ضبطها. يعني الضبط غير الصالح أنّ هناك خطأ في رمز الإطار أو أنّ هناك عدم تطابق بين البيانات الوصفية الثابتة لـ HAL والمتطلبات المفروضة على أحداث البث.
-ENODEV: إذا حدث خطأ فادح ولم يعُد الجهاز قابلاً للتشغيل لا يمكن للإطار أن يستدعي close() بنجاح إلا بعد ظهور هذا الخطأ.
const camera_metadata_t *(* construct_default_request_settings)(const struct camera3_device *, int type) |
construct_default_request_settings:
أنشئ إعدادات الالتقاط لحالات استخدام الكاميرا العادية.
يجب أن يعرض الجهاز ذاكرة تخزين مؤقت للإعدادات تم ضبطها لاستيفاء حالة الاستخدام المطلوبة، والتي يجب أن تكون إحدى القيم المحددة في CAMERA3_TEMPLATE_*. يجب تضمين جميع حقول التحكّم في الطلب.
يحتفظ HAL بملكية هذه البنية، ولكن يجب أن يكون المؤشر إلى البنية صالحًا إلى أن يتم إغلاق الجهاز. لا يجوز للإطار وHAL تعديل المخزن المؤقت بعد إرجاعه من خلال هذه الدعوة. قد يتم عرض المخزن المؤقت نفسه في طلبات لاحقة للنموذج نفسه أو للنماذج الأخرى.
متطلبات الأداء:
يجب أن يكون هذا طلبًا غير حظر. من المفترض أن يعود HAL من هذه المكالمة خلال 1 مللي ثانية، ويجب أن يعود من هذه المكالمة خلال 5 مللي ثانية.
القيم المعروضة:
البيانات الوصفية الصالحة: عند إنشاء ذاكرة تخزين مؤقتة للإعدادات التلقائية بنجاح
NULL: في حال حدوث خطأ فادح بعد عرض هذا الرمز، يمكن للإطار فقط استدعاء الطريقة close() بنجاح.
void(* dump)(const struct camera3_device *, int fd) |
dump:
طباعة حالة تصحيح الأخطاء لجهاز الكاميرا سيستدعي إطار العمل هذا الإجراء عندما يُطلب من خدمة الكاميرا إنشاء ملف تجميع أخطاء تصحيح الأخطاء، وذلك عند استخدام أداة dumpsys أو عند إنشاء تقرير أخطاء.
يمكن استخدام ملف الوصف الذي تم تمريره لكتابة نص تصحيح الأخطاء باستخدام dprintf() أو write(). يجب أن يكون النص بترميز ASCII فقط.
متطلبات الأداء:
يجب أن تكون هذه مكالمة غير محظورة. من المفترض أن يعود HAL من هذه المكالمة خلال 1 مللي ثانية، ومن المفترض أن يعود من هذه المكالمة خلال 10 مللي ثانية. يجب أن يتجنّب هذا الطلب حالات التوقف المفاجئ، لأنّه قد يتم استدعاؤه في أي وقت أثناء تشغيل الكاميرا. يجب الحصول على أيّ من الوحدات الأساسية للمزامنة المستخدَمة (مثل أقفال المُحجوزات الحصرية أو وحدات الإشارة) باستخدام مهلة.
int(* flush)(const struct camera3_device *) |
flush:
تفريغ جميع عمليات الالتقاط الجارية حاليًا وجميع وحدات التخزين المؤقت في قناة الإرسال على الجهاز المحدّد سيستخدم الإطار العمل هذا لتفريغ جميع الحالات في أسرع وقت ممكن من أجل الاستعداد لمكالمة configure_streams() .
لا يُشترط إرجاع أيّ مخازن مؤقتة بنجاح، لذا قد يتم إرجاع كلّ مخزن مؤقت محفوظ في وقت flush() (سواء تم ملؤه بنجاح أم لا) باستخدام CAMERA3_BUFFER_STATUS_ERROR. يُرجى العِلم أنّه لا يزال يُسمح لطبقة HAL بإرجاع وحدات تخزين مؤقت صالحة (CAMERA3_BUFFER_STATUS_OK) أثناء هذه المكالمة، شرط أن يتم ملؤها بنجاح.
من المتوقّع أن يتمّ ردّ جميع الطلبات المتوفّرة حاليًا في HAL في أقرب وقت ممكن. من المفترض أن تؤدي الطلبات غير الجارية المعالجة إلى ظهور أخطاء على الفور. يجب إيقاف أي عمليات حظر للأجهزة يمكن إيقافها، والانتظار إلى أن تكتمل أي عمليات حظر لا يمكن إيقافها.
قد يتمّ استدعاء flush() بشكلٍ متزامن مع process_capture_request() ، مع توقّع أن يتمّ عرض عملية process_capture_request بسرعة وأن يتمّ التعامل مع الطلب الذي تم إرساله في عملية process_capture_request هذه مثل جميع الطلبات الأخرى قيد المعالجة. بسبب مشاكل المعالجة المتزامنة، من الممكن أن يبدأ HAL عملية process_capture_request() بعد استدعاء flush ولكنّه لم يُعرَض بعد. إذا حدثت هذه الدعوة قبل أن يتم عرض القيمة المرجعية لدالّة flush() ، يجب أن يتعامل HAL مع طلب الالتقاط الجديد مثل الطلبات الأخرى المعلّقة التي لا تزال قيد المعالجة (راجِع النقطة 4 أدناه).
وعلى وجه التحديد، يجب أن يتّبع HAL المتطلبات التالية في حالات مختلفة:
- بالنسبة إلى عمليات الالتقاط التي يكون وقتها متأخرًا جدًا لدرجة أنّه لا يمكن لواجهة HAL إلغاؤها أو إيقافها، ستكملها واجهة HAL بشكلٍ طبيعي، أي يمكن لواجهة HAL إرسال shutter/notify وprocess_capture_result وbuffers كالمعتاد.
- بالنسبة إلى الطلبات التي لا تزال في انتظار المراجعة ولم يتم إجراء أي معالجة لها، يجب أن يستدعي HAL notify CAMERA3_MSG_ERROR_REQUEST، وأن يعرض جميع مخازن الإخراج التي تحتوي على process_capture_result في حالة الخطأ (CAMERA3_BUFFER_STATUS_ERROR). يجب ألا يضع HAL حاجز الإصدار في حالة خطأ، وبدلاً من ذلك، يجب ضبط حواجز الإصدار على حواجز الاستحواذ التي تم تمريرها من خلال الإطار، أو -1 إذا كان قد تم انتظارها من قِبل HAL من قبل. وهذا هو المسار الذي يجب اتّباعه لأي عمليات التقاط سبق أن استدعت HAL دالة notify() باستخدام CAMERA3_MSG_SHUTTER، ولكن لن يتم إنشاء أي بيانات وصفية أو مخازن مؤقتة صالحة لها. بعد CAMERA3_MSG_ERROR_REQUEST، لا يُسمح إلا باستخدام process_capture_results مع المخازن المؤقتة في CAMERA3_BUFFER_STATUS_ERROR لإطار معيّن. لا يُسمح بمزيد من الإشعارات أو process_capture_result التي تحتوي على بيانات وصفية غير صفرية.
-
بالنسبة إلى الطلبات المعلّقة التي اكتملت جزئيًا ولن تتضمّن جميع وحدات التخزين المؤقت للإخراج أو قد لا تتضمّن البيانات الوصفية، يجب أن يتضمّن HAL الخطوات التالية:
3.1. يمكنك استدعاء notify باستخدام CAMERA3_MSG_ERROR_RESULT إذا لم تكن بعض البيانات الوصفية للنتيجة المتوقّعة (أي بيانات وصفية جزئية واحدة أو أكثر) متاحة لالتقاط الصورة.
3.2. يمكنك استدعاء notify باستخدام CAMERA3_MSG_ERROR_BUFFER لكل وحدة تخزين مؤقت لن يتم إنشاؤها لالتقاط الصور.
3.3 استدعاء notify باستخدام CAMERA3_MSG_SHUTTER مع الطابع الزمني للالتقاط قبل عرض أيّ مخازن مؤقتة/بيانات وصفية باستخدام process_capture_result
3.4 بالنسبة إلى عمليات الالتقاط التي ستؤدي إلى ظهور بعض النتائج، يجب ألا يستدعي HAL CAMERA3_MSG_ERROR_REQUEST، لأنّ ذلك يشير إلى حدوث خطأ كامل.
3.5. يجب تمرير وحدات التخزين المؤقت أو البيانات الوصفية الصالحة إلى إطار العمل كالمعتاد.
3.6. يجب إرجاع المخزن المؤقت الذي تعذّر معالجته إلى الإطار كما هو موضّح في الحالة 2. ولكن لا يجب أن تتّبع وحدات التخزين المؤقتة التي تعذّر عليها المعالجة الترتيب الصارم الذي تتّبعه وحدات التخزين المؤقتة الصالحة، وقد تكون خارج الترتيب بالنسبة إلى وحدات التخزين المؤقتة الصالحة. على سبيل المثال، إذا تم إرسال المخزن المؤقت أ و ب و ج و د و هـ، وتعذّر إرسال د و هـ، يكون ترتيب الإرجاع المقبول هو أ و هـ و ب و د و ج.
3.7 في حال عدم توفّر البيانات الوصفية بالكامل، يكفي استدعاء CAMERA3_MSG_ERROR_RESULT، ولا حاجة إلى استدعاء process_capture_result مع بيانات وصفية فارغة أو ما شابه.
- إذا تمّت الدعوة flush() أثناء دعوة process_capture_request() نشطة، من المفترض أن يعود طلب العملية هذا في أقرب وقت ممكن. بالإضافة إلى ذلك، إذا تمّت دعوة process_capture_request() بعد invocation flush() ولكن قبل flush() ، يجب التعامل مع طلب الالتقاط المقدَّم من خلال دعوة process_capture_request المتأخرة كطلب في انتظار المراجعة في الحالة رقم 2 أعلاه.
flush() يجب ألا يتم عرضها إلا عندما لا تتوفّر أيّ مخازن مؤقتة أو طلبات غير مكتملة في HAL. قد يستدعي إطار العمل configure_streams (لأنّ حالة HAL أصبحت الآن في وضع السكون) أو قد يُصدر طلبات جديدة.
يُرجى العِلم أنّه يكفي توفير حالات النتائج التي نجحت بالكامل أو تعذّر إكمالها بالكامل فقط. ومع ذلك، من المستحسن جدًا توفير حالات الفشل الجزئي أيضًا، لأنّ ذلك قد يساعد في تحسين الأداء العام لطلب الفلاش.
متطلبات الأداء:
من المفترض أن يعود HAL من هذا الطلب خلال 100 ملي ثانية، ويجب أن يعود من هذا الطلب خلال 1000 ملي ثانية. ويجب عدم حظر هذه المكالمة لفترة أطول من وقت استجابة قناة الإرسال (راجِع S7 لمعرفة التعريف).
معلومات الإصدار:
لا يتوفّر إلا إذا كان إصدار الجهاز >= CAMERA_DEVICE_API_VERSION_3_1.
القيم المعروضة:
0: عند إعادة تحميل طبقة HAL للكاميرا بنجاح
-EINVAL: إذا كان الإدخال بتنسيق غير صحيح (الجهاز غير صالح)
-ENODEV: إذا واجه جهاز الكاميرا خطأً خطيرًا بعد ظهور هذا الخطأ، يمكن للإطار فقط استدعاء طريقة close() بنجاح.
void(* get_metadata_vendor_tag_ops)(const struct camera3_device *, vendor_tag_query_ops_t *ops) |
get_metadata_vendor_tag_ops:
الحصول على طرق لطلب معلومات علامة البيانات الوصفية لإضافة المورّد يجب أن تملأ HAL جميع طرق تشغيل علامة المورّد، أو يجب عدم تغيير ops في حال عدم تحديد أي علامات مورّد.
يمكن العثور على تعريف vendor_tag_query_ops_t في system/media/camera/include/system/camera_metadata.h.
>= CAMERA_DEVICE_API_VERSION_3_2: تم إيقاف هذه الإصدار نهائيًا. تم إيقاف هذه الدالة نهائيًا ويجب ضبطها على NULL بواسطة HAL. يُرجى تنفيذ get_vendor_tag_ops فيملف header camera_common.h بدلاً من ذلك.
int(* initialize)(const struct camera3_device *, const camera3_callback_ops_t *callback_ops) |
initialize:
يتمّ إعدادها لمرة واحدة لتمرير مؤشرات دوالّ ردّ الاتصال في إطار العمل إلى HAL. سيتمّ استدعاؤها مرّة واحدة بعد طلب open() الناجح، قبل استدعاء أيّ دوالّ أخرى في بنية camera3_device_ops .
متطلبات الأداء:
يجب أن يكون هذا طلبًا غير حظر. من المفترض أن يعود HAL من هذه المكالمة خلال 5 مللي ثانية، ويجب أن يعود من هذه المكالمة خلال 10 مللي ثانية.
القيم المعروضة:
0: عند نجاح عملية الإعداد
-ENODEV: في حال تعذّر الإعداد بعد ذلك، يمكن للإطار العمل استدعاء close() فقط بنجاح.
int(* process_capture_request)(const struct camera3_device *, camera3_capture_request_t *request) |
process_capture_request:
أرسِل طلبًا جديدًا لالتقاط الصور إلى HAL. يجب ألا يعود HAL من هذه المكالمة إلى أن يصبح جاهزًا لقبول الطلب التالي لمعالجته. سيُجري إطار العمل مكالمة واحدة فقط في كل مرة إلى دالة process_capture_request() وستتم جميع المكالمات من سلسلة المحادثات نفسها. سيتم إجراء المكالمة التالية إلى process_capture_request() فور توفّر طلب جديد ووحدات التخزين المؤقت المرتبطة به. في سيناريو المعاينة العادي، يعني ذلك أنّ الإطار سيستدعي الدالة مرة أخرى على الفور تقريبًا.
تكون معالجة الطلب الفعلية غير متزامنة، حيث يعرض HAL نتائج الالتقاط من خلال طلب process_capture_result(). يتطلب هذا الطلب توفُّر البيانات الوصفية للنتيجة، ولكن قد توفّر وحدات تخزين الإخراج ببساطة حدود مزامنة للانتظار. من المتوقّع أن يتم إرسال طلبات متعددة في الوقت نفسه للحفاظ على معدّل عرض اللقطات الكامل.
يحتفظ إطار العمل بملكية بنية الطلب. ولا يمكن ضمان صلاحيته إلا خلال هذه المكالمة. يجب أن يُنشئ جهاز HAL نُسخًا من المعلومات التي يحتاج إلى الاحتفاظ بها لمعالجة عملية الالتقاط. يتولّى HAL الانتظار إلى أن تصبح حدود المخزونات المؤقتة مغلقة وإعادتها إلى إطار العمل.
يجب أن يكتب HAL وصف الملف لحاجز مزامنة تحرير وحدة تخزين مؤقتة للإدخال في input_buffer->release_fence، إذا لم يكن input_buffer فارغًا. إذا أرجع HAL القيمة -1 لحدود مزامنة تحرير مخزن الوسائط المؤقت للإدخال، يكون إطار العمل متاحًا لإعادة استخدام مخزن الوسائط المؤقت للإدخال على الفور. بخلاف ذلك، سينتظر إطار العمل على حدود المزامنة قبل إعادة ملء مخزن الوسائط المؤقت للدخل وإعادة استخدامه.
>= CAMERA_DEVICE_API_VERSION_3_2:
قد تكون وحدات تخزين المؤقت للدخل/الخرج التي يوفّرها إطار العمل في كل طلب جديدة تمامًا (لم يسبق أن رآها HAL).
اعتبارات الأداء:
يجب أن يكون التعامل مع ذاكرة التخزين المؤقت الجديدة خفيفًا جدًا، ويجب ألا يؤدي إلى حدوث أي انخفاض في عدد اللقطات في الثانية أو أي اهتزاز في اللقطات.
يجب أن يتم عرض هذا الطلب بسرعة كافية لضمان الحفاظ على معدّل اللقطات في الثانية المطلوب، خاصةً في حالات البث (يتم ضبط إعدادات جودة المعالجة اللاحقة على "سريع"). يجب أن يعرض HAL هذا الطلب في فاصل إطار واحد، ويجب أن يعرض الردّ على هذا الطلب في 4 فواصل إطارات.
القيم المعروضة:
0: عند بدء معالجة طلب الالتقاط بنجاح
-EINVAL: إذا كان الإدخال بتنسيق غير صحيح (الإعدادات هي NULL عندما لا يكون مسموحًا بها، ولا تتوفّر وحدات تخزين مؤقت للإخراج، وما إلى ذلك) ولا يمكن بدء معالجة الالتقاط. يجب معالجة حالات الفشل أثناء معالجة الطلب من خلال استدعاء camera3_callback_ops_t.notify() . في حال حدوث هذا الخطأ، سيحتفظ إطار العمل بمسؤولية حدود ذاكرة التخزين المؤقت للبث وعناصر تحكّم ذاكرة التخزين المؤقت، ويجب ألا يغلق HAL الحدود أو يعرض هذه المخازن المؤقتة باستخدام process_capture_result.
-ENODEV: إذا واجه جهاز الكاميرا خطأً خطيرًا بعد ظهور هذا الخطأ، يمكن للإطار فقط استدعاء طريقة close() بنجاح.
int(* register_stream_buffers)(const struct camera3_device *, const camera3_stream_buffer_set_t *buffer_set) |
register_stream_buffers:
>= CAMERA_DEVICE_API_VERSION_3_2:
متوقف لن يتمّ استدعاء هذا الإجراء ويجب ضبطه على NULL.
<= CAMERA_DEVICE_API_VERSION_3_1:
تسجيل المخازن المؤقتة لمصدر بيانات معيّن باستخدام جهاز HAL يستدعي إطار العمل هذه الطريقة بعد تحديد بث جديد من خلال configure_streams، وقبل تضمين وحدات التخزين المؤقت من هذا البث في طلب تسجيل. إذا تم إدراج البث نفسه في مكالمة configure_streams() لاحقة، لن يتم استدعاء register_stream_buffers مرة أخرى لهذا البث.
لا يحتاج إطار العمل إلى تسجيل وحدات التخزين المؤقت لجميع أحداث البث التي تم ضبطها قبل إرسال أول طلب لتسجيل المحتوى. يتيح ذلك بدء المعاينة بسرعة (أو حالات الاستخدام المشابهة) أثناء تخصيص أحداث البث الأخرى.
تهدف هذه الطريقة إلى السماح لجهاز HAL بربط أو إعداد وحدات التخزين المؤقت لاستخدامها لاحقًا. ستكون وحدات التخزين المؤقت التي تم تمريرها مقفلة للاستخدام. في نهاية المكالمة، يجب أن تكون جميع وحدات التخزين المؤقت جاهزة لإعادتها إلى البث. لا تكون وسيطة buffer_set صالحة إلا خلال مدة هذه المكالمة.
إذا تم ضبط تنسيق البث على HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED، من المفترض أن يتحقّق HAL للكاميرا من وحدات التخزين المؤقت التي تم تمريرها هنا لتحديد أي معلومات خاصة بالنظام الأساسي حول تنسيق البكسل.
متطلبات الأداء:
يجب أن يكون هذا طلبًا غير حظر. من المفترض أن يعود HAL من هذه المكالمة خلال 1 مللي ثانية، ويجب أن يعود من هذه المكالمة خلال 5 مللي ثانية.
القيم المعروضة:
0: عند تسجيل ذاكرات التخزين المؤقت الجديدة للبث بنجاح
-EINVAL: إذا لم تشير مجموعة stream_buffer_set إلى مصدر بيانات نشط صالح، أو إذا كانت صفيف المخزن المؤقت غير صالح.
-ENOMEM: إذا حدث خطأ في تسجيل المخزن المؤقت يجب أن يعتبر إطار العمل أنّ جميع ذاكرات التخزين المؤقت للبث غير مسجَّلة، ويمكنه محاولة التسجيل مرة أخرى لاحقًا.
-ENODEV: إذا حدث خطأ فادح ولم يعُد الجهاز قابلاً للتشغيل لا يمكن للإطار أن يستدعي close() بنجاح إلا بعد ظهور هذا الخطأ.
تم إنشاء مستندات هذه البنية من الملف التالي:
- hardware/libhardware/include/hardware/ camera3.h