NuPlayerRenderer.h revision 9a3101b22b5115717faeac986b43fc6618fd3b30
120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber/* 220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Copyright (C) 2010 The Android Open Source Project 320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * you may not use this file except in compliance with the License. 620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * You may obtain a copy of the License at 720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 1020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Unless required by applicable law or agreed to in writing, software 1120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 1220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * See the License for the specific language governing permissions and 1420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * limitations under the License. 1520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber */ 1620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#ifndef NUPLAYER_RENDERER_H_ 1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define NUPLAYER_RENDERER_H_ 2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/AudioResamplerPublic.h> 22a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa#include <media/AVSyncSettings.h> 230683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber 2420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include "NuPlayer.h" 255561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huber 2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android { 27693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass AWakeLock; 29dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wangstruct MediaClock; 3020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass MediaCodecBuffer; 3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstruct VideoFrameScheduler; 3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 335a1c3529e4fa2f8a11054181294e0ce79fff8dd3Andreas Huberstruct NuPlayer::Renderer : public AHandler { 343de157dd8f9cd45bf9b0406268f5830887105ae1Chong Zhang enum Flags { 35ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar FLAG_REAL_TIME = 1, 361b86fe063badb5f28c467ade39be0f4008688947Andreas Huber FLAG_OFFLOAD_AUDIO = 2, 3720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber }; 38360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih Renderer(const sp<MediaPlayerBase::AudioSink> &sink, 3920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber const sp<AMessage> ¬ify, 40693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber uint32_t flags = 0); 4120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber static size_t AudioSinkCallback( 43acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber MediaPlayerBase::AudioSink *audioSink, 44acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber void *data, size_t size, void *me, 45bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber MediaPlayerBase::AudioSink::cb_event_t event); 46b33d2ac90cfce0fe6db8c3e979e7ae2bbfc28163James Dong 4782e147049625a4cfdcb228a1de7efda594d446c9Robert Shih void queueBuffer( 4866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber bool audio, 4966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber const sp<MediaCodecBuffer> &buffer, 505561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huber const sp<AMessage> ¬ifyConsumed); 511b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 525561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huber void queueEOS(bool audio, status_t finalResult); 533de157dd8f9cd45bf9b0406268f5830887105ae1Chong Zhang 54360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih status_t setPlaybackSettings(const AudioPlaybackRate &rate /* sanitized */); 55360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih status_t getPlaybackSettings(AudioPlaybackRate *rate /* nonnull */); 56360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih status_t setSyncSettings(const AVSyncSettings &sync, float videoFpsHint); 57360d6d0924f99b82ebacb5cfb6f7bca95e11b4eeRobert Shih status_t getSyncSettings(AVSyncSettings *sync /* nonnull */, float *videoFps /* nonnull */); 5899f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins 59fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber void flush(bool audio, bool notifyComplete); 6020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 6120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber void signalTimeDiscontinuity(); 6234769bc913e9f6bb138e666d94a9d685bf3da217Andreas Huber 6334769bc913e9f6bb138e666d94a9d685bf3da217Andreas Huber void signalDisableOffloadAudio(); 6499f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins void signalEnableOffloadAudio(); 6599f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins 6699f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins void pause(); 67c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong void resume(); 6820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 69693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber void setVideoFrameRate(float fps); 70c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong 71ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen status_t getCurrentPosition(int64_t *mediaUs); 7205f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen int64_t getVideoLateByUs(); 7305f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen 74693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber status_t openAudioSink( 75a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa const sp<AMessage> &format, 76a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa bool offloadOnly, 77a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa bool hasVideo, 78a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa uint32_t flags, 79a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa bool *isOffloaded); 80a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa void closeAudioSink(); 81a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa 82a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa // re-open audio sink after all pending audio buffers played. 83a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa void changeAudioFormat( 84a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa const sp<AMessage> &format, 85a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa bool offloadOnly, 86a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa bool hasVideo, 87a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa uint32_t flags, 88a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa const sp<AMessage> ¬ify); 8920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 90c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong enum { 9120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber kWhatEOS = 'eos ', 9266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber kWhatFlushComplete = 'fluC', 9366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber kWhatPosition = 'posi', 9466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber kWhatVideoRenderingStart = 'vdrd', 9566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber kWhatMediaRenderingStart = 'mdrd', 9669d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen kWhatAudioTearDown = 'adTD', 9769d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen kWhatAudioOffloadPauseTimeout = 'aOPT', 9869d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen }; 9969d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen 1000683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber enum AudioTearDownReason { 1010683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber kDueToError = 0, // Could restart with either offload or non-offload. 1020683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber kDueToTimeout, 1030683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber kForceNonOffload, // Restart only with non-offload. 10420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber }; 10520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 106dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wangprotected: 1079d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong virtual ~Renderer(); 108dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 109dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang virtual void onMessageReceived(const sp<AMessage> &msg); 110b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang 111dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wangprivate: 112771b85d9245a24273497792a2515d88d31c99e1eGloria Wang enum { 113771b85d9245a24273497792a2515d88d31c99e1eGloria Wang kWhatDrainAudioQueue = 'draA', 114771b85d9245a24273497792a2515d88d31c99e1eGloria Wang kWhatDrainVideoQueue = 'draV', 115dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang kWhatPostDrainVideoQueue = 'pDVQ', 1166511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber kWhatQueueBuffer = 'queB', 1176511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber kWhatQueueEOS = 'qEOS', 118fbe7fcfe818b6f68e352c7c450d4fe15a543b801Marco Nelissen kWhatConfigPlayback = 'cfPB', 119fbe7fcfe818b6f68e352c7c450d4fe15a543b801Marco Nelissen kWhatConfigSync = 'cfSy', 120693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber kWhatGetPlaybackSettings = 'gPbS', 121693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber kWhatGetSyncSettings = 'gSyS', 122693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber kWhatFlush = 'flus', 12320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber kWhatPause = 'paus', 12420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber kWhatResume = 'resm', 12520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber kWhatOpenAudioSink = 'opnA', 12620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber kWhatCloseAudioSink = 'clsA', 12720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber kWhatChangeAudioFormat = 'chgA', 128a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa kWhatStopAudioSink = 'stpA', 129a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa kWhatDisableOffloadAudio = 'noOA', 130a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa kWhatEnableOffloadAudio = 'enOA', 131a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa kWhatSetVideoFrameRate = 'sVFR', 132a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa }; 133a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa 134a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa // if mBuffer != nullptr, it's a buffer containing real data. 135a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa // else if mNotifyConsumed == nullptr, it's EOS. 136a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa // else it's a tag for re-opening audio sink in different format. 137a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa struct QueueEntry { 138a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa sp<MediaCodecBuffer> mBuffer; 139a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa sp<AMessage> mMeta; 140a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa sp<AMessage> mNotifyConsumed; 141a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa size_t mOffset; 142a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa status_t mFinalResult; 143a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa int32_t mBufferOrdinal; 144a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa }; 145a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa 146a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa static const int64_t kMinPositionUpdateDelayUs; 147a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa 148a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa sp<MediaPlayerBase::AudioSink> mAudioSink; 149a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa bool mUseVirtualAudioSink; 150a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa sp<AMessage> mNotify; 151a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa Mutex mLock; 152a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa uint32_t mFlags; 153a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa List<QueueEntry> mAudioQueue; 154a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa List<QueueEntry> mVideoQueue; 155a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa uint32_t mNumFramesWritten; 156a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa sp<VideoFrameScheduler> mVideoScheduler; 157a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa 158a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa bool mDrainAudioQueuePending; 159a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa bool mDrainVideoQueuePending; 160a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa int32_t mAudioQueueGeneration; 161a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa int32_t mVideoQueueGeneration; 162a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa int32_t mAudioDrainGeneration; 163a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa int32_t mVideoDrainGeneration; 164a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa int32_t mAudioEOSGeneration; 165a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa 166a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa sp<MediaClock> mMediaClock; 167a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa float mPlaybackRate; // audio track rate 168a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa 169a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa AudioPlaybackRate mPlaybackSettings; 170a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa AVSyncSettings mSyncSettings; 171a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa float mVideoFpsHint; 172a3630a418b4f65277a42cd4018cd3b0b7e134d0cPawin Vongmasa 17320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber int64_t mAudioFirstAnchorTimeMediaUs; 17420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber int64_t mAnchorTimeMediaUs; 17520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber int64_t mAnchorNumFramesWritten; 176 int64_t mVideoLateByUs; 177 bool mHasAudio; 178 bool mHasVideo; 179 180 bool mNotifyCompleteAudio; 181 bool mNotifyCompleteVideo; 182 183 bool mSyncQueues; 184 185 // modified on only renderer's thread. 186 bool mPaused; 187 int64_t mPauseDrainAudioAllowedUs; // time when we can drain/deliver audio in pause mode. 188 189 bool mVideoSampleReceived; 190 bool mVideoRenderingStarted; 191 int32_t mVideoRenderingStartGeneration; 192 int32_t mAudioRenderingStartGeneration; 193 bool mRenderingDataDelivered; 194 195 int64_t mNextAudioClockUpdateTimeUs; 196 // the media timestamp of last audio sample right before EOS. 197 int64_t mLastAudioMediaTimeUs; 198 199 int32_t mAudioOffloadPauseTimeoutGeneration; 200 bool mAudioTornDown; 201 audio_offload_info_t mCurrentOffloadInfo; 202 203 struct PcmInfo { 204 audio_channel_mask_t mChannelMask; 205 audio_output_flags_t mFlags; 206 audio_format_t mFormat; 207 int32_t mNumChannels; 208 int32_t mSampleRate; 209 }; 210 PcmInfo mCurrentPcmInfo; 211 static const PcmInfo AUDIO_PCMINFO_INITIALIZER; 212 213 int32_t mTotalBuffersQueued; 214 int32_t mLastAudioBufferDrained; 215 bool mUseAudioCallback; 216 217 sp<AWakeLock> mWakeLock; 218 219 status_t getCurrentPositionOnLooper(int64_t *mediaUs); 220 status_t getCurrentPositionOnLooper( 221 int64_t *mediaUs, int64_t nowUs, bool allowPastQueuedVideo = false); 222 bool getCurrentPositionIfPaused_l(int64_t *mediaUs); 223 status_t getCurrentPositionFromAnchor( 224 int64_t *mediaUs, int64_t nowUs, bool allowPastQueuedVideo = false); 225 226 void notifyEOSCallback(); 227 size_t fillAudioBuffer(void *buffer, size_t size); 228 229 bool onDrainAudioQueue(); 230 void drainAudioQueueUntilLastEOS(); 231 int64_t getPendingAudioPlayoutDurationUs(int64_t nowUs); 232 void postDrainAudioQueue_l(int64_t delayUs = 0); 233 234 void clearAnchorTime(); 235 void clearAudioFirstAnchorTime_l(); 236 void setAudioFirstAnchorTimeIfNeeded_l(int64_t mediaUs); 237 void setVideoLateByUs(int64_t lateUs); 238 239 void onNewAudioMediaTime(int64_t mediaTimeUs); 240 int64_t getRealTimeUs(int64_t mediaTimeUs, int64_t nowUs); 241 242 void onDrainVideoQueue(); 243 void postDrainVideoQueue(); 244 245 void prepareForMediaRenderingStart_l(); 246 void notifyIfMediaRenderingStarted_l(); 247 248 void onQueueBuffer(const sp<AMessage> &msg); 249 void onQueueEOS(const sp<AMessage> &msg); 250 void onFlush(const sp<AMessage> &msg); 251 void onAudioSinkChanged(); 252 void onDisableOffloadAudio(); 253 void onEnableOffloadAudio(); 254 status_t onConfigPlayback(const AudioPlaybackRate &rate /* sanitized */); 255 status_t onGetPlaybackSettings(AudioPlaybackRate *rate /* nonnull */); 256 status_t onConfigSync(const AVSyncSettings &sync, float videoFpsHint); 257 status_t onGetSyncSettings(AVSyncSettings *sync /* nonnull */, float *videoFps /* nonnull */); 258 259 void onPause(); 260 void onResume(); 261 void onSetVideoFrameRate(float fps); 262 int32_t getQueueGeneration(bool audio); 263 int32_t getDrainGeneration(bool audio); 264 bool getSyncQueues(); 265 void onAudioTearDown(AudioTearDownReason reason); 266 status_t onOpenAudioSink( 267 const sp<AMessage> &format, 268 bool offloadOnly, 269 bool hasVideo, 270 uint32_t flags); 271 void onCloseAudioSink(); 272 void onChangeAudioFormat(const sp<AMessage> &meta, const sp<AMessage> ¬ify); 273 274 void notifyEOS(bool audio, status_t finalResult, int64_t delayUs = 0); 275 void notifyFlushComplete(bool audio); 276 void notifyPosition(); 277 void notifyVideoLateBy(int64_t lateByUs); 278 void notifyVideoRenderingStart(); 279 void notifyAudioTearDown(AudioTearDownReason reason); 280 281 void flushQueue(List<QueueEntry> *queue); 282 bool dropBufferIfStale(bool audio, const sp<AMessage> &msg); 283 void syncQueuesDone_l(); 284 285 bool offloadingAudio() const { return (mFlags & FLAG_OFFLOAD_AUDIO) != 0; } 286 287 void startAudioOffloadPauseTimeout(); 288 void cancelAudioOffloadPauseTimeout(); 289 290 int64_t getDurationUsIfPlayedAtSampleRate(uint32_t numFrames); 291 292 DISALLOW_EVIL_CONSTRUCTORS(Renderer); 293}; 294 295} // namespace android 296 297#endif // NUPLAYER_RENDERER_H_ 298