diff options
author | shubang <shubang@google.com> | 2021-03-18 07:10:22 -0700 |
---|---|---|
committer | shubang <shubang@google.com> | 2021-03-23 22:49:42 -0700 |
commit | c56cc00ab8f98fb93e9039248fa252ace2c2465b (patch) | |
tree | c10964cc2206eb83600bd36d01ad919092998090 | |
parent | dc2a0a63f908e263af28a03749cdb40e03f094ef (diff) |
Change session ID string to ID object
Based on API review feedback from jmtrivi@ to reduce unexpected
usage of the APIs.
And add some stub APIs
Reference CLs:
MediaDrm ag/13835091 by robertshih@
MediaExtractor: ag/13607751 by aquilescanta@
MediaParser: ag/13714647 by aquilescanta@
MediaRecorder: ag/13545885 by dichenzhang@
AudioTrack & AudioRecord: ag/13712857 by hunga@
Bug: 183095725
Test: pending CTS
CTS-Coverage-Bug: 183366721
Change-Id: I931edf021a5ec6b27a25bc6142a129b92da0fc9a
Merged-In: I931edf021a5ec6b27a25bc6142a129b92da0fc9a
-rw-r--r-- | apex/media/framework/api/current.txt | 2 | ||||
-rw-r--r-- | apex/media/framework/java/android/media/MediaParser.java | 14 | ||||
-rw-r--r-- | core/api/current.txt | 26 | ||||
-rw-r--r-- | core/api/test-current.txt | 2 | ||||
-rw-r--r-- | media/java/android/media/AudioRecord.java | 33 | ||||
-rw-r--r-- | media/java/android/media/AudioTrack.java | 33 | ||||
-rw-r--r-- | media/java/android/media/MediaCodec.java | 19 | ||||
-rw-r--r-- | media/java/android/media/MediaDrm.java | 42 | ||||
-rw-r--r-- | media/java/android/media/MediaExtractor.java | 21 | ||||
-rw-r--r-- | media/java/android/media/MediaRecorder.java | 24 | ||||
-rw-r--r-- | media/java/android/media/metrics/LogSessionId.java | 30 | ||||
-rw-r--r-- | media/java/android/media/metrics/PlaybackComponent.java | 35 |
12 files changed, 176 insertions, 105 deletions
diff --git a/apex/media/framework/api/current.txt b/apex/media/framework/api/current.txt index 80698f7cedc9..bebf0190191b 100644 --- a/apex/media/framework/api/current.txt +++ b/apex/media/framework/api/current.txt @@ -69,10 +69,12 @@ package android.media { method public boolean advance(@NonNull android.media.MediaParser.SeekableInputReader) throws java.io.IOException; method @NonNull public static android.media.MediaParser create(@NonNull android.media.MediaParser.OutputConsumer, @NonNull java.lang.String...); method @NonNull public static android.media.MediaParser createByName(@NonNull String, @NonNull android.media.MediaParser.OutputConsumer); + method @NonNull public android.media.metrics.LogSessionId getLogSessionId(); method @NonNull public String getParserName(); method @NonNull public static java.util.List<java.lang.String> getParserNames(@NonNull android.media.MediaFormat); method public void release(); method public void seek(@NonNull android.media.MediaParser.SeekPoint); + method public void setLogSessionId(@NonNull android.media.metrics.LogSessionId); method @NonNull public android.media.MediaParser setParameter(@NonNull String, @NonNull Object); method public boolean supportsParameter(@NonNull String); field public static final String PARAMETER_ADTS_ENABLE_CBR_SEEKING = "android.media.mediaparser.adts.enableCbrSeeking"; diff --git a/apex/media/framework/java/android/media/MediaParser.java b/apex/media/framework/java/android/media/MediaParser.java index 8bdca766e0dd..cff422d0aafe 100644 --- a/apex/media/framework/java/android/media/MediaParser.java +++ b/apex/media/framework/java/android/media/MediaParser.java @@ -21,6 +21,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.StringDef; import android.media.MediaCodec.CryptoInfo; +import android.media.metrics.LogSessionId; import android.os.Build; import android.text.TextUtils; import android.util.Log; @@ -74,6 +75,7 @@ import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.UUID; import java.util.concurrent.ThreadLocalRandom; import java.util.function.Function; @@ -1066,6 +1068,7 @@ public final class MediaParser { private boolean mReleased; // MediaMetrics fields. + @NonNull private LogSessionId mLogSessionId = LogSessionId.LOG_SESSION_ID_NONE; private final boolean mCreatedByName; private final SparseArray<Format> mTrackFormats; private String mLastObservedExceptionName; @@ -1328,6 +1331,7 @@ public final class MediaParser { MEDIAMETRICS_PARAMETER_LIST_MAX_LENGTH)); nativeSubmitMetrics( + // TODO: mLogSessionId, mParserName, mCreatedByName, String.join(MEDIAMETRICS_ELEMENT_SEPARATOR, mParserNamesPool), @@ -1341,6 +1345,15 @@ public final class MediaParser { videoHeight); } + public void setLogSessionId(@NonNull LogSessionId sessionId) { + this.mLogSessionId = Objects.requireNonNull(sessionId); + } + + @NonNull + public LogSessionId getLogSessionId() { + return mLogSessionId; + } + // Private methods. private MediaParser( @@ -2184,6 +2197,7 @@ public final class MediaParser { // Native methods. private native void nativeSubmitMetrics( + // TODO: String logSessionId, String parserName, boolean createdByName, String parserPool, diff --git a/core/api/current.txt b/core/api/current.txt index af0a739bffaa..f428a56b594e 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -20579,6 +20579,7 @@ package android.media { method public int getChannelConfiguration(); method public int getChannelCount(); method @NonNull public android.media.AudioFormat getFormat(); + method @NonNull public android.media.metrics.LogSessionId getLogSessionId(); method public android.os.PersistableBundle getMetrics(); method public static int getMinBufferSize(int, int, int); method public int getNotificationMarkerPosition(); @@ -20601,6 +20602,7 @@ package android.media { method public void release(); method public void removeOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener); method @Deprecated public void removeOnRoutingChangedListener(android.media.AudioRecord.OnRoutingChangedListener); + method public void setLogSessionId(@NonNull android.media.metrics.LogSessionId); method public int setNotificationMarkerPosition(int); method public int setPositionNotificationPeriod(int); method public boolean setPreferredDevice(android.media.AudioDeviceInfo); @@ -20716,6 +20718,7 @@ package android.media { method public int getChannelCount(); method public int getDualMonoMode(); method @NonNull public android.media.AudioFormat getFormat(); + method @NonNull public android.media.metrics.LogSessionId getLogSessionId(); method public static float getMaxVolume(); method public android.os.PersistableBundle getMetrics(); method public static int getMinBufferSize(int, int, int); @@ -20753,6 +20756,7 @@ package android.media { method public int setAuxEffectSendLevel(@FloatRange(from=0.0) float); method public int setBufferSizeInFrames(@IntRange(from=0) int); method public boolean setDualMonoMode(int); + method public void setLogSessionId(@NonNull android.media.metrics.LogSessionId); method public int setLoopPoints(@IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0xffffffff) int); method public int setNotificationMarkerPosition(int); method public void setOffloadDelayPadding(@IntRange(from=0) int, @IntRange(from=0) int); @@ -21307,7 +21311,7 @@ package android.media { method @NonNull public String getDiagnosticInfo(); } - public final class MediaCodec implements android.media.metrics.PlaybackComponent { + public final class MediaCodec { method public void configure(@Nullable android.media.MediaFormat, @Nullable android.view.Surface, @Nullable android.media.MediaCrypto, int); method public void configure(@Nullable android.media.MediaFormat, @Nullable android.view.Surface, int, @Nullable android.media.MediaDescrambler); method @NonNull public static android.media.MediaCodec createByCodecName(@NonNull String) throws java.io.IOException; @@ -21333,7 +21337,6 @@ package android.media { method @NonNull public android.media.MediaFormat getOutputFormat(int); method @NonNull public android.media.MediaCodec.OutputFrame getOutputFrame(int); method @Nullable public android.media.Image getOutputImage(int); - method public String getPlaybackId(); method @NonNull public android.media.MediaCodec.QueueRequest getQueueRequest(int); method @Nullable public static android.media.Image mapHardwareBuffer(@NonNull android.hardware.HardwareBuffer); method public void queueInputBuffer(int, int, int, long, int) throws android.media.MediaCodec.CryptoException; @@ -21350,7 +21353,6 @@ package android.media { method public void setOnFrameRenderedListener(@Nullable android.media.MediaCodec.OnFrameRenderedListener, @Nullable android.os.Handler); method public void setOutputSurface(@NonNull android.view.Surface); method public void setParameters(@Nullable android.os.Bundle); - method public void setPlaybackId(@NonNull String); method public void setVideoScalingMode(int); method public void signalEndOfInputStream(); method public void start(); @@ -21964,7 +21966,7 @@ package android.media { method @NonNull public java.util.List<byte[]> getOfflineLicenseKeySetIds(); method public int getOfflineLicenseState(@NonNull byte[]); method public int getOpenSessionCount(); - method @Nullable public android.media.metrics.PlaybackComponent getPlaybackComponent(@NonNull byte[]); + method @Nullable public android.media.MediaDrm.PlaybackComponent getPlaybackComponent(@NonNull byte[]); method @NonNull public byte[] getPropertyByteArray(String); method @NonNull public String getPropertyString(@NonNull String); method @NonNull public android.media.MediaDrm.ProvisionRequest getProvisionRequest(); @@ -22169,6 +22171,11 @@ package android.media { method public void onSessionLostState(@NonNull android.media.MediaDrm, @NonNull byte[]); } + public final class MediaDrm.PlaybackComponent { + method @NonNull public android.media.metrics.LogSessionId getLogSessionId(); + method public void setLogSessionId(@NonNull android.media.metrics.LogSessionId); + } + public static final class MediaDrm.ProvisionRequest { method @NonNull public byte[] getData(); method @NonNull public String getDefaultUrl(); @@ -22201,6 +22208,7 @@ package android.media { method public long getCachedDuration(); method public android.media.MediaExtractor.CasInfo getCasInfo(int); method public android.media.DrmInitData getDrmInitData(); + method @NonNull public android.media.metrics.LogSessionId getLogSessionId(); method public android.os.PersistableBundle getMetrics(); method @Nullable public java.util.Map<java.util.UUID,byte[]> getPsshInfo(); method public boolean getSampleCryptoInfo(@NonNull android.media.MediaCodec.CryptoInfo); @@ -22222,6 +22230,7 @@ package android.media { method public void setDataSource(@NonNull android.content.res.AssetFileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public void setDataSource(@NonNull java.io.FileDescriptor) throws java.io.IOException; method public void setDataSource(@NonNull java.io.FileDescriptor, long, long) throws java.io.IOException; + method public void setLogSessionId(@NonNull android.media.metrics.LogSessionId); method public void setMediaCas(@NonNull android.media.MediaCas); method public void unselectTrack(int); field public static final int SAMPLE_FLAG_ENCRYPTED = 2; // 0x2 @@ -22825,6 +22834,7 @@ package android.media { method public java.util.List<android.media.MicrophoneInfo> getActiveMicrophones() throws java.io.IOException; method @Nullable public android.media.AudioRecordingConfiguration getActiveRecordingConfiguration(); method public static final int getAudioSourceMax(); + method @NonNull public android.media.metrics.LogSessionId getLogSessionId(); method public int getMaxAmplitude() throws java.lang.IllegalStateException; method public android.os.PersistableBundle getMetrics(); method public android.media.AudioDeviceInfo getPreferredDevice(); @@ -22847,6 +22857,7 @@ package android.media { method public void setCaptureRate(double); method public void setInputSurface(@NonNull android.view.Surface); method public void setLocation(float, float); + method public void setLogSessionId(@NonNull android.media.metrics.LogSessionId); method public void setMaxDuration(int) throws java.lang.IllegalArgumentException; method public void setMaxFileSize(long) throws java.lang.IllegalArgumentException; method public void setNextOutputFile(java.io.FileDescriptor) throws java.io.IOException; @@ -24478,6 +24489,8 @@ package android.media.metrics { } public final class LogSessionId { + method @NonNull public String getStringId(); + field @NonNull public static final android.media.metrics.LogSessionId LOG_SESSION_ID_NONE; } public class MediaMetricsManager { @@ -24511,11 +24524,6 @@ package android.media.metrics { method @NonNull public android.media.metrics.NetworkEvent.Builder setTimeSinceCreatedMillis(@IntRange(from=0xffffffff) long); } - public interface PlaybackComponent { - method @NonNull public String getPlaybackId(); - method public void setPlaybackId(@NonNull String); - } - public final class PlaybackErrorEvent extends android.media.metrics.Event implements android.os.Parcelable { method public int describeContents(); method public int getErrorCode(); diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 4d0c76526b35..746a0b6f8e30 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -1478,7 +1478,7 @@ package android.media.audiopolicy { package android.media.metrics { public final class LogSessionId { - method @NonNull public String getStringId(); + ctor public LogSessionId(@NonNull String); } } diff --git a/media/java/android/media/AudioRecord.java b/media/java/android/media/AudioRecord.java index 0d613992f300..3399377be999 100644 --- a/media/java/android/media/AudioRecord.java +++ b/media/java/android/media/AudioRecord.java @@ -32,6 +32,7 @@ import android.content.Context; import android.media.MediaRecorder.Source; import android.media.audiopolicy.AudioMix; import android.media.audiopolicy.AudioPolicy; +import android.media.metrics.LogSessionId; import android.media.permission.Identity; import android.media.projection.MediaProjection; import android.os.Binder; @@ -282,9 +283,9 @@ public class AudioRecord implements AudioRouting, MicrophoneDirection, /** * The log session id used for metrics. - * A null or empty string here means it is not set. + * {@link LogSessionId#LOG_SESSION_ID_NONE} here means it is not set. */ - private String mLogSessionId; + @NonNull private LogSessionId mLogSessionId = LogSessionId.LOG_SESSION_ID_NONE; //--------------------------------------------------------- // Constructor, Finalize @@ -1963,24 +1964,34 @@ public class AudioRecord implements AudioRouting, MicrophoneDirection, } /** - * Sets a string handle to this AudioRecord for metrics collection. + * Sets a {@link LogSessionId} instance to this AudioRecord for metrics collection. * - * @param logSessionId a string which is used to identify this object - * to the metrics service. Proper generated Ids must be obtained - * from the Java metrics service and should be considered opaque. - * Use null to remove the logSessionId association. + * @param logSessionId a {@link LogSessionId} instance which is used to + * identify this object to the metrics service. Proper generated + * Ids must be obtained from the Java metrics service and should + * be considered opaque. Use + * {@link LogSessionId#LOG_SESSION_ID_NONE} to remove the + * logSessionId association. * @throws IllegalStateException if AudioRecord not initialized. - * - * @hide */ - public void setLogSessionId(@Nullable String logSessionId) { + public void setLogSessionId(@NonNull LogSessionId logSessionId) { + Objects.requireNonNull(logSessionId); if (mState == STATE_UNINITIALIZED) { throw new IllegalStateException("AudioRecord not initialized"); } - native_setLogSessionId(logSessionId); + String stringId = logSessionId.getStringId(); + native_setLogSessionId(stringId); mLogSessionId = logSessionId; } + /** + * Returns the {@link LogSessionId}. + */ + @NonNull + public LogSessionId getLogSessionId() { + return mLogSessionId; + } + //--------------------------------------------------------- // Interface definitions //-------------------- diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java index bccefdfd7b96..7a2b022b514a 100644 --- a/media/java/android/media/AudioTrack.java +++ b/media/java/android/media/AudioTrack.java @@ -26,6 +26,7 @@ import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; +import android.media.metrics.LogSessionId; import android.os.Binder; import android.os.Build; import android.os.Handler; @@ -45,6 +46,7 @@ import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.NioUtils; import java.util.LinkedList; +import java.util.Objects; import java.util.concurrent.Executor; /** @@ -567,9 +569,9 @@ public class AudioTrack extends PlayerBase /** * The log session id used for metrics. - * A null or empty string here means it is not set. + * {@link LogSessionId#LOG_SESSION_ID_NONE} here means it is not set. */ - private String mLogSessionId; + @NonNull private LogSessionId mLogSessionId = LogSessionId.LOG_SESSION_ID_NONE; //-------------------------------- // Used exclusively by native code @@ -4044,24 +4046,35 @@ public class AudioTrack extends PlayerBase } /** - * Sets a string handle to this AudioTrack for metrics collection. + * Sets a {@link LogSessionId} instance to this AudioTrack for metrics collection. * - * @param logSessionId a string which is used to identify this object - * to the metrics service. Proper generated Ids must be obtained - * from the Java metrics service and should be considered opaque. - * Use null to remove the logSessionId association. + * @param logSessionId a {@link LogSessionId} instance which is used to + * identify this object to the metrics service. Proper generated + * Ids must be obtained from the Java metrics service and should + * be considered opaque. Use + * {@link LogSessionId#LOG_SESSION_ID_NONE} to remove the + * logSessionId association. * @throws IllegalStateException if AudioTrack not initialized. * - * @hide */ - public void setLogSessionId(@Nullable String logSessionId) { + public void setLogSessionId(@NonNull LogSessionId logSessionId) { + Objects.requireNonNull(logSessionId); if (mState == STATE_UNINITIALIZED) { throw new IllegalStateException("track not initialized"); } - native_setLogSessionId(logSessionId); + String stringId = logSessionId.getStringId(); + native_setLogSessionId(stringId); mLogSessionId = logSessionId; } + /** + * Returns the {@link LogSessionId}. + */ + @NonNull + public LogSessionId getLogSessionId() { + return mLogSessionId; + } + //--------------------------------------------------------- // Inner classes //-------------------- diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java index a7e2b65ebb8f..8db75d6ec2b1 100644 --- a/media/java/android/media/MediaCodec.java +++ b/media/java/android/media/MediaCodec.java @@ -25,7 +25,6 @@ import android.graphics.Rect; import android.graphics.SurfaceTexture; import android.hardware.HardwareBuffer; import android.media.MediaCodecInfo.CodecCapabilities; -import android.media.metrics.PlaybackComponent; import android.os.Build; import android.os.Bundle; import android.os.Handler; @@ -1539,7 +1538,7 @@ import java.util.concurrent.locks.ReentrantLock; </tbody> </table> */ -final public class MediaCodec implements PlaybackComponent { +final public class MediaCodec { /** * Per buffer metadata includes an offset and size specifying @@ -1697,22 +1696,6 @@ final public class MediaCodec implements PlaybackComponent { private static final int CB_OUTPUT_FORMAT_CHANGE = 4; - /** - * @hide - */ - @Override - public void setPlaybackId(@NonNull String playbackId) { - // TODO: add a native method to pass the ID to the native code for logging. - mPlaybackId = playbackId; - } - /** - * @hide - */ - @Override - public String getPlaybackId() { - return mPlaybackId; - } - private class EventHandler extends Handler { private MediaCodec mCodec; diff --git a/media/java/android/media/MediaDrm.java b/media/java/android/media/MediaDrm.java index ae64c026fb51..10b99dce53b0 100644 --- a/media/java/android/media/MediaDrm.java +++ b/media/java/android/media/MediaDrm.java @@ -27,7 +27,7 @@ import android.compat.annotation.UnsupportedAppUsage; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.Signature; -import android.media.metrics.PlaybackComponent; +import android.media.metrics.LogSessionId; import android.os.Handler; import android.os.HandlerExecutor; import android.os.Looper; @@ -50,6 +50,7 @@ import java.util.HashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; @@ -1379,7 +1380,7 @@ public final class MediaDrm implements AutoCloseable { public byte[] openSession(@SecurityLevel int level) throws NotProvisionedException, ResourceBusyException { byte[] sessionId = openSessionNative(level); - mPlaybackComponentMap.put(ByteBuffer.wrap(sessionId), new PlaybackComponentImpl(sessionId)); + mPlaybackComponentMap.put(ByteBuffer.wrap(sessionId), new PlaybackComponent(sessionId)); return sessionId; } @@ -2929,8 +2930,8 @@ public final class MediaDrm implements AutoCloseable { /** * Obtain a {@link PlaybackComponent} associated with a DRM session. - * Call {@link PlaybackComponent#setPlaybackId(String)} on the returned object - * to associate a playback session with the DRM session. + * Call {@link PlaybackComponent#setLogSessionId(LogSessionId)} on + * the returned object to associate a playback session with the DRM session. * * @param sessionId a DRM session ID obtained from {@link #openSession()} * @return a {@link PlaybackComponent} associated with the session, @@ -2945,28 +2946,37 @@ public final class MediaDrm implements AutoCloseable { return mPlaybackComponentMap.get(ByteBuffer.wrap(sessionId)); } - private native void setPlaybackId(byte[] sessionId, String playbackId); + private native void setPlaybackId(byte[] sessionId, String logSessionId); - private final class PlaybackComponentImpl implements PlaybackComponent { + /** This class contains the Drm session ID and log session ID */ + public final class PlaybackComponent { private final byte[] mSessionId; - private String mPlaybackId = ""; + @NonNull private LogSessionId mLogSessionId = LogSessionId.LOG_SESSION_ID_NONE; - public PlaybackComponentImpl(byte[] sessionId) { + /** @hide */ + public PlaybackComponent(byte[] sessionId) { mSessionId = sessionId; } - @Override - public void setPlaybackId(@NonNull String playbackId) { - if (playbackId == null) { + + /** + * Gets the {@link LogSessionId}. + */ + public void setLogSessionId(@NonNull LogSessionId logSessionId) { + Objects.requireNonNull(logSessionId); + if (logSessionId.getStringId() == null) { throw new IllegalArgumentException("playbackId is null"); } - MediaDrm.this.setPlaybackId(mSessionId, playbackId); - mPlaybackId = playbackId; + MediaDrm.this.setPlaybackId(mSessionId, logSessionId.getStringId()); + mLogSessionId = logSessionId; } - @Override - @NonNull public String getPlaybackId() { - return mPlaybackId; + + /** + * Returns the {@link LogSessionId}. + */ + @NonNull public LogSessionId getLogSessionId() { + return mLogSessionId; } } diff --git a/media/java/android/media/MediaExtractor.java b/media/java/android/media/MediaExtractor.java index 8f603300dc11..283f1f1d69a2 100644 --- a/media/java/android/media/MediaExtractor.java +++ b/media/java/android/media/MediaExtractor.java @@ -22,6 +22,7 @@ import android.annotation.Nullable; import android.content.ContentResolver; import android.content.Context; import android.content.res.AssetFileDescriptor; +import android.media.metrics.LogSessionId; import android.net.Uri; import android.os.IBinder; import android.os.IHwBinder; @@ -40,6 +41,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.UUID; import java.util.stream.Collectors; @@ -73,7 +75,7 @@ import java.util.stream.Collectors; * <p>This class requires the {@link android.Manifest.permission#INTERNET} permission * when used with network-based content. */ -final public class MediaExtractor { +public final class MediaExtractor { public MediaExtractor() { native_setup(); } @@ -768,6 +770,22 @@ final public class MediaExtractor { public native boolean hasCacheReachedEndOfStream(); /** + * Sets the {@link LogSessionId} for MediaExtractor. + */ + public void setLogSessionId(@NonNull LogSessionId logSessionId) { + mLogSessionId = Objects.requireNonNull(logSessionId); + // TODO: implement native_setPlaybackId(playbackId); + } + + /** + * Returns the {@link LogSessionId} for MediaExtractor. + */ + @NonNull + public LogSessionId getLogSessionId() { + return mLogSessionId; + } + + /** * Return Metrics data about the current media container. * * @return a {@link PersistableBundle} containing the set of attributes and values @@ -796,6 +814,7 @@ final public class MediaExtractor { } private MediaCas mMediaCas; + @NonNull private LogSessionId mLogSessionId = LogSessionId.LOG_SESSION_ID_NONE; private long mNativeContext; diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java index dd08d8adf20b..f960ff2b1a7e 100644 --- a/media/java/android/media/MediaRecorder.java +++ b/media/java/android/media/MediaRecorder.java @@ -29,6 +29,7 @@ import android.app.ActivityThread; import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; import android.hardware.Camera; +import android.media.metrics.LogSessionId; import android.media.permission.Identity; import android.os.Build; import android.os.Handler; @@ -130,6 +131,8 @@ public class MediaRecorder implements AudioRouting, private int mChannelCount; + @NonNull private LogSessionId mLogSessionId = LogSessionId.LOG_SESSION_ID_NONE; + /** * Default constructor. * @@ -165,6 +168,27 @@ public class MediaRecorder implements AudioRouting, } /** + * Sets the {@link LogSessionId} for MediaRecorder. + * + * @param id the global ID for monitoring the MediaRecorder performance + */ + public void setLogSessionId(@NonNull LogSessionId id) { + Objects.requireNonNull(id); + mLogSessionId = id; + setParameter("log-session-id=" + id.getStringId()); + } + + /** + * Returns the {@link LogSessionId} for MediaRecorder. + * + * @return the global ID for monitoring the MediaRecorder performance + */ + @NonNull + public LogSessionId getLogSessionId() { + return mLogSessionId; + } + + /** * Sets a {@link android.hardware.Camera} to use for recording. * * <p>Use this function to switch quickly between preview and capture mode without a teardown of diff --git a/media/java/android/media/metrics/LogSessionId.java b/media/java/android/media/metrics/LogSessionId.java index f68ef4b68de1..41f30937489b 100644 --- a/media/java/android/media/metrics/LogSessionId.java +++ b/media/java/android/media/metrics/LogSessionId.java @@ -17,20 +17,29 @@ package android.media.metrics; import android.annotation.NonNull; +import android.annotation.Nullable; import android.annotation.TestApi; +import java.util.Objects; + /** * An instances of this class represents the ID of a log session. */ public final class LogSessionId { - private final String mSessionId; + @NonNull private final String mSessionId; - /* package */ LogSessionId(@NonNull String id) { - mSessionId = id; - } + /** + * A {@link LogSessionId} object which is used to clear any existing session ID. + */ + @NonNull public static final LogSessionId LOG_SESSION_ID_NONE = new LogSessionId(""); /** @hide */ @TestApi + public LogSessionId(@NonNull String id) { + mSessionId = Objects.requireNonNull(id); + } + + /** Returns the ID represented by a string. */ @NonNull public String getStringId() { return mSessionId; @@ -40,4 +49,17 @@ public final class LogSessionId { public String toString() { return mSessionId; } + + @Override + public boolean equals(@Nullable Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + LogSessionId that = (LogSessionId) o; + return Objects.equals(mSessionId, that.mSessionId); + } + + @Override + public int hashCode() { + return Objects.hash(mSessionId); + } } diff --git a/media/java/android/media/metrics/PlaybackComponent.java b/media/java/android/media/metrics/PlaybackComponent.java deleted file mode 100644 index 1cadf3be38ee..000000000000 --- a/media/java/android/media/metrics/PlaybackComponent.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (C) 2020 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.media.metrics; - -import android.annotation.NonNull; - -/** - * Interface for playback related components used by playback metrics. - */ -public interface PlaybackComponent { - - /** - * Sets the playback ID of the component. - */ - void setPlaybackId(@NonNull String playbackId); - - /** - * Gets playback ID. - */ - @NonNull String getPlaybackId(); -} |