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