Xử lý phích 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ị truyền hình trực tuyến (OTT). Thay đổi này có thể xảy ra do tín hiệu cắm nóng của 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 nút nóng cho màn hình và những thay đổi về khả năng hiển thị trong quá trình triển khai HAL (Lớp trừu tượng phần cứng) cho Composer. 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 được 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 giữ chỗ trong các hoạt động tương tác của màn hình với khung trong trường hợp màn hình chính bị ngắt kết nối.

Các tình huống sau có thể xảy ra trong STB và thiết bị phần cứng TV có màn hình kết nối bên ngoài và có thể ngắt kết nối. Để triển khai tính năng hỗ trợ cho các tình huống 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 phần 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). Để các ứng dụng không nhận được sự kiện thay đổi cấu hình, chế độ hiển thị đơn này phải khớp với chế độ 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.

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 thiết bị phần cứng STB hoặc TV 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ã 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 cho trường hợp này là triển khai HAL của trình soạn thảo để sử dụng mã nhận dạng tuần tự và ngăn chặn sự cố 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 tranh như vậy.

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

  1. Sau đây là các mã cấu hình hiển thị được hỗ trợ:

    • 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ý thay đổi về 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 HAL (Lớp trừu tượng phần cứng) cho trình soạn thảo để 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 Composer HAL 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 với mã nhận dạng cấu hình không hợp lệ, HAL (Lớp trừu tượng) của Composer 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 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 sẽ 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 (Lớp trừu tượng phần cứng) của trình soạn thảo gửi một sự kiện onHotplug tới 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. Lớp này gọi vào HAL của trình soạn thảo bằng cách sử dụ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 đã cập nhật 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ị.