NuPlayerRenderer.h revision bc2fb720bbd0acd122bacc67e844e982d068f6f9
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', 65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 67f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual ~Renderer(); 69f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 70f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onMessageReceived(const sp<AMessage> &msg); 71f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 72f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 73f933441648ef6a71dee783d733aac17b9508b452Andreas Huber enum { 74bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia kWhatDrainAudioQueue = 'draA', 75bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia kWhatDrainVideoQueue = 'draV', 76bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia kWhatQueueBuffer = 'queB', 77bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia kWhatQueueEOS = 'qEOS', 78bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia kWhatFlush = 'flus', 79bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia kWhatAudioSinkChanged = 'auSC', 80bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia kWhatPause = 'paus', 81bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia kWhatResume = 'resm', 82bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia kWhatStopAudioSink = 'stpA', 83bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia kWhatDisableOffloadAudio = 'noOA', 84f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 85f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 86f933441648ef6a71dee783d733aac17b9508b452Andreas Huber struct QueueEntry { 87f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> mBuffer; 88f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> mNotifyConsumed; 89f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t mOffset; 90f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t mFinalResult; 91f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 92f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 93714aa7b7c52ce07d5fb44870c0853b4d8e5a758eAndreas Huber static const int64_t kMinPositionUpdateDelayUs; 94714aa7b7c52ce07d5fb44870c0853b4d8e5a758eAndreas Huber 95f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<MediaPlayerBase::AudioSink> mAudioSink; 96f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> mNotify; 97bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia Mutex mLock; 98d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber uint32_t mFlags; 99f933441648ef6a71dee783d733aac17b9508b452Andreas Huber List<QueueEntry> mAudioQueue; 100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber List<QueueEntry> mVideoQueue; 101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber uint32_t mNumFramesWritten; 102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 103f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool mDrainAudioQueuePending; 104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool mDrainVideoQueuePending; 105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t mAudioQueueGeneration; 106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t mVideoQueueGeneration; 107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 108bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia int64_t mFirstAudioTimeUs; 109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t mAnchorTimeMediaUs; 110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t mAnchorTimeRealUs; 111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber Mutex mFlushLock; // protects the following 2 member vars. 113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool mFlushingAudio; 114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool mFlushingVideo; 115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1163831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber bool mHasAudio; 1173831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber bool mHasVideo; 118f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool mSyncQueues; 119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 120b408222bd9479c291874b607acae1425d6154fe7Andreas Huber bool mPaused; 121f57b4ea3e409537b1d5f9aaea93d356b1cebbc6aJames Dong bool mVideoRenderingStarted; 122cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar int32_t mVideoRenderingStartGeneration; 123cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar int32_t mAudioRenderingStartGeneration; 124b408222bd9479c291874b607acae1425d6154fe7Andreas Huber 125714aa7b7c52ce07d5fb44870c0853b4d8e5a758eAndreas Huber int64_t mLastPositionUpdateUs; 1263fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber int64_t mVideoLateByUs; 127714aa7b7c52ce07d5fb44870c0853b4d8e5a758eAndreas Huber 128bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia size_t fillAudioBuffer(void *buffer, size_t size); 129bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 130078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber bool onDrainAudioQueue(); 131bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia void postDrainAudioQueue_l(int64_t delayUs = 0); 132f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 133f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void onDrainVideoQueue(); 134f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void postDrainVideoQueue(); 135f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 136cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar void prepareForMediaRenderingStart(); 137cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar void notifyIfMediaRenderingStarted(); 138cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar 139f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void onQueueBuffer(const sp<AMessage> &msg); 140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void onQueueEOS(const sp<AMessage> &msg); 141f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void onFlush(const sp<AMessage> &msg); 1423831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber void onAudioSinkChanged(); 143bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia void onDisableOffloadAudio(); 144b408222bd9479c291874b607acae1425d6154fe7Andreas Huber void onPause(); 145b408222bd9479c291874b607acae1425d6154fe7Andreas Huber void onResume(); 146f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 147c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber void notifyEOS(bool audio, status_t finalResult); 148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void notifyFlushComplete(bool audio); 14943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber void notifyPosition(); 1503fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber void notifyVideoLateBy(int64_t lateByUs); 151f57b4ea3e409537b1d5f9aaea93d356b1cebbc6aJames Dong void notifyVideoRenderingStart(); 152f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void flushQueue(List<QueueEntry> *queue); 154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool dropBufferWhileFlushing(bool audio, const sp<AMessage> &msg); 155bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia void syncQueuesDone_l(); 156bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia 157bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia bool offloadingAudio() const { return (mFlags & FLAG_OFFLOAD_AUDIO) != 0; } 158f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 159f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(Renderer); 160f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 164f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif // NUPLAYER_RENDERER_H_ 165