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 (ra mắt 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 và tiết kiệm bộ nhớ hơn để quay video, chẳng hạn như HEVC, đồng thời 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 yêu cầu về bộ nhớ và băng thông. Đối với những 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 một phút) được 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 đó. Nhờ đó, các ứng dụng có thể hoạt động ngay cả khi video được quay ở các định dạng mới hơn trên thiết bị.

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 nghe nhìn, các ứ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 chức năng liên quan đến nội dung nghe nhìn, hãy xem phần Khả năng 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 2 phần chính:

  • Dịch vụ chuyển mã trong khung đ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à chất lượng chuyển đổi cao. Trong đó có API chuyển mã, dịch vụ chuyển mã, một trình bổ trợ OEM cho các 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ã tệp đa phương tiện tương thích trong trình cung cấp nội dung nghe nhìn: Thành phần này có trong trình cung cấp nội dung nghe nhìn sẽ chặn các ứng dụng truy cập vào 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 một ứng dụng hỗ trợ định dạng của tệp đa phương tiện, thì không cần 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ề quy 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ề 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ã tệp đ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á 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 các phiên bản mediacodec và một lệnh gọi plugin của nhà cung cấp 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ã phương tiện tương thích hỗ trợ phương tiện trên thiết bị do ứng dụng camera gốc của OEM tạo ra và được lưu trữ trong thư mục DCIM/Camera/ trong ổ đĩa ngoài chính. Tính năng này không hỗ trợ nội dung nghe nhìn trên bộ nhớ phụ. Chúng tôi không hỗ trợ nội dung được chuyển đến 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. 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 của ứ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ả mã 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 Intent của trang tính chia sẻ trên 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ã:

    • Chuyể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 lựa chọn như 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 hãng vận chuyển hoặc quy định của địa phương.

Để thêm đường dẫn tệp, hãy dùng lớp phủ tài nguyên thời gian chạy (RRO) đường dẫn chuyển mã, 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 các đườ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. Cấu 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.
  • MediaTranscodingService: Dịch vụ gốc quản lý các kết nối của ứng dụng, lên lịch 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 NDK khung đa phương tiện để 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 sẽ ghi lại các chỉ số chuyển mã trong cả dịch vụ và bộ chuyển mã tệp đa 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 sửa lỗi và cập nhật kịp thời.

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

Tính năng 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 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 trên tệp trong không gian người dùng và hạn chế 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 chỉnh sửa 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 của ứng dụng. Nếu ứng dụng hỗ trợ một đị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, 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ộ nhớ đệm nếu có phiên bản đã chuyển mã.

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

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. Ứng dụng có thể yêu cầu tài sản được chuyển mã bằng các lựa 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 các chức năng trong một tài nguyênKhai báo các chức năng trong mã.
  • Tắt các định dạng được hỗ trợ bằng khung tương thích ứng dụng tại 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 phần Cài đặt).
  • Mở một 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 hoạt động truyền dữ liệu qua USB (từ thiết bị sang máy tính), theo mặc định, tính năng chuyển mã sẽ bị tắt nhưng người dùng có thể chọn bật tính năng này bằng cách dùng nút bật/tắt Chuyển đổi video sang AVC trong màn hình cài đặt Lựa chọn ưu tiên về USB như minh hoạ trong Hình 3.

Bật/tắt để bật tính năng chuyển mã nội dung nghe nhìn

Hình 3. Bật chế độ chuyển mã nội dung nghe nhìn trong màn hình USB Preferences (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 được chuyển mã

Để 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ã sẽ 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ề giá trị nhận dạng tệp ban đầu.

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ị có tính năng mã hoá HEVC được bật theo mặc định trên ứng dụng máy ảnh gốc
  • (Các thiết bị hỗ trợ chuyển mã HDR sang SDR) Thiết bị hỗ trợ tính năng quay video HDR

Để đảm bảo hiệu suất của thiết bị trong quá trình chuyển mã phương tiện, bạn phải tối ưu hoá hiệu suất truy cập đọc/ghi của phần cứng video và bộ nhớ. Khi 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ể. Bạn nên đảm bảo hiệu suất chuyển mã đạt tối thiểu 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 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ã tệp đa phương tiện tương thích, hãy chạy các kiểm thử CTS sau:

  • 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ã tệp đa phương tiện hoặc hành vi của ứng dụng khi chuyển mã, bạn có thể bật hoặc tắt tính năng chuyển mã tệp đa phương tiện tương thích trên toàn cầu. 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 đè chế độ chuyển mã mặc định thành bật rồi đặt nút bật/tắt Bật chế độ 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 ở chế độ nền cho các ứng dụng khác ngoài ứng dụng mà 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 thời lượng video

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

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á từ HDR sang SDR

Để hỗ trợ mã hoá HDR sang SDR, các 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 của AOSP 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 một thiết bị không có trình bổ trợ hỗ trợ mã hoá HDR sang SDR, thì một ứng dụng truy cập vào video HDR sẽ nhận được bộ mô tả tệp gốc bất kể các 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 một cách triển khai lớp thích ứng 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 giúp bao bọc cá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 bao bọc này dưới dạng bộ giải mã có các tính năng lọc.

Tổng quan

Lớp FilterWrapper lấy các bộ mã hoá và giải mã của nhà cung cấp rồi trả về các bộ mã hoá và giải mã được bao bọc 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 tạo, FilterWrapper sẽ khởi tạo tất cả các bộ lọc có sẵn. Chỉ những bộ lọc làm thay đổi vùng đệm mới được bắt đầu khi khởi động.

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

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

Giao diện trình bổ trợ bộ 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ề một đối tượng C2ComponentStore chứa các bộ lọc. Điều này tách biệt với những gì mà việc triển khai Codec 2.0 của nhà cung cấp cho thấy. Thông thường, kho lưu trữ 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 những bộ lọc có trong C2ComponentStore. Sau đây là nội dung mô tả đượ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ạ tông màu HDR sang SDR, tham số kiểm soát là hàm truyền mục tiêu.
    • affectedParams: Các tham 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 thông 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 làm thay đổi vùng đệm. Ví dụ: bộ lọc ánh xạ tông màu sẽ 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).

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 bao bọc sẽ tạo phiên bản 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 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 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 5. 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 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à các 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 6. Xử lý vùng đệm.

Các vùng đệm được xếp hàng đợi vào bộ giải mã bao bọc 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 một lệnh gọi lại onWorkDone_nb(), sau đó xếp hàng bộ đệm đó vào 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 ứng dụng.

Để hoạt động 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 thành bộ lọc cuối cùng để vùng đệm đầu ra của khung hình từ nhóm khối dự kiến.

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

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à 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ợ 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 đó tại /vendor/lib[64]/libc2filterplugin.so.
  2. Thêm các quyền bổ sung 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à flash 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ụ codec nhận dạng được 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