NuPlayerRenderer.h revision 078cfcf7cce9185ec7559910d08b0bc02bfc88a3
120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber/* 220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Copyright (C) 2010 The Android Open Source Project 320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * you may not use this file except in compliance with the License. 620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * You may obtain a copy of the License at 720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 1020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Unless required by applicable law or agreed to in writing, software 1120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 1220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * See the License for the specific language governing permissions and 1420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * limitations under the License. 1520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber */ 1620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#ifndef NUPLAYER_RENDERER_H_ 1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define NUPLAYER_RENDERER_H_ 2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include "NuPlayer.h" 2220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2320111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android { 2420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 25693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberstruct ABuffer; 2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstruct NuPlayer::Renderer : public AHandler { 2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Renderer(const sp<MediaPlayerBase::AudioSink> &sink, 2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber const sp<AMessage> ¬ify); 3020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber void queueBuffer( 32693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber bool audio, 3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber const sp<ABuffer> &buffer, 3466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber const sp<AMessage> ¬ifyConsumed); 3566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 3666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber void queueEOS(bool audio, status_t finalResult); 3766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 38fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber void flush(bool audio); 39fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 4020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber void signalTimeDiscontinuity(); 4120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4234769bc913e9f6bb138e666d94a9d685bf3da217Andreas Huber void signalAudioSinkChanged(); 4334769bc913e9f6bb138e666d94a9d685bf3da217Andreas Huber 4434769bc913e9f6bb138e666d94a9d685bf3da217Andreas Huber void pause(); 4520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber void resume(); 46693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 47693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber enum { 48693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber kWhatEOS = 'eos ', 4920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber kWhatFlushComplete = 'fluC', 5020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber kWhatPosition = 'posi', 5120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber }; 5266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 5366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huberprotected: 5466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber virtual ~Renderer(); 5566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber 5620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual void onMessageReceived(const sp<AMessage> &msg); 5720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprivate: 5920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber enum { 6020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber kWhatDrainAudioQueue = 'draA', 61693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber kWhatDrainVideoQueue = 'draV', 6220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber kWhatQueueBuffer = 'queB', 6320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber kWhatQueueEOS = 'qEOS', 6420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber kWhatFlush = 'flus', 6520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber kWhatAudioSinkChanged = 'auSC', 66693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber kWhatPause = 'paus', 67693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber kWhatResume = 'resm', 68693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber }; 6920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 7020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber struct QueueEntry { 7120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<ABuffer> mBuffer; 7220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<AMessage> mNotifyConsumed; 7320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber size_t mOffset; 7420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t mFinalResult; 7520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber }; 7620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 7720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber static const int64_t kMinPositionUpdateDelayUs; 7820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 7920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<MediaPlayerBase::AudioSink> mAudioSink; 80 sp<AMessage> mNotify; 81 List<QueueEntry> mAudioQueue; 82 List<QueueEntry> mVideoQueue; 83 uint32_t mNumFramesWritten; 84 85 bool mDrainAudioQueuePending; 86 bool mDrainVideoQueuePending; 87 int32_t mAudioQueueGeneration; 88 int32_t mVideoQueueGeneration; 89 90 int64_t mAnchorTimeMediaUs; 91 int64_t mAnchorTimeRealUs; 92 93 Mutex mFlushLock; // protects the following 2 member vars. 94 bool mFlushingAudio; 95 bool mFlushingVideo; 96 97 bool mHasAudio; 98 bool mHasVideo; 99 bool mSyncQueues; 100 101 bool mPaused; 102 103 int64_t mLastPositionUpdateUs; 104 105 bool onDrainAudioQueue(); 106 void postDrainAudioQueue(int64_t delayUs = 0); 107 108 void onDrainVideoQueue(); 109 void postDrainVideoQueue(); 110 111 void onQueueBuffer(const sp<AMessage> &msg); 112 void onQueueEOS(const sp<AMessage> &msg); 113 void onFlush(const sp<AMessage> &msg); 114 void onAudioSinkChanged(); 115 void onPause(); 116 void onResume(); 117 118 void notifyEOS(bool audio, status_t finalResult); 119 void notifyFlushComplete(bool audio); 120 void notifyPosition(); 121 122 void flushQueue(List<QueueEntry> *queue); 123 bool dropBufferWhileFlushing(bool audio, const sp<AMessage> &msg); 124 void syncQueuesDone(); 125 126 DISALLOW_EVIL_CONSTRUCTORS(Renderer); 127}; 128 129} // namespace android 130 131#endif // NUPLAYER_RENDERER_H_ 132