diff options
| author | 2024-11-01 18:42:31 +0000 | |
|---|---|---|
| committer | 2024-11-12 21:59:58 +0000 | |
| commit | 71d43ec84d4f5f1d510afd6d5d3e10f4c6c1661b (patch) | |
| tree | 8d9623a633e0de10f46a90a01408cc3a9b661608 | |
| parent | aa758f27e6b493333b62cc7485f7df1dd6b3d31d (diff) | |
MediaCodec: define available and required resources test api
Bug: 363282971
Test: build and boot, manual testing
Flag: android.media.codec.codec_availability
Change-Id: I8aead061c5d32daf8d0740ea0517d06ae47f42e6
| -rw-r--r-- | core/api/test-current.txt | 23 | ||||
| -rw-r--r-- | media/java/android/media/MediaCodec.java | 166 |
2 files changed, 188 insertions, 1 deletions
diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 79c4fb653542..59327c8afecc 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -2044,6 +2044,29 @@ package android.media { method public boolean isAidlHal(); } + public final class MediaCodec { + method @FlaggedApi("android.media.codec.codec_availability") @NonNull public static java.util.List<android.media.MediaCodec.GlobalResourceInfo> getGloballyAvailableResources(); + method @FlaggedApi("android.media.codec.codec_availability") @NonNull public java.util.List<android.media.MediaCodec.InstanceResourceInfo> getRequiredResources(); + } + + public abstract static class MediaCodec.Callback { + method @FlaggedApi("android.media.codec.codec_availability") public void onRequiredResourcesChanged(@NonNull android.media.MediaCodec); + } + + @FlaggedApi("android.media.codec.codec_availability") public static final class MediaCodec.GlobalResourceInfo { + ctor public MediaCodec.GlobalResourceInfo(); + method public long getAvailable(); + method public long getCapacity(); + method @NonNull public String getName(); + } + + @FlaggedApi("android.media.codec.codec_availability") public static final class MediaCodec.InstanceResourceInfo { + ctor public MediaCodec.InstanceResourceInfo(); + method @NonNull public String getName(); + method public long getPerFrameCount(); + method public long getStaticCount(); + } + public static final class MediaCodecInfo.VideoCapabilities.PerformancePoint { ctor public MediaCodecInfo.VideoCapabilities.PerformancePoint(int, int, int, int, @NonNull android.util.Size); ctor public MediaCodecInfo.VideoCapabilities.PerformancePoint(@NonNull android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint, @NonNull android.util.Size); diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java index 2ae89d3300c1..82e950365850 100644 --- a/media/java/android/media/MediaCodec.java +++ b/media/java/android/media/MediaCodec.java @@ -16,6 +16,7 @@ package android.media; +import static android.media.codec.Flags.FLAG_CODEC_AVAILABILITY; import static android.media.codec.Flags.FLAG_NULL_OUTPUT_SURFACE; import static android.media.codec.Flags.FLAG_REGION_OF_INTEREST; import static android.media.codec.Flags.FLAG_SUBSESSION_METRICS; @@ -29,6 +30,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; +import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.graphics.ImageFormat; import android.graphics.Rect; @@ -1843,6 +1845,12 @@ final public class MediaCodec { */ private static final int CB_METRICS_FLUSHED = 8; + /** + * Callback ID to notify the change in resource requirement + * for the codec component. + */ + private static final int CB_REQUIRED_RESOURCES_CHANGE = 9; + private class EventHandler extends Handler { private MediaCodec mCodec; @@ -2017,13 +2025,19 @@ final public class MediaCodec { case CB_METRICS_FLUSHED: { - if (GetFlag(() -> android.media.codec.Flags.subsessionMetrics())) { mCallback.onMetricsFlushed(mCodec, (PersistableBundle)msg.obj); } break; } + case CB_REQUIRED_RESOURCES_CHANGE: { + if (android.media.codec.Flags.codecAvailability()) { + mCallback.onRequiredResourcesChanged(mCodec); + } + break; + } + default: { break; @@ -2302,6 +2316,70 @@ final public class MediaCodec { } /** + * @hide + * Abstraction for the Global Codec resources. + * This encapsulates all the available codec resources on the device. + * + * To be able to enforce and test the implementation of codec availability hal APIs, + * globally available codec resources are exposed only as TestApi. + * This will be tracked and verified through cts. + */ + @FlaggedApi(FLAG_CODEC_AVAILABILITY) + @TestApi + public static final class GlobalResourceInfo { + /** + * Identifier for the Resource type. + */ + String mName; + /** + * Total count/capacity of resources of this type. + */ + long mCapacity; + /** + * Available count of this resource type. + */ + long mAvailable; + + @NonNull + public String getName() { + return mName; + } + + public long getCapacity() { + return mCapacity; + } + + public long getAvailable() { + return mAvailable; + } + }; + + /** + * @hide + * Get a list of globally available codec resources. + * + * To be able to enforce and test the implementation of codec availability hal APIs, + * it is exposed only as TestApi. + * This will be tracked and verified through cts. + * + * This returns a {@link java.util.List} list of codec resources. + * For every {@link GlobalResourceInfo} in the list, it encapsulates the + * information about each resources available globaly on device. + * + * @return A list of available device codec resources; an empty list if no + * device codec resources are available. + * @throws UnsupportedOperationException if not implemented. + */ + @FlaggedApi(FLAG_CODEC_AVAILABILITY) + @TestApi + public static @NonNull List<GlobalResourceInfo> getGloballyAvailableResources() { + return native_getGloballyAvailableResources(); + } + + @NonNull + private static native List<GlobalResourceInfo> native_getGloballyAvailableResources(); + + /** * Configures a component. * * @param format The format of the input data (decoder) or the desired @@ -2443,6 +2521,73 @@ final public class MediaCodec { } /** + * @hide + * Abstraction for the resources associated with a codec instance. + * This encapsulates the required codec resources for a configured codec instance. + * + * To be able to enforce and test the implementation of codec availability hal APIs, + * required codec resources are exposed only as TestApi. + * This will be tracked and verified through cts. + */ + @FlaggedApi(FLAG_CODEC_AVAILABILITY) + @TestApi + public static final class InstanceResourceInfo { + /** + * Identifier for the Resource type. + */ + String mName; + /** + * Required resource count of this type. + */ + long mStaticCount; + /** + * Per frame resource requirement of this resource type. + */ + long mPerFrameCount; + + @NonNull + public String getName() { + return mName; + } + + public long getStaticCount() { + return mStaticCount; + } + + public long getPerFrameCount() { + return mPerFrameCount; + } + }; + + /** + * @hide + * Get a list of required codec resources for this configuration. + * + * To be able to enforce and test the implementation of codec availability hal APIs, + * it is exposed only as TestApi. + * This will be tracked and verified through cts. + * + * This returns a {@link java.util.List} list of codec resources. + * For every {@link GlobalResourceInfo} in the list, it encapsulates the + * information about each resources required for the current configuration. + * + * NOTE: This may only be called after {@link #configure}. + * + * @return A list of required device codec resources; an empty list if no + * device codec resources are required. + * @throws IllegalStateException if the codec wasn't configured yet. + * @throws UnsupportedOperationException if not implemented. + */ + @FlaggedApi(FLAG_CODEC_AVAILABILITY) + @TestApi + public @NonNull List<InstanceResourceInfo> getRequiredResources() { + return native_getRequiredResources(); + } + + @NonNull + private native List<InstanceResourceInfo> native_getRequiredResources(); + + /** * Dynamically sets the output surface of a codec. * <p> * This can only be used if the codec was configured with an output surface. The @@ -5740,6 +5885,25 @@ final public class MediaCodec { @NonNull MediaCodec codec, @NonNull PersistableBundle metrics) { // default implementation ignores this callback. } + + /** + * @hide + * Called when there is a change in the required resources for the codec. + * <p> + * Upon receiving this notification, the updated resource requirement + * can be queried through {@link #getRequiredResources}. + * + * @param codec The MediaCodec object. + */ + @FlaggedApi(FLAG_CODEC_AVAILABILITY) + @TestApi + public void onRequiredResourcesChanged(@NonNull MediaCodec codec) { + /* + * A default implementation for backward compatibility. + * Since this is a TestApi, we are not enforcing the callback to be + * overridden. + */ + } } private void postEventFromNative( |