Các tính năng hiển thị (chẳng hạn như chế độ hiển thị và các loại HDR được hỗ trợ) có thể thay đổi linh hoạt trên các thiết bị có màn hình kết nối bên ngoài (qua HDMI hoặc DisplayPort), chẳng hạn như hộp giải mã tín hiệu (STB) Android TV và thiết bị truyền phát trực tuyến (OTT). Thay đổi này có thể xảy ra do tín hiệu HDMI hotplug, chẳng hạn như khi người dùng chuyển từ màn hình này sang màn hình khác hoặc khởi động thiết bị mà không có màn hình kết nối. Android 12 trở lên có các thay đổi trong khung để xử lý tính năng hotplug và các tính năng hiển thị linh hoạt.
Trang này mô tả cách xử lý tính năng hotplug và các thay đổi về tính năng hiển thị trong quá trình triển khai Composer HAL. Ngoài ra, trang này còn thảo luận về cách quản lý bộ đệm khung hình được liên kết và ngăn tình trạng tương tranh trong những trường hợp này.
Cập nhật các tính năng hiển thị
Phần này mô tả cách khung Android xử lý các thay đổi về tính năng hiển thị do Composer HAL khởi tạo.
Trước khi Android có thể xử lý các thay đổi về tính năng hiển thị đúng cách, OEM phải
triển khai Composer HAL sao cho HAL này sử dụng
onHotplug(display, connection=CONNECTED) để thông báo cho khung về mọi
thay đổi đối với tính năng hiển thị. Sau khi triển khai, Android sẽ xử lý các thay đổi về tính năng hiển thị như sau:
- Khi phát hiện thấy thay đổi về tính năng hiển thị, khung sẽ nhận được thông báo
onHotplug(display, connection=CONNECTED). - Khi nhận được thông báo, khung sẽ loại bỏ trạng thái hiển thị và
tạo lại trạng thái đó bằng các tính năng mới từ HAL bằng cách sử dụng các
getActiveConfig,getDisplayConfigs,getDisplayAttribute,getColorModes,getHdrCapabilities, vàgetDisplayCapabilitiesphương thức. - Sau khi khung tạo lại trạng thái hiển thị mới, khung sẽ gửi lệnh gọi lại
onDisplayChangedđến các ứng dụng đang nghe những sự kiện như vậy.
Khung sẽ phân bổ lại bộ đệm khung hình trên các sự kiện
onHotplug(display, connection=CONNECTED) tiếp theo. Hãy xem
bài viết Quản lý bộ đệm khung hình của ứng dụng để biết thêm thông tin về cách quản lý đúng cách
bộ nhớ bộ đệm khung hình nhằm tránh lỗi trong quá trình phân bổ bộ đệm khung hình mới.
Xử lý các trường hợp kết nối phổ biến
Phần này trình bày cách xử lý đúng cách các trường hợp kết nối khác nhau trong quá trình triển khai khi màn hình chính được kết nối và ngắt kết nối.
Được xây dựng cho thiết bị di động, khung Android không hỗ trợ tích hợp cho màn hình chính bị ngắt kết nối. Thay vào đó, HAL phải thay thế màn hình chính bằng màn hình giữ chỗ trong các tương tác với khung trong trường hợp màn hình chính bị ngắt kết nối vật lý.
Các trường hợp sau có thể xảy ra trong STB và thiết bị TV dạng khoá có màn hình kết nối bên ngoài có thể ngắt kết nối. Để triển khai hỗ trợ cho các trường hợp này, hãy sử dụng thông tin trong bảng sau:
| Trường hợp | Sử dụng |
|---|---|
| Không có màn hình kết nối tại thời điểm khởi động |
|
| Màn hình chính được kết nối vật lý |
|
| Màn hình chính bị ngắt kết nối vật lý |
|
Những điều cần cân nhắc khi kết nối không qua HDMI
Android TV chỉ hỗ trợ các độ phân giải sau:
- 720x1280
- 1080x1920
- 2160x3840
- 4320x7680
Khi STB hoặc thiết bị TV dạng khoá cố gắng hiển thị độ phân giải không được hỗ trợ, chẳng hạn như 480i qua kết nối CVBS, người dùng sẽ thấy thông báo lỗi.
Nếu STB hoặc thiết bị TV dạng khoá có cả kết nối HDMI và không qua HDMI, thì kết nối HDMI là màn hình chính và kết nối không qua HDMI không hoạt động. Do đó, nếu kết nối HDMI bị ngắt kết nối trong khi kết nối không qua HDMI
vẫn được kết nối, thì một sự kiện sẽ được gửi đến SurfaceFlinger và các
tính năng của màn hình không qua HDMI phải được phản ánh thông qua
getDisplayAttribute và các IComposerClient API khác (chẳng hạn như
getHdrCapabilities).
Sử dụng mã cấu hình tuần tự để ngăn tình trạng tương tranh
Tình trạng tương tranh có thể xảy ra nếu Composer HAL cập nhật các cấu hình hiển thị được hỗ trợ
đồng thời với khung gọi setActiveConfig hoặc
setActiveConfigWithConstraints. Giải pháp là triển khai Composer HAL để sử dụng mã tuần tự và ngăn vấn đề này.
Phần này mô tả cách tình trạng tương tranh có thể xảy ra, sau đó là thông tin chi tiết về cách triển khai Composer HAL để HAL này sử dụng mã tuần tự nhằm ngăn tình trạng như vậy.
Hãy xem xét trình tự sự kiện sau đây, khi các mã tuần tự mới KHÔNG được gán cho các cấu hình hiển thị mới, gây ra tình trạng tương tranh:
Các mã cấu hình hiển thị được hỗ trợ là:
- id=1, 1080x1920 60 Hz
- id=2, 1080x1920 50 Hz
Khung gọi
setActiveConfig(display, config=1).Đồng thời, Composer HAL xử lý việc thay đổi cấu hình hiển thị và cập nhật trạng thái nội bộ của HAL này thành một tập hợp cấu hình hiển thị mới, như sau:
- id=1, 2160x3840 60 Hz
- id=2, 2160x3840 50 Hz
- id=3, 1080x1920 60 Hz
- id=4, 1080x1920 50 Hz
Composer HAL gửi sự kiện
onHotplugđến khung để thông báo rằng tập hợp các chế độ được hỗ trợ đã thay đổi.Composer HAL nhận được
setActiveConfig(display, config=1)(từ bước 2).HAL diễn giải rằng khung đã yêu cầu thay đổi cấu hình thành 2160x3840 60 Hz, mặc dù trên thực tế 1080x1920 60 Hz đã được chọn.
Quá trình sử dụng việc gán mã không tuần tự kết thúc tại đây với việc diễn giải sai về thay đổi cấu hình đã chọn.
Định cấu hình Composer HAL để sử dụng mã tuần tự
Để tránh tình trạng tương tranh như vậy, OEM phải triển khai Composer HAL như sau:
- Khi Composer HAL cập nhật các cấu hình hiển thị được hỗ trợ, HAL này sẽ gán các mã tuần tự mới cho các cấu hình hiển thị mới.
- Khi khung gọi
setActiveConfighoặcsetActiveConfigWithConstraintsbằng mã cấu hình không hợp lệ, Composer HAL sẽ bỏ qua lệnh gọi.
Các bước này giúp ngăn tình trạng tương tranh như trong phần thảo luận sau.
Hãy xem xét trình tự sự kiện sau đây, khi các mã tuần tự mới được gán cho các cấu hình hiển thị mới:
Các mã cấu hình hiển thị được hỗ trợ là:
- id=1, 1080x1920 60 Hz
- id=2, 1080x1920 50 Hz
Khung gọi
setActiveConfig(display, config=1).Khi quá trình thay đổi cấu hình hiển thị được xử lý, tập hợp mã cấu hình tiếp theo sẽ được gán bắt đầu từ số nguyên chưa sử dụng tiếp theo, như sau:
id=3, 2160x3840 60 Hz
id=4, 2160x3840 50 Hz
id=5, 1080x1920 60 Hz
id=6, 1080x1920 50 Hz
Composer HAL gửi sự kiện
onHotplugđến khung để thông báo rằng tập hợp các chế độ được hỗ trợ đã thay đổi.Composer HAL nhận được
setActiveConfig(display, config=1)(từ bước 2).Composer HAL bỏ qua lệnh gọi vì mã không còn hợp lệ.
Khung nhận và xử lý sự kiện
onHotplugtừ bước 4. Khung gọi vào Composer HAL bằng các hàmgetDisplayConfigsvàgetDisplayAttribute. Với các hàm này, khung sẽ xác định mã mới (5) cho độ phân giải và tốc độ làm mới đã chọn là 1080x1920 và 60 Hz.Khung gửi một sự kiện
setActiveConfigkhác có mã đã cập nhật là 5.Composer HAL nhận được
setActiveConfig(display, config=5)từ bước 5.HAL diễn giải chính xác rằng khung đã yêu cầu thay đổi cấu hình thành 1080x1920 60 Hz.
Như trong ví dụ trước, quá trình sử dụng việc gán mã tuần tự sẽ xác minh rằng tình trạng tương tranh được ngăn chặn và thay đổi cấu hình hiển thị chính xác được cập nhật.