NuPlayer.h revision b5f25f005bc1d3ae35f45b58c88345e183dc336d
18ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz/* 28ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz * Copyright (C) 2010 The Android Open Source Project 38ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz * 48ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz * Licensed under the Apache License, Version 2.0 (the "License"); 58ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz * you may not use this file except in compliance with the License. 68ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz * You may obtain a copy of the License at 78ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz * 88ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz * http://www.apache.org/licenses/LICENSE-2.0 98ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz * 108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz * Unless required by applicable law or agreed to in writing, software 118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz * distributed under the License is distributed on an "AS IS" BASIS, 128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz * See the License for the specific language governing permissions and 148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz * limitations under the License. 158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz */ 168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz#ifndef NU_PLAYER_H_ 188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz#define NU_PLAYER_H_ 208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz#include <media/MediaPlayerInterface.h> 228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz#include <media/stagefright/foundation/AHandler.h> 238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz#include <media/stagefright/NativeWindowWrapper.h> 24cf7f19135f0e273f7b0136315633c2abfc715343Ian Rogers 25c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogersnamespace android { 26c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers 27c785344b87221f5e4e6473e5b762e4e61fe65dcfMathieu Chartierstruct ACodec; 28e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartierstruct MetaData; 298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertzstruct NuPlayerDriver; 30794ad76e8d5b5b9132819d5b08a0570e27615644Andreas Gampe 318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertzstruct NuPlayer : public AHandler { 328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz NuPlayer(); 338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz void setUID(uid_t uid); 3598d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang 360cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier void setDriver(const wp<NuPlayerDriver> &driver); 37e2facc5b18cd756a8b5500fb3d90da69c9ee0fb7Igor Murashkin 388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz void setDataSource(const sp<IStreamSource> &source); 392ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin 408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz void setDataSource( 418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const char *url, const KeyedVector<String8, String8> *headers); 424965c02b9074f4a3dc0a6ffe6d1b7e256f1c26c7Douglas Leung 438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz void setDataSource(int fd, int64_t offset, int64_t length); 448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz void setVideoSurfaceTextureAsync( 46e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier const sp<IGraphicBufferProducer> &bufferProducer); 478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz void setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink); 498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz void start(); 508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz void pause(); 528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz void resume(); 538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz // Will notify the driver through "notifyResetComplete" once finished. 558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz void resetAsync(); 568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz // Will notify the driver through "notifySeekComplete" once finished. 588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz void seekToAsync(int64_t seekTimeUs); 598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz status_t setVideoScalingMode(int32_t mode); 618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertzprotected: 638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz virtual ~NuPlayer(); 648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz virtual void onMessageReceived(const sp<AMessage> &msg); 66d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz 67e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian Rogerspublic: 68c67148594b1580c278ae71e3ce5c6fd59bfa6bd3Sebastien Hertz struct NuPlayerStreamListener; 698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz struct Source; 70d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz 71e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian Rogersprivate: 72c67148594b1580c278ae71e3ce5c6fd59bfa6bd3Sebastien Hertz struct Decoder; 738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz struct GenericSource; 740aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray struct HTTPLiveSource; 7590443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier struct Renderer; 76da843e11bd5f2177a776c37de033228a7ea230afSebastien Hertz struct RTSPSource; 778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz struct StreamingSource; 788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz struct Action; 798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz struct SeekAction; 808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz struct SetSurfaceAction; 818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz struct SimpleAction; 828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz enum { 848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz kWhatSetDataSource = '=DaS', 8545b1597c152af90f6d5792d02b64fd4e7c81ac9dSebastien Hertz kWhatSetVideoNativeWindow = '=NaW', 8645b1597c152af90f6d5792d02b64fd4e7c81ac9dSebastien Hertz kWhatSetAudioSink = '=AuS', 8790443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier kWhatMoreDataQueued = 'more', 8845b1597c152af90f6d5792d02b64fd4e7c81ac9dSebastien Hertz kWhatStart = 'strt', 8945b1597c152af90f6d5792d02b64fd4e7c81ac9dSebastien Hertz kWhatScanSources = 'scan', 9090443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier kWhatVideoNotify = 'vidN', 91b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier kWhatAudioNotify = 'audN', 92d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz kWhatRendererNotify = 'renN', 9390443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier kWhatReset = 'rset', 94d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz kWhatSeek = 'seek', 95c67148594b1580c278ae71e3ce5c6fd59bfa6bd3Sebastien Hertz kWhatPause = 'paus', 96c67148594b1580c278ae71e3ce5c6fd59bfa6bd3Sebastien Hertz kWhatResume = 'rsme', 97c67148594b1580c278ae71e3ce5c6fd59bfa6bd3Sebastien Hertz kWhatPollDuration = 'polD', 98c61124bdeaae94f977ffc36ac69535e792c226f2Sebastien Hertz kWhatSourceNotify = 'srcN', 99e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian Rogers }; 100c67148594b1580c278ae71e3ce5c6fd59bfa6bd3Sebastien Hertz 101c61124bdeaae94f977ffc36ac69535e792c226f2Sebastien Hertz wp<NuPlayerDriver> mDriver; 102158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin bool mUIDValid; 103158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin uid_t mUID; 104158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin sp<Source> mSource; 105158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin sp<NativeWindowWrapper> mNativeWindow; 106158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin sp<MediaPlayerBase::AudioSink> mAudioSink; 107158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin sp<Decoder> mVideoDecoder; 108158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin bool mVideoIsAVC; 109158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin sp<Decoder> mAudioDecoder; 110158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin sp<Renderer> mRenderer; 111158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin 112158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin List<sp<Action> > mDeferredActions; 113158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin 114158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin bool mAudioEOS; 115158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin bool mVideoEOS; 116158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin 11790443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier bool mScanSourcesPending; 118158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin int32_t mScanSourcesGeneration; 119158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin 120158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin int32_t mPollDurationGeneration; 121158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin 122158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin enum FlushStatus { 123158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin NONE, 124158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin AWAITING_DISCONTINUITY, 125158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin FLUSHING_DECODER, 126158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin FLUSHING_DECODER_SHUTDOWN, 127158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin SHUTTING_DOWN_DECODER, 128158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin FLUSHED, 129158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin SHUT_DOWN, 130158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin }; 131158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin 132158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin // Once the current flush is complete this indicates whether the 133158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin // notion of time has changed. 134158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin bool mTimeDiscontinuityPending; 135158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin 1362ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin FlushStatus mFlushingAudio; 1372ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin FlushStatus mFlushingVideo; 1382ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin 1392ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin int64_t mSkipRenderingAudioUntilMediaTimeUs; 1402ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin int64_t mSkipRenderingVideoUntilMediaTimeUs; 1412ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin 1422ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin int64_t mVideoLateByUs; 1432ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin int64_t mNumFramesTotal, mNumFramesDropped; 1442ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin 1452ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin int32_t mVideoScalingMode; 1462ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin 1472ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin bool mStarted; 1482ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin 1492ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin status_t instantiateDecoder(bool audio, sp<Decoder> *decoder); 1502ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin 1512ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin status_t feedDecoderInputData(bool audio, const sp<AMessage> &msg); 1522ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin void renderBuffer(bool audio, const sp<AMessage> &msg); 153158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin 154158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin void notifyListener(int msg, int ext1, int ext2); 155158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin 156158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin void finishFlushIfPossible(); 157158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin 158158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin void flushDecoder(bool audio, bool needShutdown); 159158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin 160158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin static bool IsFlushingState(FlushStatus state, bool *needShutdown = NULL); 161158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin 162158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin void postScanSources(); 163158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin 164158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin void schedulePollDuration(); 165158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin void cancelPollDuration(); 166158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin 167158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin void processDeferredActions(); 168158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin 169158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin void performSeek(int64_t seekTimeUs); 170158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin void performDecoderFlush(); 171158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin void performDecoderShutdown(); 1723a35714ebca10c989aa383c0861e2e84fe8dadf8Andreas Gampe void performReset(); 173158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin void performScanSources(); 174158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin void performSetSurface(const sp<NativeWindowWrapper> &wrapper); 175158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin 176158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin DISALLOW_EVIL_CONSTRUCTORS(NuPlayer); 177158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin}; 178158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin 179158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin} // namespace android 180158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin 181158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin#endif // NU_PLAYER_H_ 182158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin