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

Tính năng 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 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 bộ nhớ để 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, 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ề dung lượng lưu trữ và băng thông. Đố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 (dài tối đa 1 phút) được quay ở các định dạng như HEVC hoặc HDR khi ứng dụng mở video 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 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 tắt theo mặc định. Để yêu cầu chuyển mã nội dung đa phương tiện, ứng dụng phải khai báo các tính năng đa phương tiện của mình. Để biết thêm thông tin về cách khai báo các tính năng đa phương tiện, hãy xem phần Chuyển mã nội dung đa phương tiệ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ã nội dung nghe nhì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. 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 phần 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 thông tin tổng quan về quá trình chuyển mã nội dung đa phương tiệ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ề tính năng chuyển mã tệp đa phương tiện tương thích.

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

Tính năng chuyển mã nội dung đa phương tiệ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): Hoạt động chuyển đổi HDR sang SDR được thực hiện bằng cách sử dụng các thực thể mediacodec và trình bổ trợ của nhà cung cấp được nối vào các thực thể 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 thiết bị thông qua email hoặc thẻ SD.

Ứng dụng truy cập vào các 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 API MediaStore
    • Quyền truy cập vào ứ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 vào ứ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
  • Bỏ qua quá trình chuyển mã:

    • 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ư tính năng Chia sẻ lân cận hoặc chuyển 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 một đườ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.

media-transcoding-architecture

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

Cấu trúc chuyển mã nội dung nghe nhìn bao gồm các thành phần sau:

  • API hệ thống MediaTranscodingManager: Giao diện cho phép ứng dụng giao tiếp với dịch vụ MediaTranscoding. 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 việc chuyển mã. Thư viện này được xây dựng dựa trên khung nội dung đa phương tiện NDK để tương thích với các mô-đun.

Tính năng chuyển mã tệp đa phương tiệ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 thao tác tệp trong không gian người dùng và kiểm soát quyền truy cập vào 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 đa 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 ứng dụng chỉ định trong tệp kê khai hoặc trong danh sách buộc chuyển mã.

Ứng dụng có thể yêu cầu các thành phần được chuyển mã bằ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 ứng dụng cập nhật tệp kê khai bằng các định dạng không được hỗ trợ, bạn phải xoá ứng dụng đó khỏi danh sách buộc chuyển mã. 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ợ bằng khung tương thích ứng dụng tại thời điểm 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 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 các lượt chuyển qua USB (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 videos 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ư minh hoạ 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. Nhấp vào 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 chuyển mã tệp

Để ngăn các yêu cầu chuyển mã khoá 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 phiên liên tiếp
  • tổng thời lượng 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 về 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ị bật tính năng mã hoá 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 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 phép đo điểm chuẩn của trình 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 chương 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ầu

Để kiểm thử khung chuyển mã nội dung nghe nhìn hoặc hành vi của ứng dụng có tính năng 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 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 bật/tắt Ghi đè các giá trị mặc định của tính năng chuyển mã thành bật, sau đó đặ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ì tính năng chuyển mã nội dung nghe nhìn có thể diễn ra ở chế độ nền cho các ứng dụng khác ngoà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 shell ADB 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

Mở rộng giới hạn về thời lượng video

Đối với mục đích kiểm thử, bạn có thể mở rộng 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ể 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 và tệp tham chiếu của AOSP (Dự án nguồn mở Android)

Sau đây là mã nguồn AOSP liên quan đến tính năng chuyển mã tệp đa phương tiệ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ợ 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 ban đầu 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.

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ã được gói lại cho 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ừ 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 khởi động 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ị bộ lọc:

  • std::shared_ptr<C2ComponentStore>getComponentStore()

    Trả về đối tượng C2ComponentStore chứa các bộ lọc. Thông tin này tách biệt với thông tin mà quá trình triển khai Codec 2.0 của nhà cung cấp hiển thị. Thông thường, kho 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 ánh xạ tông màu HDR sang SDR, các tham số bị ảnh hưởng là các 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 thay đổi vùng đệm. Ví dụ: bộ lọc ánh xạ tông màu sẽ trả về true nếu hàm chuyển mục tiêu là SDR và hàm chuyển đầu vào là HDR (HLG hoặc PQ).

Thông tin chi tiết về FilterWrapper

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

dựa trên xu hướng

Thành phần được gói tạo bản sao của bộ giải mã cơ bản và tất cả bộ lọc đã xác định tại thời điểm 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ố đ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ừ 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 thay đổi vùng đệm. Nếu không bật bộ lọc nào, thành phần được gói sẽ khởi động bộ giải mã và vùng đệm truyền qua, đồ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 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() rồi đưa bộ đệm này vào hàng đợi. 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à nhả

Khi dừng, thành phần được gói sẽ dừng bộ giải mã và tất cả bộ lọc đã bật đã bắt đầu. 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 phát hành bất kể chúng 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ợ, 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. Kết nối 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 ra trình bổ trợ đó.

    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