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 { 48f57b4ea3e409537b1d5f9aaea93d356b1cebbc6aJames Dong kWhatEOS = 'eos ', 49f57b4ea3e409537b1d5f9aaea93d356b1cebbc6aJames Dong kWhatFlushComplete = 'fluC', 50f57b4ea3e409537b1d5f9aaea93d356b1cebbc6aJames Dong kWhatPosition = 'posi', 51f57b4ea3e409537b1d5f9aaea93d356b1cebbc6aJames Dong kWhatVideoRenderingStart = 'vdrd', 52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 53f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 54f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 55f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual ~Renderer(); 56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onMessageReceived(const sp<AMessage> &msg); 58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 59f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 60f933441648ef6a71dee783d733aac17b9508b452Andreas Huber enum { 61078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber kWhatDrainAudioQueue = 'draA', 62078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber kWhatDrainVideoQueue = 'draV', 63078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber kWhatQueueBuffer = 'queB', 64078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber kWhatQueueEOS = 'qEOS', 65078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber kWhatFlush = 'flus', 66078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber kWhatAudioSinkChanged = 'auSC', 67078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber kWhatPause = 'paus', 68078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber kWhatResume = 'resm', 69f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 70f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 71f933441648ef6a71dee783d733aac17b9508b452Andreas Huber struct QueueEntry { 72f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> mBuffer; 73f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> mNotifyConsumed; 74f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t mOffset; 75f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t mFinalResult; 76f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 77f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 78714aa7b7c52ce07d5fb44870c0853b4d8e5a758eAndreas Huber static const int64_t kMinPositionUpdateDelayUs; 79714aa7b7c52ce07d5fb44870c0853b4d8e5a758eAndreas Huber 80f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<MediaPlayerBase::AudioSink> mAudioSink; 81f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> mNotify; 82f933441648ef6a71dee783d733aac17b9508b452Andreas Huber List<QueueEntry> mAudioQueue; 83f933441648ef6a71dee783d733aac17b9508b452Andreas Huber List<QueueEntry> mVideoQueue; 84f933441648ef6a71dee783d733aac17b9508b452Andreas Huber uint32_t mNumFramesWritten; 85f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 86f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool mDrainAudioQueuePending; 87f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool mDrainVideoQueuePending; 88f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t mAudioQueueGeneration; 89f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t mVideoQueueGeneration; 90f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 91f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t mAnchorTimeMediaUs; 92f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t mAnchorTimeRealUs; 93f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 94f933441648ef6a71dee783d733aac17b9508b452Andreas Huber Mutex mFlushLock; // protects the following 2 member vars. 95f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool mFlushingAudio; 96f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool mFlushingVideo; 97f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 983831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber bool mHasAudio; 993831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber bool mHasVideo; 100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool mSyncQueues; 101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 102b408222bd9479c291874b607acae1425d6154fe7Andreas Huber bool mPaused; 103f57b4ea3e409537b1d5f9aaea93d356b1cebbc6aJames Dong bool mVideoRenderingStarted; 104b408222bd9479c291874b607acae1425d6154fe7Andreas Huber 105714aa7b7c52ce07d5fb44870c0853b4d8e5a758eAndreas Huber int64_t mLastPositionUpdateUs; 1063fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber int64_t mVideoLateByUs; 107714aa7b7c52ce07d5fb44870c0853b4d8e5a758eAndreas Huber 108078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber bool onDrainAudioQueue(); 109078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber void postDrainAudioQueue(int64_t delayUs = 0); 110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void onDrainVideoQueue(); 112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void postDrainVideoQueue(); 113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void onQueueBuffer(const sp<AMessage> &msg); 115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void onQueueEOS(const sp<AMessage> &msg); 116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void onFlush(const sp<AMessage> &msg); 1173831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber void onAudioSinkChanged(); 118b408222bd9479c291874b607acae1425d6154fe7Andreas Huber void onPause(); 119b408222bd9479c291874b607acae1425d6154fe7Andreas Huber void onResume(); 120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 121c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber void notifyEOS(bool audio, status_t finalResult); 122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void notifyFlushComplete(bool audio); 12343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber void notifyPosition(); 1243fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber void notifyVideoLateBy(int64_t lateByUs); 125f57b4ea3e409537b1d5f9aaea93d356b1cebbc6aJames Dong void notifyVideoRenderingStart(); 126f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 127f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void flushQueue(List<QueueEntry> *queue); 128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool dropBufferWhileFlushing(bool audio, const sp<AMessage> &msg); 129f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void syncQueuesDone(); 130f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 131f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(Renderer); 132f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 133f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 134f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 135f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 136f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif // NUPLAYER_RENDERER_H_ 137