1c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia/* 2c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia * Copyright 2015 The Android Open Source Project 3c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia * 4c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia * Licensed under the Apache License, Version 2.0 (the "License"); 5c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia * you may not use this file except in compliance with the License. 6c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia * You may obtain a copy of the License at 7c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia * 8c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia * http://www.apache.org/licenses/LICENSE-2.0 9c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia * 10c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia * Unless required by applicable law or agreed to in writing, software 11c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia * distributed under the License is distributed on an "AS IS" BASIS, 12c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia * See the License for the specific language governing permissions and 14c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia * limitations under the License. 15c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia */ 16c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 17c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia#ifndef MEDIA_SYNC_H 18c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia#define MEDIA_SYNC_H 19c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 20c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia#include <gui/IConsumerListener.h> 21c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia#include <gui/IProducerListener.h> 22c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 233a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar#include <media/AudioResamplerPublic.h> 243a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar#include <media/AVSyncSettings.h> 25c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia#include <media/stagefright/foundation/AHandler.h> 26c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 27c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia#include <utils/Condition.h> 28bac588208fadec78e3fa205c238089df277d3817Wei Jia#include <utils/KeyedVector.h> 29c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia#include <utils/Mutex.h> 30c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 31c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jianamespace android { 32c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 33c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jiaclass AudioTrack; 34c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jiaclass BufferItem; 35c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jiaclass Fence; 36c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jiaclass GraphicBuffer; 37c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jiaclass IGraphicBufferConsumer; 38c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jiaclass IGraphicBufferProducer; 39c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jiastruct MediaClock; 40a3725d7b0cb79ddb49f81cba00a0164d8e645acdLajos Molnarstruct VideoFrameScheduler; 41c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 42c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia// MediaSync manages media playback and its synchronization to a media clock 43c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia// source. It can be also used for video-only playback. 44c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia// 45c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia// For video playback, it requires an output surface and provides an input 46c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia// surface. It then controls the rendering of input buffers (buffer queued to 47c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia// the input surface) on the output surface to happen at the appropriate time. 48c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia// 49c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia// For audio playback, it requires an audio track and takes updates of 50c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia// information of rendered audio data to maintain media clock when audio track 51c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia// serves as media clock source. (TODO: move audio rendering from JAVA to 52c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia// native code). 53c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia// 54c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia// It can use the audio or video track as media clock source, as well as an 55c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia// external clock. (TODO: actually support external clock as media clock 56c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia// sources; use video track as media clock source for audio-and-video stream). 57c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia// 58c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia// In video-only mode, MediaSync will playback every video frame even though 59c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia// a video frame arrives late based on its timestamp and last frame's. 60c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia// 61c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia// The client needs to configure surface (for output video rendering) and audio 62c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia// track (for querying information of audio rendering) for MediaSync. 63c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia// 64c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia// Then the client needs to obtain a surface from MediaSync and render video 65c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia// frames onto that surface. Internally, the MediaSync will receive those video 66c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia// frames and render them onto the output surface at the appropriate time. 67c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia// 68c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia// The client needs to call updateQueuedAudioData() immediately after it writes 69c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia// audio data to the audio track. Such information will be used to update media 70c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia// clock. 71c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia// 72c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jiaclass MediaSync : public AHandler { 73c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jiapublic: 74c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // Create an instance of MediaSync. 75c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia static sp<MediaSync> create(); 76c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 77c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // Called when MediaSync is used to render video. It should be called 78c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // before createInputSurface(). 79ce8c218ec9db7acd86f9f8929f8bbb668151b53dWei Jia status_t setSurface(const sp<IGraphicBufferProducer> &output); 80c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 81c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // Called when audio track is used as media clock source. It should be 82c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // called before updateQueuedAudioData(). 83ce8c218ec9db7acd86f9f8929f8bbb668151b53dWei Jia status_t setAudioTrack(const sp<AudioTrack> &audioTrack); 84c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 85c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // Create a surface for client to render video frames. This is the surface 86c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // on which the client should render video frames. Those video frames will 87c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // be internally directed to output surface for rendering at appropriate 88c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // time. 89c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia status_t createInputSurface(sp<IGraphicBufferProducer> *outBufferProducer); 90c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 91c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // Update just-rendered audio data size and the presentation timestamp of 92c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // the first frame of that audio data. It should be called immediately 93c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // after the client write audio data into AudioTrack. 94c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // This function assumes continous audio stream. 95c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // TODO: support gap or backwards updates. 96c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia status_t updateQueuedAudioData( 97c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia size_t sizeInBytes, int64_t presentationTimeUs); 98c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 99c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // Set the consumer name of the input queue. 100c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia void setName(const AString &name); 101c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 102c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // Get the media clock used by the MediaSync so that the client can obtain 103c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // corresponding media time or real time via 104c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // MediaClock::getMediaTime() and MediaClock::getRealTimeFor(). 105c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia sp<const MediaClock> getMediaClock(); 106c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 10708dc42c46c942ff316a69be1cf74f3c60cf53e7fLajos Molnar // Flush mediasync 10808dc42c46c942ff316a69be1cf74f3c60cf53e7fLajos Molnar void flush(); 10908dc42c46c942ff316a69be1cf74f3c60cf53e7fLajos Molnar 1103a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar // Set the video frame rate hint - this is used by the video FrameScheduler 1113a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar status_t setVideoFrameRateHint(float rate); 1123a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar 1133a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar // Get the video frame rate measurement from the FrameScheduler 1143a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar // returns -1 if there is no measurement 1153a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar float getVideoFrameRate(); 1163a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar 1173a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar // Set the sync settings parameters. 1183a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar status_t setSyncSettings(const AVSyncSettings &syncSettings); 1193a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar 1203a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar // Gets the sync settings parameters. 1213a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar void getSyncSettings(AVSyncSettings *syncSettings /* nonnull */); 1223a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar 1233a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar // Sets the playback rate using playback settings. 1243a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar // This method can be called any time. 1253a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar status_t setPlaybackSettings(const AudioPlaybackRate &rate); 1263a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar 1273a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar // Gets the playback rate (playback settings parameters). 1283a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar void getPlaybackSettings(AudioPlaybackRate *rate /* nonnull */); 1293a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar 13099d1f78c9b16b5668e78c353373e0e7f4592cab9Wei Jia // Get the play time for pending audio frames in audio sink. 13199d1f78c9b16b5668e78c353373e0e7f4592cab9Wei Jia status_t getPlayTimeForPendingAudioFrames(int64_t *outTimeUs); 13299d1f78c9b16b5668e78c353373e0e7f4592cab9Wei Jia 133c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jiaprotected: 134c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia virtual void onMessageReceived(const sp<AMessage> &msg); 135c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 136c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jiaprivate: 137c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia enum { 13882a633b602a7ffe1efd9886744393f52a093a2f3Lajos Molnar kWhatDrainVideo = 'dVid', 139c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia }; 140c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 141c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // This is a thin wrapper class that lets us listen to 142c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // IConsumerListener::onFrameAvailable from mInput. 143c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia class InputListener : public BnConsumerListener, 144c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia public IBinder::DeathRecipient { 145c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia public: 146c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia InputListener(const sp<MediaSync> &sync); 147c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia virtual ~InputListener(); 148c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 149c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // From IConsumerListener 150c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia virtual void onFrameAvailable(const BufferItem &item); 151c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 152c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // From IConsumerListener 153c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // We don't care about released buffers because we detach each buffer as 154c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // soon as we acquire it. See the comment for onBufferReleased below for 155c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // some clarifying notes about the name. 156c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia virtual void onBuffersReleased() {} 157c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 158c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // From IConsumerListener 159c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // We don't care about sideband streams, since we won't relay them. 160c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia virtual void onSidebandStreamChanged(); 161c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 162c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // From IBinder::DeathRecipient 163c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia virtual void binderDied(const wp<IBinder> &who); 164c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 165c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia private: 166c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia sp<MediaSync> mSync; 167c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia }; 168c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 169c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // This is a thin wrapper class that lets us listen to 170c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // IProducerListener::onBufferReleased from mOutput. 171c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia class OutputListener : public BnProducerListener, 172c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia public IBinder::DeathRecipient { 173c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia public: 174b6ea1292f8adae45d95c6f37d50c96534219b6d2Wei Jia OutputListener(const sp<MediaSync> &sync, const sp<IGraphicBufferProducer> &output); 175c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia virtual ~OutputListener(); 176c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 177c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // From IProducerListener 178c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia virtual void onBufferReleased(); 179c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 180c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // From IBinder::DeathRecipient 181c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia virtual void binderDied(const wp<IBinder> &who); 182c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 183c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia private: 184c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia sp<MediaSync> mSync; 185b6ea1292f8adae45d95c6f37d50c96534219b6d2Wei Jia sp<IGraphicBufferProducer> mOutput; 186c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia }; 187c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 188c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // mIsAbandoned is set to true when the input or output dies. 189c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // Once the MediaSync has been abandoned by one side, it will disconnect 190c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // from the other side and not attempt to communicate with it further. 191c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia bool mIsAbandoned; 192c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 193c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia mutable Mutex mMutex; 194c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia Condition mReleaseCondition; 195c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia size_t mNumOutstandingBuffers; 196c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia sp<IGraphicBufferConsumer> mInput; 197c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia sp<IGraphicBufferProducer> mOutput; 198b6ea1292f8adae45d95c6f37d50c96534219b6d2Wei Jia int mUsageFlagsFromOutput; 199a3725d7b0cb79ddb49f81cba00a0164d8e645acdLajos Molnar uint32_t mMaxAcquiredBufferCount; // max acquired buffer count 20008dc42c46c942ff316a69be1cf74f3c60cf53e7fLajos Molnar bool mReturnPendingInputFrame; // set while we are pending before acquiring an input frame 201c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 202c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia sp<AudioTrack> mAudioTrack; 203c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia uint32_t mNativeSampleRateInHz; 204c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia int64_t mNumFramesWritten; 205c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia bool mHasAudio; 206c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 207c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia int64_t mNextBufferItemMediaUs; 208c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia List<BufferItem> mBufferItems; 209a3725d7b0cb79ddb49f81cba00a0164d8e645acdLajos Molnar sp<VideoFrameScheduler> mFrameScheduler; 210bac588208fadec78e3fa205c238089df277d3817Wei Jia 211bac588208fadec78e3fa205c238089df277d3817Wei Jia // Keep track of buffers received from |mInput|. This is needed because 212bac588208fadec78e3fa205c238089df277d3817Wei Jia // it's possible the consumer of |mOutput| could return a different 213bac588208fadec78e3fa205c238089df277d3817Wei Jia // GraphicBuffer::handle (e.g., due to passing buffers through IPC), 214bac588208fadec78e3fa205c238089df277d3817Wei Jia // and that could cause problem if the producer of |mInput| only 215bac588208fadec78e3fa205c238089df277d3817Wei Jia // supports pre-registered buffers. 216bac588208fadec78e3fa205c238089df277d3817Wei Jia KeyedVector<uint64_t, sp<GraphicBuffer> > mBuffersFromInput; 217b6ea1292f8adae45d95c6f37d50c96534219b6d2Wei Jia 218b6ea1292f8adae45d95c6f37d50c96534219b6d2Wei Jia // Keep track of buffers sent to |mOutput|. When a new output surface comes 219b6ea1292f8adae45d95c6f37d50c96534219b6d2Wei Jia // in, those buffers will be returned to input and old output surface will 220b6ea1292f8adae45d95c6f37d50c96534219b6d2Wei Jia // be disconnected immediately. 221b6ea1292f8adae45d95c6f37d50c96534219b6d2Wei Jia KeyedVector<uint64_t, sp<GraphicBuffer> > mBuffersSentToOutput; 222b6ea1292f8adae45d95c6f37d50c96534219b6d2Wei Jia 223c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia sp<ALooper> mLooper; 224c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia float mPlaybackRate; 225c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 2263a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar AudioPlaybackRate mPlaybackSettings; 2273a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar AVSyncSettings mSyncSettings; 2283a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar 229c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia sp<MediaClock> mMediaClock; 230c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 231c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia MediaSync(); 232c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 233c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // Must be accessed through RefBase 234c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia virtual ~MediaSync(); 235c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 236c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia int64_t getRealTime(int64_t mediaTimeUs, int64_t nowUs); 237c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia int64_t getDurationIfPlayedAtNativeSampleRate_l(int64_t numFrames); 238c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia int64_t getPlayedOutAudioDurationMedia_l(int64_t nowUs); 239c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 240c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia void onDrainVideo_l(); 241c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 242c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // This implements the onFrameAvailable callback from IConsumerListener. 243c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // It gets called from an InputListener. 244c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // During this callback, we detach the buffer from the input, and queue 245c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // it for rendering on the output. This call can block if there are too 246c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // many outstanding buffers. If it blocks, it will resume when 247c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // onBufferReleasedByOutput releases a buffer back to the input. 248c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia void onFrameAvailableFromInput(); 249c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 25082a633b602a7ffe1efd9886744393f52a093a2f3Lajos Molnar // Send |bufferItem| to the output for rendering. 25182a633b602a7ffe1efd9886744393f52a093a2f3Lajos Molnar void renderOneBufferItem_l(const BufferItem &bufferItem); 252c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 253c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // This implements the onBufferReleased callback from IProducerListener. 254c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // It gets called from an OutputListener. 255c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // During this callback, we detach the buffer from the output, and release 256c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // it to the input. A blocked onFrameAvailable call will be allowed to proceed. 257b6ea1292f8adae45d95c6f37d50c96534219b6d2Wei Jia void onBufferReleasedByOutput(sp<IGraphicBufferProducer> &output); 258c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 259c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // Return |buffer| back to the input. 260c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia void returnBufferToInput_l(const sp<GraphicBuffer> &buffer, const sp<Fence> &fence); 261c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 262c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // When this is called, the MediaSync disconnects from (i.e., abandons) its 263c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // input or output, and signals any waiting onFrameAvailable calls to wake 264c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // up. This must be called with mMutex locked. 265c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia void onAbandoned_l(bool isInput); 266c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 2673a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar // Set the playback in a desired speed. 2683a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar // This method can be called any time. 2693a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar // |rate| is the ratio between desired speed and the normal one, and should 2703a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar // be non-negative. The meaning of rate values: 2713a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar // 1.0 -- normal playback 2723a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar // 0.0 -- stop or pause 2733a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar // larger than 1.0 -- faster than normal speed 2743a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar // between 0.0 and 1.0 -- slower than normal speed 2753a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar void updatePlaybackRate_l(float rate); 2763a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar 2773a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar // apply new sync settings 2783a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar void resync_l(); 2793a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar 2803a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar // apply playback settings only - without resyncing or updating playback rate 2813a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar status_t setPlaybackSettings_l(const AudioPlaybackRate &rate); 2823a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar 283c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia // helper. 284c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia bool isPlaying() { return mPlaybackRate != 0.0; } 285c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 286c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia DISALLOW_EVIL_CONSTRUCTORS(MediaSync); 287c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia}; 288c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 289c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia} // namespace android 290c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia 291c8db9712d9abe9b0d74193ea7d7cff428e32e62cWei Jia#endif 292