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

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

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

Làm thế nào nó hoạt động

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

  • Dịch vụ chuyển mã trong khung 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 cách sử dụng phần cứng để có độ trễ thấp và chuyển đổi chất lượng cao. Điều này bao gồm API chuyển mã, dịch vụ chuyển mã, plugin OEM cho các bộ lọc tùy chỉnh và phần cứng. Để biết thêm chi tiết, xem Tổng quan về kiến ​​trúc .
  • Tính năng chuyển mã phương tiện tương thích trong nhà cung cấp phương tiện: Thành phần này có trong nhà cung cấp phương tiện sẽ chặn các ứng dụng truy cập vào tệp phương tiện và phân phát tệp gốc hoặc tệp được chuyển mã dựa trên khả năng đã khai báo của ứng dụng. Nếu ứng dụng hỗ trợ định dạng của tệp phương tiện thì không cần xử lý đặc biệt. Nếu ứ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 thể hiện tổng quan về quá trình chuyển mã phương tiện.

Quá trình chuyển mã phương tiện tương thích

Hình 1. Tổng quan về chuyển mã phương tiện tương thích.

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

Tính năng chuyển mã phương tiện tương thích hỗ trợ chuyển đổi định dạng sau:

  • HEVC (8-bit) sang AVC: Chuyển đổi Codec đượ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ã hóa mediacode.
  • HDR10+ (10-bit) sang AVC (SDR): Quá trình chuyển đổi HDR sang SDR được thực hiện bằng cách sử dụng phiên bản mediacodec và plugin của nhà cung cấp nối vào phiên bản bộ giải mã. Để biết thêm thông tin, hãy xem Mã hóa HDR sang SDR .

Nguồn nội dung được hỗ trợ

Tính năng chuyển mã phương tiện tương thích hỗ trợ phương tiện trên thiết bị được tạo bởi ứng dụng máy ảnh OEM gốc được lưu trữ trong thư mục DCIM/Camera/ ở ổ đĩa chính bên ngoài. Tính năng này không hỗ trợ phương tiện trên bộ lưu trữ thứ cấp. Nội dung được truyền tới thiết bị qua email hoặc thẻ SD không được hỗ trợ.

Ứng dụng truy cập các tệp dựa trên các đường dẫn tệp khác nhau. Phần sau đây mô tả các đường dẫn tệp nơi chuyển mã được bật hoặc bỏ qua:

  • Đã bật chuyển mã:

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

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

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

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

Để thêm đường dẫn tệp, hãy sử dụng lớp phủ tài nguyên thời gian chạy đường dẫn chuyển mã (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 được đị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ề kiến ​​trúc

Phần này mô tả kiến ​​trúc của tính năng chuyển mã phương tiện.

kiến trúc chuyển mã đa phương tiện

Hình 2. Kiến trúc chuyển mã phương tiện.

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

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

Tính năng chuyển mã phương tiện tương thích ghi lại số liệu chuyển mã trong cả dịch vụ và bộ chuyển mã phương tiện. Mã phía máy khách và phía dịch vụ nằm trong mô-đun MediaProvider để cho phép cập nhật và sửa lỗi kịp thời.

Truy cập file

Chuyển mã phương tiện tương thích được xây dựng dựa trên hệ thống tệp Hệ thống tệp trong không gian người dùng (FUSE) , được sử dụng để lưu trữ trong phạm vi. FUSE cho phép mô-đun MediaProvider kiểm tra các hoạt động của tệp trong không gian người dùng và truy cập cổng 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 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), tệp gốc sẽ được trả về. Nếu ứng dụng không hỗ trợ định dạng này thì tệp sẽ được chuyển mã sang định dạng cũ hơn (chẳng hạn như AVC) hoặc được trả về từ bộ đệm nếu có sẵn phiên bản chuyển mã.

Yêu cầu tập tin được chuyển mã

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

Ứng dụng có thể yêu cầu nội dung được chuyển mã bằng các tùy chọn sau:

  • Khai báo các định dạng không được hỗ trợ trong tệp kê khai. Để biết chi tiết, hãy xem Khai báo các khả năng trong tài nguyênKhai báo các khả năng trong mã .
  • Thêm ứng dụng vào danh sách chuyển mã bắt buộc có trong mô-đun MediaProvider . Điều này cho phép chuyển mã cho các ứng dụng chưa cập nhật tệp kê khai của chúng. Sau khi ứng dụng cập nhật tệp kê khai có định dạng không được hỗ trợ, ứng dụng đó phải bị xóa 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 xóa ứng dụng của họ khỏi danh sách chuyển mã bắt buộc bằng cách gửi bản vá hoặc báo cáo lỗi . Nhóm Android xem xét danh sách định kỳ và có thể xóa ứ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 tính năng này cho từng ứng dụng trong Cài đặt).
  • Mở tệp bằng 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 truyền USB (thiết bị sang PC), chuyển mã bị tắt theo mặc định nhưng người dùng có thể chọn bật chuyển mã bằng cách sử dụng nút chuyển đổi Chuyển đổi video sang AVC trong màn hình cài đặt Tùy chọn USB như trong Hình 3.

Chuyển đổi để bật chuyển mã phương tiện

Hình 3. Chuyển đổi để bật chuyển mã phương tiện trong màn hình Tùy chọn USB.

Hạn chế về việc yêu cầu các tập tin được chuyển mã

Để ngăn các yêu cầu chuyển mã khóa tài nguyên hệ thống trong 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 buổi liên tiếp
  • tổng thời gian chạy là ba 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ề bộ mô tả tệp gốc.

Yêu cầu về thiết bị

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

  • Thiết bị đã bật mã hóa HEVC theo mặc định trên ứng dụng máy ảnh 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 thiết bị cho việc chuyển mã phương tiện, hiệu suất truy cập đọc/ghi của phần cứng video và bộ lưu trữ phải được tối ưu hóa. Khi các codec đa phương tiện được định cấu hình với mức độ ưu tiên bằng 1 , các codec đó phải hoạt động ở thông lượng cao nhất có thể. Chúng tôi khuyên bạn nên đạt hiệu suất chuyển mã tối thiểu là 200 khung hình/giây. Để kiểm tra hiệu suất phần cứng của bạn, hãy chạy điểm chuẩn bộ chuyển mã phương tiện tại frameworks/av/media/libmediatranscoding/transcoder/benchmark .

Thẩm định

Để xác thực tính năng chuyển mã phương tiện tương thích, hãy chạy các bài kiểm tra CTS sau:

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

Cho phép chuyển mã phương tiện trên toàn cầu

Để kiểm tra khung chuyển mã phương tiện hoặc hoạt động của ứng dụng bằng tính năng chuyển mã, bạn có thể bật hoặc tắt tính năng chuyển mã phương tiện tương thích trên toàn cầu. Trong trang Cài đặt > Hệ thống > Nhà phát triển > Tùy chọn nhà phát triển chuyển mã phương tiện , hãy đặt nút chuyển đổi Ghi đè mặc định chuyển mã thành bật rồi đặt nút chuyển đổi Bật chuyển mã thành bật hoặc tắt . Nếu cài đặt này được bật, việc chuyển mã phương tiện có thể diễn ra ở chế độ nền đối với các ứng dụng không phải là ứng dụng bạn đang phát triển.

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

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

adb shell dumpsys media.transcoding

Mở rộng giới hạn độ dài video

Với mục đích thử nghiệm, bạn có thể mở rộng giới hạn độ dài video một phút để chuyển mã bằng cách sử dụng lệnh sau. Có thể cần 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 AOSP và tài liệu tham khảo

Sau đây là mã nguồn AOSP liên quan đến chuyển mã phương tiện tương thích.

Mã hóa HDR sang SDR

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

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

Làm thế nào nó hoạt động

Phần này mô tả hoạt động chung của plugin bộ lọc Codec 2.0.

Lý lịch

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

Tổng quan

Lớp FilterWrapper lấy codec của nhà cung cấp và trả các codec được gói trở lại lớp thích ứng 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ừ plugin. Khi tạo, FilterWrapper khởi tạo tất cả các bộ lọc có sẵn. Chỉ các bộ lọc làm thay đổi bộ đệm mới được khởi động khi bắt đầu.

Kiến trúc plugin lọc

Hình 1. Kiến trúc plugin lọc.

Giao diện plugin 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 có chứa các bộ lọc. Điều này khác với những gì triển khai Codec 2.0 của nhà cung cấp cho thấy. Thông thường, cửa hàng này chỉ chứa các bộ lọc được lớp FilterWrapper sử dụng.

  • bool describe(C2String name, Descriptor *desc)

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

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

    Trả về true nếu thành phần bộ lọc làm thay đổi bộ đệm. Ví dụ: bộ lọc ánh xạ giai điệu trả về true nếu hàm truyền mục tiêu là SDR và ​​hàm truyền đầu vào là HDR (HLG hoặc PQ).

Chi tiết về FilterWrapper

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

Sự sáng tạo

Thành phần được bao bọc khởi tạo bộ giải mã cơ bản và tất cả các bộ lọc được xác định khi tạo.

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

Thành phần được bao bọc sẽ tách các tham số đến khỏi các truy vấn hoặc yêu cầu cấu hình theo mô tả bộ lọc. Ví dụ: cấu hình của tham số điều khiển bộ lọc được định tuyến đến bộ lọc tương ứng và các tham số bị ảnh hưởng từ các bộ lọc sẽ xuất hiện trên các truy vấn (thay vì đọc từ bộ giải mã có cá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 làm thay đổi bộ đệ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à bộ đệm truyền qua, đồng thời gửi lệnh đến chính bộ giải mã.

Xử lý bộ đệm

Xử lý bộ đệm

Hình 3. Xử lý bộ đệm.

Bộ đệm được xếp hàng đợi tới bộ giải mã được gói sẽ chuyển đến bộ giải mã cơ bản. Thành phần được bao bọc 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 nó vào hàng đợi cho các bộ lọc. Bộ đệm đầu ra cuối cùng từ bộ lọc cuối cùng được báo cáo cho máy khách.

Để việc xử lý bộ đệ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 để khung đầu ra đệm từ nhóm khối dự kiến.

Dừng, thiết lập lại và phát hành

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 đã được khởi động. Khi đặt lại và giải phóng, tất cả các thành phần sẽ được đặt lại hoặc giải phóng bất kể chúng có được bật hay không.

Triển khai plugin bộ lọc mẫu

Để kích hoạt plugin, hãy làm như sau:

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

Kiểm tra phần bổ trợ

Để kiểm tra plugin mẫu, hãy làm như sau:

  1. Xây dựng lại và flash thiết bị.
  2. Xây dựng plugin mẫu bằng lệnh sau:

    m sample-codec2-filter-plugin
    
  3. Gắn lại thiết bị và đổi tên plugin của nhà cung cấp để dịch vụ codec nhận ra nó.

    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