NuPlayerRenderer.h revision f5b1db11734358d979a23a1ac4903872186ef60b
1f933441648ef6a71dee783d733aac17b9508b452Andreas Huber/* 2f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Copyright (C) 2010 The Android Open Source Project 3f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * 4f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * you may not use this file except in compliance with the License. 6f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * You may obtain a copy of the License at 7f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * 8f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * 10f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Unless required by applicable law or agreed to in writing, software 11f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * See the License for the specific language governing permissions and 14f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * limitations under the License. 15f933441648ef6a71dee783d733aac17b9508b452Andreas Huber */ 16f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 17f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#ifndef NUPLAYER_RENDERER_H_ 18f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 19f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#define NUPLAYER_RENDERER_H_ 20f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 21f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayer.h" 22f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 23f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android { 24f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 255bc087c573c70c84c6a39946457590b42d392a33Andreas Huberstruct ABuffer; 265bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 27f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct NuPlayer::Renderer : public AHandler { 28d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber enum Flags { 29d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber FLAG_REAL_TIME = 1, 30bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia FLAG_OFFLOAD_AUDIO = 2, 31d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber }; 32f933441648ef6a71dee783d733aac17b9508b452Andreas Huber Renderer(const sp<MediaPlayerBase::AudioSink> &sink, 33d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber const sp<AMessage> ¬ify, 34d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber uint32_t flags = 0); 35f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 36bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia static size_t AudioSinkCallback( 37bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia MediaPlayerBase::AudioSink *audioSink, 38bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia void *data, size_t size, void *me, 39bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia MediaPlayerBase::AudioSink::cb_event_t event); 40bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 41f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void queueBuffer( 42f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool audio, 43f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<ABuffer> &buffer, 44f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> ¬ifyConsumed); 45f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 46f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void queueEOS(bool audio, status_t finalResult); 47f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 48f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void flush(bool audio); 49f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 50f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void signalTimeDiscontinuity(); 51f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 523831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber void signalAudioSinkChanged(); 533831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 54bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia void signalDisableOffloadAudio(); 55bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 56b408222bd9479c291874b607acae1425d6154fe7Andreas Huber void pause(); 57b408222bd9479c291874b607acae1425d6154fe7Andreas Huber void resume(); 58b408222bd9479c291874b607acae1425d6154fe7Andreas Huber 59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber enum { 60f57b4ea3e409537b1d5f9aaea93d356b1cebbc6aJames Dong kWhatEOS = 'eos ', 61f57b4ea3e409537b1d5f9aaea93d356b1cebbc6aJames Dong kWhatFlushComplete = 'fluC', 62f57b4ea3e409537b1d5f9aaea93d356b1cebbc6aJames Dong kWhatPosition = 'posi', 63f57b4ea3e409537b1d5f9aaea93d356b1cebbc6aJames Dong kWhatVideoRenderingStart = 'vdrd', 64cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar kWhatMediaRenderingStart = 'mdrd', 653a2956d148d81194e297408179e84a47a309ef48Wei Jia kWhatAudioOffloadTearDown = 'aOTD', 66f5b1db11734358d979a23a1ac4903872186ef60bRonghua Wu kWhatAudioOffloadPauseTimeout = 'aOPT', 67f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 69f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 70f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual ~Renderer(); 71f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 72f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onMessageReceived(const sp<AMessage> &msg); 73f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 74f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 75f933441648ef6a71dee783d733aac17b9508b452Andreas Huber enum { 76bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia kWhatDrainAudioQueue = 'draA', 77bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia kWhatDrainVideoQueue = 'draV', 78bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia kWhatQueueBuffer = 'queB', 79bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia kWhatQueueEOS = 'qEOS', 80bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia kWhatFlush = 'flus', 81bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia kWhatAudioSinkChanged = 'auSC', 82bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia kWhatPause = 'paus', 83bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia kWhatResume = 'resm', 84bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia kWhatStopAudioSink = 'stpA', 85bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia kWhatDisableOffloadAudio = 'noOA', 86f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 87f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 88f933441648ef6a71dee783d733aac17b9508b452Andreas Huber struct QueueEntry { 89f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> mBuffer; 90f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> mNotifyConsumed; 91f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t mOffset; 92f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t mFinalResult; 93f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 94f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 95714aa7b7c52ce07d5fb44870c0853b4d8e5a758eAndreas Huber static const int64_t kMinPositionUpdateDelayUs; 96714aa7b7c52ce07d5fb44870c0853b4d8e5a758eAndreas Huber 97f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<MediaPlayerBase::AudioSink> mAudioSink; 98f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> mNotify; 99bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia Mutex mLock; 100d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber uint32_t mFlags; 101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber List<QueueEntry> mAudioQueue; 102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber List<QueueEntry> mVideoQueue; 103f933441648ef6a71dee783d733aac17b9508b452Andreas Huber uint32_t mNumFramesWritten; 104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool mDrainAudioQueuePending; 106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool mDrainVideoQueuePending; 107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t mAudioQueueGeneration; 108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t mVideoQueueGeneration; 109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 11009e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung int64_t mFirstAnchorTimeMediaUs; 111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t mAnchorTimeMediaUs; 112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t mAnchorTimeRealUs; 113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber Mutex mFlushLock; // protects the following 2 member vars. 115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool mFlushingAudio; 116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool mFlushingVideo; 117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1183831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber bool mHasAudio; 1193831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber bool mHasVideo; 120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool mSyncQueues; 121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 122b408222bd9479c291874b607acae1425d6154fe7Andreas Huber bool mPaused; 123fbe8bef8bcf7aed97f0332908a817b0e6d91b9baChong Zhang bool mVideoSampleReceived; 124f57b4ea3e409537b1d5f9aaea93d356b1cebbc6aJames Dong bool mVideoRenderingStarted; 125cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar int32_t mVideoRenderingStartGeneration; 126cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar int32_t mAudioRenderingStartGeneration; 127b408222bd9479c291874b607acae1425d6154fe7Andreas Huber 128714aa7b7c52ce07d5fb44870c0853b4d8e5a758eAndreas Huber int64_t mLastPositionUpdateUs; 1293fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber int64_t mVideoLateByUs; 130714aa7b7c52ce07d5fb44870c0853b4d8e5a758eAndreas Huber 131f5b1db11734358d979a23a1ac4903872186ef60bRonghua Wu int32_t mAudioOffloadPauseTimeoutGeneration; 132f5b1db11734358d979a23a1ac4903872186ef60bRonghua Wu bool mAudioOffloadTornDown; 133f5b1db11734358d979a23a1ac4903872186ef60bRonghua Wu 134bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia size_t fillAudioBuffer(void *buffer, size_t size); 135bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 136078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber bool onDrainAudioQueue(); 13706ad1528e6dd4c866c085d3cad9235d2752eb3edLajos Molnar int64_t getPendingAudioPlayoutDurationUs(int64_t nowUs); 13806ad1528e6dd4c866c085d3cad9235d2752eb3edLajos Molnar int64_t getPlayedOutAudioDurationUs(int64_t nowUs); 139bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia void postDrainAudioQueue_l(int64_t delayUs = 0); 140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 141f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void onDrainVideoQueue(); 142f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void postDrainVideoQueue(); 143f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 144cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar void prepareForMediaRenderingStart(); 145cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar void notifyIfMediaRenderingStarted(); 146cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar 147f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void onQueueBuffer(const sp<AMessage> &msg); 148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void onQueueEOS(const sp<AMessage> &msg); 149f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void onFlush(const sp<AMessage> &msg); 1503831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber void onAudioSinkChanged(); 151bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia void onDisableOffloadAudio(); 152b408222bd9479c291874b607acae1425d6154fe7Andreas Huber void onPause(); 153b408222bd9479c291874b607acae1425d6154fe7Andreas Huber void onResume(); 1543a2956d148d81194e297408179e84a47a309ef48Wei Jia void onAudioOffloadTearDown(); 155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1565095d7091874cb9e9c95ecc4fe762076ed05e624Ronghua Wu void notifyEOS(bool audio, status_t finalResult, int64_t delayUs = 0); 157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void notifyFlushComplete(bool audio); 15843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber void notifyPosition(); 1593fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber void notifyVideoLateBy(int64_t lateByUs); 160f57b4ea3e409537b1d5f9aaea93d356b1cebbc6aJames Dong void notifyVideoRenderingStart(); 1613a2956d148d81194e297408179e84a47a309ef48Wei Jia void notifyAudioOffloadTearDown(); 162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void flushQueue(List<QueueEntry> *queue); 164f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool dropBufferWhileFlushing(bool audio, const sp<AMessage> &msg); 165bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia void syncQueuesDone_l(); 166bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 167bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia bool offloadingAudio() const { return (mFlags & FLAG_OFFLOAD_AUDIO) != 0; } 168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 169f5b1db11734358d979a23a1ac4903872186ef60bRonghua Wu void startAudioOffloadPauseTimeout(); 170f5b1db11734358d979a23a1ac4903872186ef60bRonghua Wu void cancelAudioOffloadPauseTimeout(); 171f5b1db11734358d979a23a1ac4903872186ef60bRonghua Wu 172f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(Renderer); 173f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 175f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 176f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif // NUPLAYER_RENDERER_H_ 178