डिसप्ले की सुविधाएं, डिवाइसों पर डाइनैमिक तौर पर बदल सकती हैं. जैसे, डिसप्ले मोड और काम करने वाले एचडीआर टाइप. ये सुविधाएं उन डिवाइसों पर बदलती हैं जिनमें बाहर से कनेक्ट किए गए डिसप्ले (एचडीएमआई या डिसप्ले पोर्ट के साथ) होते हैं. जैसे, Android TV के सेट-टॉप बॉक्स (एसटीबी) और ओवर-द-टॉप (ओटीटी) डिवाइस. यह बदलाव, एचडीएमआई hotplug सिग्नल की वजह से हो सकता है. जैसे, जब उपयोगकर्ता एक डिसप्ले से दूसरे पर स्विच करता है या डिसप्ले से कनेक्ट किए बिना डिवाइस को बूट करता है. Android 12 और उसके बाद के वर्शन में, फ़्रेमवर्क में बदलाव किए गए हैं. इनसे, डिवाइस में डिसप्ले को हॉटप्लग करने और डाइनैमिक डिसप्ले की सुविधाओं को मैनेज करने में मदद मिलती है.
इस पेज पर, डिसप्ले हॉटप्लग को मैनेज करने और Composer HAL लागू करने के दौरान, डिसप्ले की सुविधाओं में हुए बदलावों के बारे में बताया गया है. साथ ही, इसमें फ़्रेमबफ़र को मैनेज करने और इन स्थितियों में रेस कंडीशन को रोकने का तरीका भी बताया गया है.
डिसप्ले की सुविधाओं को अपडेट करना
इस सेक्शन में बताया गया है कि Composer HAL की ओर से शुरू की गई डिसप्ले की सुविधाओं में हुए बदलावों को Android फ़्रेमवर्क कैसे मैनेज करता है.
डिसप्ले की सुविधाओं में हुए बदलावों को Android ठीक से मैनेज कर सके, इसके लिए OEM को Composer HAL को इस तरह लागू करना होगा कि वह डिसप्ले की सुविधाओं में हुए किसी भी बदलाव की सूचना फ़्रेमवर्क को देने के लिए, onHotplug(display, connection=CONNECTED)
का इस्तेमाल करे. इसके लागू होने के बाद, Android डिसप्ले की सुविधाओं में हुए बदलावों को इस तरह मैनेज करता है:
- डिसप्ले की सुविधाओं में बदलाव का पता चलने पर, फ़्रेमवर्क को एक
onHotplug(display, connection=CONNECTED)
सूचना मिलती है. - सूचना मिलने पर, फ़्रेमवर्क अपनी डिसप्ले स्टेटस को हटा देता है और
getActiveConfig
,getDisplayConfigs
,getDisplayAttribute
,getColorModes
,getHdrCapabilities
, औरgetDisplayCapabilities
तरीकों का इस्तेमाल करके, एचएएल की नई सुविधाओं के साथ इसे फिर से बना देता है. - फ़्रेमवर्क, डिसप्ले की नई स्थिति को फिर से बनाने के बाद, ऐसे इवेंट के लिए सुनने वाले ऐप्लिकेशन को
onDisplayChanged
कॉलबैक भेजता है.
फ़्रेमवर्क, बाद के onHotplug(display, connection=CONNECTED)
इवेंट के लिए फ़्रेमबफ़र को फिर से असाइन करता है. नए फ़्रेमबफ़र के लिए मेमोरी को सही तरीके से मैनेज करने के बारे में ज़्यादा जानने के लिए, क्लाइंट फ़्रेमबफ़र मैनेजमेंट देखें. इससे, फ़्रेमबफ़र के लिए मेमोरी को असाइन करने के दौरान होने वाली गड़बड़ियों से बचा जा सकता है.
कनेक्शन से जुड़ी सामान्य स्थितियों को मैनेज करना
इस सेक्शन में, प्राइमरी डिसप्ले के कनेक्ट और डिसकनेक्ट होने पर, लागू करने के दौरान कनेक्शन की अलग-अलग स्थितियों को ठीक से मैनेज करने का तरीका बताया गया है.
Android फ़्रेमवर्क, मोबाइल डिवाइसों के लिए बनाया गया है. इसलिए, इसमें डिसकनेक्ट किए गए मुख्य डिसप्ले के लिए, पहले से कोई सुविधा नहीं होती. इसके बजाय, अगर मुख्य डिसप्ले फ़िज़िकली डिसकनेक्ट हो जाता है, तो एचएएल को फ़्रेमवर्क के साथ इंटरैक्ट करते समय, मुख्य डिसप्ले को प्लेसहोल्डर डिसप्ले से बदलना चाहिए.
नीचे दी गई स्थितियां, ऐसे एसटीबी और टीवी डोंगल में हो सकती हैं जिनमें बाहर से कनेक्ट किए गए डिसप्ले होते हैं और जिन्हें डिसकनेक्ट किया जा सकता है. इन स्थितियों के लिए सहायता लागू करने के लिए, नीचे दी गई टेबल में दी गई जानकारी का इस्तेमाल करें:
स्थिति | फ़ोन के रखरखाव का सही तरीका |
---|---|
बूट के समय कोई डिसप्ले कनेक्ट नहीं है |
|
प्राइमरी डिसप्ले कनेक्ट हो |
|
प्राइमरी डिसप्ले को फ़िज़िकली डिसकनेक्ट किया गया है |
|
एचडीएमआई के अलावा किसी दूसरे कनेक्शन का इस्तेमाल करने से जुड़ी बातें
Android TV पर सिर्फ़ इन रिज़ॉल्यूशन में वीडियो चलाए जा सकते हैं:
- 720x1280
- 1080x1920
- 2160x3840
- 4320x7680
जब कोई एसटीबी या टीवी डोंगल, काम न करने वाले रिज़ॉल्यूशन को दिखाने की कोशिश करता है, जैसे कि CVBS कनेक्शन पर 480i, तो उपयोगकर्ता को गड़बड़ी का मैसेज दिखता है.
अगर एसटीबी या टीवी डोंगल में एचडीएमआई और नॉन-एचडीएमआई, दोनों कनेक्शन हैं, तो एचडीएमआई कनेक्शन को प्राइमरी डिसप्ले माना जाता है और नॉन-एचडीएमआई कनेक्शन को बंद कर दिया जाता है. इसलिए, अगर एचडीएमआई कनेक्शन डिसकनेक्ट हो जाता है, लेकिन नॉन-एचडीएमआई कनेक्शन अब भी कनेक्ट है, तो SurfaceFlinger को एक इवेंट भेजा जाता है. साथ ही, नॉन-एचडीएमआई डिसप्ले की सुविधाओं को getDisplayAttribute
और अन्य iComposerClient
एपीआई (जैसे, getHdrCapabilities
) के ज़रिए दिखाया जाना चाहिए.
रेस कंडीशन से बचने के लिए, क्रम के मुताबिक कॉन्फ़िगरेशन आईडी का इस्तेमाल करना
अगर Composer HAL, काम करने वाले डिसप्ले कॉन्फ़िगरेशन को setActiveConfig
या setActiveConfigWithConstraints
को कॉल करने वाले फ़्रेमवर्क के साथ-साथ अपडेट करता है, तो रेस कंडीशन पैदा हो सकती हैं.
इसका समाधान, क्रम से आईडी का इस्तेमाल करने और इस समस्या को रोकने के लिए, Composer HAL को लागू करना है.
इस सेक्शन में बताया गया है कि रेस की स्थितियां कैसे हो सकती हैं. इसके बाद, Composer HAL को लागू करने का तरीका बताया गया है, ताकि यह ऐसी स्थितियों से बचने के लिए, क्रम से आईडी का इस्तेमाल कर सके.
जब नए डिसप्ले कॉन्फ़िगरेशन को नए क्रम वाले आईडी असाइन नहीं किए जाते, तो इवेंट के इस क्रम पर विचार करें. इससे रेस कंडीशन की समस्या होती है:
साथ काम करने वाले डिसप्ले कॉन्फ़िगरेशन आईडी ये हैं:
- id=1, 1080x1920 60 Hz
- id=2, 1080x1920 50 Hz
फ़्रेमवर्क,
setActiveConfig(display, config=1)
को कॉल करता है.साथ ही, Composer HAL, डिसप्ले कॉन्फ़िगरेशन में हुए बदलाव को प्रोसेस करता है और अपनी इंटरनल स्थिति को डिसप्ले कॉन्फ़िगरेशन के नए सेट में अपडेट करता है. इसे यहां दिखाया गया है:
- id=1, 2160x3840 60 Hz
- id=2, 2160x3840 50 Hz
- id=3, 1080x1920 60 Hz
- id=4, 1080x1920 50 Hz
Composer HAL, फ़्रेमवर्क को
onHotplug
इवेंट भेजता है. इससे यह पता चलता है कि काम करने वाले मोड का सेट बदल गया है.Composer HAL को
setActiveConfig(display, config=1)
(दूसरे चरण से) मिलता है.एचएएल को लगता है कि फ़्रेमवर्क ने कॉन्फ़िगरेशन में बदलाव करने का अनुरोध किया है, ताकि रिज़ॉल्यूशन 2160x3840 60 Hz हो. हालांकि, असल में 1080x1920 60 Hz रिज़ॉल्यूशन चाहिए था.
क्रम से नहीं दिए गए आईडी असाइनमेंट का इस्तेमाल करने की प्रोसेस यहां खत्म हो जाती है. साथ ही, कॉन्फ़िगरेशन में किए गए बदलाव को गलत तरीके से समझा जाता है.
क्रम से आईडी इस्तेमाल करने के लिए, Composer HAL को कॉन्फ़िगर करना
इस तरह की स्थिति से बचने के लिए, OEM को Composer HAL को इस तरह लागू करना चाहिए:
- जब Composer HAL, काम करने वाले डिसप्ले कॉन्फ़िगरेशन को अपडेट करता है, तो वह नए डिसप्ले कॉन्फ़िगरेशन को नए और क्रम से चलने वाले आईडी असाइन करता है.
- जब फ़्रेमवर्क किसी अमान्य कॉन्फ़िगरेशन आईडी के साथ
setActiveConfig
याsetActiveConfigWithConstraints
को कॉल करता है, तो Composer HAL उस कॉल को अनदेखा कर देता है.
इन चरणों से, रेस की स्थितियों को रोकने में मदद मिलती है, जैसा कि यहां दी गई बातचीत में बताया गया है.
जब नए डिसप्ले कॉन्फ़िगरेशन को नए, क्रम से चलने वाले आईडी असाइन किए जाते हैं, तो इवेंट के इस क्रम पर ध्यान दें:
साथ काम करने वाले डिसप्ले कॉन्फ़िगरेशन आईडी ये हैं:
- id=1, 1080x1920 60 Hz
- id=2, 1080x1920 50 Hz
फ़्रेमवर्क,
setActiveConfig(display, config=1)
को कॉल करता है.डिसप्ले कॉन्फ़िगरेशन में बदलाव होने पर, कॉन्फ़िगरेशन आईडी का अगला सेट असाइन किया जाता है. यह सेट, इस्तेमाल नहीं किए गए अगले पूर्णांक से शुरू होता है. इसे यहां दिखाया गया है:
id=3, 2160x3840 60 Hz
id=4, 2160x3840 50 Hz
id=5, 1080x1920 60 Hz
id=6, 1080x1920 50 Hz
Composer HAL, फ़्रेमवर्क को
onHotplug
इवेंट भेजता है. इससे यह पता चलता है कि काम करने वाले मोड का सेट बदल गया है.Composer HAL को
setActiveConfig(display, config=1)
(दूसरे चरण से) मिलता है.Composer HAL, कॉल को अनदेखा कर देता है, क्योंकि आईडी अब मान्य नहीं है.
फ़्रेमवर्क, चौथे चरण से
onHotplug
इवेंट को स्वीकार और प्रोसेस करता है. यहgetDisplayConfigs
औरgetDisplayAttribute
फ़ंक्शन का इस्तेमाल करके, Composer HAL को कॉल करता है. इन फ़ंक्शन की मदद से, फ़्रेमवर्क 1080x1920 और 60 Hz के डिज़ाइन किए गए रिज़ॉल्यूशन और रीफ़्रेश रेट के लिए, नए आईडी (5) की पहचान करता है.फ़्रेमवर्क, अपडेट किए गए आईडी 5 के साथ एक और
setActiveConfig
इवेंट भेजता है.Composer HAL को पांचवें चरण से
setActiveConfig(display, config=5)
मिलता है.एचएएल सही तरीके से यह समझता है कि फ़्रेमवर्क ने 1080x1920 60 Hz पर कॉन्फ़िगरेशन में बदलाव का अनुरोध किया है.
ऊपर दिए गए उदाहरण में दिखाया गया है कि क्रम से आईडी असाइन करने की प्रोसेस से, रेस कंडीशन को रोकने और डिसप्ले कॉन्फ़िगरेशन में सही बदलाव करने में मदद मिलती है.