SDV Media: إدارة الإعلانات الصورية

تعرض SDV Media الشاشات المتاحة لتطبيقات OEM باستخدام Linux DRM API.

التفاعل بين مكونات إدارة الحقوق الرقمية

  • Framebuffer هو مصدر بيانات البكسل، ويستند إلى بعض مخازن الذاكرة التي تم تخصيصها خارجيًا.

  • Plane هو مصدر صورة تستخدمه CRTC. وهو مرتبط بـ framebuffer، وقد يمثّل عرضًا تم اقتصاصه من framebuffer.

  • CRTC يمثّل مسار عرض عامًا. وقد يجمع بين عدة مستويات لإنشاء ناتج الفيديو النهائي، وإرسال الناتج إلى عدة برامج ترميز.

  • يحوّل برنامج الترميز ناتج الفيديو من CRTC إلى نموذج مناسب لموصّل معيّن.

  • يمثّل الموصّل موصّل عرض متاحًا. على سبيل المثال، منفذ HDMI.

لمزيد من الوصف التفصيلي، يُرجى الرجوع إلى:

واجهة برمجة التطبيقات

توفّر SDV Media واجهات Linux DRM. على الرغم من إمكانية استخدامها مباشرةً باستخدام استدعاء النظام ioctl، ننصحك باستخدام مكتبة مساعِدة لمساحة المستخدِم لتطوير التطبيقات. على سبيل المثال:

  • drm-rs حزمة لـ Rust (ننصحك بها)
  • libdrm لـ C/C++‎: توفّر drm-kms صفحة دليل نظرة عامة شاملة على واجهات برمجة التطبيقات واستخدامها.

إعداد العرض على شاشة واحدة

  1. افتح جهاز DRM (/dev/dri/card*) واستخدِم واجهات Linux DRM API (على سبيل المثال، من خلال libdrm) على واصف الملف لاختيار الشاشة ووضعها.

    عادةً، لن يعرض نظام المضيف سوى جهاز وحدة معالجة رسومات افتراضية واحدة، والتي ستظهر على شكل /dev/dri/card0.

  2. خصِّص مخازن مؤقتة أمامية وخلفية باستخدام Linux DRM API.

    ننصحك باستخدام minigbm's gbm_bo_create() والحصول على واصف ملف DMA-BUF باستخدام gbm_bo_get_fd().

  3. أنشئ مخازن مؤقتة لبرنامج OpenGL تستند إلى المخازن المؤقتة التي تم تخصيصها.

    1. أنشئ EGLImage من مخزن DRM باستخدام eglCreateImageKHR مع EGL_LINUX_DMA_BUF_EXT (من EGL_EXT_image_dma_buf_import الإضافة).

    2. أنشئ مادة عرض GL واستخدِم glEGLImageTargetTexture2DOES (من GL_OES_EGL_image الإضافة) لضبط مساحة تخزين مادة العرض على الـ EGLImage من الخطوة السابقة.

    3. أنشئ مخزنًا مؤقتًا لبرنامج OpenGL واستخدِم glFramebufferTexture2D لضبط مادته الأساسية على مادة العرض التي تم إنشاؤها في الخطوة السابقة.

  4. لعرض إطار:

    1. اربط أحد المخازن المؤقتة لبرنامج OpenGL التي تم إنشاؤها.

    2. ارسم إطارًا باستخدام واجهات GLES API العادية.

    3. اعرض الإطار على شاشة: استخدِم Linux DRM API (drmModeAtomicCommit()) لإرسال DRM_MODE_PAGE_FLIP_EVENT مع واصف ملف DMA-BUF الذي يستخدمه المخزن المؤقت لبرنامج OpenGL المرتبط.

إنشاء ناتج الفيديو من طبقات متعددة

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

لمزيد من التفاصيل، يُرجى الاطّلاع على مقالة إعداد العرض على شاشات متعددة.

إعداد العرض على شاشات متعددة

  1. افتح جهاز DRM‏ /dev/dri/card* كما في مسار العرض على شاشة واحدة.

  2. اعرض موصّلات الشاشة المتاحة.

    يتم عرض كل شاشة كموصّل DRM منفصل لجهاز DRM.

  3. لكل موصّل شاشة:

    1. اختَر CRTC متوافقًا مع الموصّل. يحتوي كل موصّل على قائمة ببرامج الترميز المتاحة، ويشير كل برنامج ترميز إلى CRTC التي يمكن استخدامه معها. سيكون هناك دائمًا CRTC واحد على الأقل متوافق.

      1. اختَر مستوى متوافقًا مع CRTC.

      2. أنشئ مخازن مؤقتة لبرنامج OpenGL تستند إلى مخازن مؤقتة لوحدة معالجة الرسومات. تبدو هذه العملية مماثلة للعملية في مسار العرض على شاشة واحدة.

      3. اربط المستوى وCRTC والموصّل، واضبط وضع الفيديو على CRTC.

        يمكنك ضبط وضع شاشات متعددة في الوقت نفسه باستخدام واجهة برمجة التطبيقات الذرية لضبط خصائص DRM التالية لكل موصّل وCRTC ومجموعة مستويات.

    القائمة الكاملة بالخصائص الضرورية:

    الهدف الخاصية النوع الوصف
    موصل CRTC_ID رقم تعريف CRTC رقم تعريف CRTC المطلوب تعيينه للموصّل
    CRTC MODE_ID رقم تعريف blob رقم تعريف blob خاصية تم إنشاؤه باستخدام drmModeCreatePropertyBlob، ويحتوي على بنية drmModeModeInfo لوضع الفيديو المحدّد
    CRTC ACTIVE قيمة منطقية (Bool) true لوضع علامة "نشط" على CRTC
    مستوى FB_ID رقم تعريف المخزن المؤقت لبرنامج OpenGL رقم تعريف المخزن المؤقت لبرنامج OpenGL الذي سيتم عرضه على الشاشة
    مستوى SRC_X بكسل الإحداثي X لمستطيل صورة مصدر المخزن المؤقت لبرنامج OpenGL
    مستوى SRC_Y بكسل الإحداثي Y لمستطيل صورة مصدر المخزن المؤقت لبرنامج OpenGL
    مستوى SRC_W نقطة ثابتة 16.16 عرض مستطيل صورة مصدر المخزن المؤقت لبرنامج OpenGL (بكسل تم إزاحتها إلى اليسار بمقدار 16 بت)
    مستوى SRC_H نقطة ثابتة 16.16 ارتفاع مستطيل صورة مصدر المخزن المؤقت لبرنامج OpenGL (بكسل تم إزاحتها إلى اليسار بمقدار 16 بت)
    مستوى CRTC_X بكسل الإحداثي X لمستطيل صورة وجهة CRTC
    مستوى CRTC_Y بكسل الإحداثي Y لمستطيل صورة وجهة CRTC
    مستوى CRTC_W بكسل عرض مستطيل صورة وجهة CRTC
    مستوى CRTC_H بكسل ارتفاع مستطيل صورة وجهة CRTC
  4. ابدأ حلقة العرض:

    1. انتظِر حدث قلب الصفحة على CRTC قبل عرض الإطار التالي.

    2. اعرض إطارًا واعرضه على الشاشة من خلال جدولة قلب صفحة لـ CRTC والمخزن المؤقت لبرنامج OpenGL المحدّدَين.