MediaClock.cpp revision 5833b6aad2c46ba516bdc8262f4fc4667e8018ed
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 287b15cb33847e6282ea8352c98894683b796127f3Wei JiaMediaClock::MediaClock() 297b15cb33847e6282ea8352c98894683b796127f3Wei Jia : mAnchorTimeMediaUs(-1), 307b15cb33847e6282ea8352c98894683b796127f3Wei Jia mAnchorTimeRealUs(-1), 317b15cb33847e6282ea8352c98894683b796127f3Wei Jia mMaxTimeMediaUs(INT64_MAX), 327b15cb33847e6282ea8352c98894683b796127f3Wei Jia mStartingTimeMediaUs(-1), 339816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia mPlaybackRate(1.0) { 347b15cb33847e6282ea8352c98894683b796127f3Wei Jia} 357b15cb33847e6282ea8352c98894683b796127f3Wei Jia 367b15cb33847e6282ea8352c98894683b796127f3Wei JiaMediaClock::~MediaClock() { 377b15cb33847e6282ea8352c98894683b796127f3Wei Jia} 387b15cb33847e6282ea8352c98894683b796127f3Wei Jia 397b15cb33847e6282ea8352c98894683b796127f3Wei Jiavoid MediaClock::setStartingTimeMedia(int64_t startingTimeMediaUs) { 407b15cb33847e6282ea8352c98894683b796127f3Wei Jia Mutex::Autolock autoLock(mLock); 417b15cb33847e6282ea8352c98894683b796127f3Wei Jia mStartingTimeMediaUs = startingTimeMediaUs; 427b15cb33847e6282ea8352c98894683b796127f3Wei Jia} 437b15cb33847e6282ea8352c98894683b796127f3Wei Jia 447b15cb33847e6282ea8352c98894683b796127f3Wei Jiavoid MediaClock::clearAnchor() { 457b15cb33847e6282ea8352c98894683b796127f3Wei Jia Mutex::Autolock autoLock(mLock); 467b15cb33847e6282ea8352c98894683b796127f3Wei Jia mAnchorTimeMediaUs = -1; 477b15cb33847e6282ea8352c98894683b796127f3Wei Jia mAnchorTimeRealUs = -1; 487b15cb33847e6282ea8352c98894683b796127f3Wei Jia} 497b15cb33847e6282ea8352c98894683b796127f3Wei Jia 507b15cb33847e6282ea8352c98894683b796127f3Wei Jiavoid MediaClock::updateAnchor( 517b15cb33847e6282ea8352c98894683b796127f3Wei Jia int64_t anchorTimeMediaUs, 527b15cb33847e6282ea8352c98894683b796127f3Wei Jia int64_t anchorTimeRealUs, 537b15cb33847e6282ea8352c98894683b796127f3Wei Jia int64_t maxTimeMediaUs) { 547b15cb33847e6282ea8352c98894683b796127f3Wei Jia if (anchorTimeMediaUs < 0 || anchorTimeRealUs < 0) { 557b15cb33847e6282ea8352c98894683b796127f3Wei Jia ALOGW("reject anchor time since it is negative."); 567b15cb33847e6282ea8352c98894683b796127f3Wei Jia return; 577b15cb33847e6282ea8352c98894683b796127f3Wei Jia } 587b15cb33847e6282ea8352c98894683b796127f3Wei Jia 599816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia Mutex::Autolock autoLock(mLock); 607b15cb33847e6282ea8352c98894683b796127f3Wei Jia int64_t nowUs = ALooper::GetNowUs(); 619816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia int64_t nowMediaUs = 629816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia anchorTimeMediaUs + (nowUs - anchorTimeRealUs) * (double)mPlaybackRate; 637b15cb33847e6282ea8352c98894683b796127f3Wei Jia if (nowMediaUs < 0) { 647b15cb33847e6282ea8352c98894683b796127f3Wei Jia ALOGW("reject anchor time since it leads to negative media time."); 657b15cb33847e6282ea8352c98894683b796127f3Wei Jia return; 667b15cb33847e6282ea8352c98894683b796127f3Wei Jia } 677b15cb33847e6282ea8352c98894683b796127f3Wei Jia mAnchorTimeRealUs = nowUs; 687b15cb33847e6282ea8352c98894683b796127f3Wei Jia mAnchorTimeMediaUs = nowMediaUs; 697b15cb33847e6282ea8352c98894683b796127f3Wei Jia mMaxTimeMediaUs = maxTimeMediaUs; 707b15cb33847e6282ea8352c98894683b796127f3Wei Jia} 717b15cb33847e6282ea8352c98894683b796127f3Wei Jia 727b15cb33847e6282ea8352c98894683b796127f3Wei Jiavoid MediaClock::updateMaxTimeMedia(int64_t maxTimeMediaUs) { 737b15cb33847e6282ea8352c98894683b796127f3Wei Jia Mutex::Autolock autoLock(mLock); 747b15cb33847e6282ea8352c98894683b796127f3Wei Jia mMaxTimeMediaUs = maxTimeMediaUs; 757b15cb33847e6282ea8352c98894683b796127f3Wei Jia} 767b15cb33847e6282ea8352c98894683b796127f3Wei Jia 779816016afb2a13c6a866cd047d57020566a8b9a9Wei Jiavoid MediaClock::setPlaybackRate(float rate) { 789816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia CHECK_GE(rate, 0.0); 797b15cb33847e6282ea8352c98894683b796127f3Wei Jia Mutex::Autolock autoLock(mLock); 807b15cb33847e6282ea8352c98894683b796127f3Wei Jia if (mAnchorTimeRealUs == -1) { 819816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia mPlaybackRate = rate; 827b15cb33847e6282ea8352c98894683b796127f3Wei Jia return; 837b15cb33847e6282ea8352c98894683b796127f3Wei Jia } 847b15cb33847e6282ea8352c98894683b796127f3Wei Jia 857b15cb33847e6282ea8352c98894683b796127f3Wei Jia int64_t nowUs = ALooper::GetNowUs(); 869816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia mAnchorTimeMediaUs += (nowUs - mAnchorTimeRealUs) * (double)mPlaybackRate; 877b15cb33847e6282ea8352c98894683b796127f3Wei Jia if (mAnchorTimeMediaUs < 0) { 889816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia ALOGW("setRate: anchor time should not be negative, set to 0."); 897b15cb33847e6282ea8352c98894683b796127f3Wei Jia mAnchorTimeMediaUs = 0; 907b15cb33847e6282ea8352c98894683b796127f3Wei Jia } 917b15cb33847e6282ea8352c98894683b796127f3Wei Jia mAnchorTimeRealUs = nowUs; 929816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia mPlaybackRate = rate; 937b15cb33847e6282ea8352c98894683b796127f3Wei Jia} 947b15cb33847e6282ea8352c98894683b796127f3Wei Jia 959816016afb2a13c6a866cd047d57020566a8b9a9Wei Jiastatus_t MediaClock::getMediaTime( 969816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia int64_t realUs, int64_t *outMediaUs, bool allowPastMaxTime) { 977b15cb33847e6282ea8352c98894683b796127f3Wei Jia Mutex::Autolock autoLock(mLock); 989816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia return getMediaTime_l(realUs, outMediaUs, allowPastMaxTime); 999816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia} 1007b15cb33847e6282ea8352c98894683b796127f3Wei Jia 1019816016afb2a13c6a866cd047d57020566a8b9a9Wei Jiastatus_t MediaClock::getMediaTime_l( 1029816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia int64_t realUs, int64_t *outMediaUs, bool allowPastMaxTime) { 1037b15cb33847e6282ea8352c98894683b796127f3Wei Jia if (mAnchorTimeRealUs == -1) { 1049816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia return NO_INIT; 1057b15cb33847e6282ea8352c98894683b796127f3Wei Jia } 1067b15cb33847e6282ea8352c98894683b796127f3Wei Jia 1079816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia int64_t mediaUs = mAnchorTimeMediaUs 1089816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia + (realUs - mAnchorTimeRealUs) * (double)mPlaybackRate; 1099816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia if (mediaUs > mMaxTimeMediaUs && !allowPastMaxTime) { 1109816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia mediaUs = mMaxTimeMediaUs; 1119816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia } 1129816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia if (mediaUs < mStartingTimeMediaUs) { 1139816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia mediaUs = mStartingTimeMediaUs; 1149816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia } 1159816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia if (mediaUs < 0) { 1169816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia mediaUs = 0; 1179816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia } 1189816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia *outMediaUs = mediaUs; 1199816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia return OK; 1207b15cb33847e6282ea8352c98894683b796127f3Wei Jia} 1217b15cb33847e6282ea8352c98894683b796127f3Wei Jia 1229816016afb2a13c6a866cd047d57020566a8b9a9Wei Jiastatus_t MediaClock::getRealTimeFor(int64_t targetMediaUs, int64_t *outRealUs) { 1237b15cb33847e6282ea8352c98894683b796127f3Wei Jia Mutex::Autolock autoLock(mLock); 1249816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia if (mPlaybackRate == 0.0) { 1259816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia return NO_INIT; 1267b15cb33847e6282ea8352c98894683b796127f3Wei Jia } 1277b15cb33847e6282ea8352c98894683b796127f3Wei Jia 1289816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia int64_t nowUs = ALooper::GetNowUs(); 1299816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia int64_t nowMediaUs; 1309816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia status_t status = 1319816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia getMediaTime_l(nowUs, &nowMediaUs, true /* allowPastMaxTime */); 1329816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia if (status != OK) { 1339816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia return status; 1347b15cb33847e6282ea8352c98894683b796127f3Wei Jia } 1359816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia *outRealUs = (targetMediaUs - nowMediaUs) / (double)mPlaybackRate + nowUs; 1369816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia return OK; 1377b15cb33847e6282ea8352c98894683b796127f3Wei Jia} 1387b15cb33847e6282ea8352c98894683b796127f3Wei Jia 1397b15cb33847e6282ea8352c98894683b796127f3Wei Jia} // namespace android 140