blob: 943f14277fc3d48eefe288d2f09cb97286ca415b [file] [log] [blame]
/*
* Copyright 2017 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;
import android.annotation.IntDef;
import android.os.Parcel;
import android.os.Parcelable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* Structure for source buffering management params.
*
* Used by {@link MediaPlayer#getBufferingParams()} and
* {@link MediaPlayer#setBufferingParams(BufferingParams)}
* to control source buffering behavior.
*
* <p>There are two stages of source buffering in {@link MediaPlayer}: initial buffering
* (when {@link MediaPlayer} is being prepared) and rebuffering (when {@link MediaPlayer}
* is playing back source). {@link BufferingParams} includes corresponding marks for each
* stage of source buffering. The marks are time based (in milliseconds).
*
* <p>{@link MediaPlayer} source component has default marks which can be queried by
* calling {@link MediaPlayer#getBufferingParams()} before any change is made by
* {@link MediaPlayer#setBufferingParams()}.
* <ul>
* <li><strong>initial buffering:</strong> initialMarkMs is used when
* {@link MediaPlayer} is being prepared. When cached data amount exceeds this mark
* {@link MediaPlayer} is prepared. </li>
* <li><strong>rebuffering during playback:</strong> resumePlaybackMarkMs is used when
* {@link MediaPlayer} is playing back content.
* <ul>
* <li> {@link MediaPlayer} has internal mark, namely pausePlaybackMarkMs, to decide when
* to pause playback if cached data amount runs low. This internal mark varies based on
* type of data source. </li>
* <li> When cached data amount exceeds resumePlaybackMarkMs, {@link MediaPlayer} will
* resume playback if it has been paused due to low cached data amount. The internal mark
* pausePlaybackMarkMs shall be less than resumePlaybackMarkMs. </li>
* <li> {@link MediaPlayer} has internal mark, namely pauseRebufferingMarkMs, to decide
* when to pause rebuffering. Apparently, this internal mark shall be no less than
* resumePlaybackMarkMs. </li>
* <li> {@link MediaPlayer} has internal mark, namely resumeRebufferingMarkMs, to decide
* when to resume buffering. This internal mark varies based on type of data source. This
* mark shall be larger than pausePlaybackMarkMs, and less than pauseRebufferingMarkMs.
* </li>
* </ul> </li>
* </ul>
* <p>Users should use {@link Builder} to change {@link BufferingParams}.
* @hide
*/
public final class BufferingParams implements Parcelable {
private static final int BUFFERING_NO_MARK = -1;
// params
private int mInitialMarkMs = BUFFERING_NO_MARK;
private int mResumePlaybackMarkMs = BUFFERING_NO_MARK;
private BufferingParams() {
}
/**
* Return initial buffering mark in milliseconds.
* @return initial buffering mark in milliseconds
*/
public int getInitialMarkMs() {
return mInitialMarkMs;
}
/**
* Return the mark in milliseconds for resuming playback.
* @return the mark for resuming playback in milliseconds
*/
public int getResumePlaybackMarkMs() {
return mResumePlaybackMarkMs;
}
/**
* Builder class for {@link BufferingParams} objects.
* <p> Here is an example where <code>Builder</code> is used to define the
* {@link BufferingParams} to be used by a {@link MediaPlayer} instance:
*
* <pre class="prettyprint">
* BufferingParams myParams = mediaplayer.getDefaultBufferingParams();
* myParams = new BufferingParams.Builder(myParams)
* .setInitialMarkMs(10000)
* .setResumePlaybackMarkMs(15000)
* .build();
* mediaplayer.setBufferingParams(myParams);
* </pre>
*/
public static class Builder {
private int mInitialMarkMs = BUFFERING_NO_MARK;
private int mResumePlaybackMarkMs = BUFFERING_NO_MARK;
/**
* Constructs a new Builder with the defaults.
* By default, all marks are -1.
*/
public Builder() {
}
/**
* Constructs a new Builder from a given {@link BufferingParams} instance
* @param bp the {@link BufferingParams} object whose data will be reused
* in the new Builder.
*/
public Builder(BufferingParams bp) {
mInitialMarkMs = bp.mInitialMarkMs;
mResumePlaybackMarkMs = bp.mResumePlaybackMarkMs;
}
/**
* Combines all of the fields that have been set and return a new
* {@link BufferingParams} object. <code>IllegalStateException</code> will be
* thrown if there is conflict between fields.
* @return a new {@link BufferingParams} object
*/
public BufferingParams build() {
BufferingParams bp = new BufferingParams();
bp.mInitialMarkMs = mInitialMarkMs;
bp.mResumePlaybackMarkMs = mResumePlaybackMarkMs;
return bp;
}
/**
* Sets the time based mark in milliseconds for initial buffering.
* @param markMs time based mark in milliseconds
* @return the same Builder instance.
*/
public Builder setInitialMarkMs(int markMs) {
mInitialMarkMs = markMs;
return this;
}
/**
* Sets the time based mark in milliseconds for resuming playback.
* @param markMs time based mark in milliseconds for resuming playback
* @return the same Builder instance.
*/
public Builder setResumePlaybackMarkMs(int markMs) {
mResumePlaybackMarkMs = markMs;
return this;
}
}
private BufferingParams(Parcel in) {
mInitialMarkMs = in.readInt();
mResumePlaybackMarkMs = in.readInt();
}
public static final @android.annotation.NonNull Parcelable.Creator<BufferingParams> CREATOR =
new Parcelable.Creator<BufferingParams>() {
@Override
public BufferingParams createFromParcel(Parcel in) {
return new BufferingParams(in);
}
@Override
public BufferingParams[] newArray(int size) {
return new BufferingParams[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(mInitialMarkMs);
dest.writeInt(mResumePlaybackMarkMs);
}
}