Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7adef106 authored by Wonsik Kim's avatar Wonsik Kim Committed by Gerrit Code Review
Browse files

Merge "media: add security model APIs" into main

parents d1f660ad 27ae8530
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -22762,12 +22762,16 @@ package android.media {
    method @NonNull public String getCanonicalName();
    method public android.media.MediaCodecInfo.CodecCapabilities getCapabilitiesForType(String);
    method @NonNull public String getName();
    method @FlaggedApi("android.media.codec.in_process_sw_audio_codec") public int getSecurityModel();
    method public String[] getSupportedTypes();
    method public boolean isAlias();
    method public boolean isEncoder();
    method public boolean isHardwareAccelerated();
    method public boolean isSoftwareOnly();
    method public boolean isVendor();
    field @FlaggedApi("android.media.codec.in_process_sw_audio_codec") public static final int SECURITY_MODEL_MEMORY_SAFE = 1; // 0x1
    field @FlaggedApi("android.media.codec.in_process_sw_audio_codec") public static final int SECURITY_MODEL_SANDBOXED = 0; // 0x0
    field @FlaggedApi("android.media.codec.in_process_sw_audio_codec") public static final int SECURITY_MODEL_TRUSTED_CONTENT_ONLY = 2; // 0x2
  }
  public static final class MediaCodecInfo.AudioCapabilities {
@@ -23602,6 +23606,9 @@ package android.media {
    field public static final int COLOR_TRANSFER_LINEAR = 1; // 0x1
    field public static final int COLOR_TRANSFER_SDR_VIDEO = 3; // 0x3
    field public static final int COLOR_TRANSFER_ST2084 = 6; // 0x6
    field @FlaggedApi("android.media.codec.in_process_sw_audio_codec") public static final int FLAG_SECURITY_MODEL_MEMORY_SAFE = 2; // 0x2
    field @FlaggedApi("android.media.codec.in_process_sw_audio_codec") public static final int FLAG_SECURITY_MODEL_SANDBOXED = 1; // 0x1
    field @FlaggedApi("android.media.codec.in_process_sw_audio_codec") public static final int FLAG_SECURITY_MODEL_TRUSTED_CONTENT_ONLY = 4; // 0x4
    field public static final String KEY_AAC_DRC_ALBUM_MODE = "aac-drc-album-mode";
    field public static final String KEY_AAC_DRC_ATTENUATION_FACTOR = "aac-drc-cut-level";
    field public static final String KEY_AAC_DRC_BOOST_FACTOR = "aac-drc-boost-level";
@@ -23683,6 +23690,7 @@ package android.media {
    field public static final String KEY_REPEAT_PREVIOUS_FRAME_AFTER = "repeat-previous-frame-after";
    field public static final String KEY_ROTATION = "rotation-degrees";
    field public static final String KEY_SAMPLE_RATE = "sample-rate";
    field @FlaggedApi("android.media.codec.in_process_sw_audio_codec") public static final String KEY_SECURITY_MODEL = "security-model";
    field public static final String KEY_SLICE_HEIGHT = "slice-height";
    field public static final String KEY_SLOW_MOTION_MARKERS = "slow-motion-markers";
    field public static final String KEY_STRIDE = "stride";
+53 −0
Original line number Diff line number Diff line
@@ -20,10 +20,12 @@ import static android.media.Utils.intersectSortedDistinctRanges;
import static android.media.Utils.sortDistinctRanges;
import static android.media.codec.Flags.FLAG_DYNAMIC_COLOR_ASPECTS;
import static android.media.codec.Flags.FLAG_HLG_EDITING;
import static android.media.codec.Flags.FLAG_IN_PROCESS_SW_AUDIO_CODEC;
import static android.media.codec.Flags.FLAG_NULL_OUTPUT_SURFACE;
import static android.media.codec.Flags.FLAG_REGION_OF_INTEREST;

import android.annotation.FlaggedApi;
import android.annotation.IntDef;
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -40,6 +42,8 @@ import android.util.Range;
import android.util.Rational;
import android.util.Size;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -1808,6 +1812,55 @@ public final class MediaCodecInfo {
        }
    }

    /** @hide */
    @IntDef(prefix = {"SECURITY_MODEL_"}, value = {
        SECURITY_MODEL_SANDBOXED,
        SECURITY_MODEL_MEMORY_SAFE,
        SECURITY_MODEL_TRUSTED_CONTENT_ONLY,
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface SecurityModel {}

    /**
     * In this model the codec is running in a sandboxed process. Even if a
     * malicious content was fed to the codecs in this model, the impact will
     * be contained in the sandboxed process.
     */
    @FlaggedApi(FLAG_IN_PROCESS_SW_AUDIO_CODEC)
    public static final int SECURITY_MODEL_SANDBOXED = 0;
    /**
     * In this model the codec is not running in a sandboxed process, but
     * written in a memory-safe way. It typically means that the software
     * implementation of the codec is written in a memory-safe language such
     * as Rust.
     */
    @FlaggedApi(FLAG_IN_PROCESS_SW_AUDIO_CODEC)
    public static final int SECURITY_MODEL_MEMORY_SAFE = 1;
    /**
     * In this model the codec is suitable only for trusted content where
     * the input can be verified to be well-formed and no malicious actor
     * can alter it. For example, codecs in this model are not suitable
     * for arbitrary media downloaded from the internet or present in a user
     * directory. On the other hand, they could be suitable for media encoded
     * in the backend that the app developer wholly controls.
     * <p>
     * Codecs with this security model is not included in
     * {@link MediaCodecList#REGULAR_CODECS}, but included in
     * {@link MediaCodecList#ALL_CODECS}.
     */
    @FlaggedApi(FLAG_IN_PROCESS_SW_AUDIO_CODEC)
    public static final int SECURITY_MODEL_TRUSTED_CONTENT_ONLY = 2;

    /**
     * Query the security model of the codec.
     */
    @FlaggedApi(FLAG_IN_PROCESS_SW_AUDIO_CODEC)
    @SecurityModel
    public int getSecurityModel() {
        // TODO b/297922713 --- detect security model of out-of-sandbox codecs
        return SECURITY_MODEL_SANDBOXED;
    }

    /**
     * A class that supports querying the video capabilities of a codec.
     */
+54 −0
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package android.media;

import static android.media.codec.Flags.FLAG_IN_PROCESS_SW_AUDIO_CODEC;

import static com.android.media.codec.flags.Flags.FLAG_CODEC_IMPORTANCE;
import static com.android.media.codec.flags.Flags.FLAG_LARGE_AUDIO_FRAME;

@@ -1715,6 +1717,58 @@ public final class MediaFormat {
    @FlaggedApi(FLAG_CODEC_IMPORTANCE)
    public static final String KEY_IMPORTANCE = "importance";

    /** @hide */
    @IntDef(flag = true, prefix = {"FLAG_SECURITY_MODEL_"}, value = {
        FLAG_SECURITY_MODEL_SANDBOXED,
        FLAG_SECURITY_MODEL_MEMORY_SAFE,
        FLAG_SECURITY_MODEL_TRUSTED_CONTENT_ONLY,
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface SecurityModelFlag {}

    /**
     * Flag for {@link MediaCodecInfo#SECURITY_MODEL_SANDBOXED}.
     */
    @FlaggedApi(FLAG_IN_PROCESS_SW_AUDIO_CODEC)
    public static final int FLAG_SECURITY_MODEL_SANDBOXED =
            (1 << MediaCodecInfo.SECURITY_MODEL_SANDBOXED);
    /**
     * Flag for {@link MediaCodecInfo#SECURITY_MODEL_MEMORY_SAFE}.
     */
    @FlaggedApi(FLAG_IN_PROCESS_SW_AUDIO_CODEC)
    public static final int FLAG_SECURITY_MODEL_MEMORY_SAFE =
            (1 << MediaCodecInfo.SECURITY_MODEL_MEMORY_SAFE);
    /**
     * Flag for {@link MediaCodecInfo#SECURITY_MODEL_TRUSTED_CONTENT_ONLY}.
     */
    @FlaggedApi(FLAG_IN_PROCESS_SW_AUDIO_CODEC)
    public static final int FLAG_SECURITY_MODEL_TRUSTED_CONTENT_ONLY =
            (1 << MediaCodecInfo.SECURITY_MODEL_TRUSTED_CONTENT_ONLY);

    /**
     * A key describing the requested security model as flags.
     * <p>
     * The associated value is a flag of the following values:
     * {@link FLAG_SECURITY_MODEL_SANDBOXED},
     * {@link FLAG_SECURITY_MODEL_MEMORY_SAFE},
     * {@link FLAG_SECURITY_MODEL_TRUSTED_CONTENT_ONLY}. The default value is
     * {@link FLAG_SECURITY_MODEL_SANDBOXED}.
     * <p>
     * When passed to {@link MediaCodecList#findDecoderForFormat} or
     * {@link MediaCodecList#findEncoderForFormat}, MediaCodecList filters
     * the security model of the codecs according to this flag value.
     * <p>
     * When passed to {@link MediaCodec#configure}, MediaCodec verifies
     * the security model matches the flag value passed, and throws
     * {@link java.lang.IllegalArgumentException} if the model does not match.
     * <p>
     * @see MediaCodecInfo#getSecurityModel
     * @see MediaCodecList#findDecoderForFormat
     * @see MediaCodecList#findEncoderForFormat
     */
    @FlaggedApi(FLAG_IN_PROCESS_SW_AUDIO_CODEC)
    public static final String KEY_SECURITY_MODEL = "security-model";

    /* package private */ MediaFormat(@NonNull Map<String, Object> map) {
        mMap = map;
    }