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