17b15cb33847e6282ea8352c98894683b796127f3Wei Jia/* 27b15cb33847e6282ea8352c98894683b796127f3Wei Jia * Copyright (C) 2015 The Android Open Source Project 37b15cb33847e6282ea8352c98894683b796127f3Wei Jia * 47b15cb33847e6282ea8352c98894683b796127f3Wei Jia * Licensed under the Apache License, Version 2.0 (the "License"); 57b15cb33847e6282ea8352c98894683b796127f3Wei Jia * you may not use this file except in compliance with the License. 67b15cb33847e6282ea8352c98894683b796127f3Wei Jia * You may obtain a copy of the License at 77b15cb33847e6282ea8352c98894683b796127f3Wei Jia * 87b15cb33847e6282ea8352c98894683b796127f3Wei Jia * http://www.apache.org/licenses/LICENSE-2.0 97b15cb33847e6282ea8352c98894683b796127f3Wei Jia * 107b15cb33847e6282ea8352c98894683b796127f3Wei Jia * Unless required by applicable law or agreed to in writing, software 117b15cb33847e6282ea8352c98894683b796127f3Wei Jia * distributed under the License is distributed on an "AS IS" BASIS, 127b15cb33847e6282ea8352c98894683b796127f3Wei Jia * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137b15cb33847e6282ea8352c98894683b796127f3Wei Jia * See the License for the specific language governing permissions and 147b15cb33847e6282ea8352c98894683b796127f3Wei Jia * limitations under the License. 157b15cb33847e6282ea8352c98894683b796127f3Wei Jia */ 167b15cb33847e6282ea8352c98894683b796127f3Wei Jia 177b15cb33847e6282ea8352c98894683b796127f3Wei Jia//#define LOG_NDEBUG 0 187b15cb33847e6282ea8352c98894683b796127f3Wei Jia#define LOG_TAG "MediaClock" 197b15cb33847e6282ea8352c98894683b796127f3Wei Jia#include <utils/Log.h> 207b15cb33847e6282ea8352c98894683b796127f3Wei Jia 215833b6aad2c46ba516bdc8262f4fc4667e8018edWei Jia#include <media/stagefright/MediaClock.h> 227b15cb33847e6282ea8352c98894683b796127f3Wei Jia 239816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia#include <media/stagefright/foundation/ADebug.h> 247b15cb33847e6282ea8352c98894683b796127f3Wei Jia#include <media/stagefright/foundation/ALooper.h> 257b15cb33847e6282ea8352c98894683b796127f3Wei Jia 267b15cb33847e6282ea8352c98894683b796127f3Wei Jianamespace android { 277b15cb33847e6282ea8352c98894683b796127f3Wei Jia 284ecbea3ae1fcefb082dc419cb663909536138ddbWei Jia// Maximum allowed time backwards from anchor change. 294ecbea3ae1fcefb082dc419cb663909536138ddbWei Jia// If larger than this threshold, it's treated as discontinuity. 304ecbea3ae1fcefb082dc419cb663909536138ddbWei Jiastatic const int64_t kAnchorFluctuationAllowedUs = 10000ll; 314ecbea3ae1fcefb082dc419cb663909536138ddbWei Jia 327b15cb33847e6282ea8352c98894683b796127f3Wei JiaMediaClock::MediaClock() 337b15cb33847e6282ea8352c98894683b796127f3Wei Jia : mAnchorTimeMediaUs(-1), 347b15cb33847e6282ea8352c98894683b796127f3Wei Jia mAnchorTimeRealUs(-1), 357b15cb33847e6282ea8352c98894683b796127f3Wei Jia mMaxTimeMediaUs(INT64_MAX), 367b15cb33847e6282ea8352c98894683b796127f3Wei Jia mStartingTimeMediaUs(-1), 379816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia mPlaybackRate(1.0) { 387b15cb33847e6282ea8352c98894683b796127f3Wei Jia} 397b15cb33847e6282ea8352c98894683b796127f3Wei Jia 407b15cb33847e6282ea8352c98894683b796127f3Wei JiaMediaClock::~MediaClock() { 417b15cb33847e6282ea8352c98894683b796127f3Wei Jia} 427b15cb33847e6282ea8352c98894683b796127f3Wei Jia 437b15cb33847e6282ea8352c98894683b796127f3Wei Jiavoid MediaClock::setStartingTimeMedia(int64_t startingTimeMediaUs) { 447b15cb33847e6282ea8352c98894683b796127f3Wei Jia Mutex::Autolock autoLock(mLock); 457b15cb33847e6282ea8352c98894683b796127f3Wei Jia mStartingTimeMediaUs = startingTimeMediaUs; 467b15cb33847e6282ea8352c98894683b796127f3Wei Jia} 477b15cb33847e6282ea8352c98894683b796127f3Wei Jia 487b15cb33847e6282ea8352c98894683b796127f3Wei Jiavoid MediaClock::clearAnchor() { 497b15cb33847e6282ea8352c98894683b796127f3Wei Jia Mutex::Autolock autoLock(mLock); 507b15cb33847e6282ea8352c98894683b796127f3Wei Jia mAnchorTimeMediaUs = -1; 517b15cb33847e6282ea8352c98894683b796127f3Wei Jia mAnchorTimeRealUs = -1; 527b15cb33847e6282ea8352c98894683b796127f3Wei Jia} 537b15cb33847e6282ea8352c98894683b796127f3Wei Jia 547b15cb33847e6282ea8352c98894683b796127f3Wei Jiavoid MediaClock::updateAnchor( 557b15cb33847e6282ea8352c98894683b796127f3Wei Jia int64_t anchorTimeMediaUs, 567b15cb33847e6282ea8352c98894683b796127f3Wei Jia int64_t anchorTimeRealUs, 577b15cb33847e6282ea8352c98894683b796127f3Wei Jia int64_t maxTimeMediaUs) { 587b15cb33847e6282ea8352c98894683b796127f3Wei Jia if (anchorTimeMediaUs < 0 || anchorTimeRealUs < 0) { 597b15cb33847e6282ea8352c98894683b796127f3Wei Jia ALOGW("reject anchor time since it is negative."); 607b15cb33847e6282ea8352c98894683b796127f3Wei Jia return; 617b15cb33847e6282ea8352c98894683b796127f3Wei Jia } 627b15cb33847e6282ea8352c98894683b796127f3Wei Jia 639816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia Mutex::Autolock autoLock(mLock); 647b15cb33847e6282ea8352c98894683b796127f3Wei Jia int64_t nowUs = ALooper::GetNowUs(); 659816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia int64_t nowMediaUs = 669816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia anchorTimeMediaUs + (nowUs - anchorTimeRealUs) * (double)mPlaybackRate; 677b15cb33847e6282ea8352c98894683b796127f3Wei Jia if (nowMediaUs < 0) { 687b15cb33847e6282ea8352c98894683b796127f3Wei Jia ALOGW("reject anchor time since it leads to negative media time."); 697b15cb33847e6282ea8352c98894683b796127f3Wei Jia return; 707b15cb33847e6282ea8352c98894683b796127f3Wei Jia } 714ecbea3ae1fcefb082dc419cb663909536138ddbWei Jia 724ecbea3ae1fcefb082dc419cb663909536138ddbWei Jia if (maxTimeMediaUs != -1) { 734ecbea3ae1fcefb082dc419cb663909536138ddbWei Jia mMaxTimeMediaUs = maxTimeMediaUs; 744ecbea3ae1fcefb082dc419cb663909536138ddbWei Jia } 754ecbea3ae1fcefb082dc419cb663909536138ddbWei Jia if (mAnchorTimeRealUs != -1) { 764ecbea3ae1fcefb082dc419cb663909536138ddbWei Jia int64_t oldNowMediaUs = 774ecbea3ae1fcefb082dc419cb663909536138ddbWei Jia mAnchorTimeMediaUs + (nowUs - mAnchorTimeRealUs) * (double)mPlaybackRate; 784ecbea3ae1fcefb082dc419cb663909536138ddbWei Jia if (nowMediaUs < oldNowMediaUs 794ecbea3ae1fcefb082dc419cb663909536138ddbWei Jia && nowMediaUs > oldNowMediaUs - kAnchorFluctuationAllowedUs) { 804ecbea3ae1fcefb082dc419cb663909536138ddbWei Jia return; 814ecbea3ae1fcefb082dc419cb663909536138ddbWei Jia } 824ecbea3ae1fcefb082dc419cb663909536138ddbWei Jia } 837b15cb33847e6282ea8352c98894683b796127f3Wei Jia mAnchorTimeRealUs = nowUs; 847b15cb33847e6282ea8352c98894683b796127f3Wei Jia mAnchorTimeMediaUs = nowMediaUs; 857b15cb33847e6282ea8352c98894683b796127f3Wei Jia} 867b15cb33847e6282ea8352c98894683b796127f3Wei Jia 877b15cb33847e6282ea8352c98894683b796127f3Wei Jiavoid MediaClock::updateMaxTimeMedia(int64_t maxTimeMediaUs) { 887b15cb33847e6282ea8352c98894683b796127f3Wei Jia Mutex::Autolock autoLock(mLock); 897b15cb33847e6282ea8352c98894683b796127f3Wei Jia mMaxTimeMediaUs = maxTimeMediaUs; 907b15cb33847e6282ea8352c98894683b796127f3Wei Jia} 917b15cb33847e6282ea8352c98894683b796127f3Wei Jia 929816016afb2a13c6a866cd047d57020566a8b9a9Wei Jiavoid MediaClock::setPlaybackRate(float rate) { 939816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia CHECK_GE(rate, 0.0); 947b15cb33847e6282ea8352c98894683b796127f3Wei Jia Mutex::Autolock autoLock(mLock); 957b15cb33847e6282ea8352c98894683b796127f3Wei Jia if (mAnchorTimeRealUs == -1) { 969816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia mPlaybackRate = rate; 977b15cb33847e6282ea8352c98894683b796127f3Wei Jia return; 987b15cb33847e6282ea8352c98894683b796127f3Wei Jia } 997b15cb33847e6282ea8352c98894683b796127f3Wei Jia 1007b15cb33847e6282ea8352c98894683b796127f3Wei Jia int64_t nowUs = ALooper::GetNowUs(); 1019816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia mAnchorTimeMediaUs += (nowUs - mAnchorTimeRealUs) * (double)mPlaybackRate; 1027b15cb33847e6282ea8352c98894683b796127f3Wei Jia if (mAnchorTimeMediaUs < 0) { 1039816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia ALOGW("setRate: anchor time should not be negative, set to 0."); 1047b15cb33847e6282ea8352c98894683b796127f3Wei Jia mAnchorTimeMediaUs = 0; 1057b15cb33847e6282ea8352c98894683b796127f3Wei Jia } 1067b15cb33847e6282ea8352c98894683b796127f3Wei Jia mAnchorTimeRealUs = nowUs; 1079816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia mPlaybackRate = rate; 1087b15cb33847e6282ea8352c98894683b796127f3Wei Jia} 1097b15cb33847e6282ea8352c98894683b796127f3Wei Jia 110fa6a06765e7b92b7ba265482bd4cf3074f9ff6ccWei Jiafloat MediaClock::getPlaybackRate() const { 111fa6a06765e7b92b7ba265482bd4cf3074f9ff6ccWei Jia Mutex::Autolock autoLock(mLock); 112fa6a06765e7b92b7ba265482bd4cf3074f9ff6ccWei Jia return mPlaybackRate; 113fa6a06765e7b92b7ba265482bd4cf3074f9ff6ccWei Jia} 114fa6a06765e7b92b7ba265482bd4cf3074f9ff6ccWei Jia 1159816016afb2a13c6a866cd047d57020566a8b9a9Wei Jiastatus_t MediaClock::getMediaTime( 116c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia int64_t realUs, int64_t *outMediaUs, bool allowPastMaxTime) const { 117c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia if (outMediaUs == NULL) { 118c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia return BAD_VALUE; 119c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia } 120c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 1217b15cb33847e6282ea8352c98894683b796127f3Wei Jia Mutex::Autolock autoLock(mLock); 1229816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia return getMediaTime_l(realUs, outMediaUs, allowPastMaxTime); 1239816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia} 1247b15cb33847e6282ea8352c98894683b796127f3Wei Jia 1259816016afb2a13c6a866cd047d57020566a8b9a9Wei Jiastatus_t MediaClock::getMediaTime_l( 126c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia int64_t realUs, int64_t *outMediaUs, bool allowPastMaxTime) const { 1277b15cb33847e6282ea8352c98894683b796127f3Wei Jia if (mAnchorTimeRealUs == -1) { 1289816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia return NO_INIT; 1297b15cb33847e6282ea8352c98894683b796127f3Wei Jia } 1307b15cb33847e6282ea8352c98894683b796127f3Wei Jia 1319816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia int64_t mediaUs = mAnchorTimeMediaUs 1329816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia + (realUs - mAnchorTimeRealUs) * (double)mPlaybackRate; 1339816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia if (mediaUs > mMaxTimeMediaUs && !allowPastMaxTime) { 1349816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia mediaUs = mMaxTimeMediaUs; 1359816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia } 1369816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia if (mediaUs < mStartingTimeMediaUs) { 1379816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia mediaUs = mStartingTimeMediaUs; 1389816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia } 1399816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia if (mediaUs < 0) { 1409816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia mediaUs = 0; 1419816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia } 1429816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia *outMediaUs = mediaUs; 1439816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia return OK; 1447b15cb33847e6282ea8352c98894683b796127f3Wei Jia} 1457b15cb33847e6282ea8352c98894683b796127f3Wei Jia 146c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jiastatus_t MediaClock::getRealTimeFor( 147c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia int64_t targetMediaUs, int64_t *outRealUs) const { 148c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia if (outRealUs == NULL) { 149c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia return BAD_VALUE; 150c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia } 151c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 1527b15cb33847e6282ea8352c98894683b796127f3Wei Jia Mutex::Autolock autoLock(mLock); 1539816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia if (mPlaybackRate == 0.0) { 1549816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia return NO_INIT; 1557b15cb33847e6282ea8352c98894683b796127f3Wei Jia } 1567b15cb33847e6282ea8352c98894683b796127f3Wei Jia 1579816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia int64_t nowUs = ALooper::GetNowUs(); 1589816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia int64_t nowMediaUs; 1599816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia status_t status = 1609816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia getMediaTime_l(nowUs, &nowMediaUs, true /* allowPastMaxTime */); 1619816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia if (status != OK) { 1629816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia return status; 1637b15cb33847e6282ea8352c98894683b796127f3Wei Jia } 1649816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia *outRealUs = (targetMediaUs - nowMediaUs) / (double)mPlaybackRate + nowUs; 1659816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia return OK; 1667b15cb33847e6282ea8352c98894683b796127f3Wei Jia} 1677b15cb33847e6282ea8352c98894683b796127f3Wei Jia 1687b15cb33847e6282ea8352c98894683b796127f3Wei Jia} // namespace android 169