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