BufferingSettings: simplify buffering control.
Now only 2 marks, initialMarkMs and resumPlaybackMarkMs, remain.
Test: pass cts tests
Bug: 36280094
Change-Id: I03c8e2a0db9f7e845f57e76f51874cd8715a48d4
diff --git a/media/libmedia/BufferingSettings.cpp b/media/libmedia/BufferingSettings.cpp
index a69497e..271a238 100644
--- a/media/libmedia/BufferingSettings.cpp
+++ b/media/libmedia/BufferingSettings.cpp
@@ -23,43 +23,16 @@
namespace android {
-// static
-bool BufferingSettings::IsValidBufferingMode(int mode) {
- return (mode >= BUFFERING_MODE_NONE && mode < BUFFERING_MODE_COUNT);
-}
-
-// static
-bool BufferingSettings::IsTimeBasedBufferingMode(int mode) {
- return (mode == BUFFERING_MODE_TIME_ONLY || mode == BUFFERING_MODE_TIME_THEN_SIZE);
-}
-
-// static
-bool BufferingSettings::IsSizeBasedBufferingMode(int mode) {
- return (mode == BUFFERING_MODE_SIZE_ONLY || mode == BUFFERING_MODE_TIME_THEN_SIZE);
-}
-
BufferingSettings::BufferingSettings()
- : mInitialBufferingMode(BUFFERING_MODE_NONE),
- mRebufferingMode(BUFFERING_MODE_NONE),
- mInitialWatermarkMs(kNoWatermark),
- mInitialWatermarkKB(kNoWatermark),
- mRebufferingWatermarkLowMs(kNoWatermark),
- mRebufferingWatermarkHighMs(kNoWatermark),
- mRebufferingWatermarkLowKB(kNoWatermark),
- mRebufferingWatermarkHighKB(kNoWatermark) { }
+ : mInitialMarkMs(kNoMark),
+ mResumePlaybackMarkMs(kNoMark) { }
status_t BufferingSettings::readFromParcel(const Parcel* parcel) {
if (parcel == nullptr) {
return BAD_VALUE;
}
- mInitialBufferingMode = (BufferingMode)parcel->readInt32();
- mRebufferingMode = (BufferingMode)parcel->readInt32();
- mInitialWatermarkMs = parcel->readInt32();
- mInitialWatermarkKB = parcel->readInt32();
- mRebufferingWatermarkLowMs = parcel->readInt32();
- mRebufferingWatermarkHighMs = parcel->readInt32();
- mRebufferingWatermarkLowKB = parcel->readInt32();
- mRebufferingWatermarkHighKB = parcel->readInt32();
+ mInitialMarkMs = parcel->readInt32();
+ mResumePlaybackMarkMs = parcel->readInt32();
return OK;
}
@@ -68,26 +41,17 @@
if (parcel == nullptr) {
return BAD_VALUE;
}
- parcel->writeInt32(mInitialBufferingMode);
- parcel->writeInt32(mRebufferingMode);
- parcel->writeInt32(mInitialWatermarkMs);
- parcel->writeInt32(mInitialWatermarkKB);
- parcel->writeInt32(mRebufferingWatermarkLowMs);
- parcel->writeInt32(mRebufferingWatermarkHighMs);
- parcel->writeInt32(mRebufferingWatermarkLowKB);
- parcel->writeInt32(mRebufferingWatermarkHighKB);
+ parcel->writeInt32(mInitialMarkMs);
+ parcel->writeInt32(mResumePlaybackMarkMs);
return OK;
}
String8 BufferingSettings::toString() const {
String8 s;
- s.appendFormat("initialMode(%d), rebufferingMode(%d), "
- "initialMarks(%d ms, %d KB), rebufferingMarks(%d, %d)ms, (%d, %d)KB",
- mInitialBufferingMode, mRebufferingMode,
- mInitialWatermarkMs, mInitialWatermarkKB,
- mRebufferingWatermarkLowMs, mRebufferingWatermarkHighMs,
- mRebufferingWatermarkLowKB, mRebufferingWatermarkHighKB);
+ s.appendFormat(
+ "initialMarks(%d ms), resumePlaybackMarks(%d ms)",
+ mInitialMarkMs, mResumePlaybackMarkMs);
return s;
}
diff --git a/media/libmedia/IMediaPlayer.cpp b/media/libmedia/IMediaPlayer.cpp
index 3fb1d7a..e2eccdd 100644
--- a/media/libmedia/IMediaPlayer.cpp
+++ b/media/libmedia/IMediaPlayer.cpp
@@ -44,7 +44,7 @@
SET_DATA_SOURCE_STREAM,
SET_DATA_SOURCE_CALLBACK,
SET_BUFFERING_SETTINGS,
- GET_DEFAULT_BUFFERING_SETTINGS,
+ GET_BUFFERING_SETTINGS,
PREPARE_ASYNC,
START,
STOP,
@@ -184,14 +184,14 @@
return reply.readInt32();
}
- status_t getDefaultBufferingSettings(BufferingSettings* buffering /* nonnull */)
+ status_t getBufferingSettings(BufferingSettings* buffering /* nonnull */)
{
if (buffering == nullptr) {
return BAD_VALUE;
}
Parcel data, reply;
data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
- remote()->transact(GET_DEFAULT_BUFFERING_SETTINGS, data, &reply);
+ remote()->transact(GET_BUFFERING_SETTINGS, data, &reply);
status_t err = reply.readInt32();
if (err == OK) {
err = buffering->readFromParcel(&reply);
@@ -700,10 +700,10 @@
reply->writeInt32(setBufferingSettings(buffering));
return NO_ERROR;
} break;
- case GET_DEFAULT_BUFFERING_SETTINGS: {
+ case GET_BUFFERING_SETTINGS: {
CHECK_INTERFACE(IMediaPlayer, data, reply);
BufferingSettings buffering;
- status_t err = getDefaultBufferingSettings(&buffering);
+ status_t err = getBufferingSettings(&buffering);
reply->writeInt32(err);
if (err == OK) {
buffering.writeToParcel(reply);
diff --git a/media/libmedia/include/media/BufferingSettings.h b/media/libmedia/include/media/BufferingSettings.h
index e812d2a..d2a3e40 100644
--- a/media/libmedia/include/media/BufferingSettings.h
+++ b/media/libmedia/include/media/BufferingSettings.h
@@ -21,45 +21,14 @@
namespace android {
-enum BufferingMode : int {
- // Do not support buffering.
- BUFFERING_MODE_NONE = 0,
- // Support only time based buffering.
- BUFFERING_MODE_TIME_ONLY = 1,
- // Support only size based buffering.
- BUFFERING_MODE_SIZE_ONLY = 2,
- // Support both time and size based buffering, time based calculation precedes size based.
- // Size based calculation will be used only when time information is not available for
- // the stream.
- BUFFERING_MODE_TIME_THEN_SIZE = 3,
- // Number of modes.
- BUFFERING_MODE_COUNT = 4,
-};
-
struct BufferingSettings : public Parcelable {
- static const int kNoWatermark = -1;
+ static const int kNoMark = -1;
- static bool IsValidBufferingMode(int mode);
- static bool IsTimeBasedBufferingMode(int mode);
- static bool IsSizeBasedBufferingMode(int mode);
+ int mInitialMarkMs;
- BufferingMode mInitialBufferingMode; // for prepare
- BufferingMode mRebufferingMode; // for playback
-
- int mInitialWatermarkMs; // time based
- int mInitialWatermarkKB; // size based
-
- // When cached data is below this mark, playback will be paused for buffering
- // till data reach |mRebufferingWatermarkHighMs| or end of stream.
- int mRebufferingWatermarkLowMs;
- // When cached data is above this mark, buffering will be paused.
- int mRebufferingWatermarkHighMs;
-
- // When cached data is below this mark, playback will be paused for buffering
- // till data reach |mRebufferingWatermarkHighKB| or end of stream.
- int mRebufferingWatermarkLowKB;
- // When cached data is above this mark, buffering will be paused.
- int mRebufferingWatermarkHighKB;
+ // When cached data is above this mark, playback will be resumed if it has been paused
+ // due to low cached data.
+ int mResumePlaybackMarkMs;
BufferingSettings();
diff --git a/media/libmedia/include/media/IMediaPlayer.h b/media/libmedia/include/media/IMediaPlayer.h
index 2129222..97a998e 100644
--- a/media/libmedia/include/media/IMediaPlayer.h
+++ b/media/libmedia/include/media/IMediaPlayer.h
@@ -61,7 +61,7 @@
virtual status_t setDataSource(const sp<IDataSource>& source) = 0;
virtual status_t setVideoSurfaceTexture(
const sp<IGraphicBufferProducer>& bufferProducer) = 0;
- virtual status_t getDefaultBufferingSettings(
+ virtual status_t getBufferingSettings(
BufferingSettings* buffering /* nonnull */) = 0;
virtual status_t setBufferingSettings(const BufferingSettings& buffering) = 0;
virtual status_t prepareAsync() = 0;
diff --git a/media/libmedia/include/media/mediaplayer.h b/media/libmedia/include/media/mediaplayer.h
index 6d39ded..dc3b3aa 100644
--- a/media/libmedia/include/media/mediaplayer.h
+++ b/media/libmedia/include/media/mediaplayer.h
@@ -227,7 +227,6 @@
status_t setVideoSurfaceTexture(
const sp<IGraphicBufferProducer>& bufferProducer);
status_t setListener(const sp<MediaPlayerListener>& listener);
- status_t getDefaultBufferingSettings(BufferingSettings* buffering /* nonnull */);
status_t getBufferingSettings(BufferingSettings* buffering /* nonnull */);
status_t setBufferingSettings(const BufferingSettings& buffering);
status_t prepare();
@@ -316,7 +315,6 @@
float mSendLevel;
struct sockaddr_in mRetransmitEndpoint;
bool mRetransmitEndpointValid;
- BufferingSettings mCurrentBufferingSettings;
};
}; // namespace android
diff --git a/media/libmedia/mediaplayer.cpp b/media/libmedia/mediaplayer.cpp
index a6cdb13..26908e5 100644
--- a/media/libmedia/mediaplayer.cpp
+++ b/media/libmedia/mediaplayer.cpp
@@ -139,10 +139,8 @@
mPlayer = player;
if (player != 0) {
mCurrentState = MEDIA_PLAYER_INITIALIZED;
- player->getDefaultBufferingSettings(&mCurrentBufferingSettings);
err = NO_ERROR;
} else {
- mCurrentBufferingSettings = BufferingSettings();
ALOGE("Unable to create media player");
}
}
@@ -249,17 +247,6 @@
return mPlayer->setVideoSurfaceTexture(bufferProducer);
}
-status_t MediaPlayer::getDefaultBufferingSettings(BufferingSettings* buffering /* nonnull */)
-{
- ALOGV("getDefaultBufferingSettings");
-
- Mutex::Autolock _l(mLock);
- if (mPlayer == 0) {
- return NO_INIT;
- }
- return mPlayer->getDefaultBufferingSettings(buffering);
-}
-
status_t MediaPlayer::getBufferingSettings(BufferingSettings* buffering /* nonnull */)
{
ALOGV("getBufferingSettings");
@@ -268,8 +255,7 @@
if (mPlayer == 0) {
return NO_INIT;
}
- *buffering = mCurrentBufferingSettings;
- return NO_ERROR;
+ return mPlayer->getBufferingSettings(buffering);
}
status_t MediaPlayer::setBufferingSettings(const BufferingSettings& buffering)
@@ -280,11 +266,7 @@
if (mPlayer == 0) {
return NO_INIT;
}
- status_t err = mPlayer->setBufferingSettings(buffering);
- if (err == NO_ERROR) {
- mCurrentBufferingSettings = buffering;
- }
- return err;
+ return mPlayer->setBufferingSettings(buffering);
}
// must call with lock held
@@ -636,7 +618,6 @@
// setDataSource has to be called again to create a
// new mediaplayer.
mPlayer = 0;
- mCurrentBufferingSettings = BufferingSettings();
return ret;
}
clear_l();