Chuyển mã tệp đa phương tiện tương thích

Chuyển mã nội dung nghe nhìn tương thích được giới thiệu trong Android 12, là một tính năng cho phép các thiết bị sử dụng các định dạng nội dung nghe nhìn hiện đại hơn, tiết kiệm dung lượng lưu trữ hơn để quay video (chẳng hạn như HEVC), trong khi vẫn duy trì khả năng tương thích với các ứng dụng. Với tính năng này, theo mặc định, các nhà sản xuất thiết bị có thể sử dụng HEVC thay vì AVC để cải thiện chất lượng video trong khi giảm các yêu cầu về băng thông và dung lượng lưu trữ. Đối với các thiết bị bật tính năng chuyển mã nội dung nghe nhìn tương thích, Android có thể tự động chuyển đổi video (có thời lượng tối đa một phút) đã quay ở các định dạng như HEVC hoặc HDR khi video được mở bằng một ứng dụng không hỗ trợ định dạng này. Điều này cho phép các ứng dụng hoạt động ngay cả khi thiết bị quay video ở định dạng mới hơn.

Tính năng chuyển mã tệp đa phương tiện tương thích bị tắt theo mặc định. Để yêu cầu chuyển mã nội dung nghe nhìn, các ứng dụng phải khai báo khả năng chuyển đổi nội dung nghe nhìn. Để biết thêm thông tin về cách khai báo khả năng của nội dung nghe nhìn, hãy xem bài viết Chuyển mã nội dung nghe nhìn tương thích trên trang web dành cho nhà phát triển Android.

Cách hoạt động

Tính năng chuyển mã tệp đa phương tiện tương thích bao gồm hai phần chính:

  • Dịch vụ chuyển mã trong khung nội dung đa phương tiện: Các dịch vụ này chuyển đổi tệp từ định dạng này sang định dạng khác bằng phần cứng để có độ trễ thấp và lượt chuyển đổi chất lượng cao. Trong đó bao gồm API chuyển mã, dịch vụ chuyển mã, trình bổ trợ OEM cho bộ lọc tuỳ chỉnh và phần cứng. Để biết thêm thông tin chi tiết, hãy xem bài viết Tổng quan về cấu trúc.
  • Tính năng chuyển mã nội dung nghe nhìn tương thích trong các nhà cung cấp nội dung nghe nhìn: Thành phần này có trong các nhà cung cấp nội dung nghe nhìn chặn các ứng dụng truy cập vào các tệp nội dung nghe nhìn và phân phát tệp gốc hoặc tệp đã chuyển mã dựa trên các chức năng đã khai báo của ứng dụng. Nếu ứng dụng hỗ trợ định dạng của tệp nội dung nghe nhìn, thì bạn không cần phải xử lý đặc biệt. Nếu một ứng dụng không hỗ trợ định dạng này, thì khung sẽ chuyển đổi tệp sang định dạng cũ hơn (chẳng hạn như AVC) khi ứng dụng truy cập vào tệp đó.

Hình 1 cho thấy tổng quan về quá trình chuyển mã nội dung nghe nhìn.

Quy trình chuyển mã tệp đa phương tiện tương thích

Hình 1. Tổng quan về quá trình chuyển mã nội dung nghe nhìn tương thích.

Định dạng được hỗ trợ

Tính năng chuyển mã nội dung nghe nhìn tương thích hỗ trợ các lượt chuyển đổi định dạng sau:

  • HEVC (8 bit) sang AVC: Quá trình chuyển đổi bộ mã hoá và giải mã được thực hiện thông qua việc kết nối một bộ giải mã mediacodec và một bộ mã hoá mã nội dung nghe nhìn.
  • HDR10+ (10-bit) sang AVC (SDR): Thực hiện lượt chuyển đổi HDR thành SDR bằng các thực thể mediacodec và một trình bổ trợ của nhà cung cấp nối vào các phiên bản bộ giải mã. Để biết thêm thông tin, hãy xem phần Mã hoá HDR sang SDR.

Các nguồn nội dung được hỗ trợ

Tính năng chuyển mã nội dung nghe nhìn tương thích hỗ trợ nội dung nghe nhìn trên thiết bị do ứng dụng máy ảnh gốc của OEM (Nhà sản xuất thiết bị gốc) tạo ra, được lưu trữ trong thư mục DCIM/Camera/ trong ổ đĩa chính bên ngoài. Tính năng này không hỗ trợ nội dung nghe nhìn trên bộ nhớ phụ. Không hỗ trợ nội dung được chuyển đến các thiết bị qua email hoặc thẻ SD.

Các ứng dụng truy cập vào tệp dựa trên nhiều đường dẫn tệp. Phần sau đây mô tả các đường dẫn tệp mà quá trình chuyển mã được bật hoặc bỏ qua:

  • Đã bật tính năng chuyển mã:

    • Quyền truy cập vào ứng dụng thông qua các API MediaStore
    • Quyền truy cập của ứng dụng thông qua các API đường dẫn tệp trực tiếp, bao gồm cả Java và mã gốc
    • Quyền truy cập của ứng dụng thông qua Khung truy cập bộ nhớ (SAF)
    • Quyền truy cập vào ứng dụng thông qua Ý định của trang tính chia sẻ hệ điều hành. (Chỉ URI MediaStore)
    • Chuyển tệp MTP/PTP từ điện thoại sang máy tính
  • Quá trình chuyển mã đã bị bỏ qua:

    • Truyền tệp ra khỏi thiết bị bằng cách tháo thẻ SD
    • Chuyển tệp từ thiết bị này sang thiết bị khác bằng các tuỳ chọn như Chia sẻ lân cận hoặc chuyển tệp qua Bluetooth.

Thêm đường dẫn tệp tuỳ chỉnh để chuyển mã

Nhà sản xuất thiết bị có thể tuỳ ý thêm đường dẫn tệp để chuyển mã nội dung nghe nhìn trong thư mục DCIM/. Mọi đường dẫn bên ngoài thư mục DCIM/ đều bị từ chối. Bạn có thể phải thêm các đường dẫn tệp như vậy để đáp ứng các yêu cầu của nhà mạng hoặc quy định của địa phương.

Để thêm đường dẫn tệp, hãy sử dụng đường dẫn chuyển mã lớp phủ tài nguyên thời gian chạy (RRO), config_supported_transcoding_relative_paths. Sau đây là ví dụ về cách thêm đường dẫn tệp:

<string-array name="config_supported_transcoding_relative_paths" translatable="false">
    <item>DCIM/JCF/</item>
</string-array>

Để xác minh đường dẫn tệp đã định cấu hình, hãy sử dụng:

adb shell dumpsys activity provider com.google.android.providers.media.module/com.android.providers.media.MediaProvider | head -n 20

Tổng quan về cấu trúc

Phần này mô tả cấu trúc của tính năng chuyển mã nội dung nghe nhìn.

cấu trúc chuyển mã nội dung nghe nhìn

Hình 2. Kiến trúc chuyển mã nội dung nghe nhìn.

Kiến trúc chuyển mã nội dung đa phương tiện bao gồm các thành phần sau:

  • MediaTrans encryptedManager system API: Giao diện cho phép ứng dụng giao tiếp với dịch vụ MediaTransMã hoá. Mô-đun MediaProvider sử dụng API này.
  • MediaTranscodesService: Dịch vụ gốc quản lý các kết nối của ứng dụng, lên lịch cho các yêu cầu chuyển mã và quản lý sổ sách kế toán cho TranscodingSessions.
  • MediaTranscoder: Thư viện gốc thực hiện quá trình chuyển mã. Thư viện này được xây dựng dựa trên NDK khung đa phương tiện để tương thích với các mô-đun.

Tính năng chuyển mã nội dung nghe nhìn tương thích ghi lại các chỉ số chuyển mã trong cả dịch vụ và trình chuyển mã nội dung nghe nhìn. Phía máy khách và mã phía dịch vụ nằm trong mô-đun MediaProvider để có thể cập nhật và sửa lỗi kịp thời.

Quyền truy cập vào tệp

Tính năng chuyển mã nội dung nghe nhìn tương thích được xây dựng dựa trên Hệ thống tệp trong Không gian người dùng (FUSE), dùng cho bộ nhớ có giới hạn. FUSE cho phép mô-đun MediaProvider kiểm tra các hoạt động của tệp trong không gian của người dùng và kiểm soát quyền truy cập vào các tệp dựa trên chính sách cho phép, từ chối hoặc loại bỏ quyền truy cập.

Khi một ứng dụng cố gắng truy cập vào một tệp, trình nền FUSE sẽ chặn quyền truy cập đọc tệp từ ứng dụng đó. Nếu ứng dụng hỗ trợ định dạng mới hơn (chẳng hạn như HEVC), thì tệp gốc sẽ được trả về. Nếu ứng dụng không hỗ trợ định dạng này, tệp sẽ được chuyển mã sang một định dạng cũ hơn (chẳng hạn như AVC) hoặc được trả về từ bộ nhớ đệm nếu có phiên bản đã chuyển mã.

Yêu cầu tệp đã chuyển mã

Tính năng chuyển mã nội dung nghe nhìn tương thích bị tắt theo mặc định, nghĩa là nếu thiết bị hỗ trợ HEVC, thì Android sẽ không chuyển mã tệp trừ phi được ứng dụng trong tệp kê khai chỉ định hoặc trong danh sách chuyển mã bắt buộc.

Ứng dụng có thể yêu cầu thành phần được chuyển mã bằng cách sử dụng các tuỳ chọn sau:

  • Khai báo các định dạng không được hỗ trợ trong tệp kê khai. Để biết thông tin chi tiết, hãy xem phần Khai báo chức năng trong tài nguyênKhai báo chức năng trong mã.
  • Thêm các ứng dụng vào danh sách chuyển mã buộc có trong mô-đun MediaProvider. Việc này cho phép chuyển mã cho các ứng dụng chưa cập nhật tệp kê khai. Sau khi một ứng dụng cập nhật tệp kê khai bằng các định dạng không được hỗ trợ, thì tệp đó phải được xoá khỏi danh sách chuyển mã bắt buộc. Nhà sản xuất thiết bị có thể chỉ định thêm hoặc xoá các ứng dụng của họ khỏi danh sách chuyển mã bằng cách gửi bản vá hoặc báo cáo lỗi. Nhóm Android sẽ xem xét danh sách này theo định kỳ và có thể xoá các ứng dụng khỏi danh sách.
  • Tắt các định dạng được hỗ trợ với khung tương thích ứng dụng trong thời gian chạy (người dùng cũng có thể tắt các định dạng này cho từng ứng dụng trong phần Cài đặt).
  • Mở một tệp có MediaStore trong khi chỉ định rõ ràng các định dạng không được hỗ trợ bằng API openTypedAssetFileDescriptor.

Đối với phương thức chuyển dữ liệu qua USB (từ thiết bị sang máy tính), tính năng chuyển mã bị tắt theo mặc định nhưng người dùng có thể chọn bật tính năng chuyển mã bằng cách sử dụng nút bật/tắt Convert video to AVC (Chuyển đổi video sang AVC) trong màn hình cài đặt USB Preferences (Lựa chọn ưu tiên về USB như trong Hình 3).

Gạt nút để bật tính năng chuyển mã nội dung nghe nhìn

Hình 3. Dùng nút bật tắt để bật tính năng chuyển mã nội dung nghe nhìn trên màn hình Lựa chọn ưu tiên về USB.

Quy định hạn chế đối với việc yêu cầu tệp chuyển mã

Để các yêu cầu chuyển mã không khoá tài nguyên hệ thống trong khoảng thời gian dài, các ứng dụng yêu cầu phiên chuyển mã bị giới hạn ở:

  • 10 phiên liên tiếp
  • tổng thời gian chạy là 3 phút

Nếu một ứng dụng vượt quá tất cả các hạn chế này, khung sẽ trả về chỉ số mô tả tệp ban đầu.

Yêu cầu đối với thiết bị

Để hỗ trợ tính năng chuyển mã nội dung nghe nhìn tương thích, thiết bị phải đáp ứng các yêu cầu sau:

  • Thiết bị được bật phương thức mã hoá HEVC theo mặc định trong ứng dụng camera gốc
  • (Thiết bị hỗ trợ chuyển mã HDR sang SDR) Thiết bị hỗ trợ quay video HDR

Để đảm bảo hiệu suất của thiết bị cho quá trình chuyển mã nội dung nghe nhìn, hiệu suất truy cập đọc/ghi của phần cứng video và bộ nhớ phải được tối ưu hoá. Khi bộ mã hoá và giải mã nội dung đa phương tiện được định cấu hình với mức độ ưu tiên bằng 1, thì bộ mã hoá và giải mã phải hoạt động ở thông lượng cao nhất có thể. Bạn nên đạt được hiệu suất chuyển mã tối thiểu là 200 khung hình/giây. Để kiểm thử hiệu suất phần cứng, hãy chạy điểm chuẩn bộ chuyển mã nội dung nghe nhìn tại frameworks/av/media/libmediatranscoding/transcoder/benchmark.

Xác nhận kết quả

Để xác thực tính năng chuyển mã nội dung nghe nhìn tương thích, hãy chạy các quy trình kiểm thử CTS sau đây:

  • android.media.mediatranscoding.cts
  • android.mediaprovidertranscode.cts

Bật tính năng chuyển mã nội dung nghe nhìn trên toàn cục

Để kiểm thử khung chuyển mã nội dung nghe nhìn hoặc hành vi của ứng dụng bằng phương thức chuyển mã, bạn có thể bật hoặc tắt tính năng chuyển mã nội dung nghe nhìn tương thích trên toàn hệ thống. Trên trang tuỳ chọn dành cho nhà phát triển Cài đặt > Hệ thống > Nhà phát triển > Chuyển mã nội dung nghe nhìn, hãy đặt nút gạt Ghi đè giá trị mặc định chuyển mã thành bật rồi đặt nút bật/tắt Bật tính năng chuyển mã thành bật hoặc tắt. Nếu bạn bật chế độ cài đặt này, thì quá trình chuyển mã nội dung nghe nhìn có thể diễn ra trong nền cho các ứng dụng khác với ứng dụng bạn đang phát triển.

Kiểm tra trạng thái chuyển mã

Trong quá trình kiểm thử, bạn có thể sử dụng lệnh ADB shell sau đây để kiểm tra trạng thái chuyển mã, bao gồm cả các phiên chuyển mã hiện tại và trước đây:

adb shell dumpsys media.transcoding

Tăng giới hạn thời lượng video

Đối với mục đích kiểm thử, bạn có thể kéo dài giới hạn thời lượng video một phút cho quá trình chuyển mã bằng cách dùng lệnh sau. Bạn có thể phải khởi động lại sau khi chạy lệnh này.

adb shell device_config put storage_native_boot transcode_max_duration_ms <LARGE_NUMBER_IN_MS>

Nguồn và tệp tham chiếu của AOSP (Dự án nguồn mở Android)

Sau đây là mã nguồn AOSP (Dự án nguồn mở Android) liên quan đến quá trình chuyển mã nội dung nghe nhìn tương thích.

Mã hoá HDR sang SDR

Để hỗ trợ mã hoá HDR sang SDR, nhà sản xuất thiết bị có thể sử dụng trình bổ trợ bộ lọc Codec 2.0 mẫu AOSP (Dự án nguồn mở Android) nằm trong /platform/frameworks/av/media/codec2/hidl/plugin/. Phần này mô tả cách hoạt động của trình bổ trợ bộ lọc, cách triển khai trình bổ trợ và cách kiểm thử trình bổ trợ.

Nếu thiết bị không có trình bổ trợ hỗ trợ phương thức mã hoá HDR sang SDR, thì ứng dụng truy cập vào video HDR sẽ nhận được chỉ số mô tả tệp gốc, bất kể chức năng đa phương tiện của ứng dụng được khai báo trong tệp kê khai là gì.

Cách hoạt động

Phần này mô tả hành vi chung của trình bổ trợ bộ lọc Codec 2.0.

Thông tin khái quát

Android cung cấp phương thức triển khai lớp điều chỉnh giữa giao diện Codec 2.0 và giao diện HAL android.hardware.media.c2 tại android::hardware::media::c2. Đối với các trình bổ trợ bộ lọc, AOSP bao gồm một cơ chế trình bao bọc bao bọc bộ giải mã cùng với các trình bổ trợ bộ lọc. MediaCodec nhận dạng các thành phần được gói này là bộ giải mã có các tính năng lọc.

Tổng quan

Lớp FilterWrapper lấy bộ mã hoá và giải mã của nhà cung cấp và trả về bộ mã hoá và giải mã đã gói trở lại lớp điều chỉnh media.c2. Lớp FilterWrapper tải libc2filterplugin.so thông qua API FilterWrapper::Plugin và ghi lại các bộ lọc có sẵn từ trình bổ trợ. Khi được tạo, FilterWrapper sẽ tạo thực thể cho mọi bộ lọc có sẵn. Chỉ những bộ lọc thay đổi vùng đệm mới được bắt đầu khi bắt đầu.

Cấu trúc trình bổ trợ bộ lọc

Hình 1. Cấu trúc trình bổ trợ bộ lọc.

Giao diện trình bổ trợ Lọc

Giao diện FilterPlugin.h xác định các API sau để hiển thị các bộ lọc:

  • std::shared_ptr<C2ComponentStore>getComponentStore()

    Trả về đối tượng C2ComponentStore chứa bộ lọc. Thư viện này khác với nội dung mà hoạt động triển khai Codec 2.0 của nhà cung cấp cho thấy. Thường thì cửa hàng này chỉ chứa các bộ lọc mà lớp FilterWrapper sử dụng.

  • bool describe(C2String name, Descriptor *desc)

    Mô tả các bộ lọc ngoài nội dung có trong C2ComponentStore. Các nội dung mô tả sau đây được xác định:

    • controlParam: Các tham số kiểm soát hành vi của bộ lọc. Ví dụ: đối với trình ánh xạ âm HDR sang SDR, tham số điều khiển là hàm chuyển mục tiêu.
    • affectedParams: Các thông số chịu ảnh hưởng của các thao tác lọc. Ví dụ: đối với trình liên kết tông màu HDR sang SDR, các tham số bị ảnh hưởng là các khía cạnh màu.
  • bool isFilteringEnabled(const std::shared_ptr<C2ComponentInterface> &intf)

    Trả về true nếu thành phần bộ lọc thay đổi vùng đệm. Ví dụ: bộ lọc ánh xạ sắc độ sẽ trả về true nếu hàm chuyển mục tiêu là SDR và hàm chuyển dữ liệu đầu vào là HDR (HLG hoặc PQ).

Thông tin chi tiết về FilterWrapper

Phần này mô tả thông tin chi tiết về lớp FilterWrapper.

dựa trên xu hướng

Thành phần được bao bọc sẽ tạo thực thể cho bộ giải mã cơ bản và tất cả các bộ lọc đã xác định khi tạo.

Truy vấn và cấu hình

Thành phần được bao bọc tách biệt các tham số đến khỏi truy vấn hoặc yêu cầu cấu hình theo nội dung mô tả bộ lọc. Ví dụ: cấu hình của tham số kiểm soát bộ lọc được định tuyến đến bộ lọc tương ứng và các tham số bị ảnh hưởng từ bộ lọc sẽ có trong truy vấn (thay vì đọc từ bộ giải mã không có tham số không bị ảnh hưởng).

Truy vấn và cấu hình

Hình 2. Truy vấn và cấu hình.

Bắt đầu

Khi bắt đầu, thành phần được bao bọc sẽ khởi động bộ giải mã và tất cả các bộ lọc thay đổi vùng đệm. Nếu không có bộ lọc nào được bật, thành phần được bao bọc sẽ khởi động bộ giải mã và vùng đệm truyền, đồng thời gửi lệnh đến chính bộ giải mã.

Xử lý vùng đệm

Xử lý vùng đệm

Hình 3. Xử lý vùng đệm.

Các bộ đệm đã xếp hàng đợi đến bộ giải mã được bao bọc sẽ đi tới bộ giải mã cơ bản. Thành phần được gói sẽ lấy bộ đệm đầu ra từ bộ giải mã thông qua lệnh gọi lại onWorkDone_nb(), sau đó đưa bộ đệm đó vào hàng đợi vào bộ lọc. Vùng đệm đầu ra cuối cùng của bộ lọc cuối cùng sẽ được báo cáo cho ứng dụng.

Để việc xử lý vùng đệm này hoạt động, thành phần được bao bọc phải định cấu hình C2PortBlockPoolsTuning cho bộ lọc cuối cùng để bộ đệm đầu ra khung từ nhóm khối dự kiến.

Dừng, đặt lại và thả ra

Khi dừng, thành phần được bao bọc sẽ dừng bộ giải mã và tất cả các bộ lọc đã bật đã khởi động. Khi đặt lại và phát hành, tất cả các thành phần sẽ được đặt lại hoặc huỷ bỏ bất kể các thành phần đó có được bật hay không.

Triển khai trình bổ trợ bộ lọc mẫu

Để bật trình bổ trợ này, hãy làm như sau:

  1. Triển khai giao diện FilterPlugin trong một thư viện và thả giao diện này vào /vendor/lib[64]/libc2filterplugin.so.
  2. Thêm các quyền khác vào mediacodec.te nếu cần.
  3. Cập nhật lớp thích ứng lên Android 12 và tạo lại dịch vụ media.c2.

Kiểm thử trình bổ trợ

Để kiểm thử trình bổ trợ mẫu, hãy làm như sau:

  1. Tạo lại và cài đặt ROM thiết bị.
  2. Tạo trình bổ trợ mẫu bằng lệnh sau:

    m sample-codec2-filter-plugin
    
  3. Gắn lại thiết bị và đổi tên trình bổ trợ của nhà cung cấp để dịch vụ bộ mã hoá và giải mã nhận dạng được thiết bị.

    adb root
    adb remount
    adb reboot
    adb wait-for-device
    adb root
    adb remount
    adb
    push /out/target/<...>/lib64/sample-codec2-filter-plugin.so \
    
    /vendor/lib64/libc2filterplugin.so
    adb push
    /out/target/<...>/lib/sample-codec2-filter-plugin.so \
    
    /vendor/lib/libc2filterplugin.so
    adb reboot