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> ¬ify, 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> ¬ifyConsumed); 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