|  | /* | 
|  | * Copyright (C) 2010 The Android Open Source Project | 
|  | * | 
|  | * Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | * you may not use this file except in compliance with the License. | 
|  | * You may obtain a copy of the License at | 
|  | * | 
|  | *      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, software | 
|  | * distributed under the License is distributed on an "AS IS" BASIS, | 
|  | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | * See the License for the specific language governing permissions and | 
|  | * limitations under the License. | 
|  | */ | 
|  |  | 
|  | #ifndef NUPLAYER_RENDERER_H_ | 
|  |  | 
|  | #define NUPLAYER_RENDERER_H_ | 
|  |  | 
|  | #include "NuPlayer.h" | 
|  |  | 
|  | namespace android { | 
|  |  | 
|  | struct ABuffer; | 
|  |  | 
|  | struct NuPlayer::Renderer : public AHandler { | 
|  | Renderer(const sp<MediaPlayerBase::AudioSink> &sink, | 
|  | const sp<AMessage> ¬ify); | 
|  |  | 
|  | void queueBuffer( | 
|  | bool audio, | 
|  | const sp<ABuffer> &buffer, | 
|  | const sp<AMessage> ¬ifyConsumed); | 
|  |  | 
|  | void queueEOS(bool audio, status_t finalResult); | 
|  |  | 
|  | void flush(bool audio); | 
|  |  | 
|  | void signalTimeDiscontinuity(); | 
|  |  | 
|  | void signalAudioSinkChanged(); | 
|  |  | 
|  | void pause(); | 
|  | void resume(); | 
|  |  | 
|  | enum { | 
|  | kWhatEOS                = 'eos ', | 
|  | kWhatFlushComplete      = 'fluC', | 
|  | kWhatPosition           = 'posi', | 
|  | }; | 
|  |  | 
|  | protected: | 
|  | virtual ~Renderer(); | 
|  |  | 
|  | virtual void onMessageReceived(const sp<AMessage> &msg); | 
|  |  | 
|  | private: | 
|  | enum { | 
|  | kWhatDrainAudioQueue    = 'draA', | 
|  | kWhatDrainVideoQueue    = 'draV', | 
|  | kWhatQueueBuffer        = 'queB', | 
|  | kWhatQueueEOS           = 'qEOS', | 
|  | kWhatFlush              = 'flus', | 
|  | kWhatAudioSinkChanged   = 'auSC', | 
|  | kWhatPause              = 'paus', | 
|  | kWhatResume             = 'resm', | 
|  | }; | 
|  |  | 
|  | struct QueueEntry { | 
|  | sp<ABuffer> mBuffer; | 
|  | sp<AMessage> mNotifyConsumed; | 
|  | size_t mOffset; | 
|  | status_t mFinalResult; | 
|  | }; | 
|  |  | 
|  | static const int64_t kMinPositionUpdateDelayUs; | 
|  |  | 
|  | sp<MediaPlayerBase::AudioSink> mAudioSink; | 
|  | sp<AMessage> mNotify; | 
|  | List<QueueEntry> mAudioQueue; | 
|  | List<QueueEntry> mVideoQueue; | 
|  | uint32_t mNumFramesWritten; | 
|  |  | 
|  | bool mDrainAudioQueuePending; | 
|  | bool mDrainVideoQueuePending; | 
|  | int32_t mAudioQueueGeneration; | 
|  | int32_t mVideoQueueGeneration; | 
|  |  | 
|  | int64_t mAnchorTimeMediaUs; | 
|  | int64_t mAnchorTimeRealUs; | 
|  |  | 
|  | Mutex mFlushLock;  // protects the following 2 member vars. | 
|  | bool mFlushingAudio; | 
|  | bool mFlushingVideo; | 
|  |  | 
|  | bool mHasAudio; | 
|  | bool mHasVideo; | 
|  | bool mSyncQueues; | 
|  |  | 
|  | bool mPaused; | 
|  |  | 
|  | int64_t mLastPositionUpdateUs; | 
|  | int64_t mVideoLateByUs; | 
|  |  | 
|  | bool onDrainAudioQueue(); | 
|  | void postDrainAudioQueue(int64_t delayUs = 0); | 
|  |  | 
|  | void onDrainVideoQueue(); | 
|  | void postDrainVideoQueue(); | 
|  |  | 
|  | void onQueueBuffer(const sp<AMessage> &msg); | 
|  | void onQueueEOS(const sp<AMessage> &msg); | 
|  | void onFlush(const sp<AMessage> &msg); | 
|  | void onAudioSinkChanged(); | 
|  | void onPause(); | 
|  | void onResume(); | 
|  |  | 
|  | void notifyEOS(bool audio, status_t finalResult); | 
|  | void notifyFlushComplete(bool audio); | 
|  | void notifyPosition(); | 
|  | void notifyVideoLateBy(int64_t lateByUs); | 
|  |  | 
|  | void flushQueue(List<QueueEntry> *queue); | 
|  | bool dropBufferWhileFlushing(bool audio, const sp<AMessage> &msg); | 
|  | void syncQueuesDone(); | 
|  |  | 
|  | DISALLOW_EVIL_CONSTRUCTORS(Renderer); | 
|  | }; | 
|  |  | 
|  | }  // namespace android | 
|  |  | 
|  | #endif  // NUPLAYER_RENDERER_H_ |