এসডিভি মিডিয়া: ডিসপ্লে পরিচালনা করুন

এসডিভি মিডিয়া লিনাক্স ডিআরএম এপিআই ব্যবহার করে ওইএম অ্যাপের কাছে উপলব্ধ ডিসপ্লেগুলো উন্মোচন করে।

ডিআরএম উপাদানগুলির মধ্যে মিথস্ক্রিয়া

চিত্র ১. ডিআরএম উপাদানসমূহের পারস্পরিক ক্রিয়া।

  • ফ্রেমবাফার হলো পিক্সেল ডেটার একটি উৎস, যা বাহ্যিকভাবে বরাদ্দকৃত কোনো মেমরি বাফার দ্বারা সমর্থিত থাকে।

  • প্লেন হলো CRTC দ্বারা ব্যবহৃত একটি ইমেজ সোর্স। এটি একটি ফ্রেমবাফারের সাথে যুক্ত থাকে এবং ফ্রেমবাফারটির একটি ক্রপ করা ভিউ উপস্থাপন করতে পারে।

  • CRTC একটি সামগ্রিক ডিসপ্লে পাইপলাইনকে নির্দেশ করে। এটি চূড়ান্ত ভিডিও আউটপুট তৈরি করতে একাধিক প্লেনকে একত্রিত করতে পারে এবং সেই আউটপুট একাধিক এনকোডারে প্রেরণ করতে পারে।

  • একটি এনকোডার CRTC থেকে প্রাপ্ত ভিডিও আউটপুটকে নির্দিষ্ট কানেক্টরের জন্য উপযুক্ত রূপে রূপান্তর করে।

  • কানেক্টর বলতে একটি উপলব্ধ ডিসপ্লে কানেক্টরকে বোঝায়। উদাহরণস্বরূপ, একটি HDMI পোর্ট।

আরও বিশদ বিবরণের জন্য, দেখুন:

এপিআই পৃষ্ঠ

এসডিভি মিডিয়া লিনাক্স ডিআরএম ইন্টারফেসগুলো সরবরাহ করে। যদিও এগুলো ioctl সিস্টেম কল ব্যবহার করে সরাসরি ব্যবহার করা যায়, অ্যাপ্লিকেশন ডেভেলপমেন্টের জন্য একটি ইউজারস্পেস হেল্পার লাইব্রেরি ব্যবহার করার পরামর্শ দেওয়া হয়। উদাহরণস্বরূপ:

  • রাস্টের জন্য drm-rs ক্রেট (প্রস্তাবিত),
  • C/C++ এর জন্য libdrmdrm-kms ম্যান পেজটিতে API এবং তাদের ব্যবহার সম্পর্কে একটি বিশদ বিবরণ দেওয়া আছে।

একটিমাত্র ডিসপ্লেতে রেন্ডারিং সেট আপ করুন

  1. একটি DRM ডিভাইস ( /dev/dri/card* ) খুলুন এবং এর ফাইল ডেসক্রিপ্টরে Linux DRM API, যেমন libdrm মাধ্যমে, ব্যবহার করে ডিসপ্লে এবং এর মোড নির্বাচন করুন।

    সাধারণত, হোস্ট সিস্টেম কেবল একটি ভার্চুয়াল জিপিইউ ডিভাইস প্রকাশ করে, যা /dev/dri/card0 হিসাবে দেখা যায়।

  2. লিনাক্স ডিআরএম এপিআই ব্যবহার করে ফ্রন্ট ও ব্যাক বাফার বরাদ্দ করুন।

    minigbm এর gbm_bo_create() ব্যবহার করার এবং gbm_bo_get_fd() দিয়ে DMA-BUF ফাইল ডেসক্রিপ্টরটি পাওয়ার পরামর্শ দেওয়া হয়।

  3. বরাদ্দকৃত বাফার দ্বারা সমর্থিত জিএল ফ্রেমবাফার তৈরি করুন।

    1. EGL_LINUX_DMA_BUF_EXT ( EGL_EXT_image_dma_buf_import এক্সটেনশন থেকে) ব্যবহার করে eglCreateImageKHR কমান্ডের মাধ্যমে DRM বাফার থেকে একটি EGLImage তৈরি করুন।

    2. একটি GL টেক্সচার তৈরি করুন এবং পূর্ববর্তী ধাপের EGLImage এ টেক্সচারটির স্টোরেজ সেট করতে glEGLImageTargetTexture2DOES ( GL_OES_EGL_image এক্সটেনশন থেকে) ব্যবহার করুন।

    3. একটি GL ফ্রেমবাফার তৈরি করুন এবং glFramebufferTexture2D ব্যবহার করে এর ব্যাকিং টেক্সচারটিকে পূর্ববর্তী ধাপে তৈরি করা টেক্সচারটিতে সেট করুন।

  4. একটি ফ্রেম রেন্ডার করতে:

    1. তৈরি করা জিএল ফ্রেমবাফারগুলোর মধ্যে একটি বাইন্ড করুন।

    2. সাধারণ GLES API ব্যবহার করে একটি ফ্রেম আঁকুন।

    3. স্ক্রিনে ফ্রেমটি প্রদর্শন করতে: বাউন্ড জিএল ফ্রেমবাফার দ্বারা ব্যবহৃত ডিএমএ-বিইউএফ ফাইল ডেসক্রিপ্টর সহ একটি DRM_MODE_PAGE_FLIP_EVENT পাঠাতে লিনাক্স ডিআরএম এপিআই ( drmModeAtomicCommit() ) ব্যবহার করুন।

একাধিক স্তর থেকে ভিডিও আউটপুট তৈরি করুন

হার্ডওয়্যার অ্যাক্সিলারেটেড মাল্টি-লেয়ার (মাল্টি-প্লেন) কম্পোজিশনের জন্য, আমরা হোস্ট সিস্টেমের উপর নির্ভর করি যা প্রতিটি লেয়ারকে একটি পৃথক ডিআরএম কানেক্টর (ভার্চুয়াল ডিসপ্লে) হিসাবে প্রকাশ করে এবং সেগুলোকে সঠিক হার্ডওয়্যার লোকেশন / পাইপলাইনে ম্যাপ করে।

বিস্তারিত জানতে একাধিক ডিসপ্লেতে রেন্ডারিং সেটআপ দেখুন।

একাধিক ডিসপ্লেতে রেন্ডারিং সেট আপ করুন

  1. একক-ডিসপ্লে ফ্লো-এর মতো করে /dev/dri/card* DRM ডিভাইসটি খুলুন।

  2. উপলব্ধ ডিসপ্লে কানেক্টরগুলির তালিকা দিন।

    প্রতিটি ডিসপ্লেকে ডিআরএম ডিভাইসের একটি পৃথক ডিআরএম কানেক্টর হিসেবে চিহ্নিত করা হয়।

  3. প্রতিটি ডিসপ্লে কানেক্টরের জন্য:

    1. কানেক্টরটির সাথে সামঞ্জস্যপূর্ণ একটি CRTC নির্বাচন করুন। প্রতিটি কানেক্টরের জন্য উপলব্ধ এনকোডারগুলির একটি তালিকা থাকে এবং প্রতিটি এনকোডার নির্দেশ করে যে এটি কোন কোন CRTC-এর সাথে ব্যবহার করা যাবে। সর্বদা অন্তত একটি সামঞ্জস্যপূর্ণ CRTC পাওয়া যায়।

      1. CRTC-এর সাথে সামঞ্জস্যপূর্ণ একটি বিমান নির্বাচন করুন।

      2. জিপিইউ বাফার দ্বারা সমর্থিত ডিআরএম ফ্রেমবাফার তৈরি করুন। এই প্রক্রিয়াটি সিঙ্গেল-ডিসপ্লে সংস্করণের মতোই।

      3. প্লেন, CRTC এবং কানেক্টর সংযুক্ত করুন, এবং CRTC-তে ভিডিও মোড সেট করুন।

        প্রতিটি কানেক্টর, CRTC, এবং প্লেন সেটের জন্য নিম্নলিখিত DRM প্রোপার্টিগুলো সেট করতে অ্যাটমিক API ব্যবহার করে একই সাথে একাধিক ডিসপ্লের মোড সেট করা সম্ভব।

    প্রয়োজনীয় বৈশিষ্ট্যগুলির সম্পূর্ণ তালিকা:

    লক্ষ্য সম্পত্তি প্রকার বর্ণনা
    সংযোগকারী CRTC_ID সিআরটিসি আইডি কানেক্টরে বরাদ্দ করার জন্য CRTC-এর আইডি
    সিআরটিসি MODE_ID ব্লব আইডি drmModeCreatePropertyBlob ব্যবহার করে তৈরি একটি প্রপার্টি ব্লবের আইডি, যেটিতে নির্বাচিত ভিডিও মোডের drmModeModeInfo স্ট্রাকচারটি থাকে।
    সিআরটিসি ACTIVE বুলিয়ান CRTC-কে সক্রিয় হিসেবে চিহ্নিত করতে true
    বিমান FB_ID ফ্রেমবাফার আইডি স্ক্রিনে প্রদর্শনের জন্য ডিআরএম ফ্রেমবাফারের আইডি।
    বিমান SRC_X পিক্সেল ফ্রেমবাফার উৎস ছবির আয়তক্ষেত্রের X স্থানাঙ্ক
    বিমান SRC_Y পিক্সেল ফ্রেমবাফার উৎস ছবির আয়তক্ষেত্রের Y স্থানাঙ্ক
    বিমান SRC_W ১৬.১৬ স্থির বিন্দু ফ্রেমবাফার উৎস ছবির আয়তক্ষেত্রের প্রস্থ (পিক্সেল ১৬ বিট বামে সরানো)
    বিমান SRC_H ১৬.১৬ স্থির বিন্দু ফ্রেমবাফার উৎস ছবির আয়তক্ষেত্রের উচ্চতা (পিক্সেল ১৬ বিট বামে সরানো)
    বিমান CRTC_X পিক্সেল CRTC গন্তব্য চিত্র আয়তক্ষেত্রের X স্থানাঙ্ক
    বিমান CRTC_Y পিক্সেল CRTC গন্তব্য চিত্র আয়তক্ষেত্রের Y স্থানাঙ্ক
    বিমান CRTC_W পিক্সেল CRTC গন্তব্য চিত্র আয়তক্ষেত্রের প্রস্থ
    বিমান CRTC_H পিক্সেল CRTC গন্তব্য চিত্র আয়তক্ষেত্রের উচ্চতা
  4. রেন্ডার লুপে প্রবেশ করুন:

    1. পরবর্তী ফ্রেম রেন্ডার করার আগে CRTC-তে পৃষ্ঠা উল্টানোর ইভেন্টের জন্য অপেক্ষা করুন।

    2. প্রদত্ত CRTC+ফ্রেমবাফারের জন্য একটি পেজ ফ্লিপ শিডিউল করে একটি ফ্রেম রেন্ডার করুন এবং স্ক্রিনে প্রদর্শন করুন।