From 5833b6aad2c46ba516bdc8262f4fc4667e8018ed Mon Sep 17 00:00:00 2001 From: Wei Jia Date: Mon, 9 Mar 2015 17:01:47 -0700 Subject: mediaplayer: move MediaClock from NuPlayer to libstagefright. Bug: 19666434 Change-Id: I86865e594226419bbbbee217098f96434e43afbe --- media/libmediaplayerservice/nuplayer/Android.mk | 1 - .../libmediaplayerservice/nuplayer/MediaClock.cpp | 139 --------------------- media/libmediaplayerservice/nuplayer/MediaClock.h | 77 ------------ .../nuplayer/NuPlayerRenderer.cpp | 3 +- media/libstagefright/Android.mk | 1 + media/libstagefright/MediaClock.cpp | 139 +++++++++++++++++++++ 6 files changed, 141 insertions(+), 219 deletions(-) delete mode 100644 media/libmediaplayerservice/nuplayer/MediaClock.cpp delete mode 100644 media/libmediaplayerservice/nuplayer/MediaClock.h create mode 100644 media/libstagefright/MediaClock.cpp (limited to 'media') diff --git a/media/libmediaplayerservice/nuplayer/Android.mk b/media/libmediaplayerservice/nuplayer/Android.mk index e2c72ed..6609874 100644 --- a/media/libmediaplayerservice/nuplayer/Android.mk +++ b/media/libmediaplayerservice/nuplayer/Android.mk @@ -4,7 +4,6 @@ include $(CLEAR_VARS) LOCAL_SRC_FILES:= \ GenericSource.cpp \ HTTPLiveSource.cpp \ - MediaClock.cpp \ NuPlayer.cpp \ NuPlayerCCDecoder.cpp \ NuPlayerDecoder.cpp \ diff --git a/media/libmediaplayerservice/nuplayer/MediaClock.cpp b/media/libmediaplayerservice/nuplayer/MediaClock.cpp deleted file mode 100644 index 9152da1..0000000 --- a/media/libmediaplayerservice/nuplayer/MediaClock.cpp +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright (C) 2015 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. - */ - -//#define LOG_NDEBUG 0 -#define LOG_TAG "MediaClock" -#include - -#include "MediaClock.h" - -#include -#include - -namespace android { - -MediaClock::MediaClock() - : mAnchorTimeMediaUs(-1), - mAnchorTimeRealUs(-1), - mMaxTimeMediaUs(INT64_MAX), - mStartingTimeMediaUs(-1), - mPlaybackRate(1.0) { -} - -MediaClock::~MediaClock() { -} - -void MediaClock::setStartingTimeMedia(int64_t startingTimeMediaUs) { - Mutex::Autolock autoLock(mLock); - mStartingTimeMediaUs = startingTimeMediaUs; -} - -void MediaClock::clearAnchor() { - Mutex::Autolock autoLock(mLock); - mAnchorTimeMediaUs = -1; - mAnchorTimeRealUs = -1; -} - -void MediaClock::updateAnchor( - int64_t anchorTimeMediaUs, - int64_t anchorTimeRealUs, - int64_t maxTimeMediaUs) { - if (anchorTimeMediaUs < 0 || anchorTimeRealUs < 0) { - ALOGW("reject anchor time since it is negative."); - return; - } - - Mutex::Autolock autoLock(mLock); - int64_t nowUs = ALooper::GetNowUs(); - int64_t nowMediaUs = - anchorTimeMediaUs + (nowUs - anchorTimeRealUs) * (double)mPlaybackRate; - if (nowMediaUs < 0) { - ALOGW("reject anchor time since it leads to negative media time."); - return; - } - mAnchorTimeRealUs = nowUs; - mAnchorTimeMediaUs = nowMediaUs; - mMaxTimeMediaUs = maxTimeMediaUs; -} - -void MediaClock::updateMaxTimeMedia(int64_t maxTimeMediaUs) { - Mutex::Autolock autoLock(mLock); - mMaxTimeMediaUs = maxTimeMediaUs; -} - -void MediaClock::setPlaybackRate(float rate) { - CHECK_GE(rate, 0.0); - Mutex::Autolock autoLock(mLock); - if (mAnchorTimeRealUs == -1) { - mPlaybackRate = rate; - return; - } - - int64_t nowUs = ALooper::GetNowUs(); - mAnchorTimeMediaUs += (nowUs - mAnchorTimeRealUs) * (double)mPlaybackRate; - if (mAnchorTimeMediaUs < 0) { - ALOGW("setRate: anchor time should not be negative, set to 0."); - mAnchorTimeMediaUs = 0; - } - mAnchorTimeRealUs = nowUs; - mPlaybackRate = rate; -} - -status_t MediaClock::getMediaTime( - int64_t realUs, int64_t *outMediaUs, bool allowPastMaxTime) { - Mutex::Autolock autoLock(mLock); - return getMediaTime_l(realUs, outMediaUs, allowPastMaxTime); -} - -status_t MediaClock::getMediaTime_l( - int64_t realUs, int64_t *outMediaUs, bool allowPastMaxTime) { - if (mAnchorTimeRealUs == -1) { - return NO_INIT; - } - - int64_t mediaUs = mAnchorTimeMediaUs - + (realUs - mAnchorTimeRealUs) * (double)mPlaybackRate; - if (mediaUs > mMaxTimeMediaUs && !allowPastMaxTime) { - mediaUs = mMaxTimeMediaUs; - } - if (mediaUs < mStartingTimeMediaUs) { - mediaUs = mStartingTimeMediaUs; - } - if (mediaUs < 0) { - mediaUs = 0; - } - *outMediaUs = mediaUs; - return OK; -} - -status_t MediaClock::getRealTimeFor(int64_t targetMediaUs, int64_t *outRealUs) { - Mutex::Autolock autoLock(mLock); - if (mPlaybackRate == 0.0) { - return NO_INIT; - } - - int64_t nowUs = ALooper::GetNowUs(); - int64_t nowMediaUs; - status_t status = - getMediaTime_l(nowUs, &nowMediaUs, true /* allowPastMaxTime */); - if (status != OK) { - return status; - } - *outRealUs = (targetMediaUs - nowMediaUs) / (double)mPlaybackRate + nowUs; - return OK; -} - -} // namespace android diff --git a/media/libmediaplayerservice/nuplayer/MediaClock.h b/media/libmediaplayerservice/nuplayer/MediaClock.h deleted file mode 100644 index 660764f..0000000 --- a/media/libmediaplayerservice/nuplayer/MediaClock.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (C) 2015 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. - */ - -#ifndef MEDIA_CLOCK_H_ - -#define MEDIA_CLOCK_H_ - -#include -#include -#include - -namespace android { - -struct AMessage; - -struct MediaClock : public RefBase { - MediaClock(); - - void setStartingTimeMedia(int64_t startingTimeMediaUs); - - void clearAnchor(); - // It's required to use timestamp of just rendered frame as - // anchor time in paused state. - void updateAnchor( - int64_t anchorTimeMediaUs, - int64_t anchorTimeRealUs, - int64_t maxTimeMediaUs = INT64_MAX); - - void updateMaxTimeMedia(int64_t maxTimeMediaUs); - - void setPlaybackRate(float rate); - - // query media time corresponding to real time |realUs|, and save the - // result in |outMediaUs|. - status_t getMediaTime(int64_t realUs, - int64_t *outMediaUs, - bool allowPastMaxTime = false); - // query real time corresponding to media time |targetMediaUs|. - // The result is saved in |outRealUs|. - status_t getRealTimeFor(int64_t targetMediaUs, int64_t *outRealUs); - -protected: - virtual ~MediaClock(); - -private: - status_t getMediaTime_l(int64_t realUs, - int64_t *outMediaUs, - bool allowPastMaxTime); - - Mutex mLock; - - int64_t mAnchorTimeMediaUs; - int64_t mAnchorTimeRealUs; - int64_t mMaxTimeMediaUs; - int64_t mStartingTimeMediaUs; - - float mPlaybackRate; - - DISALLOW_EVIL_CONSTRUCTORS(MediaClock); -}; - -} // namespace android - -#endif // MEDIA_CLOCK_H_ diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp index e491a31..6f19ba5 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp @@ -20,13 +20,12 @@ #include "NuPlayerRenderer.h" -#include "MediaClock.h" - #include #include #include #include #include +#include #include #include #include diff --git a/media/libstagefright/Android.mk b/media/libstagefright/Android.mk index 6d9bbae..38f2e34 100644 --- a/media/libstagefright/Android.mk +++ b/media/libstagefright/Android.mk @@ -31,6 +31,7 @@ LOCAL_SRC_FILES:= \ MediaAdapter.cpp \ MediaBuffer.cpp \ MediaBufferGroup.cpp \ + MediaClock.cpp \ MediaCodec.cpp \ MediaCodecList.cpp \ MediaCodecSource.cpp \ diff --git a/media/libstagefright/MediaClock.cpp b/media/libstagefright/MediaClock.cpp new file mode 100644 index 0000000..38db5e4 --- /dev/null +++ b/media/libstagefright/MediaClock.cpp @@ -0,0 +1,139 @@ +/* + * Copyright (C) 2015 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. + */ + +//#define LOG_NDEBUG 0 +#define LOG_TAG "MediaClock" +#include + +#include + +#include +#include + +namespace android { + +MediaClock::MediaClock() + : mAnchorTimeMediaUs(-1), + mAnchorTimeRealUs(-1), + mMaxTimeMediaUs(INT64_MAX), + mStartingTimeMediaUs(-1), + mPlaybackRate(1.0) { +} + +MediaClock::~MediaClock() { +} + +void MediaClock::setStartingTimeMedia(int64_t startingTimeMediaUs) { + Mutex::Autolock autoLock(mLock); + mStartingTimeMediaUs = startingTimeMediaUs; +} + +void MediaClock::clearAnchor() { + Mutex::Autolock autoLock(mLock); + mAnchorTimeMediaUs = -1; + mAnchorTimeRealUs = -1; +} + +void MediaClock::updateAnchor( + int64_t anchorTimeMediaUs, + int64_t anchorTimeRealUs, + int64_t maxTimeMediaUs) { + if (anchorTimeMediaUs < 0 || anchorTimeRealUs < 0) { + ALOGW("reject anchor time since it is negative."); + return; + } + + Mutex::Autolock autoLock(mLock); + int64_t nowUs = ALooper::GetNowUs(); + int64_t nowMediaUs = + anchorTimeMediaUs + (nowUs - anchorTimeRealUs) * (double)mPlaybackRate; + if (nowMediaUs < 0) { + ALOGW("reject anchor time since it leads to negative media time."); + return; + } + mAnchorTimeRealUs = nowUs; + mAnchorTimeMediaUs = nowMediaUs; + mMaxTimeMediaUs = maxTimeMediaUs; +} + +void MediaClock::updateMaxTimeMedia(int64_t maxTimeMediaUs) { + Mutex::Autolock autoLock(mLock); + mMaxTimeMediaUs = maxTimeMediaUs; +} + +void MediaClock::setPlaybackRate(float rate) { + CHECK_GE(rate, 0.0); + Mutex::Autolock autoLock(mLock); + if (mAnchorTimeRealUs == -1) { + mPlaybackRate = rate; + return; + } + + int64_t nowUs = ALooper::GetNowUs(); + mAnchorTimeMediaUs += (nowUs - mAnchorTimeRealUs) * (double)mPlaybackRate; + if (mAnchorTimeMediaUs < 0) { + ALOGW("setRate: anchor time should not be negative, set to 0."); + mAnchorTimeMediaUs = 0; + } + mAnchorTimeRealUs = nowUs; + mPlaybackRate = rate; +} + +status_t MediaClock::getMediaTime( + int64_t realUs, int64_t *outMediaUs, bool allowPastMaxTime) { + Mutex::Autolock autoLock(mLock); + return getMediaTime_l(realUs, outMediaUs, allowPastMaxTime); +} + +status_t MediaClock::getMediaTime_l( + int64_t realUs, int64_t *outMediaUs, bool allowPastMaxTime) { + if (mAnchorTimeRealUs == -1) { + return NO_INIT; + } + + int64_t mediaUs = mAnchorTimeMediaUs + + (realUs - mAnchorTimeRealUs) * (double)mPlaybackRate; + if (mediaUs > mMaxTimeMediaUs && !allowPastMaxTime) { + mediaUs = mMaxTimeMediaUs; + } + if (mediaUs < mStartingTimeMediaUs) { + mediaUs = mStartingTimeMediaUs; + } + if (mediaUs < 0) { + mediaUs = 0; + } + *outMediaUs = mediaUs; + return OK; +} + +status_t MediaClock::getRealTimeFor(int64_t targetMediaUs, int64_t *outRealUs) { + Mutex::Autolock autoLock(mLock); + if (mPlaybackRate == 0.0) { + return NO_INIT; + } + + int64_t nowUs = ALooper::GetNowUs(); + int64_t nowMediaUs; + status_t status = + getMediaTime_l(nowUs, &nowMediaUs, true /* allowPastMaxTime */); + if (status != OK) { + return status; + } + *outRealUs = (targetMediaUs - nowMediaUs) / (double)mPlaybackRate + nowUs; + return OK; +} + +} // namespace android -- cgit v1.1