NuPlayerRenderer.h revision 202bce11a7f66f27e6dbb6d154ddc123aa62513d
199e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten/*
265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * Copyright (C) 2010 The Android Open Source Project
365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *
465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License");
565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * you may not use this file except in compliance with the License.
665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * You may obtain a copy of the License at
765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *
865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *      http://www.apache.org/licenses/LICENSE-2.0
965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *
1065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * Unless required by applicable law or agreed to in writing, software
1165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS,
1265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * See the License for the specific language governing permissions and
1465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * limitations under the License.
1565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian */
1665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
1765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#ifndef NUPLAYER_RENDERER_H_
1865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
1965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#define NUPLAYER_RENDERER_H_
2065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
2165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include "NuPlayer.h"
2265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
2365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopiannamespace android {
2465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
2565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstruct ABuffer;
2665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstruct VideoFrameScheduler;
279ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang
2865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstruct NuPlayer::Renderer : public AHandler {
2965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    enum Flags {
30d8e6fd35ec2b59ee7d873daf1f1d9d348221c7bcGlenn Kasten        FLAG_REAL_TIME = 1,
3165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        FLAG_OFFLOAD_AUDIO = 2,
3265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    };
3365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    Renderer(const sp<MediaPlayerBase::AudioSink> &sink,
3465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian             const sp<AMessage> &notify,
3538ccae2c0324daa305f3fe77d25fdf5edec0b0e1Eric Laurent             uint32_t flags = 0);
3665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
37fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    static size_t AudioSinkCallback(
3865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            MediaPlayerBase::AudioSink *audioSink,
39f6b1678f8f508b447155a81b44e214475ab634a8Glenn Kasten            void *data, size_t size, void *me,
4065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            MediaPlayerBase::AudioSink::cb_event_t event);
41d3cee2f0f649c01e1153d593cbe723887b8e0ba0Glenn Kasten
42d3cee2f0f649c01e1153d593cbe723887b8e0ba0Glenn Kasten    void queueBuffer(
43d3cee2f0f649c01e1153d593cbe723887b8e0ba0Glenn Kasten            bool audio,
449ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang            const sp<ABuffer> &buffer,
4525b248eb52a0a16adaef6b79c9d92cb88b9a2bc2Glenn Kasten            const sp<AMessage> &notifyConsumed);
46d3cee2f0f649c01e1153d593cbe723887b8e0ba0Glenn Kasten
4765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void queueEOS(bool audio, status_t finalResult);
4865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
4965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void flush(bool audio, bool notifyComplete);
50fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin
5164760240f931714858a59c1579f07264d7182ba2Dima Zavin    void signalTimeDiscontinuity();
527394a4f358fa9908a9f0a7c954b65c399f4268e6Dima Zavin
5365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void signalAudioSinkChanged();
5465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
5565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void signalDisableOffloadAudio();
5644deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    void signalEnableOffloadAudio();
5765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
5865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void pause();
596d8b694d999e9be7d5dcc336535832a80fb6f61fEric Laurent    void resume();
6059bd0da8373af0e5159b799495fda51e03120ea4Eric Laurent
6159bd0da8373af0e5159b799495fda51e03120ea4Eric Laurent    void setVideoFrameRate(float fps);
6265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
633b21c50ef95fe4e7ac3426ca14b365749e66ff08Glenn Kasten    // Following setters and getters are protected by mTimeLock.
643b21c50ef95fe4e7ac3426ca14b365749e66ff08Glenn Kasten    status_t getCurrentPosition(int64_t *mediaUs);
65feb0db689c17dced50afaee54c659f1676e2d505Eric Laurent    status_t getCurrentPosition(
66190a46f7c84e160386610c0c4cecb9767fb5503bGlenn Kasten            int64_t *mediaUs, int64_t nowUs, bool allowPastQueuedVideo = false);
674d8d0c30abfa4b8d75866d42094cc797e05068faGlenn Kasten    void setHasMedia(bool audio);
68190a46f7c84e160386610c0c4cecb9767fb5503bGlenn Kasten    void setAudioFirstAnchorTime(int64_t mediaUs);
69190a46f7c84e160386610c0c4cecb9767fb5503bGlenn Kasten    void setAudioFirstAnchorTimeIfNeeded(int64_t mediaUs);
70190a46f7c84e160386610c0c4cecb9767fb5503bGlenn Kasten    void setAnchorTime(
71190a46f7c84e160386610c0c4cecb9767fb5503bGlenn Kasten            int64_t mediaUs, int64_t realUs, int64_t numFramesWritten = -1, bool resume = false);
724d8d0c30abfa4b8d75866d42094cc797e05068faGlenn Kasten    void setVideoLateByUs(int64_t lateUs);
734ff14bae91075eb274eb1c2975982358946e7e63John Grossman    int64_t getVideoLateByUs();
744ff14bae91075eb274eb1c2975982358946e7e63John Grossman    void setPauseStartedTimeRealUs(int64_t realUs);
754ff14bae91075eb274eb1c2975982358946e7e63John Grossman
7658912562617941964939a4182cda71eaeb153d4bGlenn Kasten    status_t openAudioSink(
7758912562617941964939a4182cda71eaeb153d4bGlenn Kasten            const sp<AMessage> &format,
7858912562617941964939a4182cda71eaeb153d4bGlenn Kasten            bool offloadOnly,
7958912562617941964939a4182cda71eaeb153d4bGlenn Kasten            bool hasVideo,
8058912562617941964939a4182cda71eaeb153d4bGlenn Kasten            uint32_t flags,
8158912562617941964939a4182cda71eaeb153d4bGlenn Kasten            bool *isOffloaded);
82fbae5dae5187aca9d974cbe15ec818e9c6f56705Glenn Kasten    void closeAudioSink();
83fbae5dae5187aca9d974cbe15ec818e9c6f56705Glenn Kasten
8458912562617941964939a4182cda71eaeb153d4bGlenn Kasten    enum {
8558912562617941964939a4182cda71eaeb153d4bGlenn Kasten        kWhatEOS                 = 'eos ',
861dc28b794587be22c90a97070d928f94586db638Glenn Kasten        kWhatFlushComplete       = 'fluC',
8758912562617941964939a4182cda71eaeb153d4bGlenn Kasten        kWhatPosition            = 'posi',
8865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        kWhatVideoRenderingStart = 'vdrd',
8965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        kWhatMediaRenderingStart = 'mdrd',
901c345196edc61694f29307a1826a64a0d26028dcJohn Grossman        kWhatAudioOffloadTearDown = 'aOTD',
911c345196edc61694f29307a1826a64a0d26028dcJohn Grossman        kWhatAudioOffloadPauseTimeout = 'aOPT',
921c345196edc61694f29307a1826a64a0d26028dcJohn Grossman    };
931c345196edc61694f29307a1826a64a0d26028dcJohn Grossman
941c345196edc61694f29307a1826a64a0d26028dcJohn Grossman    enum AudioOffloadTearDownReason {
951c345196edc61694f29307a1826a64a0d26028dcJohn Grossman        kDueToError = 0,
961c345196edc61694f29307a1826a64a0d26028dcJohn Grossman        kDueToTimeout,
971c345196edc61694f29307a1826a64a0d26028dcJohn Grossman    };
981c345196edc61694f29307a1826a64a0d26028dcJohn Grossman
991c345196edc61694f29307a1826a64a0d26028dcJohn Grossmanprotected:
1001c345196edc61694f29307a1826a64a0d26028dcJohn Grossman    virtual ~Renderer();
1011c345196edc61694f29307a1826a64a0d26028dcJohn Grossman
102de070137f11d346fba77605bd76a44c040a618fcEric Laurent    virtual void onMessageReceived(const sp<AMessage> &msg);
10365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
10465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianprivate:
105ec1d6b5e17281a066d618f7fcd2b63b3ce11f421Glenn Kasten    enum {
106ec1d6b5e17281a066d618f7fcd2b63b3ce11f421Glenn Kasten        kWhatDrainAudioQueue     = 'draA',
10765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        kWhatDrainVideoQueue     = 'draV',
10865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        kWhatPostDrainVideoQueue = 'pDVQ',
109b1cf75c4935001f61057989ee3cf27bbf09ecd9cGlenn Kasten        kWhatQueueBuffer         = 'queB',
11065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        kWhatQueueEOS            = 'qEOS',
11165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        kWhatFlush               = 'flus',
11265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        kWhatAudioSinkChanged    = 'auSC',
11365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        kWhatPause               = 'paus',
11465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        kWhatResume              = 'resm',
11565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        kWhatOpenAudioSink       = 'opnA',
11665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        kWhatCloseAudioSink      = 'clsA',
11765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        kWhatStopAudioSink       = 'stpA',
11865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        kWhatDisableOffloadAudio = 'noOA',
11965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        kWhatEnableOffloadAudio  = 'enOA',
12065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        kWhatSetVideoFrameRate   = 'sVFR',
1217dede876998ff56351d495ec3a798c1b131193e8Glenn Kasten    };
12265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
1237dede876998ff56351d495ec3a798c1b131193e8Glenn Kasten    struct QueueEntry {
1247dede876998ff56351d495ec3a798c1b131193e8Glenn Kasten        sp<ABuffer> mBuffer;
12565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        sp<AMessage> mNotifyConsumed;
1267c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent        size_t mOffset;
1277c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent        status_t mFinalResult;
12865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        int32_t mBufferOrdinal;
1297dede876998ff56351d495ec3a798c1b131193e8Glenn Kasten    };
1307dede876998ff56351d495ec3a798c1b131193e8Glenn Kasten
13160cd0a0d488e604d27fc7dbb02b00348693dfde2Eric Laurent    static const int64_t kMinPositionUpdateDelayUs;
1327cafbb32999049873d4746ba83bd20c88abe6ce6Eric Laurent
1337cafbb32999049873d4746ba83bd20c88abe6ce6Eric Laurent    sp<MediaPlayerBase::AudioSink> mAudioSink;
1347cafbb32999049873d4746ba83bd20c88abe6ce6Eric Laurent    sp<AMessage> mNotify;
1357cafbb32999049873d4746ba83bd20c88abe6ce6Eric Laurent    Mutex mLock;
1367cafbb32999049873d4746ba83bd20c88abe6ce6Eric Laurent    uint32_t mFlags;
13758912562617941964939a4182cda71eaeb153d4bGlenn Kasten    List<QueueEntry> mAudioQueue;
13858912562617941964939a4182cda71eaeb153d4bGlenn Kasten    List<QueueEntry> mVideoQueue;
1394adcede0dc54a85c31abaf139921aebd7a072d8eGlenn Kasten    uint32_t mNumFramesWritten;
1404adcede0dc54a85c31abaf139921aebd7a072d8eGlenn Kasten    sp<VideoFrameScheduler> mVideoScheduler;
14158912562617941964939a4182cda71eaeb153d4bGlenn Kasten
1424ff14bae91075eb274eb1c2975982358946e7e63John Grossman    bool mDrainAudioQueuePending;
1437cafbb32999049873d4746ba83bd20c88abe6ce6Eric Laurent    bool mDrainVideoQueuePending;
144300a2ee9327c05fbf9d3a5fd595b558097c7c5e8Glenn Kasten    int32_t mAudioQueueGeneration;
145300a2ee9327c05fbf9d3a5fd595b558097c7c5e8Glenn Kasten    int32_t mVideoQueueGeneration;
146300a2ee9327c05fbf9d3a5fd595b558097c7c5e8Glenn Kasten
147300a2ee9327c05fbf9d3a5fd595b558097c7c5e8Glenn Kasten    Mutex mTimeLock;
148300a2ee9327c05fbf9d3a5fd595b558097c7c5e8Glenn Kasten    // |mTimeLock| protects the following 7 member vars that are related to time.
149300a2ee9327c05fbf9d3a5fd595b558097c7c5e8Glenn Kasten    // Note: those members are only written on Renderer thread, so reading on Renderer thread
1504adcede0dc54a85c31abaf139921aebd7a072d8eGlenn Kasten    // doesn't need to be protected. Otherwise accessing those members must be protected by
151300a2ee9327c05fbf9d3a5fd595b558097c7c5e8Glenn Kasten    // |mTimeLock|.
1524adcede0dc54a85c31abaf139921aebd7a072d8eGlenn Kasten    // TODO: move those members to a seperated media clock class.
153300a2ee9327c05fbf9d3a5fd595b558097c7c5e8Glenn Kasten    int64_t mAudioFirstAnchorTimeMediaUs;
154300a2ee9327c05fbf9d3a5fd595b558097c7c5e8Glenn Kasten    int64_t mAnchorTimeMediaUs;
155300a2ee9327c05fbf9d3a5fd595b558097c7c5e8Glenn Kasten    int64_t mAnchorTimeRealUs;
156300a2ee9327c05fbf9d3a5fd595b558097c7c5e8Glenn Kasten    int64_t mAnchorNumFramesWritten;
157300a2ee9327c05fbf9d3a5fd595b558097c7c5e8Glenn Kasten    int64_t mAnchorMaxMediaUs;
158300a2ee9327c05fbf9d3a5fd595b558097c7c5e8Glenn Kasten    int64_t mVideoLateByUs;
159300a2ee9327c05fbf9d3a5fd595b558097c7c5e8Glenn Kasten    bool mHasAudio;
160300a2ee9327c05fbf9d3a5fd595b558097c7c5e8Glenn Kasten    bool mHasVideo;
16128ed2f93324988767b5658eba7c1fa781a275183Glenn Kasten    int64_t mPauseStartedTimeRealUs;
16228ed2f93324988767b5658eba7c1fa781a275183Glenn Kasten
16328ed2f93324988767b5658eba7c1fa781a275183Glenn Kasten    Mutex mFlushLock;  // protects the following 2 member vars.
164fd4e20c226eca185fc789de761beae64855bfbbbGlenn Kasten    bool mFlushingAudio;
165fd4e20c226eca185fc789de761beae64855bfbbbGlenn Kasten    bool mFlushingVideo;
166fd4e20c226eca185fc789de761beae64855bfbbbGlenn Kasten    bool mNotifyCompleteAudio;
167fd4e20c226eca185fc789de761beae64855bfbbbGlenn Kasten    bool mNotifyCompleteVideo;
1683ed292031dc50c56110cdadb1e3778117e3be76aGlenn Kasten
1693ed292031dc50c56110cdadb1e3778117e3be76aGlenn Kasten    bool mSyncQueues;
1703ed292031dc50c56110cdadb1e3778117e3be76aGlenn Kasten
1713ed292031dc50c56110cdadb1e3778117e3be76aGlenn Kasten    bool mPaused;
1723ed292031dc50c56110cdadb1e3778117e3be76aGlenn Kasten    bool mVideoSampleReceived;
1733ed292031dc50c56110cdadb1e3778117e3be76aGlenn Kasten    bool mVideoRenderingStarted;
1743ed292031dc50c56110cdadb1e3778117e3be76aGlenn Kasten    int32_t mVideoRenderingStartGeneration;
1753ed292031dc50c56110cdadb1e3778117e3be76aGlenn Kasten    int32_t mAudioRenderingStartGeneration;
1763ed292031dc50c56110cdadb1e3778117e3be76aGlenn Kasten
17765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    int64_t mLastPositionUpdateUs;
17865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
179d3cee2f0f649c01e1153d593cbe723887b8e0ba0Glenn Kasten    int32_t mAudioOffloadPauseTimeoutGeneration;
1809ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang    bool mAudioOffloadTornDown;
1819ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang    audio_offload_info_t mCurrentOffloadInfo;
18225b248eb52a0a16adaef6b79c9d92cb88b9a2bc2Glenn Kasten
18325b248eb52a0a16adaef6b79c9d92cb88b9a2bc2Glenn Kasten    int32_t mTotalBuffersQueued;
18425b248eb52a0a16adaef6b79c9d92cb88b9a2bc2Glenn Kasten    int32_t mLastAudioBufferDrained;
1859ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang
1869ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang
1879ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang    size_t fillAudioBuffer(void *buffer, size_t size);
1889ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang
1899ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang    bool onDrainAudioQueue();
190d3cee2f0f649c01e1153d593cbe723887b8e0ba0Glenn Kasten    int64_t getPendingAudioPlayoutDurationUs(int64_t nowUs);
1919ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang    int64_t getPlayedOutAudioDurationUs(int64_t nowUs);
192f7ffb8bf0a58037f0bc9662c5275005a4e539948Eric Laurent    void postDrainAudioQueue_l(int64_t delayUs = 0);
193799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin
194f7ffb8bf0a58037f0bc9662c5275005a4e539948Eric Laurent    void onNewAudioMediaTime(int64_t mediaTimeUs);
195799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin    int64_t getRealTimeUs(int64_t mediaTimeUs, int64_t nowUs);
196799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin
197f7ffb8bf0a58037f0bc9662c5275005a4e539948Eric Laurent    void onDrainVideoQueue();
198f7ffb8bf0a58037f0bc9662c5275005a4e539948Eric Laurent    void postDrainVideoQueue();
199f7ffb8bf0a58037f0bc9662c5275005a4e539948Eric Laurent
200f7ffb8bf0a58037f0bc9662c5275005a4e539948Eric Laurent    void prepareForMediaRenderingStart();
201799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin    void notifyIfMediaRenderingStarted();
202f7ffb8bf0a58037f0bc9662c5275005a4e539948Eric Laurent
203f7ffb8bf0a58037f0bc9662c5275005a4e539948Eric Laurent    void onQueueBuffer(const sp<AMessage> &msg);
204f7ffb8bf0a58037f0bc9662c5275005a4e539948Eric Laurent    void onQueueEOS(const sp<AMessage> &msg);
205f7ffb8bf0a58037f0bc9662c5275005a4e539948Eric Laurent    void onFlush(const sp<AMessage> &msg);
206f7ffb8bf0a58037f0bc9662c5275005a4e539948Eric Laurent    void onAudioSinkChanged();
207799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin    void onDisableOffloadAudio();
208f7ffb8bf0a58037f0bc9662c5275005a4e539948Eric Laurent    void onEnableOffloadAudio();
209f7ffb8bf0a58037f0bc9662c5275005a4e539948Eric Laurent    void onPause();
210f7ffb8bf0a58037f0bc9662c5275005a4e539948Eric Laurent    void onResume();
211f7ffb8bf0a58037f0bc9662c5275005a4e539948Eric Laurent    void onSetVideoFrameRate(float fps);
212f7ffb8bf0a58037f0bc9662c5275005a4e539948Eric Laurent    void onAudioOffloadTearDown(AudioOffloadTearDownReason reason);
213f7ffb8bf0a58037f0bc9662c5275005a4e539948Eric Laurent    status_t onOpenAudioSink(
214799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin            const sp<AMessage> &format,
215799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin            bool offloadOnly,
216799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin            bool hasVideo,
217799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin            uint32_t flags);
218799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin    void onCloseAudioSink();
219799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin
220799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin    void notifyEOS(bool audio, status_t finalResult, int64_t delayUs = 0);
22165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void notifyFlushComplete(bool audio);
22265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void notifyPosition();
22365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void notifyVideoLateBy(int64_t lateByUs);
22465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void notifyVideoRenderingStart();
2254ff14bae91075eb274eb1c2975982358946e7e63John Grossman    void notifyAudioOffloadTearDown();
2267d6c35bf132a46c0a8a9826491882495fc98bd8cGlenn Kasten
2274ff14bae91075eb274eb1c2975982358946e7e63John Grossman    void flushQueue(List<QueueEntry> *queue);
2284ff14bae91075eb274eb1c2975982358946e7e63John Grossman    bool dropBufferWhileFlushing(bool audio, const sp<AMessage> &msg);
2294ff14bae91075eb274eb1c2975982358946e7e63John Grossman    void syncQueuesDone_l();
2304ff14bae91075eb274eb1c2975982358946e7e63John Grossman
2314ff14bae91075eb274eb1c2975982358946e7e63John Grossman    bool offloadingAudio() const { return (mFlags & FLAG_OFFLOAD_AUDIO) != 0; }
23265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
2335a61d2f277af3098fc10b2881babca16391362daDima Zavin    void startAudioOffloadPauseTimeout();
2345a61d2f277af3098fc10b2881babca16391362daDima Zavin    void cancelAudioOffloadPauseTimeout();
2355a61d2f277af3098fc10b2881babca16391362daDima Zavin
2365a61d2f277af3098fc10b2881babca16391362daDima Zavin    DISALLOW_EVIL_CONSTRUCTORS(Renderer);
237799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin};
238fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin
239935752053ef2691dbb6d5a6d149e0e362c6e3c74Eric Laurent}  // namespace android
240935752053ef2691dbb6d5a6d149e0e362c6e3c74Eric Laurent
241799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin#endif  // NUPLAYER_RENDERER_H_
2424ff14bae91075eb274eb1c2975982358946e7e63John Grossman