123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia/*
223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * Copyright 2017 The Android Open Source Project
323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia *
423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * Licensed under the Apache License, Version 2.0 (the "License");
523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * you may not use this file except in compliance with the License.
623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * You may obtain a copy of the License at
723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia *
823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia *      http://www.apache.org/licenses/LICENSE-2.0
923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia *
1023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * Unless required by applicable law or agreed to in writing, software
1123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * distributed under the License is distributed on an "AS IS" BASIS,
1223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * See the License for the specific language governing permissions and
1423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * limitations under the License.
1523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia */
1623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
1723dfee521a7782bf901344beec6f94614e0b02b8Wei Jiapackage android.media;
1823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
1923dfee521a7782bf901344beec6f94614e0b02b8Wei Jiaimport android.annotation.IntDef;
2023dfee521a7782bf901344beec6f94614e0b02b8Wei Jiaimport android.os.Parcel;
2123dfee521a7782bf901344beec6f94614e0b02b8Wei Jiaimport android.os.Parcelable;
2223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
2323dfee521a7782bf901344beec6f94614e0b02b8Wei Jiaimport java.lang.annotation.Retention;
2423dfee521a7782bf901344beec6f94614e0b02b8Wei Jiaimport java.lang.annotation.RetentionPolicy;
2523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
2623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia/**
2723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * Structure for source buffering management params.
2823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia *
2923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * Used by {@link MediaPlayer#getDefaultBufferingParams()},
3023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * {@link MediaPlayer#getBufferingParams()} and
3123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * {@link MediaPlayer#setBufferingParams(BufferingParams)}
3223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * to control source buffering behavior.
3323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia *
3423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * <p>There are two stages of source buffering in {@link MediaPlayer}: initial buffering
3523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * (when {@link MediaPlayer} is being prepared) and rebuffering (when {@link MediaPlayer}
3623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * is playing back source). {@link BufferingParams} includes mode and corresponding
3723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * watermarks for each stage of source buffering. The watermarks could be either size
3823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * based (in milliseconds), or time based (in kilobytes) or both, depending on the mode.
3923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia *
4023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * <p>There are 4 buffering modes: {@link #BUFFERING_MODE_NONE},
4123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * {@link #BUFFERING_MODE_TIME_ONLY}, {@link #BUFFERING_MODE_SIZE_ONLY} and
4223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * {@link #BUFFERING_MODE_TIME_THEN_SIZE}.
4323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * {@link MediaPlayer} source component has default buffering modes which can be queried
4423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * by calling {@link MediaPlayer#getDefaultBufferingParams()}.
4523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * Users should always use those default modes or their downsized version when trying to
4623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * change buffering params. For example, {@link #BUFFERING_MODE_TIME_THEN_SIZE} can be
4723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * downsized to {@link #BUFFERING_MODE_NONE}, {@link #BUFFERING_MODE_TIME_ONLY} or
4823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * {@link #BUFFERING_MODE_SIZE_ONLY}. But {@link #BUFFERING_MODE_TIME_ONLY} can not be
4923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * downsized to {@link #BUFFERING_MODE_SIZE_ONLY}.
5023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * <ul>
5123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * <li><strong>initial buffering stage:</strong> has one watermark which is used when
5223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * {@link MediaPlayer} is being prepared. When cached data amount exceeds this watermark,
5323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * {@link MediaPlayer} is prepared.</li>
5423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * <li><strong>rebuffering stage:</strong> has two watermarks, low and high, which are
5523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * used when {@link MediaPlayer} is playing back content.
5623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * <ul>
5723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * <li> When cached data amount exceeds high watermark, {@link MediaPlayer} will pause
5823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * buffering. Buffering will resume when cache runs below some limit which could be low
5923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * watermark or some intermediate value decided by the source component.</li>
6023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * <li> When cached data amount runs below low watermark, {@link MediaPlayer} will paused
6123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * playback. Playback will resume when cached data amount exceeds high watermark
6223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * or reaches end of stream.</li>
6323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * </ul>
6423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * </ul>
6523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia * <p>Users should use {@link Builder} to change {@link BufferingParams}.
66f3d93a0f69190737bfca907321c6170a490cdfdbWei Jia * @hide
6723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia */
6823dfee521a7782bf901344beec6f94614e0b02b8Wei Jiapublic final class BufferingParams implements Parcelable {
6923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    /**
7023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * This mode indicates that source buffering is not supported.
7123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     */
7223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    public static final int BUFFERING_MODE_NONE = 0;
7323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    /**
7423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * This mode indicates that only time based source buffering is supported. This means
7523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * the watermark(s) are time based.
7623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     */
7723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    public static final int BUFFERING_MODE_TIME_ONLY = 1;
7823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    /**
7923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * This mode indicates that only size based source buffering is supported. This means
8023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * the watermark(s) are size based.
8123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     */
8223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    public static final int BUFFERING_MODE_SIZE_ONLY = 2;
8323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    /**
8423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * This mode indicates that both time and size based source buffering are supported,
8523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * and time based calculation precedes size based. Size based calculation will be used
8623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * only when time information is not available from the source.
8723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     */
8823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    public static final int BUFFERING_MODE_TIME_THEN_SIZE = 3;
8923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
9023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    /** @hide */
9123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    @IntDef(
9223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        value = {
9323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia                BUFFERING_MODE_NONE,
9423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia                BUFFERING_MODE_TIME_ONLY,
9523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia                BUFFERING_MODE_SIZE_ONLY,
9623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia                BUFFERING_MODE_TIME_THEN_SIZE,
9723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        }
9823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    )
9923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    @Retention(RetentionPolicy.SOURCE)
10023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    public @interface BufferingMode {}
10123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
10223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    private static final int BUFFERING_NO_WATERMARK = -1;
10323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
10423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    // params
10523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    private int mInitialBufferingMode = BUFFERING_MODE_NONE;
10623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    private int mRebufferingMode = BUFFERING_MODE_NONE;
10723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
10823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    private int mInitialWatermarkMs = BUFFERING_NO_WATERMARK;
10923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    private int mInitialWatermarkKB = BUFFERING_NO_WATERMARK;
11023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
11123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    private int mRebufferingWatermarkLowMs = BUFFERING_NO_WATERMARK;
11223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    private int mRebufferingWatermarkHighMs = BUFFERING_NO_WATERMARK;
11323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    private int mRebufferingWatermarkLowKB = BUFFERING_NO_WATERMARK;
11423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    private int mRebufferingWatermarkHighKB = BUFFERING_NO_WATERMARK;
11523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
11623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    private BufferingParams() {
11723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    }
11823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
11923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    /**
12023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * Return the initial buffering mode used when {@link MediaPlayer} is being prepared.
12123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * @return one of the values that can be set in {@link Builder#setInitialBufferingMode(int)}
12223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     */
12323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    public int getInitialBufferingMode() {
12423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        return mInitialBufferingMode;
12523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    }
12623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
12723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    /**
12823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * Return the rebuffering mode used when {@link MediaPlayer} is playing back source.
12923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * @return one of the values that can be set in {@link Builder#setRebufferingMode(int)}
13023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     */
13123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    public int getRebufferingMode() {
13223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        return mRebufferingMode;
13323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    }
13423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
13523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    /**
13623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * Return the time based initial buffering watermark in milliseconds.
13723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * It is meaningful only when initial buffering mode obatined from
13823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * {@link #getInitialBufferingMode()} is time based.
13923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * @return time based initial buffering watermark in milliseconds
14023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     */
14123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    public int getInitialBufferingWatermarkMs() {
14223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        return mInitialWatermarkMs;
14323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    }
14423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
14523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    /**
14623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * Return the size based initial buffering watermark in kilobytes.
14723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * It is meaningful only when initial buffering mode obatined from
14823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * {@link #getInitialBufferingMode()} is size based.
14923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * @return size based initial buffering watermark in kilobytes
15023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     */
15123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    public int getInitialBufferingWatermarkKB() {
15223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        return mInitialWatermarkKB;
15323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    }
15423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
15523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    /**
15623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * Return the time based low watermark in milliseconds for rebuffering.
15723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * It is meaningful only when rebuffering mode obatined from
15823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * {@link #getRebufferingMode()} is time based.
15923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * @return time based low watermark for rebuffering in milliseconds
16023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     */
16123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    public int getRebufferingWatermarkLowMs() {
16223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        return mRebufferingWatermarkLowMs;
16323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    }
16423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
16523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    /**
16623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * Return the time based high watermark in milliseconds for rebuffering.
16723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * It is meaningful only when rebuffering mode obatined from
16823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * {@link #getRebufferingMode()} is time based.
16923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * @return time based high watermark for rebuffering in milliseconds
17023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     */
17123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    public int getRebufferingWatermarkHighMs() {
17223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        return mRebufferingWatermarkHighMs;
17323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    }
17423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
17523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    /**
17623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * Return the size based low watermark in kilobytes for rebuffering.
17723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * It is meaningful only when rebuffering mode obatined from
17823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * {@link #getRebufferingMode()} is size based.
17923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * @return size based low watermark for rebuffering in kilobytes
18023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     */
18123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    public int getRebufferingWatermarkLowKB() {
18223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        return mRebufferingWatermarkLowKB;
18323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    }
18423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
18523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    /**
18623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * Return the size based high watermark in kilobytes for rebuffering.
18723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * It is meaningful only when rebuffering mode obatined from
18823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * {@link #getRebufferingMode()} is size based.
18923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * @return size based high watermark for rebuffering in kilobytes
19023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     */
19123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    public int getRebufferingWatermarkHighKB() {
19223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        return mRebufferingWatermarkHighKB;
19323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    }
19423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
19523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    /**
19623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * Builder class for {@link BufferingParams} objects.
19723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * <p> Here is an example where <code>Builder</code> is used to define the
19823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * {@link BufferingParams} to be used by a {@link MediaPlayer} instance:
19923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     *
20023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * <pre class="prettyprint">
20123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * BufferingParams myParams = mediaplayer.getDefaultBufferingParams();
20223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * myParams = new BufferingParams.Builder(myParams)
20323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     *             .setInitialBufferingWatermarkMs(10000)
20423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     *             .build();
20523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * mediaplayer.setBufferingParams(myParams);
20623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     * </pre>
20723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia     */
20823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    public static class Builder {
20923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        private int mInitialBufferingMode = BUFFERING_MODE_NONE;
21023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        private int mRebufferingMode = BUFFERING_MODE_NONE;
21123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
21223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        private int mInitialWatermarkMs = BUFFERING_NO_WATERMARK;
21323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        private int mInitialWatermarkKB = BUFFERING_NO_WATERMARK;
21423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
21523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        private int mRebufferingWatermarkLowMs = BUFFERING_NO_WATERMARK;
21623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        private int mRebufferingWatermarkHighMs = BUFFERING_NO_WATERMARK;
21723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        private int mRebufferingWatermarkLowKB = BUFFERING_NO_WATERMARK;
21823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        private int mRebufferingWatermarkHighKB = BUFFERING_NO_WATERMARK;
21923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
22023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        /**
22123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * Constructs a new Builder with the defaults.
22223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * By default, both initial buffering mode and rebuffering mode are
22323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * {@link BufferingParams#BUFFERING_MODE_NONE}, and all watermarks are -1.
22423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         */
22523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        public Builder() {
22623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        }
22723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
22823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        /**
22923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * Constructs a new Builder from a given {@link BufferingParams} instance
23023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * @param bp the {@link BufferingParams} object whose data will be reused
23123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * in the new Builder.
23223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         */
23323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        public Builder(BufferingParams bp) {
23423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            mInitialBufferingMode = bp.mInitialBufferingMode;
23523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            mRebufferingMode = bp.mRebufferingMode;
23623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
23723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            mInitialWatermarkMs = bp.mInitialWatermarkMs;
23823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            mInitialWatermarkKB = bp.mInitialWatermarkKB;
23923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
24023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            mRebufferingWatermarkLowMs = bp.mRebufferingWatermarkLowMs;
24123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            mRebufferingWatermarkHighMs = bp.mRebufferingWatermarkHighMs;
24223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            mRebufferingWatermarkLowKB = bp.mRebufferingWatermarkLowKB;
24323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            mRebufferingWatermarkHighKB = bp.mRebufferingWatermarkHighKB;
24423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        }
24523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
24623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        /**
24723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * Combines all of the fields that have been set and return a new
24823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * {@link BufferingParams} object. <code>IllegalStateException</code> will be
24923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * thrown if there is conflict between fields.
25023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * @return a new {@link BufferingParams} object
25123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         */
25223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        public BufferingParams build() {
25323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            if (isTimeBasedMode(mRebufferingMode)
25423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia                    && mRebufferingWatermarkLowMs > mRebufferingWatermarkHighMs) {
25523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia                throw new IllegalStateException("Illegal watermark:"
25623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia                        + mRebufferingWatermarkLowMs + " : " + mRebufferingWatermarkHighMs);
25723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            }
25823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            if (isSizeBasedMode(mRebufferingMode)
25923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia                    && mRebufferingWatermarkLowKB > mRebufferingWatermarkHighKB) {
26023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia                throw new IllegalStateException("Illegal watermark:"
26123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia                        + mRebufferingWatermarkLowKB + " : " + mRebufferingWatermarkHighKB);
26223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            }
26323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
26423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            BufferingParams bp = new BufferingParams();
26523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            bp.mInitialBufferingMode = mInitialBufferingMode;
26623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            bp.mRebufferingMode = mRebufferingMode;
26723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
26823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            bp.mInitialWatermarkMs = mInitialWatermarkMs;
26923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            bp.mInitialWatermarkKB = mInitialWatermarkKB;
27023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
27123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            bp.mRebufferingWatermarkLowMs = mRebufferingWatermarkLowMs;
27223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            bp.mRebufferingWatermarkHighMs = mRebufferingWatermarkHighMs;
27323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            bp.mRebufferingWatermarkLowKB = mRebufferingWatermarkLowKB;
27423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            bp.mRebufferingWatermarkHighKB = mRebufferingWatermarkHighKB;
27523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            return bp;
27623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        }
27723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
27823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        private boolean isTimeBasedMode(int mode) {
27923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            return (mode == BUFFERING_MODE_TIME_ONLY || mode == BUFFERING_MODE_TIME_THEN_SIZE);
28023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        }
28123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
28223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        private boolean isSizeBasedMode(int mode) {
28323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            return (mode == BUFFERING_MODE_SIZE_ONLY || mode == BUFFERING_MODE_TIME_THEN_SIZE);
28423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        }
28523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
28623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        /**
28723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * Sets the initial buffering mode.
28823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * @param mode one of {@link BufferingParams#BUFFERING_MODE_NONE},
28923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         *     {@link BufferingParams#BUFFERING_MODE_TIME_ONLY},
29023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         *     {@link BufferingParams#BUFFERING_MODE_SIZE_ONLY},
29123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         *     {@link BufferingParams#BUFFERING_MODE_TIME_THEN_SIZE},
29223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * @return the same Builder instance.
29323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         */
29423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        public Builder setInitialBufferingMode(@BufferingMode int mode) {
29523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            switch (mode) {
29623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia                case BUFFERING_MODE_NONE:
29723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia                case BUFFERING_MODE_TIME_ONLY:
29823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia                case BUFFERING_MODE_SIZE_ONLY:
29923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia                case BUFFERING_MODE_TIME_THEN_SIZE:
30023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia                     mInitialBufferingMode = mode;
30123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia                     break;
30223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia                default:
30323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia                     throw new IllegalArgumentException("Illegal buffering mode " + mode);
30423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            }
30523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            return this;
30623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        }
30723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
30823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        /**
30923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * Sets the rebuffering mode.
31023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * @param mode one of {@link BufferingParams#BUFFERING_MODE_NONE},
31123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         *     {@link BufferingParams#BUFFERING_MODE_TIME_ONLY},
31223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         *     {@link BufferingParams#BUFFERING_MODE_SIZE_ONLY},
31323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         *     {@link BufferingParams#BUFFERING_MODE_TIME_THEN_SIZE},
31423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * @return the same Builder instance.
31523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         */
31623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        public Builder setRebufferingMode(@BufferingMode int mode) {
31723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            switch (mode) {
31823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia                case BUFFERING_MODE_NONE:
31923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia                case BUFFERING_MODE_TIME_ONLY:
32023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia                case BUFFERING_MODE_SIZE_ONLY:
32123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia                case BUFFERING_MODE_TIME_THEN_SIZE:
32223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia                     mRebufferingMode = mode;
32323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia                     break;
32423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia                default:
32523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia                     throw new IllegalArgumentException("Illegal buffering mode " + mode);
32623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            }
32723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            return this;
32823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        }
32923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
33023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        /**
33123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * Sets the time based watermark in milliseconds for initial buffering.
33223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * @param watermarkMs time based watermark in milliseconds
33323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * @return the same Builder instance.
33423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         */
33523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        public Builder setInitialBufferingWatermarkMs(int watermarkMs) {
33623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            mInitialWatermarkMs = watermarkMs;
33723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            return this;
33823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        }
33923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
34023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        /**
34123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * Sets the size based watermark in kilobytes for initial buffering.
34223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * @param watermarkKB size based watermark in kilobytes
34323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * @return the same Builder instance.
34423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         */
34523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        public Builder setInitialBufferingWatermarkKB(int watermarkKB) {
34623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            mInitialWatermarkKB = watermarkKB;
34723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            return this;
34823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        }
34923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
35023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        /**
35123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * Sets the time based low watermark in milliseconds for rebuffering.
35223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * @param watermarkMs time based low watermark in milliseconds
35323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * @return the same Builder instance.
35423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         */
35523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        public Builder setRebufferingWatermarkLowMs(int watermarkMs) {
35623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            mRebufferingWatermarkLowMs = watermarkMs;
35723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            return this;
35823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        }
35923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
36023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        /**
36123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * Sets the time based high watermark in milliseconds for rebuffering.
36223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * @param watermarkMs time based high watermark in milliseconds
36323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * @return the same Builder instance.
36423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         */
36523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        public Builder setRebufferingWatermarkHighMs(int watermarkMs) {
36623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            mRebufferingWatermarkHighMs = watermarkMs;
36723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            return this;
36823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        }
36923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
37023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        /**
37123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * Sets the size based low watermark in milliseconds for rebuffering.
37223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * @param watermarkKB size based low watermark in milliseconds
37323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * @return the same Builder instance.
37423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         */
37523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        public Builder setRebufferingWatermarkLowKB(int watermarkKB) {
37623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            mRebufferingWatermarkLowKB = watermarkKB;
37723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            return this;
37823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        }
37923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
38023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        /**
38123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * Sets the size based high watermark in milliseconds for rebuffering.
38223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * @param watermarkKB size based high watermark in milliseconds
38323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * @return the same Builder instance.
38423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         */
38523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        public Builder setRebufferingWatermarkHighKB(int watermarkKB) {
38623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            mRebufferingWatermarkHighKB = watermarkKB;
38723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            return this;
38823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        }
38923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
39023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        /**
39123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * Sets the time based low and high watermarks in milliseconds for rebuffering.
39223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * @param lowWatermarkMs time based low watermark in milliseconds
39323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * @param highWatermarkMs time based high watermark in milliseconds
39423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * @return the same Builder instance.
39523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         */
39623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        public Builder setRebufferingWatermarksMs(int lowWatermarkMs, int highWatermarkMs) {
39723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            mRebufferingWatermarkLowMs = lowWatermarkMs;
39823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            mRebufferingWatermarkHighMs = highWatermarkMs;
39923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            return this;
40023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        }
40123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
40223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        /**
40323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * Sets the size based low and high watermarks in kilobytes for rebuffering.
40423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * @param lowWatermarkKB size based low watermark in kilobytes
40523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * @param highWatermarkKB size based high watermark in kilobytes
40623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         * @return the same Builder instance.
40723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia         */
40823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        public Builder setRebufferingWatermarksKB(int lowWatermarkKB, int highWatermarkKB) {
40923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            mRebufferingWatermarkLowKB = lowWatermarkKB;
41023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            mRebufferingWatermarkHighKB = highWatermarkKB;
41123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            return this;
41223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        }
41323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    }
41423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
41523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    private BufferingParams(Parcel in) {
41623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        mInitialBufferingMode = in.readInt();
41723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        mRebufferingMode = in.readInt();
41823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
41923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        mInitialWatermarkMs = in.readInt();
42023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        mInitialWatermarkKB = in.readInt();
42123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
42223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        mRebufferingWatermarkLowMs = in.readInt();
42323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        mRebufferingWatermarkHighMs = in.readInt();
42423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        mRebufferingWatermarkLowKB = in.readInt();
42523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        mRebufferingWatermarkHighKB = in.readInt();
42623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    }
42723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
42823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    public static final Parcelable.Creator<BufferingParams> CREATOR =
42923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            new Parcelable.Creator<BufferingParams>() {
43023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia                @Override
43123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia                public BufferingParams createFromParcel(Parcel in) {
43223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia                    return new BufferingParams(in);
43323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia                }
43423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
43523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia                @Override
43623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia                public BufferingParams[] newArray(int size) {
43723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia                    return new BufferingParams[size];
43823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia                }
43923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            };
44023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
44123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
44223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    @Override
44323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    public int describeContents() {
44423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        return 0;
44523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    }
44623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
44723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    @Override
44823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    public void writeToParcel(Parcel dest, int flags) {
44923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        dest.writeInt(mInitialBufferingMode);
45023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        dest.writeInt(mRebufferingMode);
45123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
45223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        dest.writeInt(mInitialWatermarkMs);
45323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        dest.writeInt(mInitialWatermarkKB);
45423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
45523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        dest.writeInt(mRebufferingWatermarkLowMs);
45623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        dest.writeInt(mRebufferingWatermarkHighMs);
45723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        dest.writeInt(mRebufferingWatermarkLowKB);
45823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        dest.writeInt(mRebufferingWatermarkHighKB);
45923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    }
46023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia}
461