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

Commit b9119076 authored by Dongwon Kang's avatar Dongwon Kang
Browse files

Address feedback on MediaTimestamp, SubtitleData and TimeMetadata

Test: MediaTimestampTest, SubtitleDataTest, TimeMetadataTest
Bug: 128547839, Bug: 128460405
Change-Id: I9f2b0e10b6fecbf7b0338586974ab8a720ab77b7
parent 3d3b861a
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -26142,10 +26142,11 @@ package android.media {
  }
  public final class MediaTimestamp {
    ctor public MediaTimestamp(long, long, @FloatRange(from=0.0f, to=java.lang.Float.MAX_VALUE) float);
    method public long getAnchorMediaTimeUs();
    method public long getAnchorSystemNanoTime();
    method @Deprecated public long getAnchorSytemNanoTime();
    method public float getMediaClockRate();
    method @FloatRange(from=0.0f, to=java.lang.Float.MAX_VALUE) public float getMediaClockRate();
    field public static final android.media.MediaTimestamp TIMESTAMP_UNKNOWN;
  }
@@ -26473,6 +26474,7 @@ package android.media {
  }
  public final class SubtitleData {
    ctor public SubtitleData(int, long, long, @NonNull byte[]);
    method @NonNull public byte[] getData();
    method public long getDurationUs();
    method public long getStartTimeUs();
@@ -26513,6 +26515,7 @@ package android.media {
  }
  public final class TimedMetaData {
    ctor public TimedMetaData(long, @NonNull byte[]);
    method public byte[] getMetaData();
    method public long getTimestamp();
  }
+0 −21
Original line number Diff line number Diff line
@@ -3574,13 +3574,6 @@ package android.media {
    field public static final int RADIO_TUNER = 1998; // 0x7ce
  }
  public static final class MediaTimestamp.Builder {
    ctor public MediaTimestamp.Builder();
    ctor public MediaTimestamp.Builder(@NonNull android.media.MediaTimestamp);
    method @NonNull public android.media.MediaTimestamp build();
    method @NonNull public android.media.MediaTimestamp.Builder setMediaTimestamp(long, long, float);
  }
  public class PlayerProxy {
    method public void pause();
    method public void setPan(float);
@@ -3590,20 +3583,6 @@ package android.media {
    method public void stop();
  }
  public static final class SubtitleData.Builder {
    ctor public SubtitleData.Builder();
    ctor public SubtitleData.Builder(@NonNull android.media.SubtitleData);
    method @NonNull public android.media.SubtitleData build();
    method @NonNull public android.media.SubtitleData.Builder setSubtitleData(int, long, long, @NonNull byte[]);
  }
  public static final class TimedMetaData.Builder {
    ctor public TimedMetaData.Builder();
    ctor public TimedMetaData.Builder(@NonNull android.media.TimedMetaData);
    method @NonNull public android.media.TimedMetaData build();
    method @NonNull public android.media.TimedMetaData.Builder setTimedMetaData(long, @NonNull byte[]);
  }
}
package android.media.audiopolicy {
+13 −20
Original line number Diff line number Diff line
@@ -274,8 +274,7 @@ import java.util.concurrent.atomic.AtomicLong;
 * successful transition. Any other value will be an error. Call {@link #getState()} to
 * determine the current state. </p>
 */
public class MediaPlayer2 implements AutoCloseable
                                            , AudioRouting {
public class MediaPlayer2 implements AutoCloseable, AudioRouting {
    static {
        System.loadLibrary("media2_jni");
        native_init();
@@ -1810,12 +1809,10 @@ public class MediaPlayer2 implements AutoCloseable
    public MediaTimestamp getTimestamp() {
        try {
            // TODO: get the timestamp from native side
            return new MediaTimestamp.Builder()
                    .setMediaTimestamp(
            return new MediaTimestamp(
                    getCurrentPosition() * 1000L,
                    System.nanoTime(),
                        getState() == PLAYER_STATE_PLAYING ? getPlaybackParams().getSpeed() : 0.f)
                    .build();
                    getState() == PLAYER_STATE_PLAYING ? getPlaybackParams().getSpeed() : 0.f);
        } catch (IllegalStateException e) {
            return null;
        }
@@ -2643,13 +2640,11 @@ public class MediaPlayer2 implements AutoCloseable
                            return;
                        }
                        Iterator<Value> in = playerMsg.getValuesList().iterator();
                        SubtitleData data = new SubtitleData.Builder()
                                .setSubtitleData(
                        SubtitleData data = new SubtitleData(
                                in.next().getInt32Value(),  // trackIndex
                                in.next().getInt64Value(),  // startTimeUs
                                in.next().getInt64Value(),  // durationUs
                                    in.next().getBytesValue().toByteArray())  // data
                                .build();
                                in.next().getBytesValue().toByteArray());  // data
                        sendEvent(new EventNotifier() {
                            @Override
                            public void notify(EventCallback callback) {
@@ -2673,11 +2668,9 @@ public class MediaPlayer2 implements AutoCloseable
                            return;
                        }
                        Iterator<Value> in = playerMsg.getValuesList().iterator();
                        data = new TimedMetaData.Builder()
                                .setTimedMetaData(
                        data = new TimedMetaData(
                                in.next().getInt64Value(),  // timestampUs
                                    in.next().getBytesValue().toByteArray())  // metaData
                                .build();
                                in.next().getBytesValue().toByteArray());  // metaData
                    } else {
                        data = null;
                    }
+15 −74
Original line number Diff line number Diff line
@@ -16,8 +16,7 @@

package android.media;

import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.annotation.FloatRange;

/**
 * An immutable object that represents the linear correlation between the media time
@@ -76,6 +75,7 @@ public final class MediaTimestamp
     * greater than 1.0 if media clock is faster than the system clock;
     * less than 1.0 if media clock is slower than the system clock.
     */
    @FloatRange(from = 0.0f, to = Float.MAX_VALUE)
    public float getMediaClockRate() {
        return clockRate;
    }
@@ -87,11 +87,19 @@ public final class MediaTimestamp
    /** @hide - accessor shorthand */
    public final float clockRate;

    /** @hide */
    MediaTimestamp(long mediaUs, long systemNs, float rate) {
        mediaTimeUs = mediaUs;
        nanoTime = systemNs;
        clockRate = rate;
    /**
     * Constructor.
     *
     * @param mediaTimeUs the media time of the anchor in microseconds
     * @param nanoTimeNs the {@link java.lang.System#nanoTime system time} corresponding to the
     *                  media time in nanoseconds.
     * @param clockRate the rate of the media clock in relation to the system time.
     */
    public MediaTimestamp(long mediaTimeUs, long nanoTimeNs,
            @FloatRange(from = 0.0f, to = Float.MAX_VALUE) float clockRate) {
        this.mediaTimeUs = mediaTimeUs;
        this.nanoTime = nanoTimeNs;
        this.clockRate = clockRate;
    }

    /** @hide */
@@ -120,71 +128,4 @@ public final class MediaTimestamp
                + " clockRate=" + clockRate
                + "}";
    }

    /**
     * Builder class for {@link MediaTimestamp} objects.
     * <p> Here is an example where <code>Builder</code> is used to define the
     * {@link MediaTimestamp}:
     *
     * <pre class="prettyprint">
     * MediaTimestamp mts = new MediaTimestamp.Builder()
     *         .setMediaTimestamp(mediaTime, systemTime, rate)
     *         .build();
     * </pre>
     * @hide
     */
    @SystemApi
    public static final class Builder {
        long mMediaTimeUs;
        long mNanoTime;
        float mClockRate = 1.0f;

        /**
         * Constructs a new Builder with the defaults.
         */
        public Builder() {
        }

        /**
         * Constructs a new Builder from a given {@link MediaTimestamp} instance
         * @param mts the {@link MediaTimestamp} object whose data will be reused
         * in the new Builder.
         */
        public Builder(@NonNull MediaTimestamp mts) {
            if (mts == null) {
                throw new IllegalArgumentException("null MediaTimestamp is not allowed");
            }
            mMediaTimeUs = mts.mediaTimeUs;
            mNanoTime = mts.nanoTime;
            mClockRate = mts.clockRate;
        }

        /**
         * Combines all of the fields that have been set and return a new
         * {@link MediaTimestamp} object.
         *
         * @return a new {@link MediaTimestamp} object
         */
        public @NonNull MediaTimestamp build() {
            return new MediaTimestamp(mMediaTimeUs, mNanoTime, mClockRate);
        }

        /**
         * Sets the info of media timestamp.
         *
         * @param mediaTimeUs the media time of the anchor in microseconds
         * @param nanoTime the {@link java.lang.System#nanoTime system time} corresponding to
         *     the media time in nanoseconds.
         * @param clockRate the rate of the media clock in relation to the system time.
         * @return the same Builder instance.
         */
        public @NonNull Builder setMediaTimestamp(
                long mediaTimeUs, long nanoTime, float clockRate) {
            mMediaTimeUs = mediaTimeUs;
            mNanoTime = nanoTime;
            mClockRate = clockRate;

            return this;
        }
    }
}
+13 −81
Original line number Diff line number Diff line
@@ -17,11 +17,8 @@
package android.media;

import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.os.Parcel;

import java.util.Arrays;

/**
 * Class encapsulating subtitle data, as received through the
 * {@link MediaPlayer.OnSubtitleDataListener} interface.
@@ -82,12 +79,23 @@ public final class SubtitleData
        }
    }

    /** @hide */
    /**
     * Constructor.
     *
     * @param trackIndex the index of the media player track which contains this subtitle data.
     * @param startTimeUs the start time in microsecond for the subtitle data
     * @param durationUs the duration in microsecond for the subtitle data
     * @param data the data array for the subtitle data. It should not be null.
     *            No data copying is made.
     */
    public SubtitleData(int trackIndex, long startTimeUs, long durationUs, @NonNull byte[] data) {
        if (data == null) {
            throw new IllegalArgumentException("null data is not allowed");
        }
        mTrackIndex = trackIndex;
        mStartTimeUs = startTimeUs;
        mDurationUs = durationUs;
        mData = (data != null ? data : new byte[0]);
        mData = data;
    }

    /**
@@ -141,80 +149,4 @@ public final class SubtitleData

        return true;
    }

    /**
     * Builder class for {@link SubtitleData} objects.
     * <p> Here is an example where <code>Builder</code> is used to define the
     * {@link SubtitleData}:
     *
     * <pre class="prettyprint">
     * SubtitleData sd = new SubtitleData.Builder()
     *         .setSubtitleData(trackIndex, startTime, duration, data)
     *         .build();
     * </pre>
     * @hide
     */
    @SystemApi
    public static final class Builder {
        private int mTrackIndex;
        private long mStartTimeUs;
        private long mDurationUs;
        private byte[] mData = new byte[0];

        /**
         * Constructs a new Builder with the defaults.
         */
        public Builder() {
        }

        /**
         * Constructs a new Builder from a given {@link SubtitleData} instance
         * @param sd the {@link SubtitleData} object whose data will be reused
         * in the new Builder. It should not be null. The data array is copied.
         */
        public Builder(@NonNull SubtitleData sd) {
            if (sd == null) {
                throw new IllegalArgumentException("null SubtitleData is not allowed");
            }
            mTrackIndex = sd.mTrackIndex;
            mStartTimeUs = sd.mStartTimeUs;
            mDurationUs = sd.mDurationUs;
            if (sd.mData != null) {
                mData = Arrays.copyOf(sd.mData, sd.mData.length);
            }
        }

        /**
         * Combines all of the fields that have been set and return a new
         * {@link SubtitleData} object. <code>IllegalStateException</code> will be
         * thrown if there is conflict between fields.
         *
         * @return a new {@link SubtitleData} object
         */
        public @NonNull SubtitleData build() {
            return new SubtitleData(mTrackIndex, mStartTimeUs, mDurationUs, mData);
        }

        /**
         * Sets the info of subtitle data.
         *
         * @param trackIndex the index of the media player track which contains this subtitle data.
         * @param startTimeUs the start time in microsecond for the subtile data
         * @param durationUs the duration in microsecond for the subtile data
         * @param data the data array for the subtile data. It should not be null.
         *     No data copying is made.
         * @return the same Builder instance.
         */
        public @NonNull Builder setSubtitleData(
                int trackIndex, long startTimeUs, long durationUs, @NonNull byte[] data) {
            if (data == null) {
                throw new IllegalArgumentException("null data is not allowed");
            }
            mTrackIndex = trackIndex;
            mStartTimeUs = startTimeUs;
            mDurationUs = durationUs;
            mData = data;
            return this;
        }
    }
}
Loading