Xử lý tính năng cắm nóng

Các chức năng hiển thị (chẳng hạn như chế độ hiển thị và 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 được kết nối bên ngoài (bằng HDMI hoặc DisplayPort), chẳng hạn như hộp giải mã (STB) Android TV và thiết bị phát trực tuyến (OTT). Thay đổi này có thể xảy ra do tín hiệu cắm nóng HDMI, 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 được kết nối. Android 12 trở lên có các thay đổi trong khung để xử lý tính năng cắm nóng và hiển thị động.

Trang này mô tả cách xử lý các hoạt động cắm nóng màn hình và thay đổi về chức năng màn hình trong quá trình triển khai Composer HAL. Ngoài ra, bài viết này còn thảo luận về cách quản lý vùng đệm khung hình liên kết và ngăn chặn tình trạng tranh đua trong các trường hợp này.

Cập nhật chức năng hiển thị

Phần này mô tả cách khung Android xử lý các thay đổi về chức năng hiển thị do Composer HAL khởi tạo.

Trước khi Android có thể xử lý đúng cách các thay đổi về chức năng hiển thị, nhà sản xuất thiết bị gốc (OEM) phải triển khai Composer HAL sao cho sử dụng onHotplug(display, connection=CONNECTED) để thông báo cho khung về mọi thay đổi đối với chức năng hiển thị. Sau khi triển khai, Android sẽ xử lý các thay đổi đối với chức năng hiển thị như sau:

  1. Khi phát hiện thấy sự thay đổi về chức năng hiển thị, khung sẽ nhận được thông báo onHotplug(display, connection=CONNECTED).
  2. 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 chức năng mới từ HAL bằng cách sử dụng các phương thức getActiveConfig, getDisplayConfigs, getDisplayAttribute, getColorModes, getHdrCapabilitiesgetDisplayCapabilities.
  3. Sau khi tạo lại trạng thái hiển thị mới, khung này 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 này phân bổ lại vùng đệm khung hình trên các sự kiện onHotplug(display, connection=CONNECTED) tiếp theo. Hãy xem phần Quản lý vùng đệm khung hình của ứng dụng để biết thêm thông tin về cách quản lý bộ nhớ vùng đệm khung hình đúng cách nhằm tránh lỗi trong quá trình phân bổ vùng đệ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 nhiều tình huống kết nối 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 có tính năng hỗ trợ tích hợp cho màn hình chính đã 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 phần giữ chỗ trong quá trình 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ề mặt vật lý.

Các trường hợp sau có thể xảy ra trong STB và thiết bị truyền hình kỹ thuật số có màn hình được kết nối bên ngoài và có thể bị ngắt kết nối. Để triển khai tính năng hỗ trợ cho các trường hợp này, hãy sử dụng thông tin trong bảng dưới đây:

Trường hợp Sử dụng
Không có màn hình nào được kết nối tại thời điểm khởi động
  • Gửi tín hiệu onHotplug(display, connection=CONNECTED) từ Composer HAL đến khung.
  • Thay thế trạng thái hiển thị thực tế bên trong Composer HAL bằng trạng thái hiển thị phần giữ chỗ.
Màn hình chính được kết nối thực tế
Màn hình chính bị ngắt kết nối thực tế
  • Gửi một sự kiện onHotplug(display, connection=CONNECTED) khác từ Composer HAL đến khung.
  • Thay thế trạng thái hiển thị thực tế bên trong Composer HAL bằng trạng thái hiển thị phần giữ chỗ. Màn hình giữ chỗ phải có một chế độ hiển thị duy nhất để khung gửi lệnh gọi lại onDisplayChanged đến các ứng dụng (vì nhóm chế độ được hỗ trợ đã thay đổi). Chế độ hiển thị đơn này phải khớp với chế độ đang hoạt động gần đây nhất của màn hình thực trước khi ngắt kết nối để các ứng dụng không nhận được sự kiện thay đổi cấu hình.

Những điểm cần cân nhắc về kết nối không phải HDMI

Android TV chỉ hỗ trợ các độ phân giải sau:

  • 720x1280
  • 1080x1920
  • 2160x3840
  • 4320x7680

Khi STB hoặc TV dongle 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ị truyền hình kỹ thuật số có cả kết nối HDMI và không phải HDMI, thì kết nối HDMI là màn hình chính và kết nối không phải HDMI sẽ không hoạt động. Do đó, nếu kết nối HDMI bị ngắt trong khi kết nối không phải HDMI vẫn được kết nối, thì một sự kiện sẽ được gửi đến SurfaceFlinger và các chức năng của màn hình không phải HDMI phải được phản ánh thông qua getDisplayAttribute và các API iComposerClient khác (chẳng hạn như getHdrCapabilities).

Sử dụng mã nhận dạng 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 màn hình đượ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ã nhận dạng tuần tự và ngăn chặn vấn đề này.

Phần này mô tả cách điều kiện tương tranh có thể xảy ra, theo sau là thông tin chi tiết về cách triển khai Composer HAL để sử dụng mã nhận dạng tuần tự nhằm ngăn chặn các điều kiện tương tự.

Hãy xem xét trình tự sự kiện sau đây, khi các mã nhận dạng tuần tự, mới KHÔNG được chỉ định cho cấu hình hiển thị mới, gây ra tình trạng tương tranh:

  1. Các mã nhận dạng cấu hình hiển thị được hỗ trợ là:

    • id=1, 1080x1920 60 Hz
    • id=2, 1080x1920 50 Hz
  2. Khung này gọi setActiveConfig(display, config=1).

  3. Đồ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 cấu hình hiển thị thành một nhóm 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
  4. Composer HAL gửi một sự kiện onHotplug đến khung để thông báo rằng nhóm chế độ được hỗ trợ đã thay đổi.

  5. HAL của Compose nhận được setActiveConfig(display, config=1) (từ bước 2).

  6. 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ù thực tế là 1080x1920 60 Hz.

Quy trình sử dụng các lượt chỉ định mã nhận dạng 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 mong muốn.

Định cấu hình Composer HAL để sử dụng mã nhận dạng tuần tự

Để tránh các tình huống tương tranh như vậy, OEM phải triển khai HAL của Composer như sau:

  • Khi cập nhật cấu hình màn hình được hỗ trợ, Composer HAL sẽ chỉ định mã nhận dạng mới, theo tuần tự cho các cấu hình màn hình mới.
  • Khi khung gọi setActiveConfig hoặc setActiveConfigWithConstraints bằng mã nhận dạng 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 chặn tình trạng tranh đua 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ã nhận dạng tuần tự mới được chỉ định cho cấu hình hiển thị mới:

  1. Các mã nhận dạng cấu hình hiển thị được hỗ trợ là:

    • id=1, 1080x1920 60 Hz
    • id=2, 1080x1920 50 Hz
  2. Khung này gọi setActiveConfig(display, config=1).

  3. Khi một thay đổi về cấu hình hiển thị được xử lý, nhóm mã nhận dạng cấu hình tiếp theo sẽ được chỉ định 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

  4. HAL của Composer sẽ gửi một sự kiện onHotplug đến khung để thông báo rằng nhóm chế độ được hỗ trợ đã thay đổi.

  5. HAL của Composer nhận được setActiveConfig(display, config=1) (từ bước 2).

  6. Composer HAL bỏ qua lệnh gọi vì mã nhận dạng không còn hợp lệ.

  7. Khung này nhận và xử lý sự kiện onHotplug từ bước 4. Hàm này gọi vào Composer HAL bằng các hàm getDisplayConfigsgetDisplayAttribute. Với các hàm này, khung sẽ xác định mã nhận dạng mới (5) cho độ phân giải và tốc độ làm mới mong muốn là 1080x1920 và 60 Hz.

  8. Khung này sẽ gửi một sự kiện setActiveConfig khác với mã nhận dạng mới là 5.

  9. HAL của Composer nhận được setActiveConfig(display, config=5) từ bước 5.

  10. 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ên, quy trình sử dụng các lượt chỉ định mã nhận dạng tuần tự đảm bảo ngăn chặn tình trạng tương tranh và cập nhật đúng thay đổi về cấu hình hiển thị.