From a9b03a6bc2a5bd4f38bca91a5c7a3b6629dce971 Mon Sep 17 00:00:00 2001 From: Lajos Molnar Date: Mon, 5 Jun 2023 19:32:21 -0700 Subject: [PATCH] media: clarify the use of profiles for MediaCodec encoders Bug: 245189059 Change-Id: Ib38a6b0af75f43e88a978e88073bc75d8a604cb1 --- media/java/android/media/MediaCodec.java | 45 +++++++++++++++++++++++ media/java/android/media/MediaFormat.java | 5 ++- 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java index 32680dae75b95..38bb447f8a169 100644 --- a/media/java/android/media/MediaCodec.java +++ b/media/java/android/media/MediaCodec.java @@ -359,6 +359,51 @@ import java.util.concurrent.locks.ReentrantLock; codec to use a previously created {@linkplain #createPersistentInputSurface persistent input surface} by calling {@link #setInputSurface}. +

Encoder Profiles

+

+ When using an encoder, it is recommended to set the desired codec {@link MediaFormat#KEY_PROFILE + profile} during {@link #configure configure()}. (This is only meaningful for + {@link MediaFormat#KEY_MIME media formats} for which profiles are defined.) +

+ If a profile is not specified during {@code configure}, the encoder will choose a profile for the + session based on the available information. We will call this value the default profile. + The selection of the default profile is device specific and may not be deterministic + (could be ad hoc or even experimental). The encoder may choose a default profile that is not + suitable for the intended encoding session, which may result in the encoder ultimately rejecting + the session. +

+ The encoder may reject the encoding session if the configured (or default if unspecified) profile + does not support the codec input (mainly the {@link MediaFormat#KEY_COLOR_FORMAT color format} for + video/image codecs, or the {@link MediaFormat#KEY_PCM_ENCODING sample encoding} and the {@link + MediaFormat#KEY_CHANNEL_COUNT number of channels} for audio codecs, but also possibly + {@link MediaFormat#KEY_WIDTH width}, {@link MediaFormat#KEY_HEIGHT height}, + {@link MediaFormat#KEY_FRAME_RATE frame rate}, {@link MediaFormat#KEY_BIT_RATE bitrate} or + {@link MediaFormat#KEY_SAMPLE_RATE sample rate}.) + Alternatively, the encoder may choose to (but is not required to) convert the input to support the + selected (or default) profile - or adjust the chosen profile based on the presumed or detected + input format - to ensure a successful encoding session. Note: Converting the input to match + an incompatible profile will in most cases result in decreased codec performance. +

+ To ensure backward compatibility, the following guarantees are provided by Android: +

+

+ Note: the accepted profile can be queried through the {@link #getOutputFormat output + format} of the encoder after {@code configure} to allow applications to set up their + codec input to a format supported by the encoder profile. +

+ Implication: +

+

Codec-specific Data

Some formats, notably AAC audio and MPEG4, H.264 and H.265 video formats require the actual data diff --git a/media/java/android/media/MediaFormat.java b/media/java/android/media/MediaFormat.java index b1b7d40006353..46db777085217 100644 --- a/media/java/android/media/MediaFormat.java +++ b/media/java/android/media/MediaFormat.java @@ -1136,11 +1136,14 @@ public final class MediaFormat { * may fail if other parameters are not compatible with the desired * profile or if the desired profile is not supported, but it may also * fail silently (where the encoder ends up using a different, compatible profile.) + *

+ * It is recommended that the profile is set for all encoders. For more information, see + * the Encoder Profiles section of the {@link MediaCodec} API reference. *

* Note: Codecs are free to use all the available * coding tools at the specified profile, but may ultimately choose to not do so. *

- * Note: When configuring video encoders, profile must be + * Note: When configuring video encoders, profile (if set) must be * set together with {@link #KEY_LEVEL level}. * * @see MediaCodecInfo.CodecCapabilities#profileLevels