1a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber/* 2a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber * Copyright (C) 2010 The Android Open Source Project 3a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber * 4a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber * you may not use this file except in compliance with the License. 6a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber * You may obtain a copy of the License at 7a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber * 8a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber * 10a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber * Unless required by applicable law or agreed to in writing, software 11a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber * See the License for the specific language governing permissions and 14a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber * limitations under the License. 15a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber */ 16a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 17a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber#ifndef NUPLAYER_RENDERER_H_ 18a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 19a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber#define NUPLAYER_RENDERER_H_ 20a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 21a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber#include "NuPlayer.h" 22a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 23a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Hubernamespace android { 24a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 2554e6649e4cac3475593f3acb7894837fa1dc61ebAndreas Huberstruct ABuffer; 2654e6649e4cac3475593f3acb7894837fa1dc61ebAndreas Huber 27a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huberstruct NuPlayer::Renderer : public AHandler { 28a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber Renderer(const sp<MediaPlayerBase::AudioSink> &sink, 29a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber const sp<AMessage> ¬ify); 30a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 31a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber void queueBuffer( 32a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber bool audio, 33a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber const sp<ABuffer> &buffer, 34a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber const sp<AMessage> ¬ifyConsumed); 35a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 36a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber void queueEOS(bool audio, status_t finalResult); 37a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 38a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber void flush(bool audio); 39a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 40a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber void signalTimeDiscontinuity(); 41a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 4241c3f740485a069bf101d5a1e5263880ca1035efAndreas Huber void signalAudioSinkChanged(); 4341c3f740485a069bf101d5a1e5263880ca1035efAndreas Huber 44601fe0e5957d2ef82c51ca48f963d996ea2650bcAndreas Huber void pause(); 45601fe0e5957d2ef82c51ca48f963d996ea2650bcAndreas Huber void resume(); 46601fe0e5957d2ef82c51ca48f963d996ea2650bcAndreas Huber 47a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber enum { 48115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber kWhatEOS = 'eos ', 49115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber kWhatFlushComplete = 'fluC', 50115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber kWhatPosition = 'posi', 51a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber }; 52a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 53a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huberprotected: 54a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber virtual ~Renderer(); 55a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 56a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber virtual void onMessageReceived(const sp<AMessage> &msg); 57a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 58a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huberprivate: 59a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber enum { 60115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber kWhatDrainAudioQueue = 'draA', 61115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber kWhatDrainVideoQueue = 'draV', 62115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber kWhatQueueBuffer = 'queB', 63115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber kWhatQueueEOS = 'qEOS', 64115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber kWhatFlush = 'flus', 65115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber kWhatAudioSinkChanged = 'auSC', 66115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber kWhatPause = 'paus', 67115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber kWhatResume = 'resm', 68a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber }; 69a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 70a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber struct QueueEntry { 71a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber sp<ABuffer> mBuffer; 72a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber sp<AMessage> mNotifyConsumed; 73a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber size_t mOffset; 74a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber status_t mFinalResult; 75a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber }; 76a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 77fa6dfdcfd741980ba1c1d1971b69fc6f8a34dfebAndreas Huber static const int64_t kMinPositionUpdateDelayUs; 78fa6dfdcfd741980ba1c1d1971b69fc6f8a34dfebAndreas Huber 79a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber sp<MediaPlayerBase::AudioSink> mAudioSink; 80a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber sp<AMessage> mNotify; 81a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber List<QueueEntry> mAudioQueue; 82a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber List<QueueEntry> mVideoQueue; 83a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber uint32_t mNumFramesWritten; 84a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 85a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber bool mDrainAudioQueuePending; 86a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber bool mDrainVideoQueuePending; 87a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber int32_t mAudioQueueGeneration; 88a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber int32_t mVideoQueueGeneration; 89a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 90a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber int64_t mAnchorTimeMediaUs; 91a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber int64_t mAnchorTimeRealUs; 92a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 93a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber Mutex mFlushLock; // protects the following 2 member vars. 94a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber bool mFlushingAudio; 95a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber bool mFlushingVideo; 96a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 9741c3f740485a069bf101d5a1e5263880ca1035efAndreas Huber bool mHasAudio; 9841c3f740485a069bf101d5a1e5263880ca1035efAndreas Huber bool mHasVideo; 99a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber bool mSyncQueues; 100a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 101601fe0e5957d2ef82c51ca48f963d996ea2650bcAndreas Huber bool mPaused; 102601fe0e5957d2ef82c51ca48f963d996ea2650bcAndreas Huber 103fa6dfdcfd741980ba1c1d1971b69fc6f8a34dfebAndreas Huber int64_t mLastPositionUpdateUs; 104950fc9d1159bfc38e2b58a2ccf4465c630573126Andreas Huber int64_t mVideoLateByUs; 105fa6dfdcfd741980ba1c1d1971b69fc6f8a34dfebAndreas Huber 106115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber bool onDrainAudioQueue(); 107115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber void postDrainAudioQueue(int64_t delayUs = 0); 108a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 109a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber void onDrainVideoQueue(); 110a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber void postDrainVideoQueue(); 111a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 112a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber void onQueueBuffer(const sp<AMessage> &msg); 113a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber void onQueueEOS(const sp<AMessage> &msg); 114a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber void onFlush(const sp<AMessage> &msg); 11541c3f740485a069bf101d5a1e5263880ca1035efAndreas Huber void onAudioSinkChanged(); 116601fe0e5957d2ef82c51ca48f963d996ea2650bcAndreas Huber void onPause(); 117601fe0e5957d2ef82c51ca48f963d996ea2650bcAndreas Huber void onResume(); 118a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 119d84fd7927eaf70fb7b9a55dd6c2adccfa66009acAndreas Huber void notifyEOS(bool audio, status_t finalResult); 120a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber void notifyFlushComplete(bool audio); 12108e10cb404c0f1620ca9db7494ccbb8adcca5ee5Andreas Huber void notifyPosition(); 122950fc9d1159bfc38e2b58a2ccf4465c630573126Andreas Huber void notifyVideoLateBy(int64_t lateByUs); 123a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 124a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber void flushQueue(List<QueueEntry> *queue); 125a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber bool dropBufferWhileFlushing(bool audio, const sp<AMessage> &msg); 126a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber void syncQueuesDone(); 127a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 128a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber DISALLOW_EVIL_CONSTRUCTORS(Renderer); 129a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber}; 130a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 131a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber} // namespace android 132a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber 133a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber#endif // NUPLAYER_RENDERER_H_ 134