Merge "Add OnMediaTimeDiscontinuity notification" into pi-dev

gugelfrei
Dongwon Kang 6 years ago committed by Android (Google) Code Review
commit ef3dbdbf73

@ -59,6 +59,7 @@ enum media_event_type {
MEDIA_SUBTITLE_DATA = 201,
MEDIA_META_DATA = 202,
MEDIA_DRM_INFO = 210,
MEDIA_TIME_DISCONTINUITY = 211,
MEDIA_AUDIO_ROUTING_CHANGED = 10000,
};

@ -220,8 +220,11 @@ void NuPlayer::setUID(uid_t uid) {
mUID = uid;
}
void NuPlayer::setDriver(const wp<NuPlayerDriver> &driver) {
void NuPlayer::init(const wp<NuPlayerDriver> &driver) {
mDriver = driver;
sp<AMessage> notify = new AMessage(kWhatMediaClockNotify, this);
mMediaClock->setNotificationMessage(notify);
}
void NuPlayer::setDataSourceAsync(const sp<IStreamSource> &source) {
@ -1425,6 +1428,24 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
break;
}
case kWhatMediaClockNotify:
{
ALOGV("kWhatMediaClockNotify");
int64_t anchorMediaUs, anchorRealUs;
float playbackRate;
CHECK(msg->findInt64("anchor-media-us", &anchorMediaUs));
CHECK(msg->findInt64("anchor-real-us", &anchorRealUs));
CHECK(msg->findFloat("playback-rate", &playbackRate));
Parcel in;
in.writeInt64(anchorMediaUs);
in.writeInt64(anchorRealUs);
in.writeFloat(playbackRate);
notifyListener(MEDIA_TIME_DISCONTINUITY, 0, 0, &in);
break;
}
default:
TRESPASS();
break;

@ -39,7 +39,7 @@ struct NuPlayer : public AHandler {
void setUID(uid_t uid);
void setDriver(const wp<NuPlayerDriver> &driver);
void init(const wp<NuPlayerDriver> &driver);
void setDataSourceAsync(const sp<IStreamSource> &source);
@ -158,6 +158,7 @@ private:
kWhatSetBufferingSettings = 'sBuS',
kWhatPrepareDrm = 'pDrm',
kWhatReleaseDrm = 'rDrm',
kWhatMediaClockNotify = 'mckN',
};
wp<NuPlayerDriver> mDriver;

@ -104,7 +104,7 @@ NuPlayerDriver::NuPlayerDriver(pid_t pid)
mLooper->registerHandler(mPlayer);
mPlayer->setDriver(this);
mPlayer->init(this);
}
NuPlayerDriver::~NuPlayerDriver() {

@ -70,11 +70,9 @@ void MediaClock::reset() {
it->mNotify->post();
it = mTimers.erase(it);
}
mAnchorTimeMediaUs = -1;
mAnchorTimeRealUs = -1;
mMaxTimeMediaUs = INT64_MAX;
mStartingTimeMediaUs = -1;
mPlaybackRate = 1.0;
updateAnchorTimesAndPlaybackRate_l(-1, -1, 1.0);
++mGeneration;
}
@ -85,8 +83,7 @@ void MediaClock::setStartingTimeMedia(int64_t startingTimeMediaUs) {
void MediaClock::clearAnchor() {
Mutex::Autolock autoLock(mLock);
mAnchorTimeMediaUs = -1;
mAnchorTimeRealUs = -1;
updateAnchorTimesAndPlaybackRate_l(-1, -1, mPlaybackRate);
}
void MediaClock::updateAnchor(
@ -118,8 +115,7 @@ void MediaClock::updateAnchor(
return;
}
}
mAnchorTimeRealUs = nowUs;
mAnchorTimeMediaUs = nowMediaUs;
updateAnchorTimesAndPlaybackRate_l(nowMediaUs, nowUs, mPlaybackRate);
++mGeneration;
processTimers_l();
@ -139,13 +135,12 @@ void MediaClock::setPlaybackRate(float rate) {
}
int64_t nowUs = ALooper::GetNowUs();
mAnchorTimeMediaUs += (nowUs - mAnchorTimeRealUs) * (double)mPlaybackRate;
if (mAnchorTimeMediaUs < 0) {
int64_t nowMediaUs = mAnchorTimeMediaUs + (nowUs - mAnchorTimeRealUs) * (double)mPlaybackRate;
if (nowMediaUs < 0) {
ALOGW("setRate: anchor time should not be negative, set to 0.");
mAnchorTimeMediaUs = 0;
nowMediaUs = 0;
}
mAnchorTimeRealUs = nowUs;
mPlaybackRate = rate;
updateAnchorTimesAndPlaybackRate_l(nowMediaUs, nowUs, rate);
if (rate > 0.0) {
++mGeneration;
@ -313,4 +308,31 @@ void MediaClock::processTimers_l() {
msg->post(nextLapseRealUs);
}
void MediaClock::updateAnchorTimesAndPlaybackRate_l(int64_t anchorTimeMediaUs,
int64_t anchorTimeRealUs, float playbackRate) {
if (mAnchorTimeMediaUs != anchorTimeMediaUs
|| mAnchorTimeRealUs != anchorTimeRealUs
|| mPlaybackRate != playbackRate) {
mAnchorTimeMediaUs = anchorTimeMediaUs;
mAnchorTimeRealUs = anchorTimeRealUs;
mPlaybackRate = playbackRate;
notifyDiscontinuity_l();
}
}
void MediaClock::setNotificationMessage(const sp<AMessage> &msg) {
Mutex::Autolock autoLock(mLock);
mNotify = msg;
}
void MediaClock::notifyDiscontinuity_l() {
if (mNotify != nullptr) {
sp<AMessage> msg = mNotify->dup();
msg->setInt64("anchor-media-us", mAnchorTimeMediaUs);
msg->setInt64("anchor-real-us", mAnchorTimeRealUs);
msg->setFloat("playback-rate", mPlaybackRate);
msg->post();
}
}
} // namespace android

@ -66,6 +66,8 @@ struct MediaClock : public AHandler {
// mediaTimeUs + (adjustRealUs / playbackRate)
void addTimer(const sp<AMessage> &notify, int64_t mediaTimeUs, int64_t adjustRealUs = 0);
void setNotificationMessage(const sp<AMessage> &msg);
void reset();
protected:
@ -92,6 +94,11 @@ private:
void processTimers_l();
void updateAnchorTimesAndPlaybackRate_l(
int64_t anchorTimeMediaUs, int64_t anchorTimeRealUs , float playbackRate);
void notifyDiscontinuity_l();
sp<ALooper> mLooper;
mutable Mutex mLock;
@ -104,6 +111,7 @@ private:
int32_t mGeneration;
std::list<Timer> mTimers;
sp<AMessage> mNotify;
DISALLOW_EVIL_CONSTRUCTORS(MediaClock);
};

Loading…
Cancel
Save