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#ifndef MEDIA_CLOCK_H_ 187b15cb33847e6282ea8352c98894683b796127f3Wei Jia 197b15cb33847e6282ea8352c98894683b796127f3Wei Jia#define MEDIA_CLOCK_H_ 207b15cb33847e6282ea8352c98894683b796127f3Wei Jia 217b15cb33847e6282ea8352c98894683b796127f3Wei Jia#include <media/stagefright/foundation/ABase.h> 227b15cb33847e6282ea8352c98894683b796127f3Wei Jia#include <utils/Mutex.h> 237b15cb33847e6282ea8352c98894683b796127f3Wei Jia#include <utils/RefBase.h> 247b15cb33847e6282ea8352c98894683b796127f3Wei Jia 257b15cb33847e6282ea8352c98894683b796127f3Wei Jianamespace android { 267b15cb33847e6282ea8352c98894683b796127f3Wei Jia 277b15cb33847e6282ea8352c98894683b796127f3Wei Jiastruct AMessage; 287b15cb33847e6282ea8352c98894683b796127f3Wei Jia 297b15cb33847e6282ea8352c98894683b796127f3Wei Jiastruct MediaClock : public RefBase { 307b15cb33847e6282ea8352c98894683b796127f3Wei Jia MediaClock(); 317b15cb33847e6282ea8352c98894683b796127f3Wei Jia 327b15cb33847e6282ea8352c98894683b796127f3Wei Jia void setStartingTimeMedia(int64_t startingTimeMediaUs); 337b15cb33847e6282ea8352c98894683b796127f3Wei Jia 347b15cb33847e6282ea8352c98894683b796127f3Wei Jia void clearAnchor(); 359816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia // It's required to use timestamp of just rendered frame as 369816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia // anchor time in paused state. 377b15cb33847e6282ea8352c98894683b796127f3Wei Jia void updateAnchor( 38c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia int64_t anchorTimeMediaUs, 39c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia int64_t anchorTimeRealUs, 40c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia int64_t maxTimeMediaUs = INT64_MAX); 417b15cb33847e6282ea8352c98894683b796127f3Wei Jia 427b15cb33847e6282ea8352c98894683b796127f3Wei Jia void updateMaxTimeMedia(int64_t maxTimeMediaUs); 437b15cb33847e6282ea8352c98894683b796127f3Wei Jia 449816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia void setPlaybackRate(float rate); 45fa6a06765e7b92b7ba265482bd4cf3074f9ff6ccWei Jia float getPlaybackRate() const; 467b15cb33847e6282ea8352c98894683b796127f3Wei Jia 479816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia // query media time corresponding to real time |realUs|, and save the 489816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia // result in |outMediaUs|. 49c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia status_t getMediaTime( 50c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia int64_t realUs, 51c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia int64_t *outMediaUs, 52c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia bool allowPastMaxTime = false) const; 539816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia // query real time corresponding to media time |targetMediaUs|. 549816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia // The result is saved in |outRealUs|. 55c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia status_t getRealTimeFor(int64_t targetMediaUs, int64_t *outRealUs) const; 567b15cb33847e6282ea8352c98894683b796127f3Wei Jia 577b15cb33847e6282ea8352c98894683b796127f3Wei Jiaprotected: 587b15cb33847e6282ea8352c98894683b796127f3Wei Jia virtual ~MediaClock(); 597b15cb33847e6282ea8352c98894683b796127f3Wei Jia 607b15cb33847e6282ea8352c98894683b796127f3Wei Jiaprivate: 61c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia status_t getMediaTime_l( 62c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia int64_t realUs, 63c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia int64_t *outMediaUs, 64c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia bool allowPastMaxTime) const; 659816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia 66c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia mutable Mutex mLock; 677b15cb33847e6282ea8352c98894683b796127f3Wei Jia 687b15cb33847e6282ea8352c98894683b796127f3Wei Jia int64_t mAnchorTimeMediaUs; 697b15cb33847e6282ea8352c98894683b796127f3Wei Jia int64_t mAnchorTimeRealUs; 707b15cb33847e6282ea8352c98894683b796127f3Wei Jia int64_t mMaxTimeMediaUs; 717b15cb33847e6282ea8352c98894683b796127f3Wei Jia int64_t mStartingTimeMediaUs; 727b15cb33847e6282ea8352c98894683b796127f3Wei Jia 739816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia float mPlaybackRate; 747b15cb33847e6282ea8352c98894683b796127f3Wei Jia 757b15cb33847e6282ea8352c98894683b796127f3Wei Jia DISALLOW_EVIL_CONSTRUCTORS(MediaClock); 767b15cb33847e6282ea8352c98894683b796127f3Wei Jia}; 777b15cb33847e6282ea8352c98894683b796127f3Wei Jia 787b15cb33847e6282ea8352c98894683b796127f3Wei Jia} // namespace android 797b15cb33847e6282ea8352c98894683b796127f3Wei Jia 807b15cb33847e6282ea8352c98894683b796127f3Wei Jia#endif // MEDIA_CLOCK_H_ 81