يوضّح هذا المستند واجهات برمجة التطبيقات المتوافقة مع وحدة إضافة USB Video Class Unit (XU) تستخدمها أنظمة المؤتمرات في Google Meet لتفعيل ميزات الكاميرا الذكية. الغرض من إنشاء هذه المواصفات هو التأثير على الممارسات لتمكين هذه الميزات والسماح بقابلية التوسع غير المتزامنة والاختبار بشكل أفضل شركائنا.
للاطّلاع على تفاصيل حول آخر التغييرات التي تم إجراؤها على هذا المستند، يُرجى الانتقال إلى مقالة إصدار التطبيقات. الملاحظات.
منشأة اختبار
لمساعدة الشركاء في التأكّد من امتثالهم لهذه المواصفات، نقدّم اختبارًا
في أجهزة Chromebox للاجتماعات المحدّدة في
وضع مطوّر البرامج.
تفعيل
الكتابة إلى نظام الملفات.
أضف السطور التالية إلى
/etc/chrome_dev.conf
:
--enable-logging
--log-level=0
إعادة تشغيل الجهاز وتوصيل الكاميرا ووحدة USB
لوحة المفاتيح، والضغط على Ctrl-Alt-X
، وسيتم استيفاء مواصفات الكاميرا النشطة.
وتم تسجيله في /home/chronos/user/log/chrome
.
اصطلاحات قصيرة القامة
يعد USB معيارًا صغيرًا. في هذا المستند:
- الأرقام متعددة البايت تبدو كبيرة (ويتم نقلها إلى نطاق صغير).
- توجد صفائف البايت في تخطيط الذاكرة الصغيرة.
على سبيل المثال، 0x12345678
هو نفسه [0x78, 0x56, 0x34, 0x12]
.
المعرّف الفريد العام لوحدة الإضافة
وحدات الإضافات التي تتوافق مع مواصفات عنصر تحكُّم Meet XU هذه يجب استخدام المعرّف الفريد العالمي هذا.
وحدة الإضافات | GUID |
---|---|
التحكّم في الأجهزة الملحقة XU | {74D7E924-49C9-4A45-98A3-8A9F60061E83} |
أدوات اختيار XU للتحكّم في الأجهزة الملحقة
هذه هي أدوات اختيار XU للتحكم في الأجهزة الملحقة المحددة.
أدوات اختيار عناصر التحكّم | القيمة |
---|---|
GOOGXU_FRAME_STRATEGY |
0x01 |
GOOGXU_REFRAME |
0x02 |
GOOGXU_OCCUPANCY_COUNTING_TOGGLE |
0x03 |
GOOGXU_OCCUPANCY_COUNTING_READ |
0×04 |
GOOGXU_STATUS_INFO |
0x05 |
GOOGXU_STATUS_RESET |
0×06 |
GOOGXU_PRESETS |
0×07 |
GOOGXU_PAN_TILT_ABSOLUTE |
0×08 |
GOOGXU_PAN_TILT_RELATIVE |
0x09 |
نوع طلب التحكّم
يتم تعريف أنواع طلبات التحكم في الفصل الرابع: الطلبات الخاصة بفئة فئة UVC 1.5 المواصفات:
العملية | التحكم في الأشعة فوق البنفسجية |
---|---|
GET |
GET_CUR وGET_MIN وGET_MAX وGET_RES وGET_LEN وGET_INFO وGET_DEF |
SET |
SET_CUR |
أوضاع الكاميرا
تُستخدَم أوضاع الكاميرا لتصوير الأفراد في غرفة اجتماعات، وهي "tuple
"
of:
- الإستراتيجية (عرض الكاميرا)
- الانحياز (المتحدث أو الغرفة)
- الخلاصات (أحداث بث فردية أو عدّة مجموعات)
يمكن أن تأخذ كلّ سمة القيم الموضّحة في الأقسام التالية.
استراتيجية التعديل التلقائي لإطار الفيديو
الميزة | الوصف |
---|---|
لا ينطبق | توقِف الكاميرا جميع ميزات ضبط الإطارات الذكية وتسمح للعميل بالتحكّم بحرية في قيم PTZ. ملاحظة: عند ضبط استراتيجية ضبط الإطار هذه، ستظل الكاميرا في موضعها الحالي: التحريك والإمالة والتكبير/التصغير. |
التأطير المستمر (CAZ) | استنادًا إلى انحياز الإطارات، تتتبّع الكاميرا باستمرار الأشخاص في الغرفة. ملاحظة: يتم إيقاف PTZ في هذا الوضع. |
تقسيم الإطارات | تنشئ الكاميرا العدد المطلوب من مرات مشاهدة الفيديو. استنادًا إلى خيار استخدام الإطارات التلقائية للخلاصات، يمكن أن يتم إنشاء هذه الخلاصات في أقسام في بث واحد أو إنشاء أحداث بث فيديو منفصلة لكل مشاهدة. ملاحظة: يتم إيقاف PTZ في هذا الوضع. |
العرض الديناميكي | تحاول كاميرا واحدة أو أكثر تقديم أفضل رؤية للغرفة. قد يقرر ما إذا كان سيتم إنشاء عدة خلاصات في خلاصة واحدة أو تقديم تقرير "مثير للاهتمام" للغرفة الحالية. الغرض من هذا العرض هو توفير رؤية أكثر إنصافًا للمشاركين داخل الغرفة في المكالمة. ملاحظات:
|
انحياز الإطار التلقائي
الميزة | الوصف |
---|---|
مقدم عروض عالية المخاطر (تتبع المتحدث) | تحاول الكاميرا تصوير الشخص الذي يتحدث بنشاط في الغرفة بأفضل شكل. في هذا السيناريو، يجب أن تتحيّز الكاميرا نحو مقدِّم العرض. على سبيل المثال، الرئيس التنفيذي في قاعة اجتماعات يقدم عرضًا تقديميًا. |
التعاون (تتبُّع الغرفة) |
تحاول الكاميرا تصوير جميع المشاركين في الغرفة بأفضل شكل. في هذا السيناريو، يجب أن تتعامل الكاميرا مع كل مشارك بإنصاف. يجب أن تستخدم معظم الاجتماعات هذه الإستراتيجية. |
ضبط الإطار التلقائي للخلاصات
الميزة | الوصف |
---|---|
بث واحد | ترسل الكاميرا بث فيديو واحدًا إلى الجهاز المضيف. |
البث المتعدد (قيد العمل) |
تقسّم الكاميرا البث المباشر وتنشئ مجموعات بث فيديو متعددة لإرسالها إلى المضيف. ملاحظة: المواصفات الكاملة والسلوك المتوقَّع لهذه الميزة في انتظار المراجعة وغير متاحة حتى النُسخ اللاحقة من هذا المستند. |
قيم الصور النقطية في وضع التعديل التلقائي لإطار الفيديو
باستثناء الحالة التلقائية None
التي يتم تمثيلها ببايت فارغ
صفيفة، فإن كل بت في صفيفة البايت يمثل وضع كاميرا مختلف وهو
تركيبة محدَّدة من استراتيجية ضبط الإطار التلقائي والتعديل التلقائي لإطار الفيديو
التحيز، وخلاصات التعديل التلقائي لإطار الفيديو.
فهرس البت | CAZ | إطار مقسَّم | ديناميكية | - |
---|---|---|---|---|
مكبّرات الصوت | اليوم الأول - |
- - |
ي 5 د6 |
بث واحد بث متعدد |
الغرفة | اليوم الثاني - |
D3 D4 |
اليوم 7 D8 |
بث واحد بث متعدد |
أوضاع اللقطات | قيمة وضع الإطار (البايت الأقل أهمية) |
---|---|
None |
0×00 |
CAZ, Speaker, Single-Stream |
0x01 |
CAZ, Room, Single-Stream |
0x02 |
Split-Frame, Room, Single-Stream |
0×04 |
Split-Frame, Room, Multi-Stream |
0×08 |
Dynamic, Speaker, Single-Stream |
0x10 |
Dynamic, Speaker, Multi-Stream |
0x20 |
Dynamic, Room, Single-Stream |
0x40 |
Dynamic, Room, Multi-Stream |
0×80 |
مجموعة التحكّم: GOOGXU_FRAME_STRATEGY
يُستخدَم عنصر التحكّم هذا لضبط أوضاع ضبط إطارات الكاميرا أو ضبطها كما هو موضَّح في.
قيم الصور النقطية في وضع التعديل التلقائي لإطار الفيديو: يتم تمثيل كل وضع على أنه
قليلاً في الصورة النقطية الخاصة بها. يعرض الأمر GET_RES
رسالة بطول 8 بايت
قناع بت بقيمة صفر (0) أو واحد (1) على التوالي للإشارة إلى ما إذا كانت
غير متوافق أو متوافقة مع الجهاز. على سبيل المثال، إذا كانت الكاميرا
يتوافق مع CAZ, Speaker, Single-Stream
وSplit-Frame, Room, Single-Stream
Dynamic, Room, Multi-Stream
ولكن ليس هناك أوضاع أخرى، عند ذلك يجب عرض GET_RES
0x000000000000000085 (أي 0b10000101
متبوعة بسبعة بايت)
يُستخدَم الأمر SET_CUR
لإرسال صور نقطية لإخبار الكاميرا
وضع الكاميرا الفردي المطلوب تفعيله.
أداة اختيار عناصر التحكّم | 1 | |||
---|---|---|---|---|
العملية | GET / SET |
|||
wLength |
8 | |||
إزاحة | الحقل | حجم الملف | القيمة | الوصف |
0 | bActiveMode |
8 | صورة نقطية | ضبط "وضع الكاميرا" النشط أو الرجوع إليه |
ملاحظات:
|
في ما يلي سلوك أنواع الطلبات المتوافقة:
إزاحة | 0 | الوصف |
---|---|---|
GET_CUR |
تفعيل وضع "استخدام الإطار" النشط في الكاميرا | |
GET_MIN |
يعتمد على الكاميرا | |
GET_MAX |
يعتمد على الكاميرا | |
GET_RES |
تعرض قناع بت طويل بحجم 8 بايت من أوضاع الكاميرا المتوافقة | |
GET_LEN |
0×0008 | الطول |
GET_INFO |
0x0B | التحديث التلقائي / كتابة / قراءة |
GET_DEF |
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 |
القيمة التلقائية |
SET_CUR |
ضبط وضع "كاميرا الإطار" النشطة |
مجموعة التحكّم: GOOGXU_REFRAME
يُستخدَم عنصر التحكّم هذا لتشغيل ميزة "التأطير بنقرة واحدة"، والمعروفة أيضًا باسم OTAZ. عند نقل OTAZ تظهر زاوية رؤية الكاميرا لأفضل عرض للغرفة. بعد ذلك، يستعيد العميل القدرة على التحكم في قيم PTZ. إذا كان ضبط الإطار بلقطة واحدة غير متوافق، فلن تحدد الكاميرا عنصر التحكم هذا.
أداة اختيار عناصر التحكّم | 2 | |||
---|---|---|---|---|
العملية | SET |
|||
wLength |
1 | |||
إزاحة | الحقل | حجم الملف | القيمة | الوصف |
0 | bReframe |
1 | العدد | 0x01 تنفيذ طلب تغيير الإطار |
في ما يلي سلوك أنواع الطلبات المتوافقة:
إزاحة | 0 | الوصف |
---|---|---|
GET_MIN |
0×00 | |
GET_MAX |
0x01 | |
GET_RES |
0x01 | |
GET_LEN |
0×0001 | |
GET_INFO |
0x02 | للكتابة فقط |
GET_DEF |
0×00 | |
SET_CUR |
ضبط طلب لاستخدام الإطار بلقطة واحدة |
احتساب الإشغال
احتساب الإشغال (OC) هو ميزة تُستخدم لتقدير عدد المشاركين في غرفة اجتماعات، على الرغم من اقتصاص الكاميرا.
يوضح هذا الجدول السلوك المتوقع لعناصر التحكم في OC وتفاعلها مع بث الفيديو عبر الكاميرا ومؤشر LED للكاميرا.
عندما يكون احتساب الإشغال | & بث فيديو الكاميرا هو: | ينبغي أن يكون مؤشر LED للكاميرا | يجب أن يكون GOOGXU_OCCUPANCY_COUNTING_TOGGLE GET_CUR |
يجب أن يكون GOOGXU_OCCUPANCY_COUNTING_READ GET_CUR |
---|---|---|---|---|
مفعّل | لا يتم بثها أو كتم صوتها | مفعّل | 0x01 |
عدد الأشخاص في مجال رؤية الكاميرا الكامل. |
مفعّل | البث | مفعّل | 0x01 |
عدد الأشخاص في مجال رؤية الكاميرا الكامل. |
مفعّل | كتم الصوت | إيقاف | 0x01 |
غير مفعّل |
غير مفعّل | لا يتم بثها أو كتم صوتها | إيقاف | 0x00 |
غير مفعّل |
غير مفعّل | البث | مفعّل | 0x00 |
غير مفعّل |
غير مفعّل | كتم الصوت | إيقاف | 0x00 |
غير مفعّل |
مجموعة التحكّم: GOOGXU_OCCUPANCY_COUNTING_TOGGLE
يُستخدَم عنصر التحكّم هذا لتفعيل الميزة أو إيقافها لاحتساب عدد النزلاء في غُرفة. يؤدي تعيين قيمة صفر (0) إلى إيقاف هذه الميزة وواحد (1) يمكّن ذلك الجديدة. وإذا لم تكن هذه الميزة متاحة، يجب ألا تحدِّد الكاميرا ذلك. والتحكم المستمر.
أداة اختيار عناصر التحكّم | 3 | |||
---|---|---|---|---|
العملية | GET / SET |
|||
wLength |
1 | |||
إزاحة | الحقل | حجم الملف | القيمة | الوصف |
0 | bOccupancy |
1 | منطقي | ضبط وظيفة احتساب معدّل الإشغال 0x00 إيقاف الوظيفة 0x01 تفعيل الوظيفة |
في ما يلي سلوك أنواع الطلبات المتوافقة:
إزاحة | 0 | الوصف |
---|---|---|
GET_CUR |
الرجوع إذا تم تفعيل احتساب معدّل الإشغال | |
GET_MIN |
0×00 | |
GET_MAX |
0x01 | |
GET_RES |
0x01 | |
GET_LEN |
0×0001 | |
GET_INFO |
0x0B | التحديث التلقائي / كتابة / قراءة |
GET_DEF |
0×00 | |
SET_CUR |
تفعيل ميزة احتساب عدد الإشغال أو إيقافها |
مجموعة التحكّم: GOOGXU_OCCUPANCY_COUNTING_READ
يُستخدَم عنصر التحكّم هذا لقراءة عدد المشاركين في غرفة تم الإبلاغ عنها من خلال الكاميرا عندما يكون احتساب معدّل الإشغال مفعّلاً. عندما يتم احتساب الإشغال غير مفعّل، يجب أن توقف الكاميرا عنصر التحكم هذا. في حال لم يتم احتساب عدد الإشغال مدعومًا، فلن تحدد الكاميرا عنصر التحكم هذا.
أداة اختيار عناصر التحكّم | 4 | |||
---|---|---|---|---|
العملية | GET |
|||
wLength |
2 | |||
إزاحة | الحقل | حجم الملف | القيمة | الوصف |
0 | bNumPeople |
2 | العدد | عدد الركّاب الذين تم رصدهم في العرض. (للقراءة فقط) |
في ما يلي سلوك أنواع الطلبات المتوافقة:
إزاحة | 0 | الوصف |
---|---|---|
GET_CUR |
عدد النزلاء الذين تم رصدهم | |
GET_MIN |
0×0000 | |
GET_MAX |
0x00FF | |
GET_RES |
0×0001 | |
GET_LEN |
0×0002 | |
GET_INFO |
0x09 | التحديث التلقائي / القراءة |
GET_DEF |
0×0000 |
قياس الأجهزة عن بُعد التشخيصات
تهدف عناصر التحكم هذه إلى تشجيع ممارسات تصحيح الأخطاء بشكل أفضل باستخدام لا يكون جهاز Meet عادةً موجَّهًا للمستخدمين.
مجموعة التحكّم: GOOGXU_STATUS_INFO
يُستخدَم عنصر التحكّم هذا لطلب البحث عن معلومات من الكاميرا المضيفة لمشاركتها. الشركاء لتصحيح الأخطاء.
أداة اختيار عناصر التحكّم | 5 | |||
---|---|---|---|---|
العملية | GET |
|||
wLength |
8 | |||
إزاحة | الحقل | حجم الملف | القيمة | الوصف |
0 | bNumCameras |
1 | العدد | عدد الأقمار الصناعية الإضافية المتصلة بالكاميرا الرئيسية والتي قد تؤثّر في بث الكاميرا العائد إلى المضيف. |
1 | bIsMoving |
1 | صورة نقطية | 0 عندما تكون الكاميرا في وضع عدم النشاط، وغير صفرية عند تغيير قيم PTZ. يمكن للبائعين تعيين محاور أو محركات مختلفة إلى وحدات بت مختلفة. |
2 | Undef |
6 | إلغاء تحديد | ليتم التمديد لها في المستقبل. |
في ما يلي سلوك أنواع الطلبات المتوافقة:
إزاحة | 0 | 1 | 2 | الوصف |
---|---|---|---|---|
GET_MIN |
0×00 | 0×00 | 0x00 0x00 0x00 0x00 0x00 0x00 |
|
GET_MAX |
0xFF | 0xFF | 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF |
|
GET_RES |
0x01 | 0x01 | 0x01 0x00 0x00 0x00 0x00 0x00 |
|
GET_LEN |
0×08 | 0×00 | 0×0008 | |
GET_INFO |
0x09 | التحديث التلقائي / القراءة | ||
GET_DEF |
0×00 | 0×00 | 0x00 0x00 0x00 0x00 0x00 0x00 |
مجموعة التحكّم: GOOGXU_STATUS_RESET
يُستخدَم عنصر التحكّم هذا لإصدار طلب إعادة ضبط للكاميرا. إن تعيين قيمة واحد (1) يطلب إعادة ضبط الكاميرا. تعرض الكاميرا صفرًا (0) إذا لم يكن هناك أي طلب لإعادة تشغيل الكاميرا منذ آخر إعادة ضبط، وهناك طلب واحد (1) إذا تمت إعادة الضبط. يجب أن تؤدي إعادة الضبط إلى إعادة تشغيل الكاميرا. (هذا مطلوب الأجهزة ذاتية التشغيل حيث لا يمكن فرض فصل USB لمحاكاة مقبس كهربائي useful.)
أداة اختيار عناصر التحكّم | 6 | |||
---|---|---|---|---|
العملية | GET / SET |
|||
wLength |
1 | |||
إزاحة | الحقل | حجم الملف | القيمة | الوصف |
0 | bResetRequest |
1 | منطقي | إرسال طلب إعادة ضبط إلى المضيف والكاميرات المتصلة يعرض 0x01 إذا صدر طلب إعادة الضبط منذ آخر إعادة ضبط، وإلا 0x00. |
في ما يلي سلوك أنواع الطلبات المتوافقة:
إزاحة | 0 | الوصف |
---|---|---|
GET_MIN |
0×00 | |
GET_MAX |
0x01 | |
GET_RES |
0x01 | |
GET_LEN |
0×0001 | |
GET_INFO |
0x03 | كتابة / قراءة |
GET_DEF |
0×00 |
الإعدادات المسبقة لـ PTZ
يتم استخدامه لضبط مجال رؤية الكاميرا واستعادته إلى موضع معيّن مسبقًا.
مجموعة التحكّم: GOOGXU_PRESETS
يُستخدم عنصر التحكم هذا لضبط قيم العرض الشامل والإمالة والتكبير/التصغير (PTZ) في الكاميرا على الإعداد المسبق.
يتم استخدام Preset Action
لتوضيح الإجراء المقصود من الأمر. الإعداد
تُستخدم قيمة واحد (1) لتعيين قيم التحريك والإمالة والتكبير/التصغير الحالية
الذي قدم فهرسًا مُعدًا مسبقًا. إن تعيين القيمة اثنين (2) يجب أن يؤدي إلى نقل التحريك،
إمالة الكاميرا وتكبيرها/تصغيرها وفقًا للقيم التي تم ربطها سابقًا
أو إحداثيات المصنع الافتراضية (إذا لم يتم تعيينها مسبقًا). إعداد
تؤدي القيمة ثلاثة (3) إلى إعادة ضبط الفهرس على إحداثيات المصنع التلقائية.
ويُستخدَم Preset Index
لتحديد إحداثيات PTZ التي تم ربطها بالفهرس.
تم ربط القيمة Preset index
التي تبلغ صفر (0) بإحداثيات المنزل ويجب أن تكون
الوضع التلقائي للكاميرا عند التنشيط عند ضبط GOOGXU_FRAME_STRATEGY
على
NONE
أداة اختيار عناصر التحكّم | 7 | |||
---|---|---|---|---|
العملية | SET |
|||
wLength |
2 | |||
إزاحة | الحقل | حجم الملف | القيمة | الوصف |
0 | bPresetAction |
1 | العدد | 0x01: حفظ الإعداد المسبق 0x02: استعادة الإعداد المسبق 0x03: إعادة ضبط الإعداد المسبق على الإعداد التلقائي. (ينبغي أن تكون القيمة الافتراضية إحداثيًا صالحًا للإعداد المسبق.) |
1 | bPresetIndex |
1 | العدد | فهرس الإعداد المسبق النشط. 0~N-1 حيث يكون 0 هو الموضع التلقائي لبدء الكاميرا، ويكون N-1 ثابتًا يحدّده المورّد لعدد من الإعدادات المسبقة. |
في ما يلي سلوك أنواع الطلبات المتوافقة:
إزاحة | 0 | 1 | الوصف |
---|---|---|---|
GET_MIN |
0×00 | 0×00 | |
GET_MAX |
0x03 | N-1 | لا يمكن ضبط الإعدادات المسبقة لـ N كحد أقصى |
GET_RES |
0x01 | 0x01 | |
GET_LEN |
0x02 | 0×00 | 0×0002 |
GET_INFO |
0x02 | للكتابة فقط | |
GET_DEF |
0×00 | 0×00 |
تصوير سينمائي و ربط التطبيقات الإضافية للإمالة
تحتوي بعض الكاميرات على مكونات خاصة، مثل محركات الكاميرات الميكانيكية، أو PTZ الرقمية. لذلك، استخدم عناصر التحكم القياسية V4L2 للتحريك، والإمالة والتكبير/التصغير.
مجموعة التحكّم: GOOGXU_PAN_TILT_ABSOLUTE
(متوقّف نهائيًا)
يتم تعريف عناصر التحكم في التعيين الإضافي للتحريك والإمالة في الفصل 4: خاص بالفئة الطلبات في الفقرة 4.2.2.1.14 التحكم المطلق (المطلق) في فئة UVC 1.5 المواصفات:
مجموعة التحكّم: GOOGXU_PAN_TILT_RELATIVE
(متوقّف نهائيًا)
يتم تعريف عناصر التحكم في التعيين الإضافي للتحريك والإمالة في الفصل 4: خاص بالفئة طلبات الفقرة 4.2.2.1.15 التحكّم النسبي في فئة UVC 1.5 المواصفات:
مواضيع ذات صلة
- فئة فيديو USB (UVC) في نظام التشغيل Linux برنامج التشغيل
- مستند الإصدار 1.5 من فئة الفيديو ضبط
- منفذ USB 2.0 والمواصفات
- المساعدة بشأن أجهزة Google Meet الأوسط
- قسم "أجهزة Google Meet" ضمن قسم "مساعدة مشرف Google Workspace" الأوسط
ملاحظات الإصدار
تعكس ملاحظات الإصدار هذه التحسينات والميزات الجديدة في كل مراجعة هذا المستند.
21 مايو 2024
- تمت إزالة النص البرمجي للاختبار لصالح منشأة اختبار "إدارة علاقات العملاء" الجديدة،
الذي يتدرب
SET
ويدعم أيضًا التحقق من صحة كاميرات Series One. - تم توضيح الحقول في
GOOGXU_STATUS_INFO
- توضيح سلوك
GOOGXU_STATUS_RESET
- منهي العمل به
GOOGXU_PAN_TILT_ABSOLUTE
أوGOOGXU_PAN_TILT_RELATIVE
15 تشرين الثاني (نوفمبر) 2023
تم تعديل النص البرمجي للاختبار للتحقّق من أوضاع الإطارات الصالحة وتفسيرها. البايت الواضح والتمثيليات.
21 تموز (يوليو) 2023
تمت إضافة نص برمجي تجريبي للشركاء للتحقّق من صحة عمليات التنفيذ من أجل الامتثال إلى هذه المواصفات.
25 أيار (مايو) 2023
تم التصحيح
GOOGXU_PRESETS
ملاحظة حول عدد الإعدادات المسبقة. يجب أن يكون N-1 وليس N-1.
17 نيسان (أبريل) 2023
الإصدار الأولي.