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

Commit e6c124d0 authored by Andrew Lewis's avatar Andrew Lewis Committed by Android (Google) Code Review
Browse files

Merge "Add final editing metrics" into main

parents ae197760 d5299bea
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -25891,8 +25891,11 @@ package android.media.metrics {
  @FlaggedApi("com.android.media.editing.flags.add_media_metrics_editing") public final class EditingEndedEvent extends android.media.metrics.Event implements android.os.Parcelable {
    method public int describeContents();
    method public int getErrorCode();
    method @Nullable public String getExporterName();
    method public float getFinalProgressPercent();
    method public int getFinalState();
    method @NonNull public java.util.List<android.media.metrics.MediaItemInfo> getInputMediaItemInfos();
    method @Nullable public String getMuxerName();
    method public long getOperationTypes();
    method @Nullable public android.media.metrics.MediaItemInfo getOutputMediaItemInfo();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
@@ -25927,6 +25930,7 @@ package android.media.metrics {
    field public static final long OPERATION_TYPE_VIDEO_EDIT = 4L; // 0x4L
    field public static final long OPERATION_TYPE_VIDEO_TRANSCODE = 1L; // 0x1L
    field public static final long OPERATION_TYPE_VIDEO_TRANSMUX = 16L; // 0x10L
    field public static final int PROGRESS_PERCENT_UNKNOWN = -1; // 0xffffffff
    field public static final int TIME_SINCE_CREATED_UNKNOWN = -1; // 0xffffffff
  }
@@ -25936,7 +25940,10 @@ package android.media.metrics {
    method @NonNull public android.media.metrics.EditingEndedEvent.Builder addOperationType(long);
    method @NonNull public android.media.metrics.EditingEndedEvent build();
    method @NonNull public android.media.metrics.EditingEndedEvent.Builder setErrorCode(int);
    method @NonNull public android.media.metrics.EditingEndedEvent.Builder setExporterName(@NonNull String);
    method @NonNull public android.media.metrics.EditingEndedEvent.Builder setFinalProgressPercent(@FloatRange(from=0, to=100) float);
    method @NonNull public android.media.metrics.EditingEndedEvent.Builder setMetricsBundle(@NonNull android.os.Bundle);
    method @NonNull public android.media.metrics.EditingEndedEvent.Builder setMuxerName(@NonNull String);
    method @NonNull public android.media.metrics.EditingEndedEvent.Builder setOutputMediaItemInfo(@NonNull android.media.metrics.MediaItemInfo);
    method @NonNull public android.media.metrics.EditingEndedEvent.Builder setTimeSinceCreatedMillis(@IntRange(from=android.media.metrics.EditingEndedEvent.TIME_SINCE_CREATED_UNKNOWN) long);
  }
+107 −2
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package android.media.metrics;
import static com.android.media.editing.flags.Flags.FLAG_ADD_MEDIA_METRICS_EDITING;

import android.annotation.FlaggedApi;
import android.annotation.FloatRange;
import android.annotation.IntDef;
import android.annotation.IntRange;
import android.annotation.LongDef;
@@ -60,6 +61,8 @@ public final class EditingEndedEvent extends Event implements Parcelable {

    private final @FinalState int mFinalState;

    private final float mFinalProgressPercent;

    // The special value 0 is reserved for the field being unspecified in the proto.

    /** Special value representing that no error occurred. */
@@ -155,10 +158,15 @@ public final class EditingEndedEvent extends Event implements Parcelable {
    /** Special value for unknown {@linkplain #getTimeSinceCreatedMillis() time since creation}. */
    public static final int TIME_SINCE_CREATED_UNKNOWN = -1;

    /** Special value for unknown {@linkplain #getFinalProgressPercent() final progress}. */
    public static final int PROGRESS_PERCENT_UNKNOWN = -1;

    private final @ErrorCode int mErrorCode;
    @SuppressWarnings("HidingField") // Hiding field from superclass as for playback events.
    private final long mTimeSinceCreatedMillis;

    @Nullable private final String mExporterName;
    @Nullable private final String mMuxerName;
    private final ArrayList<MediaItemInfo> mInputMediaItemInfos;
    @Nullable private final MediaItemInfo mOutputMediaItemInfo;

@@ -207,15 +215,21 @@ public final class EditingEndedEvent extends Event implements Parcelable {

    private EditingEndedEvent(
            @FinalState int finalState,
            float finalProgressPercent,
            @ErrorCode int errorCode,
            long timeSinceCreatedMillis,
            @Nullable String exporterName,
            @Nullable String muxerName,
            ArrayList<MediaItemInfo> inputMediaItemInfos,
            @Nullable MediaItemInfo outputMediaItemInfo,
            @OperationType long operationTypes,
            @NonNull Bundle extras) {
        mFinalState = finalState;
        mFinalProgressPercent = finalProgressPercent;
        mErrorCode = errorCode;
        mTimeSinceCreatedMillis = timeSinceCreatedMillis;
        mExporterName = exporterName;
        mMuxerName = muxerName;
        mInputMediaItemInfos = inputMediaItemInfos;
        mOutputMediaItemInfo = outputMediaItemInfo;
        mOperationTypes = operationTypes;
@@ -228,6 +242,14 @@ public final class EditingEndedEvent extends Event implements Parcelable {
        return mFinalState;
    }

    /**
     * Returns the progress of the editing operation in percent at the moment that it ended, or
     * {@link #PROGRESS_PERCENT_UNKNOWN} if unknown.
     */
    public float getFinalProgressPercent() {
        return mFinalProgressPercent;
    }

    /** Returns the error code for a {@linkplain #FINAL_STATE_ERROR failed} editing session. */
    @ErrorCode
    public int getErrorCode() {
@@ -249,6 +271,24 @@ public final class EditingEndedEvent extends Event implements Parcelable {
        return mTimeSinceCreatedMillis;
    }

    /**
     * Returns the name of the library implementing the exporting operation, or {@code null} if
     * unknown.
     */
    @Nullable
    public String getExporterName() {
        return mExporterName;
    }

    /**
     * Returns the name of the library implementing the media muxing operation, or {@code null} if
     * unknown.
     */
    @Nullable
    public String getMuxerName() {
        return mMuxerName;
    }

    /** Gets information about the input media items, or an empty list if unspecified. */
    @NonNull
    public List<MediaItemInfo> getInputMediaItemInfos() {
@@ -284,12 +324,21 @@ public final class EditingEndedEvent extends Event implements Parcelable {
                + "finalState = "
                + mFinalState
                + ", "
                + "finalProgressPercent = "
                + mFinalProgressPercent
                + ", "
                + "errorCode = "
                + mErrorCode
                + ", "
                + "timeSinceCreatedMillis = "
                + mTimeSinceCreatedMillis
                + ", "
                + "exporterName = "
                + mExporterName
                + ", "
                + "muxerName = "
                + mMuxerName
                + ", "
                + "inputMediaItemInfos = "
                + mInputMediaItemInfos
                + ", "
@@ -307,29 +356,38 @@ public final class EditingEndedEvent extends Event implements Parcelable {
        if (o == null || getClass() != o.getClass()) return false;
        EditingEndedEvent that = (EditingEndedEvent) o;
        return mFinalState == that.mFinalState
                && mFinalProgressPercent == that.mFinalProgressPercent
                && mErrorCode == that.mErrorCode
                && Objects.equals(mInputMediaItemInfos, that.mInputMediaItemInfos)
                && Objects.equals(mOutputMediaItemInfo, that.mOutputMediaItemInfo)
                && mOperationTypes == that.mOperationTypes
                && mTimeSinceCreatedMillis == that.mTimeSinceCreatedMillis;
                && mTimeSinceCreatedMillis == that.mTimeSinceCreatedMillis
                && Objects.equals(mExporterName, that.mExporterName)
                && Objects.equals(mMuxerName, that.mMuxerName);
    }

    @Override
    public int hashCode() {
        return Objects.hash(
                mFinalState,
                mFinalProgressPercent,
                mErrorCode,
                mInputMediaItemInfos,
                mOutputMediaItemInfo,
                mOperationTypes,
                mTimeSinceCreatedMillis);
                mTimeSinceCreatedMillis,
                mExporterName,
                mMuxerName);
    }

    @Override
    public void writeToParcel(@NonNull Parcel dest, int flags) {
        dest.writeInt(mFinalState);
        dest.writeFloat(mFinalProgressPercent);
        dest.writeInt(mErrorCode);
        dest.writeLong(mTimeSinceCreatedMillis);
        dest.writeString(mExporterName);
        dest.writeString(mMuxerName);
        dest.writeTypedList(mInputMediaItemInfos);
        dest.writeTypedObject(mOutputMediaItemInfo, /* parcelableFlags= */ 0);
        dest.writeLong(mOperationTypes);
@@ -343,8 +401,11 @@ public final class EditingEndedEvent extends Event implements Parcelable {

    private EditingEndedEvent(@NonNull Parcel in) {
        mFinalState = in.readInt();
        mFinalProgressPercent = in.readFloat();
        mErrorCode = in.readInt();
        mTimeSinceCreatedMillis = in.readLong();
        mExporterName = in.readString();
        mMuxerName = in.readString();
        mInputMediaItemInfos = new ArrayList<>();
        in.readTypedList(mInputMediaItemInfos, MediaItemInfo.CREATOR);
        mOutputMediaItemInfo = in.readTypedObject(MediaItemInfo.CREATOR);
@@ -370,8 +431,11 @@ public final class EditingEndedEvent extends Event implements Parcelable {
    public static final class Builder {
        private final @FinalState int mFinalState;
        private final ArrayList<MediaItemInfo> mInputMediaItemInfos;
        private float mFinalProgressPercent;
        private @ErrorCode int mErrorCode;
        private long mTimeSinceCreatedMillis;
        @Nullable private String mExporterName;
        @Nullable private String mMuxerName;
        @Nullable private MediaItemInfo mOutputMediaItemInfo;
        private @OperationType long mOperationTypes;
        private Bundle mMetricsBundle;
@@ -383,12 +447,26 @@ public final class EditingEndedEvent extends Event implements Parcelable {
         */
        public Builder(@FinalState int finalState) {
            mFinalState = finalState;
            mFinalProgressPercent = PROGRESS_PERCENT_UNKNOWN;
            mErrorCode = ERROR_CODE_NONE;
            mTimeSinceCreatedMillis = TIME_SINCE_CREATED_UNKNOWN;
            mInputMediaItemInfos = new ArrayList<>();
            mMetricsBundle = new Bundle();
        }

        /**
         * Sets the progress of the editing operation in percent at the moment that it ended.
         *
         * @param finalProgressPercent The progress of the editing operation in percent at the
         *     moment that it ended.
         * @see #getFinalProgressPercent()
         */
        public @NonNull Builder setFinalProgressPercent(
                @FloatRange(from = 0, to = 100) float finalProgressPercent) {
            mFinalProgressPercent = finalProgressPercent;
            return this;
        }

        /**
         * Sets the elapsed time since creating the editing session, in milliseconds.
         *
@@ -402,6 +480,30 @@ public final class EditingEndedEvent extends Event implements Parcelable {
            return this;
        }

        /**
         * The name of the library implementing the exporting operation. For example, a Maven
         * artifact ID like "androidx.media3.media3-transformer:1.3.0-beta01".
         *
         * @param exporterName The name of the library implementing the export operation.
         * @see #getExporterName()
         */
        public @NonNull Builder setExporterName(@NonNull String exporterName) {
            mExporterName = Objects.requireNonNull(exporterName);
            return this;
        }

        /**
         * The name of the library implementing the media muxing operation. For example, a Maven
         * artifact ID like "androidx.media3.media3-muxer:1.3.0-beta01".
         *
         * @param muxerName The name of the library implementing the media muxing operation.
         * @see #getMuxerName()
         */
        public @NonNull Builder setMuxerName(@NonNull String muxerName) {
            mMuxerName = Objects.requireNonNull(muxerName);
            return this;
        }

        /** Sets the error code for a {@linkplain #FINAL_STATE_ERROR failed} editing session. */
        public @NonNull Builder setErrorCode(@ErrorCode int value) {
            mErrorCode = value;
@@ -444,8 +546,11 @@ public final class EditingEndedEvent extends Event implements Parcelable {
        public @NonNull EditingEndedEvent build() {
            return new EditingEndedEvent(
                    mFinalState,
                    mFinalProgressPercent,
                    mErrorCode,
                    mTimeSinceCreatedMillis,
                    mExporterName,
                    mMuxerName,
                    mInputMediaItemInfos,
                    mOutputMediaItemInfo,
                    mOperationTypes,
+18 −0
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@ import com.android.server.SystemService;
import java.security.SecureRandom;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;

/**
 * System service manages media metrics.
@@ -79,6 +80,10 @@ public final class MediaMetricsManagerService extends SystemService {
    private static final String FAILED_TO_GET = "failed_to_get";

    private static final MediaItemInfo EMPTY_MEDIA_ITEM_INFO = new MediaItemInfo.Builder().build();
    private static final Pattern PATTERN_KNOWN_EDITING_LIBRARY_NAMES =
            Pattern.compile(
                    "androidx\\.media3:media3-(transformer|muxer):"
                            + "[\\d.]+(-(alpha|beta|rc)\\d\\d)?");
    private static final int DURATION_BUCKETS_BELOW_ONE_MINUTE = 8;
    private static final int DURATION_BUCKETS_COUNT = 13;
    private static final String AUDIO_MIME_TYPE_PREFIX = "audio/";
@@ -415,8 +420,11 @@ public final class MediaMetricsManagerService extends SystemService {
                            .setAtomId(798)
                            .writeString(sessionId)
                            .writeInt(event.getFinalState())
                            .writeFloat(event.getFinalProgressPercent())
                            .writeInt(event.getErrorCode())
                            .writeLong(event.getTimeSinceCreatedMillis())
                            .writeString(getFilteredLibraryName(event.getExporterName()))
                            .writeString(getFilteredLibraryName(event.getMuxerName()))
                            .writeInt(getThroughputFps(event))
                            .writeInt(event.getInputMediaItemInfos().size())
                            .writeInt(inputMediaItemInfo.getSourceType())
@@ -629,6 +637,16 @@ public final class MediaMetricsManagerService extends SystemService {
        }
    }

    private static String getFilteredLibraryName(String libraryName) {
        if (TextUtils.isEmpty(libraryName)) {
            return "";
        }
        if (!PATTERN_KNOWN_EDITING_LIBRARY_NAMES.matcher(libraryName).matches()) {
            return "";
        }
        return libraryName;
    }

    private static int getThroughputFps(EditingEndedEvent event) {
        MediaItemInfo outputMediaItemInfo = event.getOutputMediaItemInfo();
        if (outputMediaItemInfo == null) {