NuPlayer.h revision 095248375e29adde961ec2a44989ecb3a6dda6a2
1cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar/* 2cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar * Copyright (C) 2010 The Android Open Source Project 3cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar * 4cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar * Licensed under the Apache License, Version 2.0 (the "License"); 5cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar * you may not use this file except in compliance with the License. 6cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar * You may obtain a copy of the License at 7cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar * 8cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar * http://www.apache.org/licenses/LICENSE-2.0 9cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar * 10cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar * Unless required by applicable law or agreed to in writing, software 11cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar * distributed under the License is distributed on an "AS IS" BASIS, 12cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar * See the License for the specific language governing permissions and 14cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar * limitations under the License. 15cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar */ 16cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 17cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar#ifndef NU_PLAYER_H_ 18cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 19cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar#define NU_PLAYER_H_ 20cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 21cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar#include <media/MediaPlayerInterface.h> 22cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar#include <media/stagefright/foundation/AHandler.h> 23cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar#include <media/stagefright/NativeWindowWrapper.h> 24cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 25cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbarnamespace android { 26cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 27cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbarstruct ABuffer; 28cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbarstruct MetaData; 29cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbarstruct NuPlayerDriver; 30cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 31cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbarstruct NuPlayer : public AHandler { 32cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar NuPlayer(); 33cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 34cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar void setUID(uid_t uid); 35cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 36cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar void setDriver(const wp<NuPlayerDriver> &driver); 37cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 38cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar void setDataSourceAsync(const sp<IStreamSource> &source); 39cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 40cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar void setDataSourceAsync( 41cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar const sp<IMediaHTTPService> &httpService, 42cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar const char *url, 43cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar const KeyedVector<String8, String8> *headers); 44cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 45cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar void setDataSourceAsync(int fd, int64_t offset, int64_t length); 46cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 47cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar void prepareAsync(); 48cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 49cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar void setVideoSurfaceTextureAsync( 50cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar const sp<IGraphicBufferProducer> &bufferProducer); 51cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 52cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar void setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink); 53cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar void start(); 54cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 55cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar void pause(); 56cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar void resume(); 57b5cd41e26f89aad2f2dc4f5dc37577f7abf8528aDaniel Dunbar 58b5cd41e26f89aad2f2dc4f5dc37577f7abf8528aDaniel Dunbar // Will notify the driver through "notifyResetComplete" once finished. 59cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar void resetAsync(); 60cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 61cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar // Will notify the driver through "notifySeekComplete" once finished. 62cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar void seekToAsync(int64_t seekTimeUs); 63cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 64cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar status_t setVideoScalingMode(int32_t mode); 65cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar status_t getTrackInfo(Parcel* reply) const; 66cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar status_t selectTrack(size_t trackIndex, bool select); 67cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 68cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbarprotected: 69b5cd41e26f89aad2f2dc4f5dc37577f7abf8528aDaniel Dunbar virtual ~NuPlayer(); 70b5cd41e26f89aad2f2dc4f5dc37577f7abf8528aDaniel Dunbar 71b5cd41e26f89aad2f2dc4f5dc37577f7abf8528aDaniel Dunbar virtual void onMessageReceived(const sp<AMessage> &msg); 72b5cd41e26f89aad2f2dc4f5dc37577f7abf8528aDaniel Dunbar 73cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbarpublic: 74cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar struct NuPlayerStreamListener; 75cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar struct Source; 76b5cd41e26f89aad2f2dc4f5dc37577f7abf8528aDaniel Dunbar 77cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbarprivate: 78cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar struct Decoder; 79cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar struct DecoderPassThrough; 80cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar struct CCDecoder; 81cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar struct GenericSource; 82cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar struct HTTPLiveSource; 83cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar struct Renderer; 84cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar struct RTSPSource; 85cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar struct StreamingSource; 86cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar struct Action; 87cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar struct SeekAction; 88cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar struct SetSurfaceAction; 89cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar struct ShutdownDecoderAction; 90cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar struct PostMessageAction; 91b5cd41e26f89aad2f2dc4f5dc37577f7abf8528aDaniel Dunbar struct SimpleAction; 92b5cd41e26f89aad2f2dc4f5dc37577f7abf8528aDaniel Dunbar 93cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar enum { 94b5cd41e26f89aad2f2dc4f5dc37577f7abf8528aDaniel Dunbar kWhatSetDataSource = '=DaS', 95b5cd41e26f89aad2f2dc4f5dc37577f7abf8528aDaniel Dunbar kWhatPrepare = 'prep', 96cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar kWhatSetVideoNativeWindow = '=NaW', 97cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar kWhatSetAudioSink = '=AuS', 98cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar kWhatMoreDataQueued = 'more', 99cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar kWhatStart = 'strt', 100cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar kWhatScanSources = 'scan', 101cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar kWhatVideoNotify = 'vidN', 102cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar kWhatAudioNotify = 'audN', 103cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar kWhatClosedCaptionNotify = 'capN', 104cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar kWhatRendererNotify = 'renN', 105cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar kWhatReset = 'rset', 106cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar kWhatSeek = 'seek', 107cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar kWhatPause = 'paus', 108cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar kWhatResume = 'rsme', 109cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar kWhatPollDuration = 'polD', 110cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar kWhatSourceNotify = 'srcN', 111cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar kWhatGetTrackInfo = 'gTrI', 112cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar kWhatSelectTrack = 'selT', 113cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar }; 114cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 115cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar wp<NuPlayerDriver> mDriver; 116cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar bool mUIDValid; 117cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar uid_t mUID; 118b5cd41e26f89aad2f2dc4f5dc37577f7abf8528aDaniel Dunbar sp<Source> mSource; 119cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar uint32_t mSourceFlags; 120cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar sp<NativeWindowWrapper> mNativeWindow; 121cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar sp<MediaPlayerBase::AudioSink> mAudioSink; 122cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar sp<Decoder> mVideoDecoder; 123cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar bool mVideoIsAVC; 124cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar bool mOffloadAudio; 125cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar sp<Decoder> mAudioDecoder; 126cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar sp<CCDecoder> mCCDecoder; 127cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar sp<Renderer> mRenderer; 128cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar sp<ALooper> mRendererLooper; 129cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 130cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar List<sp<Action> > mDeferredActions; 131cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 132cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar bool mAudioEOS; 133cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar bool mVideoEOS; 134cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 135cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar bool mScanSourcesPending; 136cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar int32_t mScanSourcesGeneration; 137cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 138cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar int32_t mPollDurationGeneration; 139cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 140cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar enum FlushStatus { 141cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar NONE, 142cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar AWAITING_DISCONTINUITY, 143cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar FLUSHING_DECODER, 144cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar FLUSHING_DECODER_SHUTDOWN, 145cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar SHUTTING_DOWN_DECODER, 146cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar FLUSHED, 147cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar SHUT_DOWN, 148cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar }; 149cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 150cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar // Once the current flush is complete this indicates whether the 151cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar // notion of time has changed. 152cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar bool mTimeDiscontinuityPending; 153cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 154cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar FlushStatus mFlushingAudio; 155cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar FlushStatus mFlushingVideo; 156cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 157cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar int64_t mSkipRenderingAudioUntilMediaTimeUs; 158cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar int64_t mSkipRenderingVideoUntilMediaTimeUs; 159cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 160cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar int64_t mVideoLateByUs; 161cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar int64_t mNumFramesTotal, mNumFramesDropped; 162cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 163cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar int32_t mVideoScalingMode; 164cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 165cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar bool mStarted; 166cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 167cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar status_t instantiateDecoder(bool audio, sp<Decoder> *decoder); 168cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 169cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar status_t feedDecoderInputData(bool audio, const sp<AMessage> &msg); 170cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar void renderBuffer(bool audio, const sp<AMessage> &msg); 171cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 172cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar void notifyListener(int msg, int ext1, int ext2, const Parcel *in = NULL); 173cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 174cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar void finishFlushIfPossible(); 175cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 176cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar void flushDecoder(bool audio, bool needShutdown); 177cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 178cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar static bool IsFlushingState(FlushStatus state, bool *needShutdown = NULL); 179cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 180b56900aa86aa535fb1f060f5935d1e209e45d907Peter Collingbourne void postScanSources(); 181b56900aa86aa535fb1f060f5935d1e209e45d907Peter Collingbourne 182cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar void schedulePollDuration(); 183cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar void cancelPollDuration(); 184cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 185cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar void processDeferredActions(); 186cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 187cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar void performSeek(int64_t seekTimeUs); 188cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar void performDecoderFlush(); 189cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar void performDecoderShutdown(bool audio, bool video); 190cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar void performReset(); 191cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar void performScanSources(); 192cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar void performSetSurface(const sp<NativeWindowWrapper> &wrapper); 19340d65dc3058e8d58426953d44e2ea0eccf996371Daniel Dunbar 19440d65dc3058e8d58426953d44e2ea0eccf996371Daniel Dunbar void onSourceNotify(const sp<AMessage> &msg); 19540d65dc3058e8d58426953d44e2ea0eccf996371Daniel Dunbar void onClosedCaptionNotify(const sp<AMessage> &msg); 196cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 197b56900aa86aa535fb1f060f5935d1e209e45d907Peter Collingbourne void queueDecoderShutdown( 198cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar bool audio, bool video, const sp<AMessage> &reply); 199cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 200cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar void sendSubtitleData(const sp<ABuffer> &buffer, int32_t baseIndex); 201cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 202cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar void writeTrackInfo(Parcel* reply, const sp<AMessage> format) const; 203cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 204cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar DISALLOW_EVIL_CONSTRUCTORS(NuPlayer); 205cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar}; 206cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar 20740d65dc3058e8d58426953d44e2ea0eccf996371Daniel Dunbar} // namespace android 208b56900aa86aa535fb1f060f5935d1e209e45d907Peter Collingbourne 209b56900aa86aa535fb1f060f5935d1e209e45d907Peter Collingbourne#endif // NU_PLAYER_H_ 210b56900aa86aa535fb1f060f5935d1e209e45d907Peter Collingbourne