NuPlayerRenderer.h revision 078cfcf7cce9185ec7559910d08b0bc02bfc88a3
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 { 28f933441648ef6a71dee783d733aac17b9508b452Andreas Huber Renderer(const sp<MediaPlayerBase::AudioSink> &sink, 29f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> ¬ify); 30f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 31f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void queueBuffer( 32f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool audio, 33f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<ABuffer> &buffer, 34f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> ¬ifyConsumed); 35f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 36f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void queueEOS(bool audio, status_t finalResult); 37f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 38f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void flush(bool audio); 39f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 40f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void signalTimeDiscontinuity(); 41f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 423831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber void signalAudioSinkChanged(); 433831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 44b408222bd9479c291874b607acae1425d6154fe7Andreas Huber void pause(); 45b408222bd9479c291874b607acae1425d6154fe7Andreas Huber void resume(); 46b408222bd9479c291874b607acae1425d6154fe7Andreas Huber 47f933441648ef6a71dee783d733aac17b9508b452Andreas Huber enum { 48078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber kWhatEOS = 'eos ', 49078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber kWhatFlushComplete = 'fluC', 50078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber kWhatPosition = 'posi', 51f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 53f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 54f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual ~Renderer(); 55f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onMessageReceived(const sp<AMessage> &msg); 57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 58f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber enum { 60078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber kWhatDrainAudioQueue = 'draA', 61078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber kWhatDrainVideoQueue = 'draV', 62078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber kWhatQueueBuffer = 'queB', 63078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber kWhatQueueEOS = 'qEOS', 64078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber kWhatFlush = 'flus', 65078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber kWhatAudioSinkChanged = 'auSC', 66078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber kWhatPause = 'paus', 67078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber kWhatResume = 'resm', 68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 69f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 70f933441648ef6a71dee783d733aac17b9508b452Andreas Huber struct QueueEntry { 71f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> mBuffer; 72f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> mNotifyConsumed; 73f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t mOffset; 74f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t mFinalResult; 75f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 76f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 77714aa7b7c52ce07d5fb44870c0853b4d8e5a758eAndreas Huber static const int64_t kMinPositionUpdateDelayUs; 78714aa7b7c52ce07d5fb44870c0853b4d8e5a758eAndreas Huber 79f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<MediaPlayerBase::AudioSink> mAudioSink; 80f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> mNotify; 81f933441648ef6a71dee783d733aac17b9508b452Andreas Huber List<QueueEntry> mAudioQueue; 82f933441648ef6a71dee783d733aac17b9508b452Andreas Huber List<QueueEntry> mVideoQueue; 83f933441648ef6a71dee783d733aac17b9508b452Andreas Huber uint32_t mNumFramesWritten; 84f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 85f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool mDrainAudioQueuePending; 86f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool mDrainVideoQueuePending; 87f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t mAudioQueueGeneration; 88f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t mVideoQueueGeneration; 89f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 90f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t mAnchorTimeMediaUs; 91f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t mAnchorTimeRealUs; 92f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 93f933441648ef6a71dee783d733aac17b9508b452Andreas Huber Mutex mFlushLock; // protects the following 2 member vars. 94f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool mFlushingAudio; 95f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool mFlushingVideo; 96f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 973831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber bool mHasAudio; 983831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber bool mHasVideo; 99f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool mSyncQueues; 100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 101b408222bd9479c291874b607acae1425d6154fe7Andreas Huber bool mPaused; 102b408222bd9479c291874b607acae1425d6154fe7Andreas Huber 103714aa7b7c52ce07d5fb44870c0853b4d8e5a758eAndreas Huber int64_t mLastPositionUpdateUs; 104714aa7b7c52ce07d5fb44870c0853b4d8e5a758eAndreas Huber 105078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber bool onDrainAudioQueue(); 106078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber void postDrainAudioQueue(int64_t delayUs = 0); 107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void onDrainVideoQueue(); 109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void postDrainVideoQueue(); 110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void onQueueBuffer(const sp<AMessage> &msg); 112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void onQueueEOS(const sp<AMessage> &msg); 113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void onFlush(const sp<AMessage> &msg); 1143831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber void onAudioSinkChanged(); 115b408222bd9479c291874b607acae1425d6154fe7Andreas Huber void onPause(); 116b408222bd9479c291874b607acae1425d6154fe7Andreas Huber void onResume(); 117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 118c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber void notifyEOS(bool audio, status_t finalResult); 119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void notifyFlushComplete(bool audio); 12043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber void notifyPosition(); 121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void flushQueue(List<QueueEntry> *queue); 123f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool dropBufferWhileFlushing(bool audio, const sp<AMessage> &msg); 124f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void syncQueuesDone(); 125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 126f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(Renderer); 127f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 129f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 130f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 131f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif // NUPLAYER_RENDERER_H_ 132